Task 1

--- Day 4: Passport Processing ---
You arrive at the airport only to realize that you grabbed your North Pole Credentials instead of your passport. While these documents are extremely similar, North Pole Credentials aren't issued by a country and therefore aren't actually valid documentation for travel in most of the world.

It seems like you're not the only one having problems, though; a very long line has formed for the automatic passport scanners, and the delay could upset your travel itinerary.

Due to some questionable network security, you realize you might be able to solve both of these problems at the same time.

The automatic passport scanners are slow because they're having trouble detecting which passports have all required fields. The expected fields are as follows:

byr (Birth Year)
iyr (Issue Year)
eyr (Expiration Year)
hgt (Height)
hcl (Hair Color)
ecl (Eye Color)
pid (Passport ID)
cid (Country ID)
Passport data is validated in batch files (your puzzle input). Each passport is represented as a sequence of key:value pairs separated by spaces or newlines. Passports are separated by blank lines.

Here is an example batch file containing four passports:

ecl:gry pid:860033327 eyr:2020 hcl:#fffffd
byr:1937 iyr:2017 cid:147 hgt:183cm

iyr:2013 ecl:amb cid:350 eyr:2023 pid:028048884
hcl:#cfa07d byr:1929

hcl:#ae17e1 iyr:2013
eyr:2024
ecl:brn pid:760753108 byr:1931
hgt:179cm

hcl:#cfa07d eyr:2025 pid:166559648
iyr:2011 ecl:brn hgt:59in
The first passport is valid - all eight fields are present. The second passport is invalid - it is missing hgt (the Height field).

The third passport is interesting; the only missing field is cid, so it looks like data from North Pole Credentials, not a passport at all! Surely, nobody would mind if you made the system temporarily ignore missing cid fields. Treat this "passport" as valid.

The fourth passport is missing two fields, cid and byr. Missing cid is fine, but missing any other field is not, so this passport is invalid.

According to the above rules, your improved system would report 2 valid passports.

Count the number of valid passports - those that have all required fields. Treat cid as optional. In your batch file, how many passports are valid?
with open("data.txt") as data:
    lines = data.readlines()
 
# All passport in the file, splitted and gathered into one string line 
passports = []
currentPassport = ""
 
for line in lines:
    if line != "\n":
        if currentPassport:
            currentPassport += " " + line.strip()
        else:
            currentPassport += line.strip()
    else:
        passports.append(currentPassport)
        currentPassport = ""
 
# Append the last passport to the list, since we've reached the end of the file/lines.
passports.append(currentPassport)
 
validPassports = 0
print("Toally found", len(passports), "passports in the file.")
for passport in passports:
    validByr = False
    validIyr = False
    validEyr = False
    validHgt = False
    validHcl = False
    validEcl = False
    validPid = False
    #validCid = True # "optional"
 
    fields = passport.split(" ")
    for field in fields:
        keyValue = field.split(":")
 
        if(keyValue[0] == "byr" and keyValue[1]):
            validByr = True
        
        if(keyValue[0] == "iyr" and keyValue[1]):
            validIyr = True
        
        if(keyValue[0] == "eyr" and keyValue[1]):
            validEyr = True
        
        if(keyValue[0] == "hgt" and keyValue[1]):
            validHgt = True
        
        if(keyValue[0] == "hcl" and keyValue[1]):
            validHcl = True
        
        if(keyValue[0] == "ecl" and keyValue[1]):
            validEcl = True
        
        if(keyValue[0] == "pid" and keyValue[1]):
            validPid = True
        
        # if(keyValue[0] == "cid" and keyValue[1]):
        #    validCid = True
 
    if(validByr and validIyr and validEyr and validHgt and validHcl and validEcl and validPid):
    #if(validByr and validIyr and validEyr and validHgt and validHcl and validEcl and validPid and validCid):
        validPassports += 1
 
print("Valid passports:", str(validPassports))

Answer: 202

Task 2

--- Part Two ---
The line is moving more quickly now, but you overhear airport security talking about how passports with invalid data are getting through. Better add some data validation, quick!

You can continue to ignore the cid field, but each other field has strict rules about what values are valid for automatic validation:

byr (Birth Year) - four digits; at least 1920 and at most 2002.
iyr (Issue Year) - four digits; at least 2010 and at most 2020.
eyr (Expiration Year) - four digits; at least 2020 and at most 2030.
hgt (Height) - a number followed by either cm or in:
If cm, the number must be at least 150 and at most 193.
If in, the number must be at least 59 and at most 76.
hcl (Hair Color) - a # followed by exactly six characters 0-9 or a-f.
ecl (Eye Color) - exactly one of: amb blu brn gry grn hzl oth.
pid (Passport ID) - a nine-digit number, including leading zeroes.
cid (Country ID) - ignored, missing or not.
Your job is to count the passports where all required fields are both present and valid according to the above rules. Here are some example values:

byr valid:   2002
byr invalid: 2003

hgt valid:   60in
hgt valid:   190cm
hgt invalid: 190in
hgt invalid: 190

hcl valid:   #123abc
hcl invalid: #123abz
hcl invalid: 123abc

ecl valid:   brn
ecl invalid: wat

pid valid:   000000001
pid invalid: 0123456789
Here are some invalid passports:

eyr:1972 cid:100
hcl:#18171d ecl:amb hgt:170 pid:186cm iyr:2018 byr:1926

iyr:2019
hcl:#602927 eyr:1967 hgt:170cm
ecl:grn pid:012533040 byr:1946

hcl:dab227 iyr:2012
ecl:brn hgt:182cm pid:021572410 eyr:2020 byr:1992 cid:277

hgt:59cm ecl:zzz
eyr:2038 hcl:74454a iyr:2023
pid:3556412378 byr:2007
Here are some valid passports:

pid:087499704 hgt:74in ecl:grn iyr:2012 eyr:2030 byr:1980
hcl:#623a2f

eyr:2029 ecl:blu cid:129 byr:1989
iyr:2014 pid:896056539 hcl:#a97842 hgt:165cm

hcl:#888785
hgt:164cm byr:2001 iyr:2015 cid:88
pid:545766238 ecl:hzl
eyr:2022

iyr:2010 hgt:158cm hcl:#b6652a ecl:blu byr:1944 eyr:2021 pid:093154719
Count the number of valid passports - those that have all required fields and valid values. Continue to treat cid as optional. In your batch file, how many passports are valid?
import re
 
with open("data.txt") as data:
#with open("testdata_task2_valid.txt") as data:
#with open("testdata_task2_invalid.txt") as data:
    lines = data.readlines()
 
# All passport in the file, splitted and gathered into one string line 
passports = []
currentPassport = ""
 
for line in lines:
    if line != "\n":
        if currentPassport:
            currentPassport += " " + line.strip()
        else:
            currentPassport += line.strip()
    else:
        passports.append(currentPassport)
        currentPassport = ""
 
# Append the last passport to the list, since we've reached the end of the file/lines.
passports.append(currentPassport)
 
validPassports = 0
print("Toally found", len(passports), "passports in the file.")
for passport in passports:
    validByr = False
    validIyr = False
    validEyr = False
    validHgt = False
    validHcl = False
    validEcl = False
    validPid = False
    #validCid = True # "optional"
 
    fields = passport.split(" ")
    for field in fields:
        keyValue = field.split(":")
 
        if(keyValue[0] == "byr" and keyValue[1]):
            if 1920 <= int(keyValue[1]) <= 2002:
                validByr = True
        
        if(keyValue[0] == "iyr" and keyValue[1]):
            if 2010 <= int(keyValue[1]) <= 2020:
                validIyr = True
        
        if(keyValue[0] == "eyr" and keyValue[1]):
            if 2020 <= int(keyValue[1]) <= 2030:
                validEyr = True
        
        if(keyValue[0] == "hgt" and keyValue[1]):
            if ("cm" in keyValue[1]):
                heightSplit = keyValue[1].split("cm")
                if 150 <= int(heightSplit[0]) <= 193:
                    validHgt = True
            if ("in" in keyValue[1]):
                heightSplit = keyValue[1].split("in")
                if 59 <= int(heightSplit[0]) <= 76:
                    validHgt = True
        
        if(keyValue[0] == "hcl" and keyValue[1]):
            if re.match(r"#[a-f0-9]{6}", keyValue[1]):
                validHcl = True
        
        if(keyValue[0] == "ecl" and keyValue[1]):
            if keyValue[1] == "amb" or keyValue[1] == "blu" or keyValue[1] == "brn" or keyValue[1] == "gry" or keyValue[1] == "grn" or keyValue[1] == "hzl" or keyValue[1] == "oth":
                validEcl = True
        
        if(keyValue[0] == "pid" and keyValue[1]):
            if re.match(r"^\d{9}$", keyValue[1]):
                validPid = True
        
        # if(keyValue[0] == "cid" and keyValue[1]):
        #    validCid = True
 
    if(validByr and validIyr and validEyr and validHgt and validHcl and validEcl and validPid):
    #if(validByr and validIyr and validEyr and validHgt and validHcl and validEcl and validPid and validCid):
        validPassports += 1
 
print("Valid passports:", str(validPassports))

Answer: 137

Data

Test data - Task 1

ecl:gry pid:860033327 eyr:2020 hcl:#fffffd
byr:1937 iyr:2017 cid:147 hgt:183cm

iyr:2013 ecl:amb cid:350 eyr:2023 pid:028048884
hcl:#cfa07d byr:1929

hcl:#ae17e1 iyr:2013
eyr:2024
ecl:brn pid:760753108 byr:1931
hgt:179cm

hcl:#cfa07d eyr:2025 pid:166559648
iyr:2011 ecl:brn hgt:59in

Test data - Task 2 - Valid

pid:087499704 hgt:74in ecl:grn iyr:2012 eyr:2030 byr:1980
hcl:#623a2f

eyr:2029 ecl:blu cid:129 byr:1989
iyr:2014 pid:896056539 hcl:#a97842 hgt:165cm

hcl:#888785
hgt:164cm byr:2001 iyr:2015 cid:88
pid:545766238 ecl:hzl
eyr:2022

iyr:2010 hgt:158cm hcl:#b6652a ecl:blu byr:1944 eyr:2021 pid:093154719

Test data - Task 2 - Invalid

eyr:1972 cid:100
hcl:#18171d ecl:amb hgt:170 pid:186cm iyr:2018 byr:1926

iyr:2019
hcl:#602927 eyr:1967 hgt:170cm
ecl:grn pid:012533040 byr:1946

hcl:dab227 iyr:2012
ecl:brn hgt:182cm pid:021572410 eyr:2020 byr:1992 cid:277

hgt:59cm ecl:zzz
eyr:2038 hcl:74454a iyr:2023
pid:3556412378 byr:2007

Real data

hgt:159cm
pid:561068005 eyr:2025 iyr:2017 cid:139 ecl:blu hcl:#ceb3a1
byr:1940

iyr:2014
byr:1986 pid:960679613 eyr:2025 ecl:hzl

cid:211 ecl:blu hcl:#7d3b0c iyr:2011 pid:006632702
byr:1982 eyr:2023 hgt:68in

hcl:#341e13 hgt:192 iyr:2028
ecl:utc
eyr:2027 byr:1979 pid:653515689

eyr:2026 hgt:161cm ecl:#1850b8
pid:298779494 hcl:b2114e iyr:1953

