Section 1 - Loading the Data

1.1

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

mvt = read.csv("Unit1/mvtWeek1.csv")
nrow(mvt)
[1] 191641

1.2

How many variables are in this dataset?

str(mvt)
'data.frame':   191641 obs. of  11 variables:
 $ ID                 : int  8951354 8951141 8952745 8952223 8951608 8950793 8950760 8951611 8951802 8950706 ...
 $ Date               : Factor w/ 131680 levels "1/1/01 0:01",..: 42824 42823 42823 42823 42822 42821 42820 42819 42817 42816 ...
 $ LocationDescription: Factor w/ 78 levels "ABANDONED BUILDING",..: 72 72 62 72 72 72 72 72 72 72 ...
 $ Arrest             : logi  FALSE FALSE FALSE FALSE FALSE TRUE ...
 $ Domestic           : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ Beat               : int  623 1213 1622 724 211 2521 423 231 1021 1215 ...
 $ District           : int  6 12 16 7 2 25 4 2 10 12 ...
 $ CommunityArea      : int  69 24 11 67 35 19 48 40 29 24 ...
 $ Year               : int  2012 2012 2012 2012 2012 2012 2012 2012 2012 2012 ...
 $ Latitude           : num  41.8 41.9 42 41.8 41.8 ...
 $ Longitude          : num  -87.6 -87.7 -87.8 -87.7 -87.6 ...

1.3

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

max(mvt$ID)
[1] 9181151

1.4

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

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)?

summary(mvt)
       ID                      Date       
 Min.   :1310022   5/16/08 0:00  :    11  
 1st Qu.:2832144   10/17/01 22:00:    10  
 Median :4762956   4/13/04 21:00 :    10  
 Mean   :4968629   9/17/05 22:00 :    10  
 3rd Qu.:7201878   10/12/01 22:00:     9  
 Max.   :9181151   10/13/01 22:00:     9  
                   (Other)       :191582  
                     LocationDescription
 STREET                        :156564  
 PARKING LOT/GARAGE(NON.RESID.): 14852  
 OTHER                         :  4573  
 ALLEY                         :  2308  
 GAS STATION                   :  2111  
 DRIVEWAY - RESIDENTIAL        :  1675  
 (Other)                       :  9558  
   Arrest         Domestic            Beat     
 Mode :logical   Mode :logical   Min.   : 111  
 FALSE:176105    FALSE:191226    1st Qu.: 722  
 TRUE :15536     TRUE :415       Median :1121  
                                 Mean   :1259  
                                 3rd Qu.:1733  
                                 Max.   :2535  
                                               
    District     CommunityArea        Year     
 Min.   : 1.00   Min.   : 0      Min.   :2001  
 1st Qu.: 6.00   1st Qu.:22      1st Qu.:2003  
 Median :10.00   Median :32      Median :2006  
 Mean   :11.82   Mean   :38      Mean   :2006  
 3rd Qu.:17.00   3rd Qu.:60      3rd Qu.:2009  
 Max.   :31.00   Max.   :77      Max.   :2012  
 NA's   :43056   NA's   :24616                 
    Latitude       Longitude     
 Min.   :41.64   Min.   :-87.93  
 1st Qu.:41.77   1st Qu.:-87.72  
 Median :41.85   Median :-87.68  
 Mean   :41.84   Mean   :-87.68  
 3rd Qu.:41.92   3rd Qu.:-87.64  
 Max.   :42.02   Max.   :-87.52  
 NA's   :2276    NA's   :2276    

1.6

How many observations have a LocationDescription value of ALLEY?

summary(mvt)
       ID                      Date       
 Min.   :1310022   5/16/08 0:00  :    11  
 1st Qu.:2832144   10/17/01 22:00:    10  
 Median :4762956   4/13/04 21:00 :    10  
 Mean   :4968629   9/17/05 22:00 :    10  
 3rd Qu.:7201878   10/12/01 22:00:     9  
 Max.   :9181151   10/13/01 22:00:     9  
                   (Other)       :191582  
                     LocationDescription
 STREET                        :156564  
 PARKING LOT/GARAGE(NON.RESID.): 14852  
 OTHER                         :  4573  
 ALLEY                         :  2308  
 GAS STATION                   :  2111  
 DRIVEWAY - RESIDENTIAL        :  1675  
 (Other)                       :  9558  
   Arrest         Domestic            Beat     
 Mode :logical   Mode :logical   Min.   : 111  
 FALSE:176105    FALSE:191226    1st Qu.: 722  
 TRUE :15536     TRUE :415       Median :1121  
                                 Mean   :1259  
                                 3rd Qu.:1733  
                                 Max.   :2535  
                                               
    District     CommunityArea        Year     
 Min.   : 1.00   Min.   : 0      Min.   :2001  
 1st Qu.: 6.00   1st Qu.:22      1st Qu.:2003  
 Median :10.00   Median :32      Median :2006  
 Mean   :11.82   Mean   :38      Mean   :2006  
 3rd Qu.:17.00   3rd Qu.:60      3rd Qu.:2009  
 Max.   :31.00   Max.   :77      Max.   :2012  
 NA's   :43056   NA's   :24616                 
    Latitude       Longitude     
 Min.   :41.64   Min.   :-87.93  
 1st Qu.:41.77   1st Qu.:-87.72  
 Median :41.85   Median :-87.68  
 Mean   :41.84   Mean   :-87.68  
 3rd Qu.:41.92   3rd Qu.:-87.64  
 Max.   :42.02   Max.   :-87.52  
 NA's   :2276    NA's   :2276    

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?

  • Month/Day/Year Hour:Minute
  • Day/Month/Year Hour:Minute
  • Hour:Minute Month/Day/Year
  • Hour:Minute Day/Month/Year
