Section 1 - Loading the Data

1.1

How many rows of data (observations) are in this dataset?

A:191641
Sys.setlocale("LC_ALL","C")
[1] "C"
nrow(mvt)
[1] 191641

1.2

How many variables are in this dataset?

A:11
ncol(mvt)
[1] 11

1.3

Using the “max” function, what is the maximum value of the variable “ID”?

A:9181151
max(mvt$ID)
[1] 9181151

1.4

What is the minimum value of the variable “Beat”?

A:111
min(mvt$Beat)
[1] 111

1.5

How many observations have value TRUE in the Arrest variable (this is the number of crimes for which an arrest was made)?

A:15536
summary(mvt$Arrest)
   Mode   FALSE    TRUE 
logical  176105   15536 

1.6

How many observations have a LocationDescription value of ALLEY?

A:2308
table(mvt$LocationDescription)

                             ABANDONED BUILDING 
                                              4 
AIRPORT BUILDING NON-TERMINAL - NON-SECURE AREA 
                                              4 
    AIRPORT BUILDING NON-TERMINAL - SECURE AREA 
                                              1 
             AIRPORT EXTERIOR - NON-SECURE AREA 
                                             24 
                 AIRPORT EXTERIOR - SECURE AREA 
                                              1 
                            AIRPORT PARKING LOT 
                                             11 
 AIRPORT TERMINAL UPPER LEVEL - NON-SECURE AREA 
                                              5 
                  AIRPORT VENDING ESTABLISHMENT 
                                             10 
                               AIRPORT/AIRCRAFT 
                                            363 
                                          ALLEY 
                                           2308 
                                ANIMAL HOSPITAL 
                                              1 
                                      APARTMENT 
                                            184 
                                APPLIANCE STORE 
                                              1 
                                  ATHLETIC CLUB 
                                              9 
                                           BANK 
                                              7 
                                  BAR OR TAVERN 
                                             17 
                                     BARBERSHOP 
                                              4 
                                  BOWLING ALLEY 
                                              3 
                                         BRIDGE 
                                              2 
                                       CAR WASH 
                                             44 
                                  CHA APARTMENT 
                                              5 
                        CHA PARKING LOT/GROUNDS 
                                            405 
              CHURCH/SYNAGOGUE/PLACE OF WORSHIP 
                                             56 
                                 CLEANING STORE 
                                              3 
                     COLLEGE/UNIVERSITY GROUNDS 
                                             47 
              COLLEGE/UNIVERSITY RESIDENCE HALL 
                                              2 
                   COMMERCIAL / BUSINESS OFFICE 
                                            126 
                              CONSTRUCTION SITE 
                                             35 
                              CONVENIENCE STORE 
                                              7 
                    CTA GARAGE / OTHER PROPERTY 
                                            148 
                                      CTA TRAIN 
                                              1 
                              CURRENCY EXCHANGE 
                                              2 
                                DAY CARE CENTER 
                                              5 
                               DEPARTMENT STORE 
                                             22 
                         DRIVEWAY - RESIDENTIAL 
                                           1675 
                                     DRUG STORE 
                                              8 
                 FACTORY/MANUFACTURING BUILDING 
                                             16 
                                   FIRE STATION 
                                              5 
                                FOREST PRESERVE 
                                              6 
                                    GAS STATION 
                                           2111 
                   GOVERNMENT BUILDING/PROPERTY 
                                             48 
                             GROCERY FOOD STORE 
                                             80 
                             HIGHWAY/EXPRESSWAY 
                                             22 
                      HOSPITAL BUILDING/GROUNDS 
                                            101 
                                    HOTEL/MOTEL 
                                            124 
                        JAIL / LOCK-UP FACILITY 
                                              1 
                 LAKEFRONT/WATERFRONT/RIVERBANK 
                                              4 
                                        LIBRARY 
                                              4 
                          MEDICAL/DENTAL OFFICE 
                                              3 
                            MOVIE HOUSE/THEATER 
                                             18 
                                      NEWSSTAND 
                                              1 
                   NURSING HOME/RETIREMENT HOME 
                                             21 
                                          OTHER 
                                           4573 
                OTHER COMMERCIAL TRANSPORTATION 
                                              8 
              OTHER RAILROAD PROP / TRAIN DEPOT 
                                             28 
                                  PARK PROPERTY 
                                            255 
                 PARKING LOT/GARAGE(NON.RESID.) 
                                          14852 
                POLICE FACILITY/VEH PARKING LOT 
                                            266 
                                      RESIDENCE 
                                           1302 
                               RESIDENCE-GARAGE 
                                           1176 
                        RESIDENCE PORCH/HALLWAY 
                                             18 
                  RESIDENTIAL YARD (FRONT/BACK) 
                                           1536 
                                     RESTAURANT 
                                             49 
                               SAVINGS AND LOAN 
                                              4 
                      SCHOOL, PRIVATE, BUILDING 
                                             14 
                       SCHOOL, PRIVATE, GROUNDS 
                                             23 
                       SCHOOL, PUBLIC, BUILDING 
                                            114 
                        SCHOOL, PUBLIC, GROUNDS 
                                            206 
                                       SIDEWALK 
                                            462 
                             SMALL RETAIL STORE 
                                             33 
                           SPORTS ARENA/STADIUM 
                                            166 
                                         STREET 
                                         156564 
                            TAVERN/LIQUOR STORE 
                                             14 
                                        TAXICAB 
                                             21 
                                VACANT LOT/LAND 
                                            985 
                             VEHICLE-COMMERCIAL 
                                             23 
                         VEHICLE NON-COMMERCIAL 
                                            817 
                                      WAREHOUSE 
                                             17 