hgt:155cm
hcl:#a97842 iyr:2019
ecl:gry byr:1939
pid:935099157 eyr:2027

eyr:2024 ecl:grn
pid:102781360 byr:1962 iyr:2013 hcl:#602927

hcl:#602927 hgt:152cm
pid:659074205 ecl:brn iyr:2014 byr:1951

iyr:2025 hcl:8464b2 byr:2030 pid:976783295 hgt:155cm ecl:dne

hcl:#ceb3a1 byr:1984 pid:863872932
iyr:2016 hgt:190cm ecl:grn eyr:2026

eyr:2030 hcl:#efcc98
cid:166 pid:894418497 ecl:hzl
hgt:189cm iyr:2014 byr:1966

byr:1937 iyr:2017 eyr:2028
ecl:amb
hgt:165cm cid:84
pid:435289747

hgt:166cm hcl:#6b5442 byr:1953 eyr:2023 iyr:2010
pid:948173962 ecl:amb

byr:1962 cid:276 iyr:2010 hgt:183cm pid:097154397
hcl:#341e13 eyr:2024

hgt:61cm
byr:1942 ecl:xry hcl:#05e97d pid:42823283
eyr:2024

hcl:#888785
pid:960190685 byr:1967 iyr:2012 cid:99 eyr:2021
hgt:76in

eyr:2025 byr:1958 hcl:#18171d iyr:2012 pid:759427419
ecl:hzl

ecl:#829d2e
cid:60 iyr:2028
byr:1979 hcl:caff12 eyr:1931 pid:#fd7aab hgt:184cm

cid:251 byr:1981 pid:625590775
hcl:#a97842 eyr:2020
ecl:amb hgt:178cm
iyr:2016

pid:026891577 ecl:amb byr:2014
hcl:bc419f eyr:2026
iyr:1948
hgt:123 cid:67

ecl:hzl
hgt:152cm hcl:#efcc98
byr:1993
eyr:2025

ecl:grn iyr:1924 eyr:2039 pid:8441306576
hgt:163in
byr:2012
cid:193

ecl:#78f4fa
eyr:2020 hgt:165cm byr:1965 pid:987868257 iyr:2012
cid:331 hcl:z

ecl:brn cid:289 pid:868305933
byr:1936 hgt:174cm iyr:2016 hcl:#623a2f eyr:2021

hcl:#2a6308 eyr:2027 hgt:154cm ecl:grn
iyr:2012
byr:1940
pid:675209536

pid:186cm eyr:2022
hcl:#fffffd hgt:151cm iyr:2016 ecl:hzl byr:1954

ecl:grn hgt:177cm pid:725111435 byr:1927 eyr:2027 cid:154 iyr:2010 hcl:#623a2f

pid:801551597 cid:55 eyr:2028 hgt:193cm hcl:#a97842
ecl:hzl byr:1942 iyr:2015

cid:176 eyr:2030 iyr:2018 byr:1932 hgt:162cm pid:896180324 ecl:amb hcl:#6b5442

cid:239 ecl:grn iyr:1953 pid:9500162195
byr:1998
hgt:182cm hcl:#733820 eyr:1966

eyr:2030
pid:919325322 hcl:z iyr:2024 hgt:71cm ecl:#1e935c byr:2026

iyr:2012
ecl:gry eyr:2025 hcl:#602927 hgt:168cm byr:1925
pid:303312675

hgt:150in iyr:2014 ecl:gry eyr:2029
byr:2029
cid:228

ecl:#9524e0 byr:2026 hcl:z
iyr:2023
cid:325
eyr:1996
pid:6172325031 hgt:191

ecl:#689e88
eyr:1937
cid:75 byr:1963 iyr:2024
pid:4980937 hgt:156cm
hcl:#fffffd

pid:719820090 iyr:2020 hgt:165cm
hcl:#ceb3a1 byr:1997 ecl:blu eyr:2027

eyr:2025
pid:241723456
iyr:2011
byr:1953 cid:230 hgt:185cm hcl:#efcc98 ecl:oth

byr:1936 hcl:#623a2f
iyr:2010 hgt:156cm
eyr:2022
pid:064253102 ecl:brn

cid:332 hcl:#a97842 eyr:2026 ecl:gry iyr:2019 pid:#4e4a46
hgt:150cm
byr:1987

ecl:grn hgt:67in
iyr:2012
byr:1953 pid:910793005 hcl:#341e13 eyr:2020

iyr:2024 eyr:2030 cid:204 hgt:166cm pid:218828260
hcl:701b48 ecl:gry byr:1930

hgt:162cm pid:024916763 eyr:2026 ecl:hzl
hcl:#efcc98 iyr:2019 byr:1921

eyr:2025
iyr:2017 ecl:hzl hcl:#fffffd hgt:167cm pid:779214145

eyr:2022
hcl:#6b5442 byr:1941 ecl:grn hgt:169cm iyr:2014
pid:610328167

iyr:2026 cid:179 pid:193cm
ecl:#deb37c
byr:1958 eyr:2024
hgt:185cm

pid:907508207 ecl:oth byr:1941 iyr:2017 hcl:#341e13
eyr:2030 hgt:186cm

iyr:2018 byr:1925
ecl:brn eyr:2023 pid:903196231
hgt:159cm
hcl:#a97842 cid:323

hgt:185cm ecl:hzl eyr:2022 iyr:2020 pid:572453155 hcl:#fffffd

hcl:#a97842 ecl:blu pid:#ab3597 eyr:1964 byr:2030
hgt:181cm iyr:2018

ecl:blu
hcl:#602927
cid:234
hgt:68in eyr:2021 pid:257420555 iyr:2014 byr:1972

hcl:#7d3b0c eyr:2022
hgt:152cm byr:1974
iyr:2017
pid:353127736
ecl:gry

