Introduction:

In this lab we will:

Intro to code needed

NOTE: as we discussed in lectures, depending on the TYPE of variable you have (categorical vs. numerical) there are different calculations for confidence intervals. Below is some introductory/sample code for determining CIs for different variable types:

For either data type, when asked for “desired confidence” this is going to be a value from 0-1, if I ask for 90% confidence, you need to enter 0.9

FOR CATEGORICAL (this means you are essentially creating proportional data): ** Install and load the package in the code chunk below

install.packages("DescTools")
trying URL 'https://cran.rstudio.com/bin/macosx/big-sur-arm64/contrib/4.4/DescTools_0.99.60.tgz'
Content type 'application/x-gzip' length 6403924 bytes (6.1 MB)
==================================================
downloaded 6.1 MB

The downloaded binary packages are in
    /var/folders/f1/3b7bq38n3pvf0chk1f7c2xbr0000gn/T//RtmpmRl0dr/downloaded_packages
library(DescTools)

FOR ALL THE CODE BELOW, things have been commented out, if you copy and paste them, please make sure the # is removed. ### Condfidence Interval for Proportions

You will need the number of cases that are positive (x) from your data set as well as the total number of observations (n)

Access number of positive cases

rice <- read.csv('~/Desktop/BIN510-files/rice.csv')
names(rice)
[1] "PlantNo"      "Block"        "RootDryMass"  "ShootDryMass" "trt"          "fert"        
[7] "variety"     
head(rice)
table(rice$variety)

gmo  wt 
 36  36 

Access Total number of cases

length(rice$variety)
[1] 72

NOTE: there are two common methods for calculating CIs for proportions, the Wald method and the Agresti-Coull method, the only difference is a slight change in the calculation. The Wald method is a good default, Agresti-Coull is better for smaller sample sizes.

Confidence Interval - Wald Method

BinomCI(x = 36, n = 72, conf.level = 0.95, method = "wald")
     est   lwr.ci   upr.ci
[1,] 0.5 0.384508 0.615492

Condfidence Interval - Agresti-Coull Method

BinomCI(x = 36, n = 72, conf.level = 0.95, method = "agresti-coull")
     est    lwr.ci    upr.ci
[1,] 0.5 0.3874709 0.6125291

Condfidence Interval for Mean of a Quantitative Variable (NUMERICAL)

t.test(rice$RootDryMass, conf.level = 0.95)

    One Sample t-test

data:  rice$RootDryMass
t = 9.6778, df = 71, p-value = 1.329e-14
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 14.34656 21.79233
sample estimates:
mean of x 
 18.06944 

Or directly access the Confidence Interval

t.test(rice$RootDryMass, conf.level = 0.95)$conf.int
[1] 14.34656 21.79233
attr(,"conf.level")
[1] 0.95

Exercise 1: Creating confidence intervals

In a study involving how rice grows across different nutrient treatments, researchers randomly selected plots where there was a mix of wild-type and gmo rice growing. Please bring in the “rice.csv” file and call it “rice_df”

rice_df <- read.csv('~/Desktop/BIN510-files/rice.csv')

Exercise 2:

Using the code chunk below, write R commands to

  • list the names of the variables for the dataframe
  • get the data type for each variable in the list above.

Answer:

names(rice_df)
[1] "PlantNo"      "Block"        "RootDryMass"  "ShootDryMass" "trt"          "fert"        
[7] "variety"     
head(rice_df)
table(rice_df$variety)

gmo  wt 
 36  36 

Exercise 3:

  1. Based on the data type for the variety variable, which confidence interval would be appropriate to use: C.I. for a mean or a C.I. for a proportion?
  2. Use the code chunk below to get the appropriate C.I. with a confidence level of 97%; if you decided to work with proportions, use the Wald method.
  3. In your own words, what does the output of 2 tell us??

Answer:

1.We would use CI for a proportion because it is a categorical variable. 2.See code below… 3.We are 97% confident that the proportion of GMO rice is between 37-62%.

BinomCI(x = 36, n = 72, conf.level = 0.97, method = "wald")
     est    lwr.ci    upr.ci
[1,] 0.5 0.3721262 0.6278738