Section 2 - Understanding Dates in R

In many datasets, like this one, you have a date field. Unfortunately, R does not automatically recognize entries that look like dates. We need to use a function in R to extract the date and time. Take a look at the first entry of Date (remember to use square brackets when looking at a certain entry of a variable).

2.1

In what format are the entries in the variable Date?

A:Month/Day/Year Hour:Minute
  • Month/Day/Year Hour:Minute
  • Day/Month/Year Hour:Minute
  • Hour:Minute Month/Day/Year
  • Hour:Minute Day/Month/Year
(mvt$Date)[1]
[1] 12/31/12 23:15
131680 Levels: 1/1/01 0:01 1/1/01 0:05 1/1/01 0:30 1/1/01 1:17 ... 9/9/12 9:50

2.2

Now, let’s convert these characters into a Date object in R. In your R console, type

DateConvert = as.Date(strptime(mvt$Date, "%m/%d/%y %H:%M"))

This converts the variable “Date” into a Date object in R. Take a look at the variable DateConvert using the summary function.

What is the month and year of the median date in our dataset? Enter your answer as “Month Year”, without the quotes. (Ex: if the answer was 2008-03-28, you would give the answer “March 2008”, without the quotes.)

A:May 2006
DateConvert = as.Date(strptime(mvt$Date, "%m/%d/%y %H:%M"))
summary(DateConvert)
        Min.      1st Qu.       Median         Mean      3rd Qu. 
"2001-01-01" "2003-07-10" "2006-05-21" "2006-08-23" "2009-10-24" 
        Max. 
"2012-12-31" 

2.3

Now, let’s extract the month and the day of the week, and add these variables to our data frame mvt. We can do this with two simple functions. Type the following commands in R:

mvt$Month = months(DateConvert)

mvt$Weekday = weekdays(DateConvert)

This creates two new variables in our data frame, Month and Weekday, and sets them equal to the month and weekday values that we can extract from the Date object. Lastly, replace the old Date variable with DateConvert by typing:

mvt$Date = DateConvert

Using the table command, answer the following questions.

In which month did the fewest motor vehicle thefts occur?

A:February
mvt$Month = months(DateConvert)
mvt$Weekday = weekdays(DateConvert)
mvt$Date = DateConvert
table(mvt$Month)

    April    August  December  February   January      July      June 
    15280     16572     16426     13511     16047     16801     16002 
    March       May  November   October September 
    15758     16035     16063     17086     16060 

2.4

On which weekday did the most motor vehicle thefts occur?

A:Friday
table(mvt$Weekday)

   Friday    Monday  Saturday    Sunday  Thursday   Tuesday Wednesday 
    29284     27397     27118     26316     27319     26791     27416 

2.5

Each observation in the dataset represents a motor vehicle theft, and the Arrest variable indicates whether an arrest was later made for this theft. Which month has the largest number of motor vehicle thefts for which an arrest was made?

A:January
table(mvt$Month, mvt$Arrest)
           
            FALSE  TRUE
  April     14028  1252
  August    15243  1329
  December  15029  1397
  February  12273  1238
  January   14612  1435
  July      15477  1324
  June      14772  1230
  March     14460  1298
  May       14848  1187
  November  14807  1256
  October   15744  1342
  September 14812  1248