summary(mvt)
       ID                      Date       
 Min.   :1310022   5/16/08 0:00  :    11  
 1st Qu.:2832144   10/17/01 22:00:    10  
 Median :4762956   4/13/04 21:00 :    10  
 Mean   :4968629   9/17/05 22:00 :    10  
 3rd Qu.:7201878   10/12/01 22:00:     9  
 Max.   :9181151   10/13/01 22:00:     9  
                   (Other)       :191582  
                     LocationDescription
 STREET                        :156564  
 PARKING LOT/GARAGE(NON.RESID.): 14852  
 OTHER                         :  4573  
 ALLEY                         :  2308  
 GAS STATION                   :  2111  
 DRIVEWAY - RESIDENTIAL        :  1675  
 (Other)                       :  9558  
   Arrest         Domestic            Beat     
 Mode :logical   Mode :logical   Min.   : 111  
 FALSE:176105    FALSE:191226    1st Qu.: 722  
 TRUE :15536     TRUE :415       Median :1121  
                                 Mean   :1259  
                                 3rd Qu.:1733  
                                 Max.   :2535  
                                               
    District     CommunityArea        Year     
 Min.   : 1.00   Min.   : 0      Min.   :2001  
 1st Qu.: 6.00   1st Qu.:22      1st Qu.:2003  
 Median :10.00   Median :32      Median :2006  
 Mean   :11.82   Mean   :38      Mean   :2006  
 3rd Qu.:17.00   3rd Qu.:60      3rd Qu.:2009  
 Max.   :31.00   Max.   :77      Max.   :2012  
 NA's   :43056   NA's   :24616                 
    Latitude       Longitude     
 Min.   :41.64   Min.   :-87.93  
 1st Qu.:41.77   1st Qu.:-87.72  
 Median :41.85   Median :-87.68  
 Mean   :41.84   Mean   :-87.68  
 3rd Qu.:41.92   3rd Qu.:-87.64  
 Max.   :42.02   Max.   :-87.52  
 NA's   :2276    NA's   :2276    

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.)

median(DateConvert)
[1] "2006-05-21"

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?

table(mvt$Month)

 10月  11月  12月   1月   2月   3月   4月   5月   6月 
17086 16063 16426 16047 13511 15758 15280 16035 16002 
  7月   8月   9月 
16801 16572 16060 

2.4

On which weekday did the most motor vehicle thefts occur?

table(mvt$Weekday)

 周二  周六  周日  周三  周四  周五  周一 
26791 27118 26316 27416 27319 29284 27397 

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?

table(mvt$Arrest,mvt$Month)
       
         10月  11月  12月   1月   2月   3月   4月
  FALSE 15744 14807 15029 14612 12273 14460 14028
  TRUE   1342  1256  1397  1435  1238  1298  1252
       
          5月   6月   7月   8月   9月
  FALSE 14848 14772 15477 15243 14812
  TRUE   1187  1230  1324  1329  1248
