diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..f91f646 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,12 @@ +# +# https://help.github.com/articles/dealing-with-line-endings/ +# +# Linux start script should use lf +/gradlew text eol=lf + +# These are Windows script files and should use crlf +*.bat text eol=crlf + +# Binary files should be left untouched +*.jar binary + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..67c4583 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +# Ignore Gradle project-specific cache directory +.gradle + +# Ignore Gradle build output directory +build + +.idea/ diff --git a/.sdkmanrc b/.sdkmanrc new file mode 100644 index 0000000..7be29c0 --- /dev/null +++ b/.sdkmanrc @@ -0,0 +1 @@ +java=21.0.4-amzn \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..ef75da3 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,24 @@ +plugins { + `java-library` +} + +repositories { + mavenCentral() +} + +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(21)) + } +} + +dependencies { + testImplementation("org.junit.jupiter:junit-jupiter-api:5.10.1") + testImplementation("org.assertj:assertj-core:3.24.2") + + testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.10.1") +} + +tasks.named("test") { + useJUnitPlatform() +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..5154008 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,7 @@ +# This file was generated by the Gradle 'init' task. +# https://docs.gradle.org/current/userguide/build_environment.html#sec:gradle_configuration_properties + +org.gradle.configuration-cache=true +org.gradle.parallel=true +org.gradle.caching=true + diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000..4ac3234 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,2 @@ +# This file was generated by the Gradle 'init' task. +# https://docs.gradle.org/current/userguide/platforms.html#sub::toml-dependencies-format diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..a4b76b9 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..e2847c8 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..f5feea6 --- /dev/null +++ b/gradlew @@ -0,0 +1,252 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original 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. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# 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"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..9d21a21 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,94 @@ +@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 +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +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% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +: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 %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..c45dd68 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,9 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * For more detailed information on multi-project builds, please refer to https://docs.gradle.org/8.11.1/userguide/multi_project_builds.html in the Gradle documentation. + * This project uses @Incubating APIs which are subject to change. + */ + +rootProject.name = "advent-of-code-2024" diff --git a/src/test/java/be/tbrx/Day1.java b/src/test/java/be/tbrx/Day1.java new file mode 100644 index 0000000..632a1c4 --- /dev/null +++ b/src/test/java/be/tbrx/Day1.java @@ -0,0 +1,85 @@ +package be.tbrx; + +// Throughout the Chief's office, the historically significant locations are listed not by name but by a unique number called the location ID. +// To make sure they don't miss anything, The Historians split into two groups, each searching the office and trying to create their own complete list of location IDs. +// +// There's just one problem: by holding the two lists up side by side (your puzzle input), it quickly becomes clear that the lists aren't very similar. +// Maybe you can help The Historians reconcile their lists? + +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThat; + +public class Day1 { + + @Test + void question1() throws IOException { + // read input + InputStream inputStream = getClass().getResourceAsStream("/day1/input.txt"); + String input = new String(inputStream.readAllBytes(), StandardCharsets.UTF_8); + + + List left = new ArrayList<>(); + List right = new ArrayList<>(); + for (String line : input.split("\n")) { + String[] split = line.split("\\s+"); + left.add(Integer.parseInt(split[0])); + right.add(Integer.parseInt(split[1])); + } + + // sort the lists + left.sort(null); + right.sort(null); + + Integer result = 0; + for (int i = 0; i < left.size(); i++) { + Integer minimumLeft = left.get(i); + Integer minimumRight = right.get(i); + + result += Math.abs(minimumLeft - minimumRight); + } + + // find the missing number + assertThat(result).isEqualTo(2000468); + } + + //a lot of location IDs appear in both lists! Maybe the other numbers aren't location IDs at all but rather misinterpreted handwriting. + // Calculate a total similarity score by adding up each number in the left list after multiplying it by the number of times that number appears in the right list. + + @Test + void question2() throws IOException { + // read input + InputStream inputStream = getClass().getResourceAsStream("/day1/input.txt"); + String input = new String(inputStream.readAllBytes(), StandardCharsets.UTF_8); + + List left = new ArrayList<>(); + List right = new ArrayList<>(); + for (String line : input.split("\n")) { + String[] split = line.split("\\s+"); + left.add(Integer.parseInt(split[0])); + right.add(Integer.parseInt(split[1])); + } + + Map lookupCounts = right.stream() + .collect(Collectors.groupingBy( + number -> number, + Collectors.counting() + )); + + + Long total = left.stream() + .mapToLong(number -> number * lookupCounts.getOrDefault(number, 0L)) + .sum(); + + assertThat(total).isEqualTo(31); + + } +} diff --git a/src/test/resources/day1/calibration_input.txt b/src/test/resources/day1/calibration_input.txt new file mode 100644 index 0000000..dfca0b1 --- /dev/null +++ b/src/test/resources/day1/calibration_input.txt @@ -0,0 +1,6 @@ +3 4 +4 3 +2 5 +1 3 +3 9 +3 3 \ No newline at end of file diff --git a/src/test/resources/day1/input.txt b/src/test/resources/day1/input.txt new file mode 100644 index 0000000..add1159 --- /dev/null +++ b/src/test/resources/day1/input.txt @@ -0,0 +1,1000 @@ +97924 12015 +50267 32019 +98415 10716 +64856 63472 +73972 11396 +85009 60876 +16084 81584 +63342 45754 +36722 57910 +71800 33139 +13657 42097 +31646 60883 +13033 45362 +98175 50742 +12224 82309 +26745 36160 +91733 22906 +63235 23212 +34149 43474 +55819 92797 +89877 82309 +63876 68418 +35017 24286 +71693 56515 +67230 56504 +32107 70146 +29455 43966 +10294 80966 +11503 97276 +45021 44890 +65889 45042 +22646 50684 +29246 40041 +94894 64304 +97487 32858 +11658 25139 +86638 37390 +77389 69681 +20834 20641 +43948 97853 +25169 18624 +47469 14334 +77677 51466 +67863 10346 +66135 44506 +22510 90140 +39330 56504 +96958 57081 +65629 98292 +40599 32865 +41131 50742 +41361 91497 +44833 76741 +32056 53741 +15025 58921 +32170 52656 +95391 10777 +55371 78010 +48305 51466 +65862 89174 +40636 54184 +97450 99374 +77105 83865 +34812 41764 +23999 77192 +25503 93924 +66670 24286 +30994 12382 +76175 60974 +43005 50445 +53741 14287 +67639 60769 +68473 53741 +16078 76080 +51006 54184 +74520 49015 +17232 40707 +25445 89174 +39404 16084 +23041 85801 +54140 17286 +46419 20749 +49484 46855 +19164 86911 +39289 12150 +59326 22031 +47693 53741 +89369 86087 +78926 99284 +46255 78050 +53879 65533 +27064 21120 +21756 63733 +46201 58079 +83358 45402 +67814 39702 +36582 27906 +68742 32858 +63598 80368 +46069 15449 +43061 21120 +82842 43966 +47757 41841 +11761 26946 +55059 78870 +73640 28789 +87885 16294 +76819 42168 +99933 82831 +96701 43783 +33926 50742 +53211 50456 +63392 97067 +86076 89174 +22252 52322 +82469 52960 +15384 19277 +17446 62973 +60995 85599 +67563 99208 +81796 42097 +13959 65386 +67714 81831 +98828 55717 +66905 59486 +12690 99284 +24626 21468 +14738 49115 +58555 17335 +23470 27139 +38356 94975 +21420 34794 +85109 99284 +88215 16754 +13822 56504 +78720 97465 +17622 49756 +27946 39646 +42737 85951 +39857 51466 +98335 73635 +51079 27139 +75618 80096 +55716 22031 +44439 79910 +74943 85951 +15914 69859 +94892 51466 +89851 26946 +58970 40772 +89048 21927 +79217 43966 +22327 21545 +15513 56526 +52584 39743 +17822 37390 +50437 45539 +26861 99284 +39402 43966 +44176 98943 +93367 38719 +85462 35314 +70936 30406 +64975 53741 +69603 40772 +27447 43966 +48913 50742 +55729 17033 +55903 55600 +58608 73308 +13030 62519 +79586 53741 +85885 78724 +47696 26716 +89036 95563 +51691 35314 +74369 27139 +83246 50742 +34233 53741 +87921 48574 +12660 51466 +15408 54159 +82361 21120 +78963 99205 +87395 10043 +73712 24286 +97972 97487 +77207 34050 +26598 21574 +51812 47558 +34508 90761 +26436 40460 +71011 60574 +50890 51466 +50493 24854 +16217 47118 +44890 73772 +44429 26946 +99607 43966 +38107 99307 +10208 32858 +73098 45260 +26515 70155 +53750 55600 +74904 44506 +89898 43966 +71445 37467 +77746 82076 +20131 34528 +67840 12429 +36620 80900 +18892 95044 +73474 85951 +83450 24551 +45728 11046 +66927 40772 +35585 85951 +93945 83865 +76199 18892 +26536 16084 +58275 26910 +51874 42097 +88833 57054 +75871 85642 +67764 32556 +69526 26946 +19475 16084 +80585 90761 +34189 82309 +96205 55600 +11371 24399 +38079 51194 +99465 44890 +21120 99284 +15731 84749 +82309 28950 +33121 47050 +84859 31889 +93071 22719 +69403 40772 +47701 55127 +94758 12405 +71944 40772 +59059 27139 +23522 48009 +69897 20227 +96432 53857 +40161 56742 +99974 31605 +28726 40772 +43411 19960 +52521 51466 +10024 51312 +84954 35314 +33296 99284 +77780 49638 +89571 26843 +13582 87187 +27081 74290 +29330 26946 +35469 42097 +96455 60260 +44473 20645 +52280 90488 +36181 17193 +83515 89920 +77203 22203 +31113 70569 +93446 50742 +94776 14334 +65132 74481 +76822 22765 +76108 25212 +88359 81025 +58602 89174 +71874 21120 +78276 98125 +39092 22656 +62278 65305 +40915 21120 +55896 26933 +89049 11422 +73736 82035 +41226 93643 +91298 94509 +48613 68016 +48763 50742 +72203 25900 +83036 90823 +40070 22471 +34155 77007 +66614 75044 +99172 34719 +10261 48242 +75196 91994 +60212 32858 +82136 42097 +68902 40955 +61584 61094 +18196 97838 +12112 99284 +28990 51912 +21082 40991 +45932 51466 +71891 70388 +93524 71891 +36886 20645 +84927 11097 +90640 82280 +12240 22031 +50754 79877 +12243 56504 +21896 69022 +27361 50742 +92599 91087 +50881 17965 +19258 92324 +48109 51450 +39617 66508 +33422 59580 +24453 21120 +70071 76583 +61099 99284 +32270 81634 +18554 90140 +57108 40772 +72972 82180 +44178 35314 +58969 35314 +68638 32858 +59752 97487 +91349 85951 +42541 91799 +11241 85951 +56014 40772 +18240 82309 +83562 82349 +99794 20645 +49642 24286 +26318 35314 +20645 16436 +95467 32543 +85129 29179 +63111 28393 +21776 47366 +17413 13453 +39834 96167 +54442 65122 +25618 90140 +67027 50742 +91899 59045 +36861 84429 +41069 24405 +39818 26532 +41305 57846 +50844 54184 +35314 52839 +13646 66988 +21610 72792 +84316 67867 +37390 27139 +33072 38672 +50742 68302 +95333 44890 +67978 10314 +54472 77425 +65124 64037 +62367 57908 +88774 40958 +71725 85651 +27200 73263 +72832 16084 +93194 20645 +84331 87651 +83654 96024 +98518 44506 +26270 85951 +17471 54184 +40445 40716 +24801 98329 +71775 48960 +63886 62621 +11574 58455 +36092 85951 +70761 10112 +61291 26292 +97303 19625 +44506 86054 +91586 95307 +58301 40772 +81698 27139 +72921 26946 +50502 36406 +16298 86304 +75558 37706 +22495 99284 +33661 82309 +85183 85951 +57125 55600 +32610 99284 +61179 38278 +59372 93008 +74037 14334 +48967 43966 +57442 16159 +26047 21120 +23188 89174 +23633 16084 +15300 57527 +11726 50556 +59493 94320 +66596 32570 +78092 75310 +48254 42097 +23338 50742 +36327 78906 +14142 94284 +26946 68750 +51040 40772 +69209 40772 +15882 54414 +31997 14334 +12496 32775 +54801 60587 +92254 34864 +54184 56224 +50128 37390 +46755 37390 +68205 42097 +16526 31984 +33415 89174 +95561 99284 +58231 11999 +12000 27968 +13762 24130 +20783 29706 +49870 13617 +31028 85455 +73097 31238 +36095 22031 +15523 97714 +41560 34014 +30530 90052 +34128 97988 +91541 54184 +97402 68624 +14133 22098 +95923 88909 +21065 76908 +54343 27139 +17923 52386 +39271 97487 +54329 47300 +29173 12083 +73679 66145 +25043 79638 +23367 27139 +47733 73848 +50178 19841 +61856 75136 +12334 99284 +24075 99000 +66813 16084 +68591 37390 +60548 26946 +47476 51466 +65067 34238 +27139 43966 +90127 90140 +71661 53741 +76564 86323 +14606 74629 +33073 20645 +28929 99210 +20290 16026 +55600 31919 +44895 95367 +69018 51466 +19996 10788 +79035 39402 +59205 55228 +38746 94339 +86509 76500 +99613 75251 +21577 12189 +97880 60387 +91425 85951 +84219 85951 +82752 51466 +24031 14334 +21843 51466 +67480 16084 +89728 72818 +28954 99145 +88314 89174 +18726 32858 +87526 25968 +85951 85741 +64143 78312 +42517 49699 +13848 22031 +43260 35799 +53772 81476 +54544 99120 +38528 26946 +75966 82991 +66179 95509 +58180 45829 +53138 99284 +43795 67657 +75091 16278 +82097 47194 +58590 11318 +50521 83696 +27323 81208 +33112 99284 +27922 49371 +65787 90869 +40517 36120 +20919 48795 +30416 63304 +88719 50742 +79993 75970 +27124 51458 +35850 70479 +47642 30113 +56934 42097 +99900 51466 +21591 33043 +97673 89174 +29342 22031 +75687 90761 +45898 50821 +22897 63031 +23889 77846 +63662 48377 +65299 75957 +44563 99284 +60281 51466 +49181 35314 +50909 52749 +21600 11254 +44988 13205 +58351 33964 +84132 90140 +33795 94103 +30993 90836 +23660 42097 +56833 67799 +84296 30712 +27172 23612 +41123 64339 +70231 50742 +65636 35314 +24047 72155 +11869 60279 +44666 91711 +81159 79500 +75418 66073 +18982 51466 +54865 26946 +91042 14334 +21791 89073 +86188 22769 +92550 56504 +63942 48743 +55260 92181 +97155 69816 +44593 25507 +94520 37390 +16803 31162 +99284 94474 +10940 16434 +51986 32334 +94727 54184 +79564 22031 +67524 42754 +96074 54184 +32231 87988 +82182 11698 +36414 29276 +16281 28226 +21085 86754 +98238 43817 +53299 42097 +19359 93023 +46340 72842 +16355 51322 +70234 51466 +50841 13798 +81149 71891 +58011 53741 +80355 58080 +62858 56427 +25160 14155 +29287 26946 +82307 37276 +45594 10162 +52167 67510 +66037 18892 +16339 26946 +74466 59737 +68243 96568 +70410 82183 +18833 81661 +52684 20077 +99904 14334 +64936 32858 +67435 35314 +25168 51466 +48685 52200 +87833 43966 +16974 56000 +82852 91407 +54986 42097 +56112 49272 +64314 67342 +66607 54466 +61959 45397 +20294 14988 +22416 99280 +15287 22031 +42081 17788 +69276 85883 +19958 89174 +14337 24625 +43966 45494 +56772 64995 +37195 65787 +71264 60398 +45446 14947 +27319 54184 +71714 56504 +98898 54184 +15964 53181 +35923 34140 +92462 99284 +70969 21414 +60163 81686 +26799 45525 +57327 92053 +19339 51466 +56504 91566 +53113 44890 +78876 51902 +96200 89174 +82490 70725 +44316 36065 +71051 88682 +89880 22031 +27972 74592 +58858 41411 +31090 64119 +99124 40772 +77060 35314 +67020 25937 +28781 22031 +58289 99284 +89174 50742 +38323 63710 +42607 42383 +12543 89055 +23349 38990 +70058 59526 +15437 50742 +59862 98161 +30674 37596 +14449 18706 +42471 22031 +41124 32858 +77330 44890 +91002 14369 +12075 40772 +51581 75361 +17412 76932 +57784 38581 +78558 99284 +68326 18310 +33313 54184 +18353 52449 +91690 32831 +31047 33504 +41819 19604 +97743 65016 +81549 20645 +72159 33409 +38296 27139 +39901 97487 +26924 14334 +77429 52218 +90666 42785 +25384 60133 +61440 92089 +42764 30200 +26668 94108 +44171 93942 +96575 54184 +77777 25665 +65805 84579 +66448 48617 +66204 20645 +67751 33623 +48577 64139 +14034 62738 +82234 33385 +94447 92116 +21669 80984 +76758 43995 +16998 91461 +10808 14581 +91668 92007 +42411 65834 +83439 51090 +57286 56504 +26423 85951 +47687 90581 +75978 35314 +79027 96347 +13122 76475 +43173 64852 +33696 85951 +26050 53741 +29903 49202 +55762 67069 +22725 93128 +92748 37390 +75292 46134 +84901 83013 +82424 53741 +49756 10496 +99049 95224 +21549 42097 +45030 90831 +42687 43966 +24675 43966 +64330 78889 +26258 21120 +11886 18810 +10674 55709 +80983 36441 +73290 20645 +91623 50742 +68510 82209 +96050 27139 +29559 40772 +87297 79655 +16161 22031 +69453 73178 +79979 36506 +28404 82655 +95222 38807 +61168 81721 +39809 74305 +24627 16084 +48823 82344 +22852 44523 +67111 26946 +22838 97487 +19454 33107 +84203 54184 +97780 35714 +53203 27139 +89425 97487 +16614 18100 +19219 99284 +20569 82309 +48161 40982 +17213 31332 +70935 40772 +86566 78489 +24611 91868 +54359 97873 +95758 54184 +20532 73488 +49070 58755 +66014 54184 +69011 69128 +54241 99864 +61068 82574 +64852 26325 +60260 90900 +26299 10028 +58452 27139 +26134 22031 +84291 31012 +94851 23134 +90147 21120 +88435 46853 +26639 32875 +98570 64925 +66700 61354 +57045 31104 +30983 77622 +77419 62276 +61144 34934 +79828 81916 +38801 34632 +71141 73192 +30543 33571 +33787 93024 +93255 97304 +27104 93186 +43923 23461 +70069 73947 +23376 79180 +82293 51960 +37692 27139 +91328 69682 +47801 37390 +90140 50742 +40772 21893 +77630 62221 +26106 24286 +82191 79832 +29674 85951 +32858 35263 +57709 50742 +70834 74783 +34807 23868 +40646 93606 +17334 72970 +79995 39402 +22031 14334 +59137 40772 +23515 23407 +69665 59362 +78363 31953 +74969 85136 +51172 40772 +11229 98531 +86385 53822 +71049 73230 +90321 64852 +15381 24392 +17377 14334 +35732 26946 +92220 98405 +75143 22448 +93217 22031 +12345 80271 +66240 40772 +63460 31057 +14334 59725 +52629 82139 +67549 57710 +32589 21120 +40973 51466 +48086 64809 +62405 56431 +69385 65345 +73015 28247 +47116 35314 +89461 53741 +89978 37390 +45093 43966 +95580 20645 +90761 22983 +61770 37390 +91506 17021 +37148 58211 +73119 29135 +83826 16084 +11602 46435 +79485 43966 +51373 14334 +71333 50742 +41091 71891 +60255 11833 +70778 44890 +76205 26946 +67609 32858 +65250 83865 +81623 12242 +20105 17154 +53573 89174 +67594 55600 +30437 56504 +74127 98641 +43012 24286 +82823 90761 +87461 43966 +35267 22031 +99386 71177 +47451 23934 +51886 43966 +45000 98769 +93502 69179 +26127 42438 +61492 44506 +16858 20657 +77633 89949 +29357 86929 +91974 85951 +87979 14334 +12707 83865 +38824 83968 +46482 25275 +69244 35249 +10765 99284 +30619 53741 +30590 55600 +99292 85951 +28244 43966 +18494 85951 +91105 44506 +73930 26946 +30813 85951 +67308 94250 +54758 85951 +43568 33487 +15869 34016 +82010 27139 +33131 52450 +57985 12045 +93101 51270 +15835 64414 +24286 23491 +56944 11795 +47755 10809 +82704 75027 +93787 90140 +51466 20555 +51856 14334 +30252 44890 +44052 31936 +20691 68431 +57033 63455 +13300 43535 +33712 84239 +97080 51559 +91808 22031 +90652 22031 +64155 44890 +65463 40772 +44798 52819 +43936 44156 +18253 27360 +73289 89174 +71164 56212 +34646 20645 +42097 89582 +15990 55600 +56628 41785 +68636 89174 +67043 16186 +25652 34811 +87109 70679 +83865 43966 +54773 24922 +12778 27139 +41699 62346 +59666 17557 +94699 37390 +77535 27125 +19069 18324 +34344 51466 +24906 41267 +91226 76330 +58992 17879 +21084 37390 +95352 27424 +14593 14167 +57258 79480 +41550 98477 +59908 49327 +63930 56501 +52103 49712 +98431 19293 +64232 64852 +10638 14334 +52217 35314 +11797 27139 +12501 53741 +39316 73238 +62625 54184 +54433 27493 +23801 35877 +15292 50742 +28822 55302 +90501 18892 +52285 33785 +42385 21120 +34500 97487 +39882 93726 +12013 47966 +42691 18536 +57217 14334 +31320 58173 +90532 42331 +65216 54184 +78393 42097 +48315 29944 +37332 48362 +40774 98927 +16062 28783 +73931 39391 +54344 21435 +17846 56504 +61807 42097 +93272 97487 \ No newline at end of file