iyr:2018 eyr:2028 byr:1924 hcl:#69929e ecl:gry
hgt:68in pid:942207567

eyr:2028 cid:90
hgt:185cm
ecl:amb byr:1990 pid:947625812 hcl:#623a2f iyr:2011

eyr:2023 byr:1996 hgt:175cm
iyr:2012
hcl:#866857 ecl:blu
pid:437669135

byr:1937 eyr:2030
hcl:#866857 iyr:2017 pid:513963895 hgt:157cm
ecl:grn

iyr:2016 hcl:#623a2f eyr:2025
pid:559150893 hgt:176cm
byr:1920 ecl:amb

byr:1982
eyr:1961 ecl:hzl
hgt:167cm hcl:#888785 iyr:2011 cid:261 pid:709006236

pid:307171649 byr:1935 hcl:#888785 hgt:182cm ecl:brn eyr:2030 iyr:2013
cid:256

ecl:hzl
eyr:1998
byr:2009
hgt:153cm iyr:2010
hcl:#888785 pid:140487128

iyr:2019 cid:78
hgt:169cm
hcl:#888785 ecl:hzl byr:1997 eyr:2028

hgt:182in eyr:2025 hcl:#cfa07d ecl:#27a1c9 byr:2005 pid:8143047758

byr:2013 hgt:178in
eyr:1933
pid:829007679 iyr:2016 hcl:#783308
ecl:grn

cid:267 byr:1930 pid:949963673 eyr:2026
ecl:grn iyr:2020
hgt:188cm hcl:#6b5442

eyr:2022 pid:254482159
byr:1935 iyr:2017
ecl:hzl
hcl:#b6652a
hgt:165cm

hcl:109d15 hgt:72cm
cid:258 byr:2023 eyr:1987 ecl:grt iyr:2022

byr:1969
ecl:oth hgt:151cm
pid:578662559
eyr:2024 iyr:2015 hcl:#602927
cid:343

iyr:2011 byr:1989
ecl:brn eyr:2029 pid:123354233
hcl:#efcc98

hcl:#a97842 iyr:2010 pid:558586208
eyr:2029 byr:2002 ecl:amb
cid:225 hgt:152cm

eyr:2005 byr:2024 iyr:1924 ecl:gmt cid:186 pid:#886ae9
hcl:3cf4cd hgt:74cm

ecl:gry
eyr:2029
iyr:2013
hgt:178cm hcl:#7d3b0c

byr:1970 hcl:#6b5442 hgt:155cm iyr:2020 ecl:hzl
pid:698123164 eyr:2030 cid:185

hcl:#6b5442 ecl:hzl
iyr:2014 cid:324 pid:149063285 hgt:64in eyr:2023
byr:1949

hcl:#866857
eyr:2025
iyr:2012 cid:116 hgt:185cm
pid:416329937
ecl:grn byr:1962

iyr:2020 cid:55 byr:1985 hcl:#733820 pid:237883033 eyr:2020 ecl:blu

iyr:2020 hgt:71in
ecl:hzl byr:1960 cid:53 hcl:#888785 pid:590574853 eyr:2024

pid:834729501 iyr:2019 hgt:72in byr:1977
hcl:#604861 ecl:oth eyr:2024

pid:111536282 ecl:gry
hgt:69in eyr:2021 byr:1940
iyr:2019
hcl:#ceb3a1

hgt:186cm pid:045765056 ecl:gry byr:1958 iyr:2012
eyr:2025 hcl:#cfa07d

hgt:61in eyr:2023 pid:4189258985 ecl:brn iyr:1995
hcl:#602927 byr:2017

byr:1984 hcl:#866857
iyr:2013 pid:927074474 hgt:168cm
eyr:2021 ecl:oth

hgt:186cm
pid:948677443 iyr:2014 hcl:#866857 byr:1968 ecl:amb eyr:2027

eyr:2028 cid:260 hcl:#623a2f pid:500330326
iyr:2018 hgt:170cm
ecl:gry
byr:1960

hgt:71cm
pid:6209572 byr:1927 iyr:2011 ecl:utc hcl:3bc47a eyr:1984

hgt:164cm cid:160 iyr:2010
byr:1922 eyr:2024 hcl:#c0946f ecl:gry pid:867476938

cid:316
iyr:2015 hcl:#b6652a hgt:72cm pid:#c37dbf byr:2022 eyr:2036 ecl:#8bd8f4

iyr:2016 hgt:172cm
pid:482664712 ecl:hzl eyr:2024 hcl:#602927 byr:1945

eyr:2029 pid:883381915
hgt:174cm byr:1937 hcl:#fffffd ecl:gry cid:91

eyr:2029 pid:302832265 hcl:#ceb3a1 byr:2010
hgt:64 iyr:1960

hgt:170cm eyr:2030 pid:846949920
hcl:#ceb3a1
ecl:hzl iyr:2016 byr:1945

hcl:#efcc98
pid:406029852 eyr:2023 byr:1981 ecl:blu iyr:2013

pid:788563693 hcl:#a97842 hgt:172cm eyr:2022 ecl:brn iyr:2010 byr:2002

iyr:2013
hgt:60cm hcl:#7d3b0c pid:6594060725 ecl:#46a7d7 eyr:2023 byr:1995

cid:313 byr:1964 pid:102442749 eyr:2020
hgt:167cm
hcl:#341e13

ecl:grn hgt:163cm pid:405504213 cid:349 hcl:#733820 eyr:2029 iyr:2011

ecl:hzl pid:470689685 iyr:2015 byr:1980 hgt:180cm eyr:2027

eyr:2023 iyr:2013
hgt:189cm hcl:#866857 byr:1981
cid:313
ecl:brn pid:386584267