LS0tCnRpdGxlOiAiQVMxLTEgQW4gQW5hbHl0aWNhbCBEZXRlY3RpdmUiCmF1dGhvcjogIjxuYW1lPiA8c3R1ZGVudCBJRD4iCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCi0gLSAtIAoKIyMjIFNlY3Rpb24gMSAtIExvYWRpbmcgdGhlIERhdGEKCiMjIyMgMS4xIApIb3cgbWFueSByb3dzIG9mIGRhdGEgKG9ic2VydmF0aW9ucykgYXJlIGluIHRoaXMgZGF0YXNldD8KCmBgYHtyfQptdnQgPSByZWFkLmNzdigiVW5pdDEvbXZ0V2VlazEuY3N2IikKbnJvdyhtdnQpCmBgYAoKCiMjIyMgMS4yIApIb3cgbWFueSB2YXJpYWJsZXMgYXJlIGluIHRoaXMgZGF0YXNldD8KYGBge3J9CnN0cihtdnQpCgpgYGAKCgojIyMjIDEuMyAKVXNpbmcgdGhlICJtYXgiIGZ1bmN0aW9uLCB3aGF0IGlzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSAiSUQiPwoKYGBge3J9CnN1bW1hcnkobXZ0KQptYXgobXZ0JElEKQpgYGAKCiMjIyMgMS40IApXaGF0IGlzIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSAiQmVhdCI/CmBgYHtyfQptaW4obXZ0JEJlYXQpCmBgYAoKIyMjIyAxLjUgCkhvdyBtYW55IG9ic2VydmF0aW9ucyBoYXZlIHZhbHVlIFRSVUUgaW4gdGhlIEFycmVzdCB2YXJpYWJsZSAodGhpcyBpcyB0aGUgbnVtYmVyIG9mIGNyaW1lcyBmb3Igd2hpY2ggYW4gYXJyZXN0IHdhcyBtYWRlKT8KCmBgYHtyfQpzdW1tYXJ5KG12dCkKCmBgYAoKIyMjIyAxLjYgCkhvdyBtYW55IG9ic2VydmF0aW9ucyBoYXZlIGEgTG9jYXRpb25EZXNjcmlwdGlvbiB2YWx1ZSBvZiBBTExFWT8KCmBgYHtyfQpzdW1tYXJ5KG12dCkKYGBgCgojIyMgU2VjdGlvbiAyIC0gVW5kZXJzdGFuZGluZyBEYXRlcyBpbiBSCgoKSW4gbWFueSBkYXRhc2V0cywgbGlrZSB0aGlzIG9uZSwgeW91IGhhdmUgYSBkYXRlIGZpZWxkLiBVbmZvcnR1bmF0ZWx5LCBSIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgcmVjb2duaXplIGVudHJpZXMgdGhhdCBsb29rIGxpa2UgZGF0ZXMuIFdlIG5lZWQgdG8gdXNlIGEgZnVuY3Rpb24gaW4gUiB0byBleHRyYWN0IHRoZSBkYXRlIGFuZCB0aW1lLiBUYWtlIGEgbG9vayBhdCB0aGUgZmlyc3QgZW50cnkgb2YgRGF0ZSAocmVtZW1iZXIgdG8gdXNlIHNxdWFyZSBicmFja2V0cyB3aGVuIGxvb2tpbmcgYXQgYSBjZXJ0YWluIGVudHJ5IG9mIGEgdmFyaWFibGUpLgoKIyMjIyAyLjEgCkluIHdoYXQgZm9ybWF0IGFyZSB0aGUgZW50cmllcyBpbiB0aGUgdmFyaWFibGUgRGF0ZT8KCisgTW9udGgvRGF5L1llYXIgSG91cjpNaW51dGUKKyBEYXkvTW9udGgvWWVhciBIb3VyOk1pbnV0ZQorIEhvdXI6TWludXRlIE1vbnRoL0RheS9ZZWFyCisgSG91cjpNaW51dGUgRGF5L01vbnRoL1llYXIKCmBgYHtyfQpzdW1tYXJ5KG12dCkKSXQgaXMgb2J2aW91cyB0aGF0IHRoZSBEYXRlIHZhcmlhYmxlIGlzIGluIHRoZSBNb250aC9EYXkvWWVhciBIb3VyOk1pbnV0ZSBmb3JtYXQuCgpgYGAKCiMjIyMgMi4yIAoKTm93LCBsZXQncyBjb252ZXJ0IHRoZXNlIGNoYXJhY3RlcnMgaW50byBhIERhdGUgb2JqZWN0IGluIFIuIEluIHlvdXIgUiBjb25zb2xlLCB0eXBlCgogICAgRGF0ZUNvbnZlcnQgPSBhcy5EYXRlKHN0cnB0aW1lKG12dCREYXRlLCAiJW0vJWQvJXkgJUg6JU0iKSkKClRoaXMgY29udmVydHMgdGhlIHZhcmlhYmxlICJEYXRlIiBpbnRvIGEgRGF0ZSBvYmplY3QgaW4gUi4gVGFrZSBhIGxvb2sgYXQgdGhlIHZhcmlhYmxlIERhdGVDb252ZXJ0IHVzaW5nIHRoZSBzdW1tYXJ5IGZ1bmN0aW9uLgoKV2hhdCBpcyB0aGUgbW9udGggYW5kIHllYXIgb2YgdGhlIG1lZGlhbiBkYXRlIGluIG91ciBkYXRhc2V0PyBFbnRlciB5b3VyIGFuc3dlciBhcyAiTW9udGggWWVhciIsIHdpdGhvdXQgdGhlIHF1b3Rlcy4gKEV4OiBpZiB0aGUgYW5zd2VyIHdhcyAyMDA4LTAzLTI4LCB5b3Ugd291bGQgZ2l2ZSB0aGUgYW5zd2VyICJNYXJjaCAyMDA4Iiwgd2l0aG91dCB0aGUgcXVvdGVzLikKCmBgYHtyfQpEYXRlQ29udmVydCA9IGFzLkRhdGUoc3RycHRpbWUobXZ0JERhdGUsICIlbS8lZC8leSAlSDolTSIpKQpzdW1tYXJ5KERhdGVDb252ZXJ0KQptZWRpYW4oRGF0ZUNvbnZlcnQpCkFOU1dFUjogTWF5IDIwMDYKYGBgCgojIyMjIDIuMwpOb3csIGxldCdzIGV4dHJhY3QgdGhlIG1vbnRoIGFuZCB0aGUgZGF5IG9mIHRoZSB3ZWVrLCBhbmQgYWRkIHRoZXNlIHZhcmlhYmxlcyB0byBvdXIgZGF0YSBmcmFtZSBtdnQuIFdlIGNhbiBkbyB0aGlzIHdpdGggdHdvIHNpbXBsZSBmdW5jdGlvbnMuIFR5cGUgdGhlIGZvbGxvd2luZyBjb21tYW5kcyBpbiBSOgoKICAgIG12dCRNb250aCA9IG1vbnRocyhEYXRlQ29udmVydCkKCiAgICBtdnQkV2Vla2RheSA9IHdlZWtkYXlzKERhdGVDb252ZXJ0KQoKVGhpcyBjcmVhdGVzIHR3byBuZXcgdmFyaWFibGVzIGluIG91ciBkYXRhIGZyYW1lLCBNb250aCBhbmQgV2Vla2RheSwgYW5kIHNldHMgdGhlbSBlcXVhbCB0byB0aGUgbW9udGggYW5kIHdlZWtkYXkgdmFsdWVzIHRoYXQgd2UgY2FuIGV4dHJhY3QgZnJvbSB0aGUgRGF0ZSBvYmplY3QuIExhc3RseSwgcmVwbGFjZSB0aGUgb2xkIERhdGUgdmFyaWFibGUgd2l0aCBEYXRlQ29udmVydCBieSB0eXBpbmc6CgogICAgbXZ0JERhdGUgPSBEYXRlQ29udmVydAoKVXNpbmcgdGhlIHRhYmxlIGNvbW1hbmQsIGFuc3dlciB0aGUgZm9sbG93aW5nIHF1ZXN0aW9ucy4KCkluIHdoaWNoIG1vbnRoIGRpZCB0aGUgZmV3ZXN0IG1vdG9yIHZlaGljbGUgdGhlZnRzIG9jY3VyPwoKYGBge3J9Cm12dCRNb250aCA9IG1vbnRocyhEYXRlQ29udmVydCkKbXZ0JFdlZWtkYXkgPSB3ZWVrZGF5cyhEYXRlQ29udmVydCkKbXZ0JERhdGUgPSBEYXRlQ29udmVydAp0YWJsZShtdnQkTW9udGgpCgpBTlNXRVI6RmVicnVhcnkKYGBgCgoKIyMjIyAyLjQgCk9uIHdoaWNoIHdlZWtkYXkgZGlkIHRoZSBtb3N0IG1vdG9yIHZlaGljbGUgdGhlZnRzIG9jY3VyPwoKYGBge3J9CnRhYmxlKG12dCRXZWVrZGF5KQpBTlNXRVI6RnJpZGF5CmBgYAoKIyMjIyAyLjUgCkVhY2ggb2JzZXJ2YXRpb24gaW4gdGhlIGRhdGFzZXQgcmVwcmVzZW50cyBhIG1vdG9yIHZlaGljbGUgdGhlZnQsIGFuZCB0aGUgQXJyZXN0IHZhcmlhYmxlIGluZGljYXRlcyB3aGV0aGVyIGFuIGFycmVzdCB3YXMgbGF0ZXIgbWFkZSBmb3IgdGhpcyB0aGVmdC4gV2hpY2ggbW9udGggaGFzIHRoZSBsYXJnZXN0IG51bWJlciBvZiBtb3RvciB2ZWhpY2xlIHRoZWZ0cyBmb3Igd2hpY2ggYW4gYXJyZXN0IHdhcyBtYWRlPwoKYGBge3J9CnRhYmxlKG12dCRBcnJlc3QsbXZ0JE1vbnRoKQpBTlNXRVI6IEphbnVhcnkKYGBgCgojIyMgU2VjdGlvbiAzIC0gVmlzdWFsaXppbmcgQ3JpbWUgVHJlbmRzCgojIyMjIDMuMQoKTm93LCBsZXQncyBtYWtlIHNvbWUgcGxvdHMgdG8gaGVscCB1cyBiZXR0ZXIgdW5kZXJzdGFuZCBob3cgY3JpbWUgaGFzIGNoYW5nZWQgb3ZlciB0aW1lIGluIENoaWNhZ28uIFRocm91Z2hvdXQgdGhpcyBwcm9ibGVtLCBhbmQgaW4gZ2VuZXJhbCwgeW91IGNhbiBzYXZlIHlvdXIgcGxvdCB0byBhIGZpbGUuIEZvciBtb3JlIGluZm9ybWF0aW9uLCB0aGlzIHdlYnNpdGUgdmVyeSBjbGVhcmx5IGV4cGxhaW5zIHRoZSBwcm9jZXNzLgoKRmlyc3QsIGxldCdzIG1ha2UgYSBoaXN0b2dyYW0gb2YgdGhlIHZhcmlhYmxlIERhdGUuIFdlJ2xsIGFkZCBhbiBleHRyYSBhcmd1bWVudCwgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGJhcnMgd2Ugd2FudCBpbiBvdXIgaGlzdG9ncmFtLiBJbiB5b3VyIFIgY29uc29sZSwgdHlwZQoKaGlzdChtdnQkRGF0ZSwgYnJlYWtzPTEwMCkKCmBgYHtyfQpoaXN0KG12dCREYXRlLCBicmVha3M9MTAwKQpgYGAKCkxvb2tpbmcgYXQgdGhlIGhpc3RvZ3JhbSwgYW5zd2VyIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb25zLgoKSW4gZ2VuZXJhbCwgZG9lcyBpdCBsb29rIGxpa2UgY3JpbWUgaW5jcmVhc2VzIG9yIGRlY3JlYXNlcyBmcm9tIDIwMDIgLSAyMDEyPwoKKyBJbmNyZWFzZXMKKyBEZWNyZWFzZXMKCmBgYHtyfQpBTlNXRVI6IERlY3JlYXNlcwpgYGAKCkluIGdlbmVyYWwsIGRvZXMgaXQgbG9vayBsaWtlIGNyaW1lIGluY3JlYXNlcyBvciBkZWNyZWFzZXMgZnJvbSAyMDA1IC0gMjAwOD8KCisgSW5jcmVhc2VzCisgRGVjcmVhc2VzCgpgYGB7cn0KQU5TV0VSOiBEZWNyZWFzZXMKYGBgCgojIyMjIDMuMgpOb3csIGxldCdzIHNlZSBob3cgYXJyZXN0cyBoYXZlIGNoYW5nZWQgb3ZlciB0aW1lLiBDcmVhdGUgYSBib3hwbG90IG9mIHRoZSB2YXJpYWJsZSAiRGF0ZSIsIHNvcnRlZCBieSB0aGUgdmFyaWFibGUgIkFycmVzdCIgKGlmIHlvdSBhcmUgbm90IGZhbWlsaWFyIHdpdGggYm94cGxvdHMgYW5kIHdvdWxkIGxpa2UgdG8gbGVhcm4gbW9yZSwgY2hlY2sgb3V0IHRoaXMgdHV0b3JpYWwpLiBJbiBhIGJveHBsb3QsIHRoZSBib2xkIGhvcml6b250YWwgbGluZSBpcyB0aGUgbWVkaWFuIHZhbHVlIG9mIHRoZSBkYXRhLCB0aGUgYm94IHNob3dzIHRoZSByYW5nZSBvZiB2YWx1ZXMgYmV0d2VlbiB0aGUgZmlyc3QgcXVhcnRpbGUgYW5kIHRoaXJkIHF1YXJ0aWxlLCBhbmQgdGhlIHdoaXNrZXJzICh0aGUgZG90dGVkIGxpbmVzIGV4dGVuZGluZyBvdXRzaWRlIHRoZSBib3gpIHNob3cgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzLCBleGNsdWRpbmcgYW55IG91dGxpZXJzICh3aGljaCBhcmUgcGxvdHRlZCBhcyBjaXJjbGVzKS4gT3V0bGllcnMgYXJlIGRlZmluZWQgYnkgZmlyc3QgY29tcHV0aW5nIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGZpcnN0IGFuZCB0aGlyZCBxdWFydGlsZSB2YWx1ZXMsIG9yIHRoZSBoZWlnaHQgb2YgdGhlIGJveC4gVGhpcyBudW1iZXIgaXMgY2FsbGVkIHRoZSBJbnRlci1RdWFydGlsZSBSYW5nZSAoSVFSKS4gQW55IHBvaW50IHRoYXQgaXMgZ3JlYXRlciB0aGFuIHRoZSB0aGlyZCBxdWFydGlsZSBwbHVzIHRoZSBJUVIgb3IgbGVzcyB0aGFuIHRoZSBmaXJzdCBxdWFydGlsZSBtaW51cyB0aGUgSVFSIGlzIGNvbnNpZGVyZWQgYW4gb3V0bGllci4KCkRvZXMgaXQgbG9vayBsaWtlIHRoZXJlIHdlcmUgbW9yZSBjcmltZXMgZm9yIHdoaWNoIGFycmVzdHMgd2VyZSBtYWRlIGluIHRoZSBmaXJzdCBoYWxmIG9mIHRoZSB0aW1lIHBlcmlvZCBvciB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIHRpbWUgcGVyaW9kPyAoTm90ZSB0aGF0IHRoZSB0aW1lIHBlcmlvZCBpcyBmcm9tIDIwMDEgdG8gMjAxMiwgc28gdGhlIG1pZGRsZSBvZiB0aGUgdGltZSBwZXJpb2QgaXMgdGhlIGJlZ2lubmluZyBvZiAyMDA3LikKCisgRmlyc3QgaGFsZgorIFNlY29uZCBoYWxmCgpgYGB7cn0KYm94cGxvdChtdnQkRGF0ZSB+IG12dCRBcnJlc3QpCkFOU1dFUjogRmlyc3QgaGFsZgpgYGAKCgojIyMjIDMuMwpMZXQncyBpbnZlc3RpZ2F0ZSB0aGlzIGZ1cnRoZXIuIFVzZSB0aGUgdGFibGUgZnVuY3Rpb24gZm9yIHRoZSBuZXh0IGZldyBxdWVzdGlvbnMuCgpGb3Igd2hhdCBwcm9wb3J0aW9uIG9mIG1vdG9yIHZlaGljbGUgdGhlZnRzIGluIDIwMDEgd2FzIGFuIGFycmVzdCBtYWRlPwoKTm90ZTogaW4gdGhpcyBxdWVzdGlvbiBhbmQgbWFueSBvdGhlcnMgaW4gdGhlIGNvdXJzZSwgd2UgYXJlIGFza2luZyBmb3IgYW4gYW5zd2VyIGFzIGEgcHJvcG9ydGlvbi4gVGhlcmVmb3JlLCB5b3VyIGFuc3dlciBzaG91bGQgdGFrZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMS4KCmBgYHtyfQp0YWJsZShtdnQkWWVhcixtdnQkQXJyZXN0KQoyMTUyLygxODUxNysyMTUyKQoKYGBgCgojIyMjIDMuNApGb3Igd2hhdCBwcm9wb3J0aW9uIG9mIG1vdG9yIHZlaGljbGUgdGhlZnRzIGluIDIwMDcgd2FzIGFuIGFycmVzdCBtYWRlPwoKYGBge3J9CnRhYmxlKG12dCRZZWFyLG12dCRBcnJlc3QpCjEyMTIvKDEzMDY4KzEyMTIpCgpgYGAKCiMjIyMgMy41CkZvciB3aGF0IHByb3BvcnRpb24gb2YgbW90b3IgdmVoaWNsZSB0aGVmdHMgaW4gMjAxMiB3YXMgYW4gYXJyZXN0IG1hZGU/CgpgYGB7cn0KdGFibGUobXZ0JFllYXIsbXZ0JEFycmVzdCkKNTUwLygxMzU0Mis1NTApCmBgYAoKU2luY2UgdGhlcmUgbWF5IHN0aWxsIGJlIG9wZW4gaW52ZXN0aWdhdGlvbnMgZm9yIHJlY2VudCBjcmltZXMsIHRoaXMgY291bGQgZXhwbGFpbiB0aGUgdHJlbmQgd2UgYXJlIHNlZWluZyBpbiB0aGUgZGF0YS4gVGhlcmUgY291bGQgYWxzbyBiZSBvdGhlciBmYWN0b3JzIGF0IHBsYXksIGFuZCB0aGlzIHRyZW5kIHNob3VsZCBiZSBpbnZlc3RpZ2F0ZWQgZnVydGhlci4gSG93ZXZlciwgc2luY2Ugd2UgZG9uJ3Qga25vdyB3aGVuIHRoZSBhcnJlc3RzIHdlcmUgYWN0dWFsbHkgbWFkZSwgb3VyIGRldGVjdGl2ZSB3b3JrIGluIHRoaXMgYXJlYSBoYXMgcmVhY2hlZCBhIGRlYWQgZW5kLgoKIyMjIFNlY3Rpb24gNCAtIFBvcHVsYXIgTG9jYXRpb25zCgojIyMjIDQuMQpBbmFseXppbmcgdGhpcyBkYXRhIGNvdWxkIGJlIHVzZWZ1bCB0byB0aGUgQ2hpY2FnbyBQb2xpY2UgRGVwYXJ0bWVudCB3aGVuIGRlY2lkaW5nIHdoZXJlIHRvIGFsbG9jYXRlIHJlc291cmNlcy4gSWYgdGhleSB3YW50IHRvIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgYXJyZXN0cyB0aGF0IGFyZSBtYWRlIGZvciBtb3RvciB2ZWhpY2xlIHRoZWZ0cywgd2hlcmUgc2hvdWxkIHRoZXkgZm9jdXMgdGhlaXIgZWZmb3J0cz8KCldlIHdhbnQgdG8gZmluZCB0aGUgdG9wIGZpdmUgbG9jYXRpb25zIHdoZXJlIG1vdG9yIHZlaGljbGUgdGhlZnRzIG9jY3VyLiBJZiB5b3UgY3JlYXRlIGEgdGFibGUgb2YgdGhlIExvY2F0aW9uRGVzY3JpcHRpb24gdmFyaWFibGUsIGl0IGlzIHVuZm9ydHVuYXRlbHkgdmVyeSBoYXJkIHRvIHJlYWQgc2luY2UgdGhlcmUgYXJlIDc4IGRpZmZlcmVudCBsb2NhdGlvbnMgaW4gdGhlIGRhdGEgc2V0LiBCeSB1c2luZyB0aGUgc29ydCBmdW5jdGlvbiwgd2UgY2FuIHZpZXcgdGhpcyBzYW1lIHRhYmxlLCBidXQgc29ydGVkIGJ5IHRoZSBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zIGluIGVhY2ggY2F0ZWdvcnkuIEluIHlvdXIgUiBjb25zb2xlLCB0eXBlOgoKICAgIHNvcnQodGFibGUobXZ0JExvY2F0aW9uRGVzY3JpcHRpb24pKQoKV2hpY2ggbG9jYXRpb25zIGFyZSB0aGUgdG9wIGZpdmUgbG9jYXRpb25zIGZvciBtb3RvciB2ZWhpY2xlIHRoZWZ0cywgZXhjbHVkaW5nIHRoZSAiT3RoZXIiIGNhdGVnb3J5PyBZb3Ugc2hvdWxkIHNlbGVjdCA1IG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9ucy4KCisgQmFuaworIEdhcyBTdGF0aW9uCisgSG90ZWwvTW90ZWwKKyBTdHJlZXQKKyBDYXIgV2FzaAorIFJlc3RhdXJhbnQKKyBQYXJraW5nIExvdC9HYXJhZ2UgKE5vbi1SZXNpZGVudGlhbCkKKyBBbGxleQorIERyaXZld2F5IChSZXNpZGVudGlhbCkKKyBWYWNhbnQgTG90L0xhbmQKCmBgYHtyfQpzb3J0KHRhYmxlKG12dCRMb2NhdGlvbkRlc2NyaXB0aW9uKSkKCkFOU1dFUjpEUklWRVdBWShSRVNJREVOVElBTCksIEdBUyBTVEFUSU9OLCBBTExFWSwgUEFSS0lORywgTE9UL0dBUkFHRShOT04uUkVTSUQuKSwgU1RSRUVUCmBgYAoKIyMjIyA0LjIgCkNyZWF0ZSBhIHN1YnNldCBvZiB5b3VyIGRhdGEsIG9ubHkgdGFraW5nIG9ic2VydmF0aW9ucyBmb3Igd2hpY2ggdGhlIHRoZWZ0IGhhcHBlbmVkIGluIG9uZSBvZiB0aGVzZSBmaXZlIGxvY2F0aW9ucywgYW5kIGNhbGwgdGhpcyBuZXcgZGF0YSBzZXQgIlRvcDUiLiBUbyBkbyB0aGlzLCB5b3UgY2FuIHVzZSB0aGUgfCBzeW1ib2wuIEluIGxlY3R1cmUsIHdlIHVzZWQgdGhlICYgc3ltYm9sIHRvIHVzZSB0d28gY3JpdGVyaWEgdG8gbWFrZSBhIHN1YnNldCBvZiB0aGUgZGF0YS4gVG8gb25seSB0YWtlIG9ic2VydmF0aW9ucyB0aGF0IGhhdmUgYSBjZXJ0YWluIHZhbHVlIGluIG9uZSB2YXJpYWJsZSBvciB0aGUgb3RoZXIsIHRoZSB8IGNoYXJhY3RlciBjYW4gYmUgdXNlZCBpbiBwbGFjZSBvZiB0aGUgJiBzeW1ib2wuIFRoaXMgaXMgYWxzbyBjYWxsZWQgYSBsb2dpY2FsICJvciIgb3BlcmF0aW9uLgoKQWx0ZXJuYXRlbHksIHlvdSBjb3VsZCBjcmVhdGUgZml2ZSBkaWZmZXJlbnQgc3Vic2V0cywgYW5kIHRoZW4gbWVyZ2UgdGhlbSB0b2dldGhlciBpbnRvIG9uZSBkYXRhIGZyYW1lIHVzaW5nIHJiaW5kLgoKSG93IG1hbnkgb2JzZXJ2YXRpb25zIGFyZSBpbiBUb3A1PwoKYGBge3J9ClRvcExvY2F0aW9uID0gYygiU1RSRUVUIiwiUEFSS0lORyBMT1QvR0FSQUdFKE5PTi5SRVNJRC4pIiwiQUxMRVkiLCJHQVMgU1RBVElPTiIsIkRSSVZFV0FZIC0gUkVTSURFTlRJQUwiKQpUb3A1ID0gc3Vic2V0KG12dCwgTG9jYXRpb25EZXNjcmlwdGlvbiAlaW4lIFRvcExvY2F0aW9uKQpzdHIoVG9wNSkKQU5TV0VSOiAxNzc1MTAgb2JzCmBgYAoKIyMjIyA0LjMKUiB3aWxsIHJlbWVtYmVyIHRoZSBvdGhlciBjYXRlZ29yaWVzIG9mIHRoZSBMb2NhdGlvbkRlc2NyaXB0aW9uIHZhcmlhYmxlIGZyb20gdGhlIG9yaWdpbmFsIGRhdGFzZXQsIHNvIHJ1bm5pbmcgdGFibGUoVG9wNSRMb2NhdGlvbkRlc2NyaXB0aW9uKSB3aWxsIGhhdmUgYSBsb3Qgb2YgdW5uZWNlc3Nhcnkgb3V0cHV0LiBUbyBtYWtlIG91ciB0YWJsZXMgYSBiaXQgbmljZXIgdG8gcmVhZCwgd2UgY2FuIHJlZnJlc2ggdGhpcyBmYWN0b3IgdmFyaWFibGUuIEluIHlvdXIgUiBjb25zb2xlLCB0eXBlOgoKICAgIFRvcDUkTG9jYXRpb25EZXNjcmlwdGlvbiA9IGZhY3RvcihUb3A1JExvY2F0aW9uRGVzY3JpcHRpb24pCgpJZiB5b3UgcnVuIHRoZSBzdHIgb3IgdGFibGUgZnVuY3Rpb24gb24gVG9wNSBub3csIHlvdSBzaG91bGQgc2VlIHRoYXQgTG9jYXRpb25EZXNjcmlwdGlvbiBub3cgb25seSBoYXMgNSB2YWx1ZXMsIGFzIHdlIGV4cGVjdC4KClVzZSB0aGUgVG9wNSBkYXRhIGZyYW1lIHRvIGFuc3dlciB0aGUgcmVtYWluaW5nIHF1ZXN0aW9ucy4KCk9uZSBvZiB0aGUgbG9jYXRpb25zIGhhcyBhIG11Y2ggaGlnaGVyIGFycmVzdCByYXRlIHRoYW4gdGhlIG90aGVyIGxvY2F0aW9ucy4gV2hpY2ggaXMgaXQ/IFBsZWFzZSBlbnRlciB0aGUgdGV4dCBpbiBleGFjdGx5IHRoZSBzYW1lIHdheSBhcyBob3cgaXQgbG9va3MgaW4gdGhlIGFuc3dlciBvcHRpb25zIGZvciBQcm9ibGVtIDQuMS4KCmBgYHtyfQpUb3A1JExvY2F0aW9uRGVzY3JpcHRpb24gPSBmYWN0b3IoVG9wNSRMb2NhdGlvbkRlc2NyaXB0aW9uKQpzdHIoVG9wNSkKdGFibGUoVG9wNSRMb2NhdGlvbkRlc2NyaXB0aW9uLFRvcDUkQXJyZXN0KQpBcnJlc3RSYXRlID0gYygyNDkvKDI0OSsyMDU5KSwgMTMyLygxMzIrMjU0MyksIDQzOS8oNDM5KzE2NzIpLCAxNjAzLygxNjAyKzEzMjQ5KSwgMTE1OTUvKDExNTk1KzE0NDk2OSkpCkFycmVzdFJhdGUKQU5TV0VSOkdBUyBTVEFUSU9OCmBgYAoKCiMjIyMgNC40IApPbiB3aGljaCBkYXkgb2YgdGhlIHdlZWsgZG8gdGhlIG1vc3QgbW90b3IgdmVoaWNsZSB0aGVmdHMgYXQgZ2FzIHN0YXRpb25zIGhhcHBlbj8KKE1vbmRheX5TdW5kYXkpCgpgYGB7cn0KdGFibGUoVG9wNSRMb2NhdGlvbkRlc2NyaXB0aW9uLCBUb3A1JFdlZWtkYXkpCnRhYmxlKFRvcDUkV2Vla2RheSwgVG9wNSRMb2NhdGlvbkRlc2NyaXB0aW9uKQoKQU5TV0VSOlNhdHVyZGF5CmBgYAoKIyMjIyA0LjUKT24gd2hpY2ggZGF5IG9mIHRoZSB3ZWVrIGRvIHRoZSBmZXdlc3QgbW90b3IgdmVoaWNsZSB0aGVmdHMgaW4gcmVzaWRlbnRpYWwgZHJpdmV3YXlzIGhhcHBlbj8oTW9uZGF5flN1bmRheSkKCmBgYHtyfQp0YWJsZShUb3A1JFdlZWtkYXksIFRvcDUkTG9jYXRpb25EZXNjcmlwdGlvbikKQU5TV0VSOiBTdGF1cmRheQpgYGAKCgoKCgo=