Exercise 4:

  1. Based on the data type for the ShootDryMass variable, which confidence interval would be appropriate to use: C.I. for a mean or a C.I. for a proportion?
  2. Use the code chunk below to get the appropriate C.I. with a confidence level of 97%; if you decided to work with proportions, use the Agresti-Coull method.
  3. In your own words, what does the output of 2 tell us??

Answer:

1.Since ShootDryMass is a numerical variable we would want a CI for a mean. 2.See code below… 3.We are 97% confident that the mean of ShootDryMass is between 50 and 68.

t.test(rice_df$ShootDryMass, conf.level = 0.97)$conf.int
[1] 50.11550 68.99561
attr(,"conf.level")
[1] 0.97

Section 2: Comparing Confidence Intervals

In this final section, we will continue to work with the rice_df. We are now interested in whether the variety of rice (wt or gmo) influences the growth of the rice plants.

Exercise 5:

Recall that the summary() function will compute the five-number summary for a quantitative data set. Using tapply() compute the “summary” of the ShootDryMass for each plant broken up by variety:


Answer:

tapply(rice_df$ShootDryMass, rice_df$variety, summary)
$gmo
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00    9.50   40.00   41.81   62.75  100.00 

$wt
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  26.00   47.50   76.00   77.31  108.25  134.00 

Exercise 8: Confidence Intervals by variety

Using the code chunk below, slice your rice_df into two dataframes: wt and gmo. The wt dataframe should include the ShootDryMass data for only the wild-type in the sample, and the gmo dataframe should do the same for gmo rice

The basic way to do this is to utilize the following steps, notice the first step highlights rows in your dataframe that contain a value your are looking to isolate, you need to look for the exact phrase! The second step takes your isolated rows and creates a new dataframe (which you control the name of)

### create a variable for desired rows
desired_rows <- dataframe_name$categorical_column_name == "desired_level"
### use the desired rows to create a new dataframe
new_dataframe_name <- dataframe_name[desired_rows,]

Answer

### I have done created a dataframe for wild-type rice below, you need to do the same for the gmo rice

wt_rows <- rice_df$variety == "wt"
wt_df <- rice_df[wt_rows,]
gmo_rows <- rice_df$variety == "gmo"
gmo_df <- rice_df[gmo_rows,]

Lastly, using the code chunk below, compute a confidence interval for the ShootDryMass of wt, and then compute another for the ShootDryMass of gmo Use a confidence level of 96% in both cases.

t.test(wt_df$ShootDryMass, conf.level = 0.96)$conf.int
[1] 65.60515 89.00596
attr(,"conf.level")
[1] 0.96
t.test(gmo_df$ShootDryMass, conf.level = 0.96)$conf.int
[1] 31.00591 52.60520
attr(,"conf.level")
[1] 0.96

Answer the following:

  1. What is the C.I. for only the wt rice?
  2. What is the C.I. for only the gmo rice?
  3. Do these C.I.’s overlap at all?
  4. In light of your answer to question 3, do you suspect the mean ShootDryMass is different for wt vs gmo? Explain your answer.

Answers:

1.The CI for WT is between 65-89. 2.The CI for the GMO is bewteen 31-52. 3.No these CIs do not overlap. 4.Since they do not overlap the means of ShootDryMass might be different between the WT and GMO rice. The mean of WT is higher than that of the GMO.