iyr:2011
hcl:#7d3b0c
eyr:2027
ecl:gry byr:1931
hgt:71in
pid:435568613

eyr:2021
pid:443386140 hgt:192cm iyr:2015 byr:1974

byr:1989 ecl:oth iyr:2011
eyr:2027
pid:761106563 hcl:#efcc98
hgt:60in

byr:1933 ecl:brn pid:607926472
hcl:#cfa07d eyr:2026
iyr:2010

ecl:hzl eyr:2027 hgt:175cm
pid:68527368
byr:1980 iyr:2017 hcl:#341e13

hgt:159cm pid:6199921925 iyr:1920 byr:1950 ecl:amb cid:229 eyr:2034

pid:060780170 ecl:gmt
eyr:1961 hgt:184cm hcl:#a97842 byr:2007

eyr:2025 byr:1970 ecl:brn hgt:183cm pid:423232940 hcl:#cfa07d cid:283

hcl:#18171d hgt:191cm
byr:1951
eyr:2029
pid:627632195 cid:268 iyr:2012

eyr:2025 iyr:2019 hgt:163cm
ecl:oth pid:967756889
byr:1938

hgt:160cm iyr:2015
ecl:#9cf598 pid:297446459 cid:123 byr:1968 eyr:1970
hcl:#efcc98

ecl:hzl pid:311990731 hgt:171cm hcl:#602927 byr:1978
eyr:2026 cid:254 iyr:2014

hcl:#8e0dfc
pid:961997362 byr:1950 eyr:2027 hgt:184in ecl:blu iyr:2015 cid:266

pid:953859016 iyr:2018 hcl:#341e13 ecl:grn cid:61
hgt:192cm
eyr:2022 byr:1920

eyr:2026 pid:149020634 byr:1942 iyr:2021 hcl:#6b5442
ecl:oth hgt:176in

eyr:2025 hgt:176cm
iyr:2020 ecl:oth hcl:#efcc98 pid:196082064 byr:2002

hgt:172in hcl:z
pid:#b454a0
ecl:#d7a600
byr:1977
eyr:2035 iyr:2014

cid:254 iyr:2020
pid:716596533
hcl:#341e13 byr:1947
hgt:150cm ecl:hzl eyr:2028

iyr:2019 pid:190601635 byr:1922 hcl:#18171d hgt:71in ecl:brn eyr:2021

byr:1938 iyr:2019 eyr:2028 pid:568504071 hcl:#efcc98 hgt:178cm ecl:amb

pid:921417345 eyr:2020 ecl:brn hcl:#c0946f
hgt:168cm
byr:1983 cid:170
iyr:2018

iyr:2020 cid:212 eyr:2002 pid:61850316 hgt:148 hcl:#b6652a
byr:2024 ecl:grn

hcl:z eyr:1985 iyr:2015 hgt:72cm ecl:brn pid:599880521

pid:166cm hcl:z
hgt:165 eyr:2036
cid:152 iyr:1943
ecl:zzz

eyr:2021 iyr:2014
hgt:156cm
pid:654181902 ecl:amb
byr:1946
hcl:#733820

iyr:2019
hgt:189cm byr:1940 pid:419593669 ecl:amb
cid:149 hcl:#fffffd eyr:2020

hgt:172cm
ecl:lzr pid:788208394 hcl:#341e13 cid:183
iyr:2020 eyr:2027 byr:1988

byr:2030 ecl:#d82c54 iyr:2014
hcl:#be9be7 eyr:2027 pid:1291285950 hgt:61cm

ecl:hzl
hcl:#a97842 hgt:186cm byr:1992 eyr:2022

iyr:2017 hgt:191cm pid:097984693 eyr:2025 byr:1963
cid:333
ecl:blu

ecl:zzz pid:425594420
byr:1983
hcl:z
eyr:2028 hgt:184cm
iyr:1937

hgt:167cm
eyr:2025 hcl:#623a2f pid:575911832
cid:305 byr:1939 iyr:2020

iyr:2015 hgt:179cm hcl:d678e0 byr:2030 pid:284187009 eyr:1977 cid:285

pid:405789549 byr:1982 eyr:2020 hcl:#623a2f
hgt:161cm iyr:2013 ecl:amb

pid:775860836 hgt:184cm hcl:#fffffd ecl:amb byr:1930 eyr:2022 iyr:2016

iyr:2020 byr:1979
eyr:2024 hgt:171cm
ecl:brn hcl:#ceb3a1 pid:853915000

iyr:2015 pid:244459567
hcl:#18171d cid:224 byr:1931 eyr:2022 hgt:169cm ecl:gry

iyr:2017 cid:308 eyr:2026 ecl:blu hgt:59in byr:1953
hcl:#ceb3a1 pid:466915764

hcl:#7d3b0c
byr:1940 iyr:2015
eyr:2020 pid:950614940 ecl:amb
hgt:179cm

byr:2010
cid:106 eyr:2022
iyr:2020 pid:336057617 ecl:brn hcl:f13e26
hgt:182cm

byr:1981 iyr:2017 hgt:152cm
hcl:#fffffd
eyr:2024 ecl:gry

cid:216 hgt:193cm
byr:1975 ecl:oth pid:684529055 iyr:2018 eyr:2020 hcl:#18171d

hgt:150cm
eyr:2028
hcl:#cfa07d ecl:grn
iyr:2018 byr:1951 pid:749102509

pid:937451204 hcl:#341e13 iyr:2020
hgt:171cm eyr:2021
byr:1941
ecl:hzl

cid:69
iyr:2014 eyr:2022 pid:174789690 hgt:157cm byr:1961 ecl:hzl
hcl:#a97842

hcl:#7d3b0c pid:658134059 hgt:65in byr:2005 ecl:#2dcb50 iyr:2012
eyr:2030