LS0tDQp0aXRsZTogIkFTMS0xIEFuIEFuYWx5dGljYWwgRGV0ZWN0aXZlIg0KYXV0aG9yOiAi5ZSQ5oCd55CqIEIwNDEwMTAwMDQiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQotIC0gLSANCg0KIyMjIFNlY3Rpb24gMSAtIExvYWRpbmcgdGhlIERhdGENCg0KIyMjIyAxLjEgDQpIb3cgbWFueSByb3dzIG9mIGRhdGEgKG9ic2VydmF0aW9ucykgYXJlIGluIHRoaXMgZGF0YXNldD8NCg0KIyMjIyMgQToxOTE2NDENCg0KYGBge3J9DQpTeXMuc2V0bG9jYWxlKCJMQ19BTEwiLCJDIikNCm5yb3cobXZ0KQ0KYGBgDQoNCg0KIyMjIyAxLjIgDQpIb3cgbWFueSB2YXJpYWJsZXMgYXJlIGluIHRoaXMgZGF0YXNldD8NCg0KIyMjIyMgQToxMQ0KDQpgYGB7cn0NCm5jb2wobXZ0KQ0KYGBgDQoNCg0KIyMjIyAxLjMgDQpVc2luZyB0aGUgIm1heCIgZnVuY3Rpb24sIHdoYXQgaXMgdGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIHZhcmlhYmxlICJJRCI/ICANCg0KIyMjIyMgQTo5MTgxMTUxDQoNCmBgYHtyfQ0KbWF4KG12dCRJRCkNCmBgYA0KDQojIyMjIDEuNCANCldoYXQgaXMgdGhlIG1pbmltdW0gdmFsdWUgb2YgdGhlIHZhcmlhYmxlICJCZWF0Ij8NCg0KIyMjIyMgQToxMTENCg0KYGBge3J9DQptaW4obXZ0JEJlYXQpDQpgYGANCg0KIyMjIyAxLjUgDQpIb3cgbWFueSBvYnNlcnZhdGlvbnMgaGF2ZSB2YWx1ZSBUUlVFIGluIHRoZSBBcnJlc3QgdmFyaWFibGUgKHRoaXMgaXMgdGhlIG51bWJlciBvZiBjcmltZXMgZm9yIHdoaWNoIGFuIGFycmVzdCB3YXMgbWFkZSk/DQoNCiMjIyMjIEE6MTU1MzYNCg0KYGBge3J9DQpzdW1tYXJ5KG12dCRBcnJlc3QpDQpgYGANCg0KIyMjIyAxLjYgDQpIb3cgbWFueSBvYnNlcnZhdGlvbnMgaGF2ZSBhIExvY2F0aW9uRGVzY3JpcHRpb24gdmFsdWUgb2YgQUxMRVk/ICANCg0KIyMjIyMgQToyMzA4DQoNCmBgYHtyfQ0KdGFibGUobXZ0JExvY2F0aW9uRGVzY3JpcHRpb24pDQpgYGANCg0KIyMjIFNlY3Rpb24gMiAtIFVuZGVyc3RhbmRpbmcgRGF0ZXMgaW4gUg0KDQoNCkluIG1hbnkgZGF0YXNldHMsIGxpa2UgdGhpcyBvbmUsIHlvdSBoYXZlIGEgZGF0ZSBmaWVsZC4gVW5mb3J0dW5hdGVseSwgUiBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IHJlY29nbml6ZSBlbnRyaWVzIHRoYXQgbG9vayBsaWtlIGRhdGVzLiBXZSBuZWVkIHRvIHVzZSBhIGZ1bmN0aW9uIGluIFIgdG8gZXh0cmFjdCB0aGUgZGF0ZSBhbmQgdGltZS4gVGFrZSBhIGxvb2sgYXQgdGhlIGZpcnN0IGVudHJ5IG9mIERhdGUgKHJlbWVtYmVyIHRvIHVzZSBzcXVhcmUgYnJhY2tldHMgd2hlbiBsb29raW5nIGF0IGEgY2VydGFpbiBlbnRyeSBvZiBhIHZhcmlhYmxlKS4NCg0KIyMjIyAyLjEgDQpJbiB3aGF0IGZvcm1hdCBhcmUgdGhlIGVudHJpZXMgaW4gdGhlIHZhcmlhYmxlIERhdGU/ICANCg0KIyMjIyMgQTpNb250aC9EYXkvWWVhciBIb3VyOk1pbnV0ZQ0KDQorIE1vbnRoL0RheS9ZZWFyIEhvdXI6TWludXRlDQorIERheS9Nb250aC9ZZWFyIEhvdXI6TWludXRlDQorIEhvdXI6TWludXRlIE1vbnRoL0RheS9ZZWFyDQorIEhvdXI6TWludXRlIERheS9Nb250aC9ZZWFyDQoNCmBgYHtyfQ0KKG12dCREYXRlKVsxXQ0KYGBgDQoNCiMjIyMgMi4yIA0KDQpOb3csIGxldCdzIGNvbnZlcnQgdGhlc2UgY2hhcmFjdGVycyBpbnRvIGEgRGF0ZSBvYmplY3QgaW4gUi4gSW4geW91ciBSIGNvbnNvbGUsIHR5cGUNCg0KICAgIERhdGVDb252ZXJ0ID0gYXMuRGF0ZShzdHJwdGltZShtdnQkRGF0ZSwgIiVtLyVkLyV5ICVIOiVNIikpDQoNClRoaXMgY29udmVydHMgdGhlIHZhcmlhYmxlICJEYXRlIiBpbnRvIGEgRGF0ZSBvYmplY3QgaW4gUi4gVGFrZSBhIGxvb2sgYXQgdGhlIHZhcmlhYmxlIERhdGVDb252ZXJ0IHVzaW5nIHRoZSBzdW1tYXJ5IGZ1bmN0aW9uLg0KDQpXaGF0IGlzIHRoZSBtb250aCBhbmQgeWVhciBvZiB0aGUgbWVkaWFuIGRhdGUgaW4gb3VyIGRhdGFzZXQ/IEVudGVyIHlvdXIgYW5zd2VyIGFzICJNb250aCBZZWFyIiwgd2l0aG91dCB0aGUgcXVvdGVzLiAoRXg6IGlmIHRoZSBhbnN3ZXIgd2FzIDIwMDgtMDMtMjgsIHlvdSB3b3VsZCBnaXZlIHRoZSBhbnN3ZXIgIk1hcmNoIDIwMDgiLCB3aXRob3V0IHRoZSBxdW90ZXMuKSAgDQoNCiMjIyMjIEE6TWF5IDIwMDYNCg0KYGBge3J9DQpEYXRlQ29udmVydCA9IGFzLkRhdGUoc3RycHRpbWUobXZ0JERhdGUsICIlbS8lZC8leSAlSDolTSIpKQ0Kc3VtbWFyeShEYXRlQ29udmVydCkNCmBgYA0KDQojIyMjIDIuMw0KTm93LCBsZXQncyBleHRyYWN0IHRoZSBtb250aCBhbmQgdGhlIGRheSBvZiB0aGUgd2VlaywgYW5kIGFkZCB0aGVzZSB2YXJpYWJsZXMgdG8gb3VyIGRhdGEgZnJhbWUgbXZ0LiBXZSBjYW4gZG8gdGhpcyB3aXRoIHR3byBzaW1wbGUgZnVuY3Rpb25zLiBUeXBlIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgaW4gUjoNCg0KICAgIG12dCRNb250aCA9IG1vbnRocyhEYXRlQ29udmVydCkNCg0KICAgIG12dCRXZWVrZGF5ID0gd2Vla2RheXMoRGF0ZUNvbnZlcnQpDQoNClRoaXMgY3JlYXRlcyB0d28gbmV3IHZhcmlhYmxlcyBpbiBvdXIgZGF0YSBmcmFtZSwgTW9udGggYW5kIFdlZWtkYXksIGFuZCBzZXRzIHRoZW0gZXF1YWwgdG8gdGhlIG1vbnRoIGFuZCB3ZWVrZGF5IHZhbHVlcyB0aGF0IHdlIGNhbiBleHRyYWN0IGZyb20gdGhlIERhdGUgb2JqZWN0LiBMYXN0bHksIHJlcGxhY2UgdGhlIG9sZCBEYXRlIHZhcmlhYmxlIHdpdGggRGF0ZUNvbnZlcnQgYnkgdHlwaW5nOg0KDQogICAgbXZ0JERhdGUgPSBEYXRlQ29udmVydA0KDQpVc2luZyB0aGUgdGFibGUgY29tbWFuZCwgYW5zd2VyIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb25zLg0KDQpJbiB3aGljaCBtb250aCBkaWQgdGhlIGZld2VzdCBtb3RvciB2ZWhpY2xlIHRoZWZ0cyBvY2N1cj8gIA0KDQojIyMjIyBBOkZlYnJ1YXJ5DQoNCmBgYHtyfQ0KbXZ0JE1vbnRoID0gbW9udGhzKERhdGVDb252ZXJ0KQ0KbXZ0JFdlZWtkYXkgPSB3ZWVrZGF5cyhEYXRlQ29udmVydCkNCm12dCREYXRlID0gRGF0ZUNvbnZlcnQNCnRhYmxlKG12dCRNb250aCkNCmBgYA0KDQojIyMjIDIuNCANCk9uIHdoaWNoIHdlZWtkYXkgZGlkIHRoZSBtb3N0IG1vdG9yIHZlaGljbGUgdGhlZnRzIG9jY3VyPyAgDQoNCiMjIyMjIEE6RnJpZGF5DQoNCmBgYHtyfQ0KdGFibGUobXZ0JFdlZWtkYXkpDQpgYGANCg0KIyMjIyAyLjUgDQpFYWNoIG9ic2VydmF0aW9uIGluIHRoZSBkYXRhc2V0IHJlcHJlc2VudHMgYSBtb3RvciB2ZWhpY2xlIHRoZWZ0LCBhbmQgdGhlIEFycmVzdCB2YXJpYWJsZSBpbmRpY2F0ZXMgd2hldGhlciBhbiBhcnJlc3Qgd2FzIGxhdGVyIG1hZGUgZm9yIHRoaXMgdGhlZnQuIFdoaWNoIG1vbnRoIGhhcyB0aGUgbGFyZ2VzdCBudW1iZXIgb2YgbW90b3IgdmVoaWNsZSB0aGVmdHMgZm9yIHdoaWNoIGFuIGFycmVzdCB3YXMgbWFkZT8gIA0KDQojIyMjIyBBOkphbnVhcnkNCg0KYGBge3J9DQp0YWJsZShtdnQkTW9udGgsIG12dCRBcnJlc3QpDQpgYGANCg0KIyMjIFNlY3Rpb24gMyAtIFZpc3VhbGl6aW5nIENyaW1lIFRyZW5kcw0KDQojIyMjIDMuMQ0KDQpOb3csIGxldCdzIG1ha2Ugc29tZSBwbG90cyB0byBoZWxwIHVzIGJldHRlciB1bmRlcnN0YW5kIGhvdyBjcmltZSBoYXMgY2hhbmdlZCBvdmVyIHRpbWUgaW4gQ2hpY2Fnby4gVGhyb3VnaG91dCB0aGlzIHByb2JsZW0sIGFuZCBpbiBnZW5lcmFsLCB5b3UgY2FuIHNhdmUgeW91ciBwbG90IHRvIGEgZmlsZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHRoaXMgd2Vic2l0ZSB2ZXJ5IGNsZWFybHkgZXhwbGFpbnMgdGhlIHByb2Nlc3MuDQoNCkZpcnN0LCBsZXQncyBtYWtlIGEgaGlzdG9ncmFtIG9mIHRoZSB2YXJpYWJsZSBEYXRlLiBXZSdsbCBhZGQgYW4gZXh0cmEgYXJndW1lbnQsIHRvIHNwZWNpZnkgdGhlIG51bWJlciBvZiBiYXJzIHdlIHdhbnQgaW4gb3VyIGhpc3RvZ3JhbS4gSW4geW91ciBSIGNvbnNvbGUsIHR5cGUNCg0KaGlzdChtdnQkRGF0ZSwgYnJlYWtzPTEwMCkNCg0KYGBge3J9DQpoaXN0KG12dCREYXRlLCBicmVha3M9MTAwKQ0KYGBgDQoNCkxvb2tpbmcgYXQgdGhlIGhpc3RvZ3JhbSwgYW5zd2VyIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb25zLg0KDQpJbiBnZW5lcmFsLCBkb2VzIGl0IGxvb2sgbGlrZSBjcmltZSBpbmNyZWFzZXMgb3IgZGVjcmVhc2VzIGZyb20gMjAwMiAtIDIwMTI/ICANCg0KIyMjIyMgQTpEZWNyZWFzZXMNCg0KKyBJbmNyZWFzZXMNCisgRGVjcmVhc2VzDQoNCkluIGdlbmVyYWwsIGRvZXMgaXQgbG9vayBsaWtlIGNyaW1lIGluY3JlYXNlcyBvciBkZWNyZWFzZXMgZnJvbSAyMDA1IC0gMjAwOD8gIA0KDQojIyMjIyBBOkRlY3JlYXNlcw0KDQorIEluY3JlYXNlcw0KKyBEZWNyZWFzZXMNCg0KSW4gZ2VuZXJhbCwgZG9lcyBpdCBsb29rIGxpa2UgY3JpbWUgaW5jcmVhc2VzIG9yIGRlY3JlYXNlcyBmcm9tIDIwMDkgLSAyMDExPyAgDQoNCiMjIyMjIEE6SW5jcmVhc2VzDQoNCisgSW5jcmVhc2VzDQorIERlY3JlYXNlcw0KDQojIyMjIDMuMg0KTm93LCBsZXQncyBzZWUgaG93IGFycmVzdHMgaGF2ZSBjaGFuZ2VkIG92ZXIgdGltZS4gQ3JlYXRlIGEgYm94cGxvdCBvZiB0aGUgdmFyaWFibGUgIkRhdGUiLCBzb3J0ZWQgYnkgdGhlIHZhcmlhYmxlICJBcnJlc3QiIChpZiB5b3UgYXJlIG5vdCBmYW1pbGlhciB3aXRoIGJveHBsb3RzIGFuZCB3b3VsZCBsaWtlIHRvIGxlYXJuIG1vcmUsIGNoZWNrIG91dCB0aGlzIHR1dG9yaWFsKS4gSW4gYSBib3hwbG90LCB0aGUgYm9sZCBob3Jpem9udGFsIGxpbmUgaXMgdGhlIG1lZGlhbiB2YWx1ZSBvZiB0aGUgZGF0YSwgdGhlIGJveCBzaG93cyB0aGUgcmFuZ2Ugb2YgdmFsdWVzIGJldHdlZW4gdGhlIGZpcnN0IHF1YXJ0aWxlIGFuZCB0aGlyZCBxdWFydGlsZSwgYW5kIHRoZSB3aGlza2VycyAodGhlIGRvdHRlZCBsaW5lcyBleHRlbmRpbmcgb3V0c2lkZSB0aGUgYm94KSBzaG93IHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcywgZXhjbHVkaW5nIGFueSBvdXRsaWVycyAod2hpY2ggYXJlIHBsb3R0ZWQgYXMgY2lyY2xlcykuIE91dGxpZXJzIGFyZSBkZWZpbmVkIGJ5IGZpcnN0IGNvbXB1dGluZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgdGhpcmQgcXVhcnRpbGUgdmFsdWVzLCBvciB0aGUgaGVpZ2h0IG9mIHRoZSBib3guIFRoaXMgbnVtYmVyIGlzIGNhbGxlZCB0aGUgSW50ZXItUXVhcnRpbGUgUmFuZ2UgKElRUikuIEFueSBwb2ludCB0aGF0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgdGhpcmQgcXVhcnRpbGUgcGx1cyB0aGUgSVFSIG9yIGxlc3MgdGhhbiB0aGUgZmlyc3QgcXVhcnRpbGUgbWludXMgdGhlIElRUiBpcyBjb25zaWRlcmVkIGFuIG91dGxpZXIuDQoNCkRvZXMgaXQgbG9vayBsaWtlIHRoZXJlIHdlcmUgbW9yZSBjcmltZXMgZm9yIHdoaWNoIGFycmVzdHMgd2VyZSBtYWRlIGluIHRoZSBmaXJzdCBoYWxmIG9mIHRoZSB0aW1lIHBlcmlvZCBvciB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIHRpbWUgcGVyaW9kPyAoTm90ZSB0aGF0IHRoZSB0aW1lIHBlcmlvZCBpcyBmcm9tIDIwMDEgdG8gMjAxMiwgc28gdGhlIG1pZGRsZSBvZiB0aGUgdGltZSBwZXJpb2QgaXMgdGhlIGJlZ2lubmluZyBvZiAyMDA3LikgIA0KDQojIyMjIyBBOkZpcnN0IGhhbGYNCg0KKyBGaXJzdCBoYWxmDQorIFNlY29uZCBoYWxmDQoNCmBgYHtyfQ0KYm94cGxvdChtdnQkRGF0ZX5tdnQkQXJyZXN0KQ0KYGBgDQoNCg0KIyMjIyAzLjMNCkxldCdzIGludmVzdGlnYXRlIHRoaXMgZnVydGhlci4gVXNlIHRoZSB0YWJsZSBmdW5jdGlvbiBmb3IgdGhlIG5leHQgZmV3IHF1ZXN0aW9ucy4NCg0KRm9yIHdoYXQgcHJvcG9ydGlvbiBvZiBtb3RvciB2ZWhpY2xlIHRoZWZ0cyBpbiAyMDAxIHdhcyBhbiBhcnJlc3QgbWFkZT8gIA0KDQojIyMjIyBBOjAuMTA0MTE3Mw0KDQpOb3RlOiBpbiB0aGlzIHF1ZXN0aW9uIGFuZCBtYW55IG90aGVycyBpbiB0aGUgY291cnNlLCB3ZSBhcmUgYXNraW5nIGZvciBhbiBhbnN3ZXIgYXMgYSBwcm9wb3J0aW9uLiBUaGVyZWZvcmUsIHlvdXIgYW5zd2VyIHNob3VsZCB0YWtlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLg0KDQpgYGB7cn0NCnRhYmxlKG12dCRZZWFyLG12dCRBcnJlc3QpDQoyMTUyLygyMTUyKzE4NTE3KQ0KYGBgDQoNCiMjIyMgMy40DQpGb3Igd2hhdCBwcm9wb3J0aW9uIG9mIG1vdG9yIHZlaGljbGUgdGhlZnRzIGluIDIwMDcgd2FzIGFuIGFycmVzdCBtYWRlPyAgDQoNCiMjIyMjIEE6MC4wODQ4NzM5NQ0KDQpgYGB7cn0NCjEyMTIvKDEyMTIrMTMwNjgpDQpgYGANCg0KIyMjIyAzLjUNCkZvciB3aGF0IHByb3BvcnRpb24gb2YgbW90b3IgdmVoaWNsZSB0aGVmdHMgaW4gMjAxMiB3YXMgYW4gYXJyZXN0IG1hZGU/ICANCg0KIyMjIyMgQTowLjAzOTAyOTI0DQoNCmBgYHtyfQ0KNTUwLyg1NTArMTM1NDIpDQpgYGANCg0KU2luY2UgdGhlcmUgbWF5IHN0aWxsIGJlIG9wZW4gaW52ZXN0aWdhdGlvbnMgZm9yIHJlY2VudCBjcmltZXMsIHRoaXMgY291bGQgZXhwbGFpbiB0aGUgdHJlbmQgd2UgYXJlIHNlZWluZyBpbiB0aGUgZGF0YS4gVGhlcmUgY291bGQgYWxzbyBiZSBvdGhlciBmYWN0b3JzIGF0IHBsYXksIGFuZCB0aGlzIHRyZW5kIHNob3VsZCBiZSBpbnZlc3RpZ2F0ZWQgZnVydGhlci4gSG93ZXZlciwgc2luY2Ugd2UgZG9uJ3Qga25vdyB3aGVuIHRoZSBhcnJlc3RzIHdlcmUgYWN0dWFsbHkgbWFkZSwgb3VyIGRldGVjdGl2ZSB3b3JrIGluIHRoaXMgYXJlYSBoYXMgcmVhY2hlZCBhIGRlYWQgZW5kLg0KDQojIyMgU2VjdGlvbiA0IC0gUG9wdWxhciBMb2NhdGlvbnMNCg0KIyMjIyA0LjENCkFuYWx5emluZyB0aGlzIGRhdGEgY291bGQgYmUgdXNlZnVsIHRvIHRoZSBDaGljYWdvIFBvbGljZSBEZXBhcnRtZW50IHdoZW4gZGVjaWRpbmcgd2hlcmUgdG8gYWxsb2NhdGUgcmVzb3VyY2VzLiBJZiB0aGV5IHdhbnQgdG8gaW5jcmVhc2UgdGhlIG51bWJlciBvZiBhcnJlc3RzIHRoYXQgYXJlIG1hZGUgZm9yIG1vdG9yIHZlaGljbGUgdGhlZnRzLCB3aGVyZSBzaG91bGQgdGhleSBmb2N1cyB0aGVpciBlZmZvcnRzPw0KDQpXZSB3YW50IHRvIGZpbmQgdGhlIHRvcCBmaXZlIGxvY2F0aW9ucyB3aGVyZSBtb3RvciB2ZWhpY2xlIHRoZWZ0cyBvY2N1ci4gSWYgeW91IGNyZWF0ZSBhIHRhYmxlIG9mIHRoZSBMb2NhdGlvbkRlc2NyaXB0aW9uIHZhcmlhYmxlLCBpdCBpcyB1bmZvcnR1bmF0ZWx5IHZlcnkgaGFyZCB0byByZWFkIHNpbmNlIHRoZXJlIGFyZSA3OCBkaWZmZXJlbnQgbG9jYXRpb25zIGluIHRoZSBkYXRhIHNldC4gQnkgdXNpbmcgdGhlIHNvcnQgZnVuY3Rpb24sIHdlIGNhbiB2aWV3IHRoaXMgc2FtZSB0YWJsZSwgYnV0IHNvcnRlZCBieSB0aGUgbnVtYmVyIG9mIG9ic2VydmF0aW9ucyBpbiBlYWNoIGNhdGVnb3J5LiBJbiB5b3VyIFIgY29uc29sZSwgdHlwZToNCg0KICAgIHNvcnQodGFibGUobXZ0JExvY2F0aW9uRGVzY3JpcHRpb24pKQ0KDQpXaGljaCBsb2NhdGlvbnMgYXJlIHRoZSB0b3AgZml2ZSBsb2NhdGlvbnMgZm9yIG1vdG9yIHZlaGljbGUgdGhlZnRzLCBleGNsdWRpbmcgdGhlICJPdGhlciIgY2F0ZWdvcnk/IFlvdSBzaG91bGQgc2VsZWN0IDUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zLiAgDQoNCiMjIyMjIEE6U3RyZWV0LCBQYXJraW5nIExvdC9HYXJhZ2UgKE5vbi4gUmVzaWQuKSwgQWxsZXksIEdhcyBTdGF0aW9uLCBhbmQgRHJpdmV3YXkgLSBSZXNpZGVudGlhbC4NCg0KKyBCYW5rDQorIEdhcyBTdGF0aW9uDQorIEhvdGVsL01vdGVsDQorIFN0cmVldA0KKyBDYXIgV2FzaA0KKyBSZXN0YXVyYW50DQorIFBhcmtpbmcgTG90L0dhcmFnZSAoTm9uLVJlc2lkZW50aWFsKQ0KKyBBbGxleQ0KKyBEcml2ZXdheSAoUmVzaWRlbnRpYWwpDQorIFZhY2FudCBMb3QvTGFuZA0KDQpgYGB7cn0NCnNvcnQodGFibGUobXZ0JExvY2F0aW9uRGVzY3JpcHRpb24pKQ0KYGBgDQoNCiMjIyMgNC4yIA0KQ3JlYXRlIGEgc3Vic2V0IG9mIHlvdXIgZGF0YSwgb25seSB0YWtpbmcgb2JzZXJ2YXRpb25zIGZvciB3aGljaCB0aGUgdGhlZnQgaGFwcGVuZWQgaW4gb25lIG9mIHRoZXNlIGZpdmUgbG9jYXRpb25zLCBhbmQgY2FsbCB0aGlzIG5ldyBkYXRhIHNldCAiVG9wNSIuIFRvIGRvIHRoaXMsIHlvdSBjYW4gdXNlIHRoZSB8IHN5bWJvbC4gSW4gbGVjdHVyZSwgd2UgdXNlZCB0aGUgJiBzeW1ib2wgdG8gdXNlIHR3byBjcml0ZXJpYSB0byBtYWtlIGEgc3Vic2V0IG9mIHRoZSBkYXRhLiBUbyBvbmx5IHRha2Ugb2JzZXJ2YXRpb25zIHRoYXQgaGF2ZSBhIGNlcnRhaW4gdmFsdWUgaW4gb25lIHZhcmlhYmxlIG9yIHRoZSBvdGhlciwgdGhlIHwgY2hhcmFjdGVyIGNhbiBiZSB1c2VkIGluIHBsYWNlIG9mIHRoZSAmIHN5bWJvbC4gVGhpcyBpcyBhbHNvIGNhbGxlZCBhIGxvZ2ljYWwgIm9yIiBvcGVyYXRpb24uDQoNCkFsdGVybmF0ZWx5LCB5b3UgY291bGQgY3JlYXRlIGZpdmUgZGlmZmVyZW50IHN1YnNldHMsIGFuZCB0aGVuIG1lcmdlIHRoZW0gdG9nZXRoZXIgaW50byBvbmUgZGF0YSBmcmFtZSB1c2luZyByYmluZC4NCg0KSG93IG1hbnkgb2JzZXJ2YXRpb25zIGFyZSBpbiBUb3A1PyAgDQoNCiMjIyMjIEE6MTc3NTEwDQoNCmBgYHtyfQ0KVG9wNSA9IHN1YnNldChtdnQsTG9jYXRpb25EZXNjcmlwdGlvbj09IlNUUkVFVCJ8TG9jYXRpb25EZXNjcmlwdGlvbj09IlBBUktJTkcgTE9UL0dBUkFHRShOT04uUkVTSUQuKSJ8TG9jYXRpb25EZXNjcmlwdGlvbj09IkFMTEVZInxMb2NhdGlvbkRlc2NyaXB0aW9uPT0iR0FTIFNUQVRJT04ifExvY2F0aW9uRGVzY3JpcHRpb249PSJEUklWRVdBWSAtIFJFU0lERU5USUFMIikNCnN0cihUb3A1KQ0KYGBgDQoNCiMjIyMgNC4zDQpSIHdpbGwgcmVtZW1iZXIgdGhlIG90aGVyIGNhdGVnb3JpZXMgb2YgdGhlIExvY2F0aW9uRGVzY3JpcHRpb24gdmFyaWFibGUgZnJvbSB0aGUgb3JpZ2luYWwgZGF0YXNldCwgc28gcnVubmluZyB0YWJsZShUb3A1JExvY2F0aW9uRGVzY3JpcHRpb24pIHdpbGwgaGF2ZSBhIGxvdCBvZiB1bm5lY2Vzc2FyeSBvdXRwdXQuIFRvIG1ha2Ugb3VyIHRhYmxlcyBhIGJpdCBuaWNlciB0byByZWFkLCB3ZSBjYW4gcmVmcmVzaCB0aGlzIGZhY3RvciB2YXJpYWJsZS4gSW4geW91ciBSIGNvbnNvbGUsIHR5cGU6DQoNCiAgICBUb3A1JExvY2F0aW9uRGVzY3JpcHRpb24gPSBmYWN0b3IoVG9wNSRMb2NhdGlvbkRlc2NyaXB0aW9uKQ0KDQpJZiB5b3UgcnVuIHRoZSBzdHIgb3IgdGFibGUgZnVuY3Rpb24gb24gVG9wNSBub3csIHlvdSBzaG91bGQgc2VlIHRoYXQgTG9jYXRpb25EZXNjcmlwdGlvbiBub3cgb25seSBoYXMgNSB2YWx1ZXMsIGFzIHdlIGV4cGVjdC4NCg0KVXNlIHRoZSBUb3A1IGRhdGEgZnJhbWUgdG8gYW5zd2VyIHRoZSByZW1haW5pbmcgcXVlc3Rpb25zLg0KDQpPbmUgb2YgdGhlIGxvY2F0aW9ucyBoYXMgYSBtdWNoIGhpZ2hlciBhcnJlc3QgcmF0ZSB0aGFuIHRoZSBvdGhlciBsb2NhdGlvbnMuIFdoaWNoIGlzIGl0PyBQbGVhc2UgZW50ZXIgdGhlIHRleHQgaW4gZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMgaG93IGl0IGxvb2tzIGluIHRoZSBhbnN3ZXIgb3B0aW9ucyBmb3IgUHJvYmxlbSA0LjEuICANCg0KIyMjIyMgQTpHQVMgU1RBVElPTg0KDQpgYGB7cn0NClRvcDUkTG9jYXRpb25EZXNjcmlwdGlvbiA9IGZhY3RvcihUb3A1JExvY2F0aW9uRGVzY3JpcHRpb24pDQp0YWJsZShUb3A1JExvY2F0aW9uRGVzY3JpcHRpb24sVG9wNSRBcnJlc3QpDQoyNDkvKDI0OSsyMDU5KQ0KMTMyLygxMzIrMTU0MykNCjQzOS8oNDM5KzE2NzIpDQoxNjAzLygxNjAzKzEzMjQ5KQ0KMTE1OTUvKDExNTk1KzE0NDk2OSkNCmBgYA0KDQoNCiMjIyMgNC40IA0KT24gd2hpY2ggZGF5IG9mIHRoZSB3ZWVrIGRvIHRoZSBtb3N0IG1vdG9yIHZlaGljbGUgdGhlZnRzIGF0IGdhcyBzdGF0aW9ucyBoYXBwZW4/KE1vbmRheX5TdW5kYXkpDQoNCiMjIyMjIEE6U2F0dXJkYXkNCg0KYGBge3J9DQp0YWJsZShUb3A1JFdlZWtkYXksVG9wNSRMb2NhdGlvbkRlc2NyaXB0aW9uKQ0KYGBgDQoNCiMjIyMgNC41DQpPbiB3aGljaCBkYXkgb2YgdGhlIHdlZWsgZG8gdGhlIGZld2VzdCBtb3RvciB2ZWhpY2xlIHRoZWZ0cyBpbiByZXNpZGVudGlhbCBkcml2ZXdheXMgaGFwcGVuPyhNb25kYXl+U3VuZGF5KSAgDQoNCiMjIyMjIEE6U2F0dXJkYXkNCg0KYGBge3J9DQp0YWJsZShUb3A1JFdlZWtkYXksVG9wNSRMb2NhdGlvbkRlc2NyaXB0aW9uKQ0KYGBgDQoNCg0KDQo=