LS0tCnRpdGxlOiAiQklONTEwIFIgTGFiIDMiCnN1YnRpdGxlOiAiQ29uZmlkZW5jZSBJbnRlcnZhbHMgZm9yIFBhcmFtZXRlciBFc3RpbWF0aW9uIgphdXRob3I6IEthdGVyaW5hIEdlb3JnaW9wb3Vsb3MKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKIyMgSW50cm9kdWN0aW9uOgpJbiB0aGlzIGxhYiB3ZSB3aWxsOgoKKiBwcmFjdGljZSBkZXRlcm1pbmluZyBkYXRhIHR5cGVzIGZyb20gYSBkYXRhZnJhbWUgYW5kIGNob29zZSBhcHByb3ByaWF0ZSBhbmFseXNpcyBiYXNlZCBvbiBkYXRhIHR5cGUKKiBjcmVhdGUgY29uZmlkZW5jZSBpbnRlcnZhbHMgZm9yIHF1YW50aXRhdGl2ZSBhbmQgY2F0ZWdvcmljYWwgZGF0YSB1c2luZyBgdC50ZXN0KClgIGFuZCBgQmlub21DSSgpYAoqIHByYWN0aWNlIHN1YnNldHRpbmcgYSBkYXRhZnJhbWUgaW50byBwaWVjZXMgYmFzZWQgb24gYSBjYXRlZ29yaWNhbCB2YXJpYWJsZQoKCiMjIyMgSW50cm8gdG8gY29kZSBuZWVkZWQKTk9URTogYXMgd2UgZGlzY3Vzc2VkIGluIGxlY3R1cmVzLCBkZXBlbmRpbmcgb24gdGhlIFRZUEUgb2YgdmFyaWFibGUgeW91IGhhdmUgKGNhdGVnb3JpY2FsIHZzLiBudW1lcmljYWwpIHRoZXJlIGFyZSBkaWZmZXJlbnQgY2FsY3VsYXRpb25zIGZvciBjb25maWRlbmNlIGludGVydmFscy4gQmVsb3cgaXMgc29tZSBpbnRyb2R1Y3Rvcnkvc2FtcGxlIGNvZGUgZm9yIGRldGVybWluaW5nIENJcyBmb3IgZGlmZmVyZW50IHZhcmlhYmxlIHR5cGVzOgoKRm9yIGVpdGhlciBkYXRhIHR5cGUsIHdoZW4gYXNrZWQgZm9yICJkZXNpcmVkIGNvbmZpZGVuY2UiIHRoaXMgaXMgZ29pbmcgdG8gYmUgYSB2YWx1ZSBmcm9tIDAtMSwgaWYgSSBhc2sgZm9yIDkwJSBjb25maWRlbmNlLCB5b3UgbmVlZCB0byBlbnRlciAwLjkKCkZPUiBDQVRFR09SSUNBTCAodGhpcyBtZWFucyB5b3UgYXJlIGVzc2VudGlhbGx5IGNyZWF0aW5nIHByb3BvcnRpb25hbCBkYXRhKToKKiogSW5zdGFsbCBhbmQgbG9hZCB0aGUgcGFja2FnZSBpbiB0aGUgY29kZSBjaHVuayBiZWxvdwoKYGBge3J9Cmluc3RhbGwucGFja2FnZXMoIkRlc2NUb29scyIpCmxpYnJhcnkoRGVzY1Rvb2xzKQpgYGAKCkZPUiBBTEwgVEhFIENPREUgQkVMT1csIHRoaW5ncyBoYXZlIGJlZW4gY29tbWVudGVkIG91dCwgaWYgeW91IGNvcHkgYW5kIHBhc3RlIHRoZW0sIHBsZWFzZSBtYWtlIHN1cmUgdGhlICMgaXMgcmVtb3ZlZC4KIyMjIENvbmRmaWRlbmNlIEludGVydmFsIGZvciBQcm9wb3J0aW9ucwoKWW91IHdpbGwgbmVlZCB0aGUgbnVtYmVyIG9mIGNhc2VzIHRoYXQgYXJlIHBvc2l0aXZlICh4KSBmcm9tIHlvdXIgZGF0YSBzZXQgYXMgd2VsbCBhcyB0aGUgdG90YWwgbnVtYmVyIG9mIG9ic2VydmF0aW9ucyAobikKCkFjY2VzcyBudW1iZXIgb2YgcG9zaXRpdmUgY2FzZXMKYGBge3J9CnJpY2UgPC0gcmVhZC5jc3YoJ34vRGVza3RvcC9CSU41MTAtZmlsZXMvcmljZS5jc3YnKQpuYW1lcyhyaWNlKQpoZWFkKHJpY2UpCnRhYmxlKHJpY2UkdmFyaWV0eSkKYGBgCgpBY2Nlc3MgVG90YWwgbnVtYmVyIG9mIGNhc2VzCmBgYHtyfQpsZW5ndGgocmljZSR2YXJpZXR5KQpgYGAKCk5PVEU6IHRoZXJlIGFyZSB0d28gY29tbW9uIG1ldGhvZHMgZm9yIGNhbGN1bGF0aW5nIENJcyBmb3IgcHJvcG9ydGlvbnMsIHRoZSBXYWxkIG1ldGhvZCBhbmQgdGhlIEFncmVzdGktQ291bGwgbWV0aG9kLCB0aGUgb25seSBkaWZmZXJlbmNlIGlzIGEgc2xpZ2h0IGNoYW5nZSBpbiB0aGUgY2FsY3VsYXRpb24uIFRoZSBXYWxkIG1ldGhvZCBpcyBhIGdvb2QgZGVmYXVsdCwgQWdyZXN0aS1Db3VsbCBpcyBiZXR0ZXIgZm9yIHNtYWxsZXIgc2FtcGxlIHNpemVzLgoKQ29uZmlkZW5jZSBJbnRlcnZhbCAtIFdhbGQgTWV0aG9kCmBgYHtyfQpCaW5vbUNJKHggPSAzNiwgbiA9IDcyLCBjb25mLmxldmVsID0gMC45NSwgbWV0aG9kID0gIndhbGQiKQpgYGAKCkNvbmRmaWRlbmNlIEludGVydmFsIC0gQWdyZXN0aS1Db3VsbCBNZXRob2QKYGBge3J9CkJpbm9tQ0koeCA9IDM2LCBuID0gNzIsIGNvbmYubGV2ZWwgPSAwLjk1LCBtZXRob2QgPSAiYWdyZXN0aS1jb3VsbCIpCmBgYAoKIyMjIENvbmRmaWRlbmNlIEludGVydmFsIGZvciBNZWFuIG9mIGEgUXVhbnRpdGF0aXZlIFZhcmlhYmxlIChOVU1FUklDQUwpCmBgYHtyfQp0LnRlc3QocmljZSRSb290RHJ5TWFzcywgY29uZi5sZXZlbCA9IDAuOTUpCmBgYAoKT3IgZGlyZWN0bHkgYWNjZXNzIHRoZSBDb25maWRlbmNlIEludGVydmFsCmBgYHtyfQp0LnRlc3QocmljZSRSb290RHJ5TWFzcywgY29uZi5sZXZlbCA9IDAuOTUpJGNvbmYuaW50CmBgYAoKIyMjIyBFeGVyY2lzZSAxOiBDcmVhdGluZyBjb25maWRlbmNlIGludGVydmFscwoKSW4gYSBzdHVkeSBpbnZvbHZpbmcgaG93IHJpY2UgZ3Jvd3MgYWNyb3NzIGRpZmZlcmVudCBudXRyaWVudCB0cmVhdG1lbnRzLCByZXNlYXJjaGVycyByYW5kb21seSBzZWxlY3RlZCBwbG90cyB3aGVyZSB0aGVyZSB3YXMgYSBtaXggb2Ygd2lsZC10eXBlIGFuZCBnbW8gcmljZSBncm93aW5nLiBQbGVhc2UgYnJpbmcgaW4gdGhlICJyaWNlLmNzdiIgZmlsZSBhbmQgY2FsbCBpdCAicmljZV9kZiIKYGBge3J9CnJpY2VfZGYgPC0gcmVhZC5jc3YoJ34vRGVza3RvcC9CSU41MTAtZmlsZXMvcmljZS5jc3YnKQpgYGAKCiMjIyMgRXhlcmNpc2UgMjoKVXNpbmcgdGhlIGNvZGUgY2h1bmsgYmVsb3csIHdyaXRlIFIgY29tbWFuZHMgdG8KCiAgKiBsaXN0IHRoZSBuYW1lcyBvZiB0aGUgdmFyaWFibGVzIGZvciB0aGUgZGF0YWZyYW1lCiAgKiBnZXQgdGhlIGRhdGEgdHlwZSBmb3IgZWFjaCB2YXJpYWJsZSBpbiB0aGUgbGlzdCBhYm92ZS4KCioqKioKIyMjIyBBbnN3ZXI6CmBgYHtyfQpuYW1lcyhyaWNlX2RmKQpoZWFkKHJpY2VfZGYpCnRhYmxlKHJpY2VfZGYkdmFyaWV0eSkKYGBgCgoqKioqCgojIyMjIEV4ZXJjaXNlIDM6CgogIDEuIEJhc2VkIG9uIHRoZSBkYXRhIHR5cGUgZm9yIHRoZSBgdmFyaWV0eWAgdmFyaWFibGUsIHdoaWNoIGNvbmZpZGVuY2UgaW50ZXJ2YWwgd291bGQgYmUgYXBwcm9wcmlhdGUgdG8gdXNlOiAgQy5JLiBmb3IgYSBtZWFuIG9yIGEgQy5JLiBmb3IgYSBwcm9wb3J0aW9uPwogIDIuIFVzZSB0aGUgY29kZSBjaHVuayBiZWxvdyB0byBnZXQgdGhlIGFwcHJvcHJpYXRlIEMuSS4gd2l0aCBhIGNvbmZpZGVuY2UgbGV2ZWwgb2YgOTclOyBpZiB5b3UgZGVjaWRlZCB0byB3b3JrIHdpdGggcHJvcG9ydGlvbnMsIHVzZSB0aGUgV2FsZCBtZXRob2QuCiAgMy4gSW4geW91ciBvd24gd29yZHMsIHdoYXQgZG9lcyB0aGUgb3V0cHV0IG9mIDIgdGVsbCB1cz8/CgoqKioqCiMjIyMgQW5zd2VyOgogIDEuV2Ugd291bGQgdXNlIENJIGZvciBhIHByb3BvcnRpb24gYmVjYXVzZSBpdCBpcyBhIGNhdGVnb3JpY2FsIHZhcmlhYmxlLiAKICAyLlNlZSBjb2RlIGJlbG93Li4uCiAgMy5XZSBhcmUgOTclIGNvbmZpZGVudCB0aGF0IHRoZSBwcm9wb3J0aW9uIG9mIEdNTyByaWNlIGlzIGJldHdlZW4gMzctNjIlLgpgYGB7cn0KQmlub21DSSh4ID0gMzYsIG4gPSA3MiwgY29uZi5sZXZlbCA9IDAuOTcsIG1ldGhvZCA9ICJ3YWxkIikKYGBgCgoqKioqCgojIyMjIEV4ZXJjaXNlIDQ6CiAgMS4gQmFzZWQgb24gdGhlIGRhdGEgdHlwZSBmb3IgdGhlIGBTaG9vdERyeU1hc3NgIHZhcmlhYmxlLCB3aGljaCBjb25maWRlbmNlIGludGVydmFsIHdvdWxkIGJlIGFwcHJvcHJpYXRlIHRvIHVzZTogIEMuSS4gZm9yIGEgbWVhbiBvciBhIEMuSS4gZm9yIGEgcHJvcG9ydGlvbj8KICAyLiBVc2UgdGhlIGNvZGUgY2h1bmsgYmVsb3cgdG8gZ2V0IHRoZSBhcHByb3ByaWF0ZSBDLkkuIHdpdGggYSBjb25maWRlbmNlIGxldmVsIG9mIDk3JTsgaWYgeW91IGRlY2lkZWQgdG8gd29yayB3aXRoIHByb3BvcnRpb25zLCB1c2UgdGhlIEFncmVzdGktQ291bGwgbWV0aG9kLgogIDMuIEluIHlvdXIgb3duIHdvcmRzLCB3aGF0IGRvZXMgdGhlIG91dHB1dCBvZiAyIHRlbGwgdXM/PwoKKioqKiAKIyMjIyBBbnN3ZXI6CiAgMS5TaW5jZSBTaG9vdERyeU1hc3MgaXMgYSBudW1lcmljYWwgdmFyaWFibGUgd2Ugd291bGQgd2FudCBhIENJIGZvciBhIG1lYW4uIAogIDIuU2VlIGNvZGUgYmVsb3cuLi4KICAzLldlIGFyZSA5NyUgY29uZmlkZW50IHRoYXQgdGhlIG1lYW4gb2YgU2hvb3REcnlNYXNzIGlzIGJldHdlZW4gNTAgYW5kIDY4LiAKYGBge3J9CnQudGVzdChyaWNlX2RmJFNob290RHJ5TWFzcywgY29uZi5sZXZlbCA9IDAuOTcpJGNvbmYuaW50CmBgYAoqKioqCgojIyBTZWN0aW9uIDI6IENvbXBhcmluZyBDb25maWRlbmNlIEludGVydmFscwoKSW4gdGhpcyBmaW5hbCBzZWN0aW9uLCB3ZSB3aWxsIGNvbnRpbnVlIHRvIHdvcmsgd2l0aCB0aGUgYHJpY2VfZGZgLiAgV2UgYXJlIG5vdyBpbnRlcmVzdGVkIGluIHdoZXRoZXIgdGhlIHZhcmlldHkgb2YgcmljZSAod3Qgb3IgZ21vKSBpbmZsdWVuY2VzIHRoZSBncm93dGggb2YgdGhlIHJpY2UgcGxhbnRzLgoKIyMjIyBFeGVyY2lzZSA1OiAKUmVjYWxsIHRoYXQgdGhlIGBzdW1tYXJ5KClgIGZ1bmN0aW9uIHdpbGwgY29tcHV0ZSB0aGUgZml2ZS1udW1iZXIgc3VtbWFyeSBmb3IgYSBxdWFudGl0YXRpdmUgZGF0YSBzZXQuICBVc2luZyBgdGFwcGx5KClgIGNvbXB1dGUgdGhlICJzdW1tYXJ5IiBvZiB0aGUgU2hvb3REcnlNYXNzIGZvciBlYWNoIHBsYW50IGJyb2tlbiB1cCBieSBgdmFyaWV0eWA6CgoqKioqCiMjIyMgQW5zd2VyOgpgYGB7cn0KdGFwcGx5KHJpY2VfZGYkU2hvb3REcnlNYXNzLCByaWNlX2RmJHZhcmlldHksIHN1bW1hcnkpCmBgYAoqKioqCgojIyMjIEV4ZXJjaXNlIDg6IENvbmZpZGVuY2UgSW50ZXJ2YWxzIGJ5IGB2YXJpZXR5YApVc2luZyB0aGUgY29kZSBjaHVuayBiZWxvdywgc2xpY2UgeW91ciBgcmljZV9kZmAgaW50byB0d28gZGF0YWZyYW1lczogYHd0YCBhbmQgYGdtb2AuICBUaGUgYHd0YCBkYXRhZnJhbWUgc2hvdWxkIGluY2x1ZGUgdGhlIFNob290RHJ5TWFzcyBkYXRhIGZvciBvbmx5IHRoZSB3aWxkLXR5cGUgaW4gdGhlIHNhbXBsZSwgYW5kIHRoZSBgZ21vYCBkYXRhZnJhbWUgc2hvdWxkIGRvIHRoZSBzYW1lIGZvciBnbW8gcmljZQoKVGhlIGJhc2ljIHdheSB0byBkbyB0aGlzIGlzIHRvIHV0aWxpemUgdGhlIGZvbGxvd2luZyBzdGVwcywgbm90aWNlIHRoZSBmaXJzdCBzdGVwIGhpZ2hsaWdodHMgcm93cyBpbiB5b3VyIGRhdGFmcmFtZSB0aGF0IGNvbnRhaW4gYSB2YWx1ZSB5b3VyIGFyZSBsb29raW5nIHRvIGlzb2xhdGUsIHlvdSBuZWVkIHRvIGxvb2sgZm9yIHRoZSBleGFjdCBwaHJhc2UhIFRoZSBzZWNvbmQgc3RlcCB0YWtlcyB5b3VyIGlzb2xhdGVkIHJvd3MgYW5kIGNyZWF0ZXMgYSBuZXcgZGF0YWZyYW1lICh3aGljaCB5b3UgY29udHJvbCB0aGUgbmFtZSBvZikKCmBgYHtyfQojIyMgY3JlYXRlIGEgdmFyaWFibGUgZm9yIGRlc2lyZWQgcm93cwpkZXNpcmVkX3Jvd3MgPC0gZGF0YWZyYW1lX25hbWUkY2F0ZWdvcmljYWxfY29sdW1uX25hbWUgPT0gImRlc2lyZWRfbGV2ZWwiCiMjIyB1c2UgdGhlIGRlc2lyZWQgcm93cyB0byBjcmVhdGUgYSBuZXcgZGF0YWZyYW1lCm5ld19kYXRhZnJhbWVfbmFtZSA8LSBkYXRhZnJhbWVfbmFtZVtkZXNpcmVkX3Jvd3MsXQpgYGAKCioqKioKIyMjIyBBbnN3ZXIKYGBge3J9CiMjIyBJIGhhdmUgZG9uZSBjcmVhdGVkIGEgZGF0YWZyYW1lIGZvciB3aWxkLXR5cGUgcmljZSBiZWxvdywgeW91IG5lZWQgdG8gZG8gdGhlIHNhbWUgZm9yIHRoZSBnbW8gcmljZQoKd3Rfcm93cyA8LSByaWNlX2RmJHZhcmlldHkgPT0gInd0Igp3dF9kZiA8LSByaWNlX2RmW3d0X3Jvd3MsXQpnbW9fcm93cyA8LSByaWNlX2RmJHZhcmlldHkgPT0gImdtbyIKZ21vX2RmIDwtIHJpY2VfZGZbZ21vX3Jvd3MsXQoKYGBgCiAKKioqKgoKTGFzdGx5LCB1c2luZyB0aGUgY29kZSBjaHVuayBiZWxvdywgY29tcHV0ZSBhIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yIHRoZSBTaG9vdERyeU1hc3Mgb2Ygd3QsIGFuZCB0aGVuIGNvbXB1dGUgYW5vdGhlciBmb3IgdGhlIFNob290RHJ5TWFzcyBvZiBnbW8gIFVzZSBhIGNvbmZpZGVuY2UgbGV2ZWwgb2YgOTYlIGluIGJvdGggY2FzZXMuIApgYGB7cn0KdC50ZXN0KHd0X2RmJFNob290RHJ5TWFzcywgY29uZi5sZXZlbCA9IDAuOTYpJGNvbmYuaW50CnQudGVzdChnbW9fZGYkU2hvb3REcnlNYXNzLCBjb25mLmxldmVsID0gMC45NikkY29uZi5pbnQKYGBgCgpBbnN3ZXIgdGhlIGZvbGxvd2luZzoKCiAgMS4gV2hhdCBpcyB0aGUgQy5JLiBmb3Igb25seSB0aGUgd3QgcmljZT8KICAyLiBXaGF0IGlzIHRoZSBDLkkuIGZvciBvbmx5IHRoZSBnbW8gcmljZT8KICAzLiBEbyB0aGVzZSBDLkkuJ3Mgb3ZlcmxhcCBhdCBhbGw/CiAgNC4gSW4gbGlnaHQgb2YgeW91ciBhbnN3ZXIgdG8gcXVlc3Rpb24gMywgZG8geW91IHN1c3BlY3QgdGhlIG1lYW4gU2hvb3REcnlNYXNzIGlzIGRpZmZlcmVudCBmb3Igd3QgdnMgZ21vPyAgRXhwbGFpbiB5b3VyIGFuc3dlci4KICAKKioqKgojIyMjIEFuc3dlcnM6CgogIDEuVGhlIENJIGZvciBXVCBpcyBiZXR3ZWVuIDY1LTg5LgogIDIuVGhlIENJIGZvciB0aGUgR01PIGlzIGJld3RlZW4gMzEtNTIuCiAgMy5ObyB0aGVzZSBDSXMgZG8gbm90IG92ZXJsYXAuIAogIDQuU2luY2UgdGhleSBkbyBub3Qgb3ZlcmxhcCB0aGUgbWVhbnMgb2YgU2hvb3REcnlNYXNzIG1pZ2h0IGJlIGRpZmZlcmVudCBiZXR3ZWVuIHRoZSBXVCBhbmQgR01PIHJpY2UuIFRoZSBtZWFuIG9mIFdUIGlzIGhpZ2hlciB0aGFuIHRoYXQgb2YgdGhlIEdNTy4gCiAgCiAg