eyr:2027
hgt:68in ecl:oth hcl:#888785 iyr:2016 pid:181577931

iyr:1997 byr:1994
hgt:189cm
ecl:gry pid:564165515
eyr:2029 hcl:#ceb3a1

hcl:#602927 eyr:2024
cid:130
iyr:2015 ecl:blu
hgt:184cm byr:1996
pid:897871188

ecl:oth hcl:#623a2f
iyr:2016 pid:012591439 byr:1937 eyr:2022 hgt:176cm

eyr:2020
byr:1965
iyr:2013 hgt:193cm
hcl:#ceb3a1
ecl:hzl pid:177120440

byr:1934 iyr:2015 hcl:#341e13
pid:370860309 ecl:oth
eyr:2028 hgt:157cm

ecl:brn
byr:2001
iyr:2010
eyr:2028 hcl:#866857 hgt:183cm pid:194361427

hgt:182cm pid:449667574 ecl:amb
byr:1958 iyr:2017
hcl:#efcc98

iyr:2020 ecl:hzl eyr:2030 hgt:185cm byr:1969 hcl:#ceb3a1 pid:157651787

pid:893956434 eyr:2027 hgt:185cm hcl:#a97842
byr:1944 ecl:oth

byr:2011
iyr:2018
hcl:#623a2f hgt:159cm ecl:blu pid:174cm
eyr:2030

ecl:grt pid:520129782 eyr:2020
byr:2020 hcl:z cid:50 iyr:2017
hgt:156cm

iyr:2015
ecl:grn hcl:#83b224 eyr:2021 pid:554994156 hgt:179cm byr:1994

ecl:gry byr:1971 pid:772131254
eyr:2027 cid:201 hcl:#602927

cid:125
byr:1943 hgt:168cm ecl:hzl pid:418786991
eyr:2020 iyr:2016
hcl:#cfa07d

pid:825704567 eyr:2032 byr:2024
iyr:1926
hcl:d31139 hgt:190in

cid:243 hcl:#cfa07d byr:1951 ecl:oth pid:382615614
iyr:2018 eyr:2030 hgt:64in

byr:1925 hgt:187cm ecl:oth eyr:2023 hcl:#888785

eyr:2028 iyr:2013 ecl:brn byr:1923 cid:174 hcl:#b6652a hgt:154cm pid:274036240

ecl:brn hgt:183cm iyr:2016
byr:1922
hcl:#efcc98 eyr:2030

hgt:188cm
byr:1979
ecl:amb
eyr:2025 hcl:#b6652a cid:130
pid:646985829 iyr:2019

hgt:76cm hcl:z cid:112 ecl:zzz
pid:953385473 eyr:2020
byr:1943

ecl:#12c807
byr:1954 eyr:1934 hgt:73cm hcl:#ceb3a1 iyr:2015 pid:704621520

hgt:188cm hcl:#733820 eyr:2024 ecl:grn
iyr:2018 byr:1982 pid:522812862

hgt:68cm ecl:blu
byr:2023 pid:875418461 iyr:2021 eyr:2020 hcl:#623a2f

byr:1967
pid:313706535 ecl:amb hcl:#888785
iyr:2012
eyr:2026

eyr:2026
pid:288363970 cid:70 byr:1932 hgt:157cm iyr:2016 ecl:hzl hcl:#ceb3a1

byr:1992 pid:539896055
eyr:2023
cid:189 hgt:70in ecl:oth iyr:2019
hcl:#866857

hgt:158in
ecl:gry byr:2028
eyr:2036 cid:188
hcl:#cfa07d
pid:044279141

eyr:2024 hgt:170cm ecl:hzl
byr:1939 pid:851235247 iyr:2013
hcl:#fffffd

ecl:hzl hcl:#c0946f
hgt:167cm
eyr:2024 byr:1936 pid:463230636 cid:297
iyr:2016

pid:291401545 ecl:grn hcl:#b6652a iyr:2014
hgt:185cm eyr:2025 byr:1947

eyr:2029 pid:612595763
iyr:2018 ecl:gry
cid:290
byr:1991 hcl:#733820
hgt:150cm

hgt:151cm
pid:667532675 cid:134
byr:1930
hcl:#efcc98 iyr:2012
ecl:oth

ecl:gry
hcl:#888785 hgt:161cm
eyr:2023
pid:467759498 cid:274

eyr:2023 byr:1956 hgt:188cm iyr:2014 hcl:#b6652a pid:382721925 ecl:brn

byr:1947 ecl:gry eyr:2020
pid:874004905 hcl:#602927 hgt:161cm iyr:2029

pid:164334257
iyr:2014 cid:286 eyr:2020
hcl:#733820
ecl:gry byr:1959 hgt:165cm

hgt:59in
pid:#5b1362
eyr:2028 iyr:1980 hcl:z byr:2030
ecl:utc

pid:604128460 iyr:2016 byr:1952 hgt:152cm ecl:grn hcl:#7d3b0c eyr:2021

pid:7483106309 eyr:2005 hgt:158in byr:2024 iyr:1935 hcl:z
ecl:#158994

hcl:22207f eyr:1994
cid:166 pid:#d8e64c ecl:utc
byr:1966 hgt:70cm
iyr:1980

iyr:2012 pid:045892410 hgt:70in ecl:dne hcl:1a323a byr:1920 eyr:2022

hcl:#18171d iyr:2019 eyr:2026
hgt:191cm pid:514596186 cid:327 byr:1938 ecl:grn

pid:904148746 hcl:#a97842 hgt:161cm
cid:181
iyr:2012 eyr:2020 ecl:oth

iyr:2028
eyr:2034
cid:276 pid:#0e7ee2 byr:2020
hgt:63cm ecl:gry
hcl:z

pid:4270554593 eyr:2031 ecl:lzr hgt:72cm
iyr:2027 hcl:ffc210 cid:132
byr:2008

iyr:2018 pid:174cm cid:144
ecl:#10b2ed byr:1931 eyr:2040 hcl:z hgt:68in

pid:446746712
iyr:1957
ecl:oth cid:213 hgt:184cm byr:2008 hcl:z

hcl:#7d3b0c iyr:2012 ecl:hzl
eyr:2023 pid:270148060

pid:832184923
eyr:2023 hgt:180cm
byr:1965 ecl:hzl cid:189 hcl:#a97842
iyr:2016

pid:688867083
iyr:2011 hcl:#733820 cid:147 eyr:2021
byr:1986 ecl:oth

hgt:166in ecl:amb byr:2014
pid:169cm hcl:#cfa07d iyr:1976

hgt:64in byr:1987 hcl:01f3d7
pid:553206412 eyr:2027 ecl:grn cid:336
iyr:2012

cid:336
ecl:oth byr:1975
pid:296100726 hcl:#6b5442 iyr:2016 hgt:180cm eyr:2029

hcl:#ceb3a1 hgt:181cm pid:364719801 byr:1922 eyr:2029
iyr:2010 cid:346 ecl:gry

hcl:#1c7f1d cid:205
hgt:184cm
byr:1928
pid:694275035 iyr:2018 ecl:blu eyr:2023

eyr:1970
hcl:z byr:2001
pid:9244596 iyr:2030 hgt:187in ecl:blu

hgt:96
byr:2030 ecl:zzz eyr:1920 pid:115437655 hcl:z
iyr:2017
cid:344

iyr:2018
eyr:2023
hcl:#888785 hgt:188cm
ecl:amb byr:1992 pid:602211075

pid:848099019 hgt:168cm iyr:2016
eyr:2026 ecl:amb
hcl:#866857 byr:1981

iyr:2013 hcl:#623a2f hgt:151cm cid:135 byr:1974 eyr:2026 ecl:gry
pid:313553018

hcl:#733820
byr:1986 hgt:182cm
ecl:brn eyr:2024 iyr:2017
pid:676008782

eyr:2030 pid:833874339 iyr:2011 byr:1949 hgt:159cm
ecl:brn hcl:#602927

hgt:182cm hcl:#6b5442 pid:131549376 eyr:2029 iyr:2012
ecl:gry byr:1926

cid:55 ecl:amb iyr:2015 hgt:192cm hcl:#a97842
byr:1944
eyr:2027

iyr:1944 eyr:2038 hcl:a2adf2 cid:99 byr:2006 hgt:67cm
pid:154cm
ecl:dne

eyr:2005 hcl:#1495bd ecl:grt byr:2028
iyr:2016 hgt:155 pid:182cm
cid:326

hgt:136
pid:599182089 eyr:2020 byr:1945
iyr:2012
ecl:oth hcl:#18171d

pid:4695182580
iyr:2012
ecl:brn eyr:2039 byr:1936
hcl:#cfa07d

ecl:hzl byr:1949 cid:133 hgt:159cm hcl:#b6652a pid:9833212692 iyr:2011 eyr:2030

eyr:2020
hgt:175cm
cid:140 iyr:2014 byr:1980 hcl:#7d3b0c
ecl:grn pid:400508366

pid:#100a75 iyr:2016
hgt:65
eyr:2037 ecl:hzl
byr:1962

eyr:2024 pid:180cm hcl:#6b5442 hgt:154cm
iyr:1964

byr:1986 hgt:159cm ecl:brn
pid:856817592 hcl:#cfa07d eyr:2024
iyr:2017

hgt:166cm
byr:1996 hcl:#410645
ecl:hzl iyr:2010 cid:178 pid:337713295
eyr:2026

iyr:2017 byr:1964 hgt:167cm hcl:#7d3b0c cid:298 ecl:brn pid:371416367

byr:1929 iyr:2011 hcl:#fffffd ecl:blu
pid:013408674 hgt:187cm eyr:2021

hcl:#cfa07d byr:1986 cid:331
iyr:2010 ecl:gry pid:616063053 hgt:150cm
eyr:2028

pid:013835033 iyr:2017 byr:1991
hgt:154cm hcl:#efcc98 eyr:2020

byr:1978 eyr:2024
hgt:155cm iyr:2012 hcl:#694989 pid:914726069
ecl:amb

ecl:blu pid:139464317 hcl:#fffffd eyr:2024 byr:1970 hgt:72in iyr:2012

byr:1965 hcl:#ceb3a1 ecl:hzl iyr:2019 pid:910593212 eyr:2029

byr:1994 cid:228
ecl:grn hgt:171cm pid:538884417 eyr:2025 iyr:2011 hcl:#6b5442

cid:264 hcl:#623a2f
hgt:186cm iyr:2012 ecl:brn eyr:2024 pid:304101929 byr:1954

hgt:183cm byr:1987 hcl:z ecl:gry eyr:2020 pid:384983241 iyr:2015

pid:#885c1a
byr:2012 eyr:2034 ecl:#8ea705 iyr:2028 hgt:61cm hcl:z

eyr:2023 hgt:156cm byr:1939 hcl:#cd2220 ecl:brn pid:484163297

hgt:158in
byr:2000 ecl:lzr
iyr:2014
eyr:2033 pid:50157400

byr:1974 hcl:#c0946f
iyr:2018 pid:285451524 cid:299 eyr:2029 hgt:184cm ecl:hzl

byr:1974 hcl:#602927 hgt:151cm iyr:2013 pid:322935162 ecl:amb
cid:209
eyr:2026

hcl:#341e13 iyr:2015
ecl:gry byr:1970
hgt:186cm
pid:330151070 eyr:2034

ecl:gry eyr:2023
hgt:160cm hcl:#c0946f
iyr:2011 byr:1926 pid:727347794

iyr:2012
byr:1974 hcl:#866857
eyr:2025
pid:933155590 hgt:167cm
ecl:grn

iyr:2015 ecl:gry eyr:2029
byr:1967 hcl:#f9f576 hgt:170cm pid:439696954 cid:173

eyr:2029 byr:1935 ecl:brn pid:165587982
hcl:#6b5442
iyr:2020

eyr:2029 ecl:hzl hcl:#866857 byr:1994
pid:308548232 hgt:162cm iyr:2012

byr:1924 cid:274
pid:028266367 eyr:2025 iyr:2017 hgt:169cm
hcl:#cfa07d ecl:gry

eyr:2025 byr:1995
ecl:brn
hgt:160cm
pid:819047484
hcl:#602927 iyr:2011

pid:660383456
iyr:2016 eyr:2022 hgt:158cm byr:1942 ecl:amb cid:334 hcl:#efcc98

hcl:#6b5442 iyr:2024 cid:180 ecl:grn pid:167cm hgt:169

eyr:2024 iyr:2017 hgt:165cm hcl:#7d3b0c byr:1920
ecl:amb pid:236377188

pid:063113952
ecl:grn hcl:#341e13 hgt:166cm
byr:1977 iyr:2017

ecl:amb hgt:174cm
eyr:2028 byr:2002
hcl:#7d3b0c
pid:428826816 iyr:2017

byr:2025 ecl:dne hgt:167in pid:706379338
iyr:2019 hcl:240e75 eyr:1971

eyr:2021
hcl:#efcc98 iyr:2014
pid:358236477
byr:1923 cid:73 hgt:165cm ecl:amb

eyr:2030 cid:267
ecl:brn
pid:282023612 hcl:#c0946f iyr:2018 byr:1989
hgt:72cm

ecl:utc hcl:ea4b34 byr:2013
pid:#d58d54
hgt:107 iyr:2027 cid:296 eyr:2038

byr:1946 eyr:2024 iyr:2012
hcl:#341e13
pid:765835791 hgt:159cm

hcl:#341e13 byr:1927
ecl:grn iyr:2011
hgt:175cm eyr:2023 pid:638808763 cid:339

eyr:2030 cid:160 byr:1994 hgt:163cm ecl:hzl iyr:2016 hcl:#623a2f pid:569304871

byr:1965
eyr:2020 hgt:157cm hcl:#a97842
cid:271 iyr:2014 pid:326802068 ecl:#a16571

byr:1965
ecl:hzl eyr:2029 iyr:2010 hgt:157cm
hcl:#7d3b0c pid:617693914

pid:547158528 byr:1956
ecl:gry hgt:189cm
eyr:2029
hcl:#602927
iyr:2011

hcl:#efcc98
ecl:#1ecd0e pid:160cm eyr:2027 hgt:183cm byr:2027 iyr:1963

hcl:#fffffd eyr:2021 iyr:2014 byr:1959 ecl:amb
pid:102521439 hgt:190cm

cid:112 hcl:#fffffd byr:2025
pid:016603375
eyr:1942 hgt:145
iyr:1994

ecl:xry
pid:#5be367
hgt:171cm cid:144 iyr:1946 eyr:2034 hcl:z byr:2022

ecl:oth
iyr:2014 hcl:#7d3b0c
cid:316
byr:1936 pid:088295340
eyr:2029

iyr:2019
hgt:183cm ecl:brn hcl:#efcc98 pid:821190245 cid:251 eyr:2023
byr:1993

ecl:oth iyr:2018
cid:131
hcl:#524e2e byr:1981 hgt:183cm eyr:2022 pid:037981572

hcl:#18171d byr:1934 eyr:2020 hgt:62in
cid:64
ecl:oth pid:343039563 iyr:2010

hcl:#733820 pid:374199356
hgt:169cm eyr:2026 byr:1994 iyr:2015 ecl:brn

pid:394267581
hcl:#a97842 iyr:2010 byr:1988
hgt:185cm ecl:amb
eyr:2022

ecl:#be3b70 iyr:2025
hcl:z
eyr:2010
byr:2023
hgt:65 cid:220 pid:#d6af49

eyr:2029
hcl:#a97842 ecl:amb hgt:159cm
cid:228 byr:1946 iyr:2012
pid:805319194

hcl:#c0946f eyr:2020 hgt:171cm ecl:oth iyr:2010 byr:1958 pid:276122958

iyr:2017
hcl:#da47a1 byr:2007 ecl:utc
eyr:1945 cid:327 hgt:192cm pid:549704477

iyr:1923 hgt:174in hcl:z byr:1974
eyr:2026
ecl:xry pid:158cm

iyr:2022
ecl:#ae10f9
hgt:108
eyr:2035 hcl:z byr:2019 pid:#1f4f7c

eyr:2021 pid:959352732 cid:306 hgt:178cm ecl:amb
iyr:2012
byr:1953

byr:2016 ecl:lzr eyr:2021 hcl:z iyr:1977 hgt:181cm cid:164

cid:242 byr:2008 hcl:#866857 hgt:172cm iyr:2011
ecl:blu eyr:2026 pid:350658669

hgt:67in eyr:2030
ecl:gry pid:156329184 iyr:2010 byr:1936 hcl:#efcc98

cid:110 hgt:76in iyr:2018
eyr:2029 pid:474249956 byr:2002 hcl:#866857
ecl:oth

iyr:2016 hgt:193cm eyr:2029
byr:1934 hcl:#b6652a pid:901756621
ecl:brn

eyr:2017 hcl:z pid:#2f9848 iyr:2024
hgt:170cm

hgt:60in eyr:2026 byr:1922 hcl:#18171d iyr:2016
pid:921038878