General ideas before creating slide

First we create a Powerpoint document by importing a pptx file as an R object. To make it most easy, I create my own powerpoint document based on my own template that is my style. Of course you can create your own template in Powerpoint office software. To do this, in Powerpoint software: file -> new -> blank presentation: in View tab choose Slide Master you can edit slide master as you wish then save file as any name such as template.pptx. Using read_pptx() notice that an argument is your template file.

Layout summary

layout_summary(my_pres )
##              layout       master
## 1       Title Slide Office Theme
## 2 Title and Content Office Theme
## 3    Section Header Office Theme
## 4       Two Content Office Theme
## 5        Comparison Office Theme
## 6        Title Only Office Theme
## 7             Blank Office Theme

This is Layout of my Powerpoint template Threre most important part of creating an powerpoint in R is to understand the structure of Layouts. My template file has 7 layout: Title Slide, Title and Content, Section Header, Two Content, Comparison, Title Only,

View Layout property

It is very useful to uderstand the structure of layout_property of a template. An object named lay_pro is created

lay_pro <- my_pres  %>%   officer::layout_properties() 
haven::write_sav(lay_pro,"my_pres_layout.sav") # write sav read by SPSS about Layout and property

To know the layout summary

layout_summary(my_pres )
##              layout       master
## 1       Title Slide Office Theme
## 2 Title and Content Office Theme
## 3    Section Header Office Theme
## 4       Two Content Office Theme
## 5        Comparison Office Theme
## 6        Title Only Office Theme
## 7             Blank Office Theme
glimpse(layout_summary(my_pres ))
## Rows: 7
## Columns: 2
## $ layout <chr> "Title Slide", "Title and Content", "Section Header", "Two Cont…
## $ master <chr> "Office Theme", "Office Theme", "Office Theme", "Office Theme",…

Layout properties

z1 <- layout_properties(my_pres, layout = "Title Slide")
z2 <- layout_properties(my_pres, layout = "Title and Content")
z3 <- layout_properties(my_pres, layout = "Section Header")
z4 <- layout_properties(my_pres, layout = "Two Content")
z5 <- layout_properties(my_pres, layout = "Comparison")
z6 <- layout_properties(my_pres, layout = "Title Only")
z7 <- layout_properties(my_pres, layout = "Blank")
#my_pres %>% layout_properties( layout = "Title and Content") %>% haven:: write_sav("my_pres_layout_properties.sav")

layout of templates

01. Title Slide

ggplot(z1, aes(xmin = offx, ymin = -offy, xmax = offx + cx, ymax = -offy - cy)) + 
  geom_rect(fill = "pink") + 
  geom_text(aes(x = offx, y = -offy - cy/2, label = ph_label), 
            color = "black", size = 3.5, hjust = 0) +
  theme_void()

02. Title and Content

ggplot(z2, aes(xmin = offx, ymin = -offy, xmax = offx + cx, ymax = -offy - cy)) + 
  geom_rect(fill = "pink") + 
  geom_text(aes(x = offx, y = -offy - cy/2, label = ph_label), 
            color = "black", size = 3.5, hjust = 0) +
  theme_void()

03. Section Header

ggplot(z3, aes(xmin = offx, ymin = -offy, xmax = offx + cx, ymax = -offy - cy)) + 
  geom_rect(fill = "pink") + 
  geom_text(aes(x = offx, y = -offy - cy/2, label = ph_label), 
            color = "black", size = 3.5, hjust = 0) +
  theme_void()

04. Two Content

ggplot(z4, aes(xmin = offx, ymin = -offy, xmax = offx + cx, ymax = -offy - cy)) + 
  geom_rect(fill = "pink") + 
  geom_text(aes(x = offx, y = -offy - cy/2, label = ph_label), 
            color = "black", size = 3.5, hjust = 0) +
  theme_void()

05. Comparison

ggplot(z5, aes(xmin = offx, ymin = -offy, xmax = offx + cx, ymax = -offy - cy)) + 
  geom_rect(fill = "pink") + 
  geom_text(aes(x = offx, y = -offy - cy/2, label = ph_label), 
            color = "black", size = 3.5, hjust = 0) +
  theme_void()

06. Title Only

ggplot(z6, aes(xmin = offx, ymin = -offy, xmax = offx + cx, ymax = -offy - cy)) + 
  geom_rect(fill = "pink") + 
  geom_text(aes(x = offx, y = -offy - cy/2, label = ph_label), 
            color = "black", size = 3.5, hjust = 0) +
  theme_void()

07. Blank

ggplot(z7, aes(xmin = offx, ymin = -offy, xmax = offx + cx, ymax = -offy - cy)) + 
  geom_rect(fill = "pink") + 
  geom_text(aes(x = offx, y = -offy - cy/2, label = ph_label), 
            color = "black", size = 3.5, hjust = 0) +
  theme_void()

Creat slides on Powerpoint based in your own template.

After you have your own template on your working directory, you will add contents to the slide.

Creae your own first slide of a PowerPoint presentation. Your purpose is to put contents onto the “Title slide”. Notice that understanding properties of layout is very important since you should understand the type, placeholder and other properties of your first slide.

z1 %>% knitr::kable()
master_name name type type_idx id ph_label ph offx offy cx cy rotation fld_id fld_type
Office Theme Title Slide ctrTitle 1 2 Title 1 1.0000000 2.00000 11.333333 1.6076389 NA NA NA
Office Theme Title Slide subTitle 1 3 Subtitle 2 2.0000000 4.25000 9.333333 1.9166667 NA NA NA
Office Theme Title Slide dt 1 4 Date Placeholder 3 0.6666667 6.95139 3.111111 0.3993056 NA {E6744CE3-0875-4B69-89C0-6F72D8139561} datetimeFigureOut
Office Theme Title Slide ftr 1 5 Footer Placeholder 4 4.5555556 6.95139 4.222222 0.3993056 NA NA NA
Office Theme Title Slide sldNum 1 6 Slide Number Placeholder 5 9.5555556 6.95139 3.111111 0.3993056 NA {8DADB20D-508E-4C6D-A9E4-257D5607B0F6} slidenum

Create the first slide: (“Title Slide)

  • We use add_slide() to create a slide, you also specify the layout of the slide, in this case I choe “Title Slide”, because it is my first slide of powerpoint.

  • Also use add_slide()function to put contents to place holder.

  • Remember this slide: has two main placeholder: Title 1 and Subtitle 2 we should enter command as `

  • With Title 1

my_pres <- ph_with(my_pres, value = " your Title text....", location = ph_location_type(type = "ctrTitle"))

  • With Subtitle 2

my_pres <- ph_with(my_pres, value = " your subtile text....", location = ph_location_type(type = "subTitle"))

my_pres  <- add_slide(my_pres , layout = "Title Slide", master = "Office Theme")

my_pres <- ph_with(my_pres, value = " Resiliense for caregivers of Dementia", location = ph_location_type(type = "ctrTitle")) # Main title

my_pres <- ph_with(my_pres, value = " Dr Liem, Dr Loan", location = ph_location_type(type = "subTitle")) # subtitle

Create the next slide: (“Title and Content”)

  • After creating “Title Slide”, We create another slide, since I want to add contents to this slide I use add_slide(), however I choose “Title and Content”.
  • Also use add_slide()function to put contents to place holder however since we need to put a lot of texts with different kind of lists, so I use level_list()function to create structure of headings and unordered_list()function to write contents.
ul <- unordered_list(
  level_list = c(1, 2,  1, 2, 2),
  str_list = c("Câu hỏi nghiên cứu", "Ở người chăm sóc bệnh nhân sa sút trí tuệ, chiến lược thích nghi với căng thẳng là gì.
", "Mục tiêu", "Mô tả các đặc điểm thích nghi của người chăm sóc bệnh nhân sa sút trí tuệ.
", "Mô tả chiến lược thích nghi của người chăm sóc bệnh nhân sa sút trí tuệ...
"),
  style = fp_text(color = "black", font.size = 0) )


my_pres  <- add_slide(my_pres , layout = "Title and Content", master = "Office Theme")

my_pres <- ph_with(my_pres, value = "Research Question and Objectives", location = ph_location_type(type = "title"))
my_pres <- ph_with(x = my_pres, value = ul, 
               location = ph_location_type(type = "body") )

Next slide of title and content

Next slide of title and content 3

# add slide
my_pres  <- add_slide(my_pres , layout = "Title and Content", master = "Office Theme")
# add title of slide
my_pres <- ph_with(my_pres, value = "Objectives", location = ph_location_type(type = "title"))
# add body of slide
my_pres <- ph_with(my_pres, value = c("A novel model of resilience was tested in caregivers of people with mild-to-moderate dementia and was extended to explore whether including self-efficacy, optimism, and self-esteem improved its predictive value."), location = ph_location_type(type = "body"))
# Add footer
my_pres <- ph_with(my_pres, value = "https://doi.org/10.1186/s12877-023-04549-y", location = ph_location_type(type = "ftr"))
# Add footer with date
my_pres <- ph_with(my_pres, value = format(Sys.Date()), location = ph_location_type(type = "dt"))
# Add infor to footer

my_pres <- ph_with(my_pres, value = "slide thứ nhất", location = ph_location_type(type = "sldNum"))

We put table inside

my_pres  <- add_slide(my_pres , layout = "Title and Content", master = "Office Theme")
my_pres  <- on_slide(my_pres , index = 4)

my_pres <- ph_with(my_pres, value = "Psychological resilience", location = ph_location_type(type = "title"))

emp <- data.frame(name=c("Mild resilience", "Moderate resilience", "High resilience"), salary=c("Less than 50%", "50-75%", "More than 75%" )) # cteate a dataframe and make it to table 

loc <- ph_location(
  left=1.5,
  top = 1.5,
  width = 10,
  height = 4,
  rotation = 0,
  bg="#333333"
)

my_pres  <- ph_with(my_pres , emp, location = loc)

Add slide

my_pres <- add_slide(my_pres, layout = 'Title and Content', master = 'Office Theme')

my_pres <- ph_with(my_pres, value = "Sự thích nghi Resilient", location = ph_location_type(type = "title"))
my_pres <- ph_with(my_pres, c(
  "Tự động viên - self-appraisal",
  "Sự chấp nhận Aceptance", 
  "Hỗ trợ xã hội - Social support",
  "Đời sống tâm linh- spirituality"
    ), 
          location = ph_location_type(type = "body") ) 

Add more slide

# add slide
my_pres  <- add_slide(my_pres , layout = "Title and Content", master = "Office Theme")
# add title of slide
my_pres <- ph_with(my_pres, value = "Current study", location = ph_location_type(type = "title"))
# add body of slide
my_pres <- ph_with(my_pres, value = c("The present study found that there are factors relating to the caregiver and to the person with dementia that affect how resilient a dementia caregiver may be.", "It is apparent that caregiver resilience is not solely due to the personal assets and resources of the caregiver but may also be affected by the level of dependence of the person with dementia.",  "Findings suggest that caregivers with high levels of neuroticism and low subjective caregiver competence"), location = ph_location_type(type = "body"))

add ggplot

library(ggplot2)
gg_plot <- ggplot(data = iris ) +
  geom_point(
    mapping = aes(Sepal.Length, Petal.Length, color = Species),
    size = 3) + theme_minimal()


my_pres  <- add_slide(my_pres , layout = "Title and Content", master = "Office Theme")


my_pres <- ph_with(my_pres, value = "cho ggplot vô body", location = ph_location_type(type = "title"))

  
my_pres <- ph_with(x = my_pres, gg_plot, 
   location = ph_location_type(type = "body") )

add image

my_pres  <- add_slide(my_pres , layout = "Title and Content", master = "Office Theme")


my_pres <- ph_with(my_pres, value = "Thêm hình", location = ph_location_type(type = "title"))

img.file <- file.path( "i1.png" )
my_pres <- ph_with(x = my_pres, external_img(img.file, width = 1.58*3, height = 0.79*3),
   location = ph_location_type(type = "body"), use_loc_size = TRUE )

add table

my_pres  <- add_slide(my_pres , layout = "Title and Content", master = "Office Theme")

 
my_pres <- ph_with(my_pres, value = "Thêm bảng", location = ph_location_type(type = "title"))

ft <- flextable(head(mtcars))
ft <- set_table_properties(ft, width = 0.5, layout = "autofit")

my_pres <- ph_with(x = my_pres, ft,   location = ph_location_type(type = "body")  )

add table in the center

my_pres  <- add_slide(my_pres , layout = "Title and Content", master = "Office Theme")

 
my_pres <- ph_with(my_pres, value = "Thêm bảng", location = ph_location_type(type = "title"))

ft <- flextable(head(mtcars))
ft <- set_table_properties(ft, width = 0.5, layout = "autofit")

my_pres <- ph_with(x = my_pres, ft,   location = ph_location(width = 7, height = 5, newlabel = "hello") )  

Export to pptx file

print(my_pres , "document.pptx")
LS0tDQp0aXRsZTogIm9mZmljZXIgYW5kIFBvd2VycG9pbnQgIg0Kc3VidGl0bGU6IDxhIG5hbWU9ImhvbWUiPjwvYT4NCmF1dGhvcjogIkhlbnJ5Ig0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IGZhbHNlDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgd29yZF9kb2N1bWVudHM6DQogICAgdG9jOiB0cnVlDQphbHdheXNfYWxsb3dfaHRtbDogdHJ1ZQ0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQ0KLS0tDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KHBhY21hbikNCnBfbG9hZCh0aWR5dmVyc2Usb2ZmaWNlcixoYXZlbiwgZ3QsIGZsZXh0YWJsZSkNCg0KYGBgDQoNCiMgR2VuZXJhbCBpZGVhcyBiZWZvcmUgY3JlYXRpbmcgc2xpZGUNCg0KRmlyc3Qgd2UgY3JlYXRlIGEgUG93ZXJwb2ludCBkb2N1bWVudCBieSBpbXBvcnRpbmcgYSBwcHR4IGZpbGUgYXMgYW4gUiBvYmplY3QuIFRvIG1ha2UgaXQgbW9zdCBlYXN5LCBJIGNyZWF0ZSBteSBvd24gcG93ZXJwb2ludCBkb2N1bWVudCBiYXNlZCBvbiBteSBvd24gdGVtcGxhdGUgdGhhdCBpcyBteSBzdHlsZS4gT2YgY291cnNlIHlvdSBjYW4gY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlIGluIFBvd2VycG9pbnQgb2ZmaWNlIHNvZnR3YXJlLiBUbyBkbyB0aGlzLCBpbiBQb3dlcnBvaW50IHNvZnR3YXJlOiBmaWxlIC1cPiBuZXcgLVw+IGJsYW5rIHByZXNlbnRhdGlvbjogaW4gVmlldyB0YWIgY2hvb3NlIFNsaWRlIE1hc3RlciB5b3UgY2FuIGVkaXQgc2xpZGUgbWFzdGVyIGFzIHlvdSB3aXNoIHRoZW4gc2F2ZSBmaWxlIGFzIGFueSBuYW1lIHN1Y2ggYXMgdGVtcGxhdGUucHB0eC4gVXNpbmcgcmVhZF9wcHR4KCkgbm90aWNlIHRoYXQgYW4gYXJndW1lbnQgaXMgeW91ciB0ZW1wbGF0ZSBmaWxlLg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KbXlfcHJlcyAgPC0gcmVhZF9wcHR4KCJ0ZW1wbGF0ZS5wcHR4IikgDQpgYGANCg0KIyMgTGF5b3V0IHN1bW1hcnkNCg0KYGBge3J9DQpsYXlvdXRfc3VtbWFyeShteV9wcmVzICkNCmBgYA0KDQpUaGlzIGlzIExheW91dCBvZiBteSBQb3dlcnBvaW50IHRlbXBsYXRlIFRocmVyZSBtb3N0IGltcG9ydGFudCBwYXJ0IG9mIGNyZWF0aW5nIGFuIHBvd2VycG9pbnQgaW4gUiBpcyB0byB1bmRlcnN0YW5kIHRoZSBzdHJ1Y3R1cmUgb2YgTGF5b3V0cy4gTXkgdGVtcGxhdGUgZmlsZSBoYXMgNyBsYXlvdXQ6IFRpdGxlIFNsaWRlLCBUaXRsZSBhbmQgQ29udGVudCwgU2VjdGlvbiBIZWFkZXIsIFR3byBDb250ZW50LCBDb21wYXJpc29uLCBUaXRsZSBPbmx5LA0KDQojIyBWaWV3IExheW91dCBwcm9wZXJ0eQ0KDQpJdCBpcyB2ZXJ5IHVzZWZ1bCB0byB1ZGVyc3RhbmQgdGhlIHN0cnVjdHVyZSBvZiBsYXlvdXRfcHJvcGVydHkgb2YgYSB0ZW1wbGF0ZS4gQW4gb2JqZWN0IG5hbWVkIGBsYXlfcHJvYCBpcyBjcmVhdGVkDQoNCmBgYHtyfQ0KbGF5X3BybyA8LSBteV9wcmVzICAlPiUgICBvZmZpY2VyOjpsYXlvdXRfcHJvcGVydGllcygpIA0KaGF2ZW46OndyaXRlX3NhdihsYXlfcHJvLCJteV9wcmVzX2xheW91dC5zYXYiKSAjIHdyaXRlIHNhdiByZWFkIGJ5IFNQU1MgYWJvdXQgTGF5b3V0IGFuZCBwcm9wZXJ0eQ0KYGBgDQoNCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIEdseW1wZSBhdCBwb3dlciBwb2ludCBsYXlvdXQgcHJvcGVydGllcw0KI0xheW91dCBwcm9wZXJ0eSBpcyBhICJibGFjay1ib3giIG9mIFBvd2VycG9pbnQgc2xpZGUgbWFzdGVyDQpnbGltcHNlKGxheV9wcm8pDQpsYXlfcHJvICU+JSBndCgpDQpgYGANCg0KIyMgVG8ga25vdyB0aGUgbGF5b3V0IHN1bW1hcnkNCg0KYGBge3J9DQpsYXlvdXRfc3VtbWFyeShteV9wcmVzICkNCmBgYA0KDQpgYGB7cn0NCmdsaW1wc2UobGF5b3V0X3N1bW1hcnkobXlfcHJlcyApKQ0KYGBgDQoNCiMjIExheW91dCBwcm9wZXJ0aWVzDQoNCmBgYHtyfQ0KejEgPC0gbGF5b3V0X3Byb3BlcnRpZXMobXlfcHJlcywgbGF5b3V0ID0gIlRpdGxlIFNsaWRlIikNCnoyIDwtIGxheW91dF9wcm9wZXJ0aWVzKG15X3ByZXMsIGxheW91dCA9ICJUaXRsZSBhbmQgQ29udGVudCIpDQp6MyA8LSBsYXlvdXRfcHJvcGVydGllcyhteV9wcmVzLCBsYXlvdXQgPSAiU2VjdGlvbiBIZWFkZXIiKQ0KejQgPC0gbGF5b3V0X3Byb3BlcnRpZXMobXlfcHJlcywgbGF5b3V0ID0gIlR3byBDb250ZW50IikNCno1IDwtIGxheW91dF9wcm9wZXJ0aWVzKG15X3ByZXMsIGxheW91dCA9ICJDb21wYXJpc29uIikNCno2IDwtIGxheW91dF9wcm9wZXJ0aWVzKG15X3ByZXMsIGxheW91dCA9ICJUaXRsZSBPbmx5IikNCno3IDwtIGxheW91dF9wcm9wZXJ0aWVzKG15X3ByZXMsIGxheW91dCA9ICJCbGFuayIpDQojbXlfcHJlcyAlPiUgbGF5b3V0X3Byb3BlcnRpZXMoIGxheW91dCA9ICJUaXRsZSBhbmQgQ29udGVudCIpICU+JSBoYXZlbjo6IHdyaXRlX3NhdigibXlfcHJlc19sYXlvdXRfcHJvcGVydGllcy5zYXYiKQ0KDQpgYGANCg0KIyMgbGF5b3V0IG9mIHRlbXBsYXRlcw0KDQojIyAwMS4gVGl0bGUgU2xpZGUNCg0KYGBge3J9DQpnZ3Bsb3QoejEsIGFlcyh4bWluID0gb2ZmeCwgeW1pbiA9IC1vZmZ5LCB4bWF4ID0gb2ZmeCArIGN4LCB5bWF4ID0gLW9mZnkgLSBjeSkpICsgDQogIGdlb21fcmVjdChmaWxsID0gInBpbmsiKSArIA0KICBnZW9tX3RleHQoYWVzKHggPSBvZmZ4LCB5ID0gLW9mZnkgLSBjeS8yLCBsYWJlbCA9IHBoX2xhYmVsKSwgDQogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSAzLjUsIGhqdXN0ID0gMCkgKw0KICB0aGVtZV92b2lkKCkNCmBgYA0KDQojIyAwMi4gVGl0bGUgYW5kIENvbnRlbnQNCg0KYGBge3J9DQpnZ3Bsb3QoejIsIGFlcyh4bWluID0gb2ZmeCwgeW1pbiA9IC1vZmZ5LCB4bWF4ID0gb2ZmeCArIGN4LCB5bWF4ID0gLW9mZnkgLSBjeSkpICsgDQogIGdlb21fcmVjdChmaWxsID0gInBpbmsiKSArIA0KICBnZW9tX3RleHQoYWVzKHggPSBvZmZ4LCB5ID0gLW9mZnkgLSBjeS8yLCBsYWJlbCA9IHBoX2xhYmVsKSwgDQogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSAzLjUsIGhqdXN0ID0gMCkgKw0KICB0aGVtZV92b2lkKCkNCmBgYA0KDQojIyAwMy4gU2VjdGlvbiBIZWFkZXINCg0KYGBge3J9DQpnZ3Bsb3QoejMsIGFlcyh4bWluID0gb2ZmeCwgeW1pbiA9IC1vZmZ5LCB4bWF4ID0gb2ZmeCArIGN4LCB5bWF4ID0gLW9mZnkgLSBjeSkpICsgDQogIGdlb21fcmVjdChmaWxsID0gInBpbmsiKSArIA0KICBnZW9tX3RleHQoYWVzKHggPSBvZmZ4LCB5ID0gLW9mZnkgLSBjeS8yLCBsYWJlbCA9IHBoX2xhYmVsKSwgDQogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSAzLjUsIGhqdXN0ID0gMCkgKw0KICB0aGVtZV92b2lkKCkNCmBgYA0KDQojIyAwNC4gVHdvIENvbnRlbnQNCg0KYGBge3J9DQpnZ3Bsb3QoejQsIGFlcyh4bWluID0gb2ZmeCwgeW1pbiA9IC1vZmZ5LCB4bWF4ID0gb2ZmeCArIGN4LCB5bWF4ID0gLW9mZnkgLSBjeSkpICsgDQogIGdlb21fcmVjdChmaWxsID0gInBpbmsiKSArIA0KICBnZW9tX3RleHQoYWVzKHggPSBvZmZ4LCB5ID0gLW9mZnkgLSBjeS8yLCBsYWJlbCA9IHBoX2xhYmVsKSwgDQogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSAzLjUsIGhqdXN0ID0gMCkgKw0KICB0aGVtZV92b2lkKCkNCmBgYA0KDQojIyAwNS4gQ29tcGFyaXNvbg0KDQpgYGB7cn0NCmdncGxvdCh6NSwgYWVzKHhtaW4gPSBvZmZ4LCB5bWluID0gLW9mZnksIHhtYXggPSBvZmZ4ICsgY3gsIHltYXggPSAtb2ZmeSAtIGN5KSkgKyANCiAgZ2VvbV9yZWN0KGZpbGwgPSAicGluayIpICsgDQogIGdlb21fdGV4dChhZXMoeCA9IG9mZngsIHkgPSAtb2ZmeSAtIGN5LzIsIGxhYmVsID0gcGhfbGFiZWwpLCANCiAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDMuNSwgaGp1c3QgPSAwKSArDQogIHRoZW1lX3ZvaWQoKQ0KYGBgDQoNCiMjIDA2LiBUaXRsZSBPbmx5DQoNCmBgYHtyfQ0KZ2dwbG90KHo2LCBhZXMoeG1pbiA9IG9mZngsIHltaW4gPSAtb2ZmeSwgeG1heCA9IG9mZnggKyBjeCwgeW1heCA9IC1vZmZ5IC0gY3kpKSArIA0KICBnZW9tX3JlY3QoZmlsbCA9ICJwaW5rIikgKyANCiAgZ2VvbV90ZXh0KGFlcyh4ID0gb2ZmeCwgeSA9IC1vZmZ5IC0gY3kvMiwgbGFiZWwgPSBwaF9sYWJlbCksIA0KICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMy41LCBoanVzdCA9IDApICsNCiAgdGhlbWVfdm9pZCgpDQpgYGANCg0KIyMgMDcuIEJsYW5rDQoNCmBgYHtyfQ0KZ2dwbG90KHo3LCBhZXMoeG1pbiA9IG9mZngsIHltaW4gPSAtb2ZmeSwgeG1heCA9IG9mZnggKyBjeCwgeW1heCA9IC1vZmZ5IC0gY3kpKSArIA0KICBnZW9tX3JlY3QoZmlsbCA9ICJwaW5rIikgKyANCiAgZ2VvbV90ZXh0KGFlcyh4ID0gb2ZmeCwgeSA9IC1vZmZ5IC0gY3kvMiwgbGFiZWwgPSBwaF9sYWJlbCksIA0KICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMy41LCBoanVzdCA9IDApICsNCiAgdGhlbWVfdm9pZCgpDQpgYGANCg0KIyBDcmVhdCBzbGlkZXMgb24gUG93ZXJwb2ludCBiYXNlZCBpbiB5b3VyIG93biB0ZW1wbGF0ZS4NCg0KQWZ0ZXIgeW91IGhhdmUgeW91ciBvd24gdGVtcGxhdGUgb24geW91ciB3b3JraW5nIGRpcmVjdG9yeSwgeW91IHdpbGwgYWRkIGNvbnRlbnRzIHRvIHRoZSBzbGlkZS4NCg0KQ3JlYWUgeW91ciBvd24gZmlyc3Qgc2xpZGUgb2YgYSBQb3dlclBvaW50IHByZXNlbnRhdGlvbi4gWW91ciBwdXJwb3NlIGlzIHRvIHB1dCBjb250ZW50cyBvbnRvIHRoZSAiVGl0bGUgc2xpZGUiLiBOb3RpY2UgdGhhdCB1bmRlcnN0YW5kaW5nIHByb3BlcnRpZXMgb2YgbGF5b3V0IGlzIHZlcnkgaW1wb3J0YW50IHNpbmNlIHlvdSBzaG91bGQgdW5kZXJzdGFuZCB0aGUgdHlwZSwgcGxhY2Vob2xkZXIgYW5kIG90aGVyIHByb3BlcnRpZXMgb2YgeW91ciBmaXJzdCBzbGlkZS4NCg0KYGBge3J9DQp6MSAlPiUga25pdHI6OmthYmxlKCkNCmBgYA0KDQojIyBDcmVhdGUgdGhlIGZpcnN0IHNsaWRlOiAoIlRpdGxlIFNsaWRlKQ0KDQotICAgV2UgdXNlIGBhZGRfc2xpZGUoKWAgdG8gY3JlYXRlIGEgc2xpZGUsIHlvdSBhbHNvIHNwZWNpZnkgdGhlIGxheW91dCBvZiB0aGUgc2xpZGUsIGluIHRoaXMgY2FzZSBJIGNob2UgIlRpdGxlIFNsaWRlIiwgYmVjYXVzZSBpdCBpcyBteSBmaXJzdCBzbGlkZSBvZiBwb3dlcnBvaW50Lg0KDQotICAgQWxzbyB1c2UgYGFkZF9zbGlkZSgpYGZ1bmN0aW9uIHRvIHB1dCBjb250ZW50cyB0byBwbGFjZSBob2xkZXIuDQoNCi0gICBSZW1lbWJlciB0aGlzIHNsaWRlOiBoYXMgdHdvIG1haW4gcGxhY2Vob2xkZXI6IGBUaXRsZSAxYCBhbmQgYFN1YnRpdGxlIDJgIHdlIHNob3VsZCBlbnRlciBjb21tYW5kIGFzIFxgDQoNCiAgLSAgIFdpdGggYFRpdGxlIDFgDQoNCiAgIGAgbXlfcHJlcyA8LSBwaF93aXRoKG15X3ByZXMsIHZhbHVlID0gIiB5b3VyIFRpdGxlIHRleHQuLi4uIiwgbG9jYXRpb24gPSBwaF9sb2NhdGlvbl90eXBlKHR5cGUgPSAiY3RyVGl0bGUiKSlgDQogICANCiAgLSAgIFdpdGggYFN1YnRpdGxlIDJgDQoNCiAgYG15X3ByZXMgPC0gcGhfd2l0aChteV9wcmVzLCB2YWx1ZSA9ICIgeW91ciBzdWJ0aWxlIHRleHQuLi4uIiwgbG9jYXRpb24gPSBwaF9sb2NhdGlvbl90eXBlKHR5cGUgPSAic3ViVGl0bGUiKSlgICAgDQoNCmBgYHtyfQ0KbXlfcHJlcyAgPC0gYWRkX3NsaWRlKG15X3ByZXMgLCBsYXlvdXQgPSAiVGl0bGUgU2xpZGUiLCBtYXN0ZXIgPSAiT2ZmaWNlIFRoZW1lIikNCg0KbXlfcHJlcyA8LSBwaF93aXRoKG15X3ByZXMsIHZhbHVlID0gIiBSZXNpbGllbnNlIGZvciBjYXJlZ2l2ZXJzIG9mIERlbWVudGlhIiwgbG9jYXRpb24gPSBwaF9sb2NhdGlvbl90eXBlKHR5cGUgPSAiY3RyVGl0bGUiKSkgIyBNYWluIHRpdGxlDQoNCm15X3ByZXMgPC0gcGhfd2l0aChteV9wcmVzLCB2YWx1ZSA9ICIgRHIgTGllbSwgRHIgTG9hbiIsIGxvY2F0aW9uID0gcGhfbG9jYXRpb25fdHlwZSh0eXBlID0gInN1YlRpdGxlIikpICMgc3VidGl0bGUNCg0KYGBgDQoNCiMjIENyZWF0ZSB0aGUgbmV4dCBzbGlkZTogKCJUaXRsZSBhbmQgQ29udGVudCIpDQoNCi0gICBBZnRlciBjcmVhdGluZyAiVGl0bGUgU2xpZGUiLCBXZSBjcmVhdGUgYW5vdGhlciBzbGlkZSwgc2luY2UgSSB3YW50IHRvIGFkZCBjb250ZW50cyB0byB0aGlzIHNsaWRlIEkgdXNlIGBhZGRfc2xpZGUoKWAsIGhvd2V2ZXIgSSBjaG9vc2UgIlRpdGxlIGFuZCBDb250ZW50Ii4NCi0gICBBbHNvIHVzZSBgYWRkX3NsaWRlKClgZnVuY3Rpb24gdG8gcHV0IGNvbnRlbnRzIHRvIHBsYWNlIGhvbGRlciBob3dldmVyIHNpbmNlIHdlIG5lZWQgdG8gcHV0IGEgbG90IG9mIHRleHRzIHdpdGggZGlmZmVyZW50IGtpbmQgb2YgbGlzdHMsIHNvIEkgdXNlICBgbGV2ZWxfbGlzdCgpYGZ1bmN0aW9uIHRvIGNyZWF0ZSBzdHJ1Y3R1cmUgb2YgaGVhZGluZ3MgYW5kICBgdW5vcmRlcmVkX2xpc3QoKWBmdW5jdGlvbiB0byB3cml0ZSBjb250ZW50cy4NCg0KYGBge3J9DQp1bCA8LSB1bm9yZGVyZWRfbGlzdCgNCiAgbGV2ZWxfbGlzdCA9IGMoMSwgMiwgIDEsIDIsIDIpLA0KICBzdHJfbGlzdCA9IGMoIkPDonUgaOG7j2kgbmdoacOqbiBj4bupdSIsICLhu54gbmfGsOG7nWkgY2jEg20gc8OzYyBi4buHbmggbmjDom4gc2Egc8O6dCB0csOtIHR14buHLCBjaGnhur9uIGzGsOG7o2MgdGjDrWNoIG5naGkgduG7m2kgY8SDbmcgdGjhurNuZyBsw6AgZ8OsLg0KIiwgIk3hu6VjIHRpw6p1IiwgIk3DtCB04bqjIGPDoWMgxJHhurdjIMSRaeG7g20gdGjDrWNoIG5naGkgY+G7p2EgbmfGsOG7nWkgY2jEg20gc8OzYyBi4buHbmggbmjDom4gc2Egc8O6dCB0csOtIHR14buHLg0KIiwgIk3DtCB04bqjIGNoaeG6v24gbMaw4bujYyB0aMOtY2ggbmdoaSBj4bunYSBuZ8aw4budaSBjaMSDbSBzw7NjIGLhu4duaCBuaMOibiBzYSBzw7p0IHRyw60gdHXhu4cuLi4NCiIpLA0KICBzdHlsZSA9IGZwX3RleHQoY29sb3IgPSAiYmxhY2siLCBmb250LnNpemUgPSAwKSApDQoNCg0KbXlfcHJlcyAgPC0gYWRkX3NsaWRlKG15X3ByZXMgLCBsYXlvdXQgPSAiVGl0bGUgYW5kIENvbnRlbnQiLCBtYXN0ZXIgPSAiT2ZmaWNlIFRoZW1lIikNCg0KbXlfcHJlcyA8LSBwaF93aXRoKG15X3ByZXMsIHZhbHVlID0gIlJlc2VhcmNoIFF1ZXN0aW9uIGFuZCBPYmplY3RpdmVzIiwgbG9jYXRpb24gPSBwaF9sb2NhdGlvbl90eXBlKHR5cGUgPSAidGl0bGUiKSkNCm15X3ByZXMgPC0gcGhfd2l0aCh4ID0gbXlfcHJlcywgdmFsdWUgPSB1bCwgDQogICAgICAgICAgICAgICBsb2NhdGlvbiA9IHBoX2xvY2F0aW9uX3R5cGUodHlwZSA9ICJib2R5IikgKQ0KDQoNCmBgYA0KDQojIyMgTmV4dCBzbGlkZSBvZiB0aXRsZSBhbmQgY29udGVudA0KDQojIyMgTmV4dCBzbGlkZSBvZiB0aXRsZSBhbmQgY29udGVudCAzDQoNCmBgYHtyfQ0KIyBhZGQgc2xpZGUNCm15X3ByZXMgIDwtIGFkZF9zbGlkZShteV9wcmVzICwgbGF5b3V0ID0gIlRpdGxlIGFuZCBDb250ZW50IiwgbWFzdGVyID0gIk9mZmljZSBUaGVtZSIpDQojIGFkZCB0aXRsZSBvZiBzbGlkZQ0KbXlfcHJlcyA8LSBwaF93aXRoKG15X3ByZXMsIHZhbHVlID0gIk9iamVjdGl2ZXMiLCBsb2NhdGlvbiA9IHBoX2xvY2F0aW9uX3R5cGUodHlwZSA9ICJ0aXRsZSIpKQ0KIyBhZGQgYm9keSBvZiBzbGlkZQ0KbXlfcHJlcyA8LSBwaF93aXRoKG15X3ByZXMsIHZhbHVlID0gYygiQSBub3ZlbCBtb2RlbCBvZiByZXNpbGllbmNlIHdhcyB0ZXN0ZWQgaW4gY2FyZWdpdmVycyBvZiBwZW9wbGUgd2l0aCBtaWxkLXRvLW1vZGVyYXRlIGRlbWVudGlhIGFuZCB3YXMgZXh0ZW5kZWQgdG8gZXhwbG9yZSB3aGV0aGVyIGluY2x1ZGluZyBzZWxmLWVmZmljYWN5LCBvcHRpbWlzbSwgYW5kIHNlbGYtZXN0ZWVtIGltcHJvdmVkIGl0cyBwcmVkaWN0aXZlIHZhbHVlLiIpLCBsb2NhdGlvbiA9IHBoX2xvY2F0aW9uX3R5cGUodHlwZSA9ICJib2R5IikpDQojIEFkZCBmb290ZXINCm15X3ByZXMgPC0gcGhfd2l0aChteV9wcmVzLCB2YWx1ZSA9ICJodHRwczovL2RvaS5vcmcvMTAuMTE4Ni9zMTI4NzctMDIzLTA0NTQ5LXkiLCBsb2NhdGlvbiA9IHBoX2xvY2F0aW9uX3R5cGUodHlwZSA9ICJmdHIiKSkNCiMgQWRkIGZvb3RlciB3aXRoIGRhdGUNCm15X3ByZXMgPC0gcGhfd2l0aChteV9wcmVzLCB2YWx1ZSA9IGZvcm1hdChTeXMuRGF0ZSgpKSwgbG9jYXRpb24gPSBwaF9sb2NhdGlvbl90eXBlKHR5cGUgPSAiZHQiKSkNCiMgQWRkIGluZm9yIHRvIGZvb3Rlcg0KDQpteV9wcmVzIDwtIHBoX3dpdGgobXlfcHJlcywgdmFsdWUgPSAic2xpZGUgdGjhu6kgbmjhuqV0IiwgbG9jYXRpb24gPSBwaF9sb2NhdGlvbl90eXBlKHR5cGUgPSAic2xkTnVtIikpDQoNCmBgYA0KDQojIyBXZSBwdXQgdGFibGUgaW5zaWRlDQoNCmBgYHtyfQ0KbXlfcHJlcyAgPC0gYWRkX3NsaWRlKG15X3ByZXMgLCBsYXlvdXQgPSAiVGl0bGUgYW5kIENvbnRlbnQiLCBtYXN0ZXIgPSAiT2ZmaWNlIFRoZW1lIikNCm15X3ByZXMgIDwtIG9uX3NsaWRlKG15X3ByZXMgLCBpbmRleCA9IDQpDQoNCm15X3ByZXMgPC0gcGhfd2l0aChteV9wcmVzLCB2YWx1ZSA9ICJQc3ljaG9sb2dpY2FsIHJlc2lsaWVuY2UiLCBsb2NhdGlvbiA9IHBoX2xvY2F0aW9uX3R5cGUodHlwZSA9ICJ0aXRsZSIpKQ0KDQplbXAgPC0gZGF0YS5mcmFtZShuYW1lPWMoIk1pbGQgcmVzaWxpZW5jZSIsICJNb2RlcmF0ZSByZXNpbGllbmNlIiwgIkhpZ2ggcmVzaWxpZW5jZSIpLCBzYWxhcnk9YygiTGVzcyB0aGFuIDUwJSIsICI1MC03NSUiLCAiTW9yZSB0aGFuIDc1JSIgKSkgIyBjdGVhdGUgYSBkYXRhZnJhbWUgYW5kIG1ha2UgaXQgdG8gdGFibGUgDQoNCmxvYyA8LSBwaF9sb2NhdGlvbigNCiAgbGVmdD0xLjUsDQogIHRvcCA9IDEuNSwNCiAgd2lkdGggPSAxMCwNCiAgaGVpZ2h0ID0gNCwNCiAgcm90YXRpb24gPSAwLA0KICBiZz0iIzMzMzMzMyINCikNCg0KbXlfcHJlcyAgPC0gcGhfd2l0aChteV9wcmVzICwgZW1wLCBsb2NhdGlvbiA9IGxvYykNCg0KYGBgDQoNCiMjIEFkZCBzbGlkZQ0KDQpgYGB7cn0NCm15X3ByZXMgPC0gYWRkX3NsaWRlKG15X3ByZXMsIGxheW91dCA9ICdUaXRsZSBhbmQgQ29udGVudCcsIG1hc3RlciA9ICdPZmZpY2UgVGhlbWUnKQ0KDQpteV9wcmVzIDwtIHBoX3dpdGgobXlfcHJlcywgdmFsdWUgPSAiU+G7sSB0aMOtY2ggbmdoaSBSZXNpbGllbnQiLCBsb2NhdGlvbiA9IHBoX2xvY2F0aW9uX3R5cGUodHlwZSA9ICJ0aXRsZSIpKQ0KbXlfcHJlcyA8LSBwaF93aXRoKG15X3ByZXMsIGMoDQogICJU4buxIMSR4buZbmcgdmnDqm4gLSBzZWxmLWFwcHJhaXNhbCIsDQogICJT4buxIGNo4bqlcCBuaOG6rW4gQWNlcHRhbmNlIiwgDQogICJI4buXIHRy4bujIHjDoyBo4buZaSAtIFNvY2lhbCBzdXBwb3J0IiwNCiAgIsSQ4budaSBz4buRbmcgdMOibSBsaW5oLSBzcGlyaXR1YWxpdHkiDQogICAgKSwgDQogICAgICAgICAgbG9jYXRpb24gPSBwaF9sb2NhdGlvbl90eXBlKHR5cGUgPSAiYm9keSIpICkgDQpgYGANCg0KIyMgQWRkIG1vcmUgc2xpZGUNCg0KYGBge3J9DQojIGFkZCBzbGlkZQ0KbXlfcHJlcyAgPC0gYWRkX3NsaWRlKG15X3ByZXMgLCBsYXlvdXQgPSAiVGl0bGUgYW5kIENvbnRlbnQiLCBtYXN0ZXIgPSAiT2ZmaWNlIFRoZW1lIikNCiMgYWRkIHRpdGxlIG9mIHNsaWRlDQpteV9wcmVzIDwtIHBoX3dpdGgobXlfcHJlcywgdmFsdWUgPSAiQ3VycmVudCBzdHVkeSIsIGxvY2F0aW9uID0gcGhfbG9jYXRpb25fdHlwZSh0eXBlID0gInRpdGxlIikpDQojIGFkZCBib2R5IG9mIHNsaWRlDQpteV9wcmVzIDwtIHBoX3dpdGgobXlfcHJlcywgdmFsdWUgPSBjKCJUaGUgcHJlc2VudCBzdHVkeSBmb3VuZCB0aGF0IHRoZXJlIGFyZSBmYWN0b3JzIHJlbGF0aW5nIHRvIHRoZSBjYXJlZ2l2ZXIgYW5kIHRvIHRoZSBwZXJzb24gd2l0aCBkZW1lbnRpYSB0aGF0IGFmZmVjdCBob3cgcmVzaWxpZW50IGEgZGVtZW50aWEgY2FyZWdpdmVyIG1heSBiZS4iLCAiSXQgaXMgYXBwYXJlbnQgdGhhdCBjYXJlZ2l2ZXIgcmVzaWxpZW5jZSBpcyBub3Qgc29sZWx5IGR1ZSB0byB0aGUgcGVyc29uYWwgYXNzZXRzIGFuZCByZXNvdXJjZXMgb2YgdGhlIGNhcmVnaXZlciBidXQgbWF5IGFsc28gYmUgYWZmZWN0ZWQgYnkgdGhlIGxldmVsIG9mIGRlcGVuZGVuY2Ugb2YgdGhlIHBlcnNvbiB3aXRoIGRlbWVudGlhLiIsICAiRmluZGluZ3Mgc3VnZ2VzdCB0aGF0IGNhcmVnaXZlcnMgd2l0aCBoaWdoIGxldmVscyBvZiBuZXVyb3RpY2lzbSBhbmQgbG93IHN1YmplY3RpdmUgY2FyZWdpdmVyIGNvbXBldGVuY2UiKSwgbG9jYXRpb24gPSBwaF9sb2NhdGlvbl90eXBlKHR5cGUgPSAiYm9keSIpKQ0KYGBgDQoNCiMgYWRkIGdncGxvdA0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmdnX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBpcmlzICkgKw0KICBnZW9tX3BvaW50KA0KICAgIG1hcHBpbmcgPSBhZXMoU2VwYWwuTGVuZ3RoLCBQZXRhbC5MZW5ndGgsIGNvbG9yID0gU3BlY2llcyksDQogICAgc2l6ZSA9IDMpICsgdGhlbWVfbWluaW1hbCgpDQoNCg0KbXlfcHJlcyAgPC0gYWRkX3NsaWRlKG15X3ByZXMgLCBsYXlvdXQgPSAiVGl0bGUgYW5kIENvbnRlbnQiLCBtYXN0ZXIgPSAiT2ZmaWNlIFRoZW1lIikNCg0KDQpteV9wcmVzIDwtIHBoX3dpdGgobXlfcHJlcywgdmFsdWUgPSAiY2hvIGdncGxvdCB2w7QgYm9keSIsIGxvY2F0aW9uID0gcGhfbG9jYXRpb25fdHlwZSh0eXBlID0gInRpdGxlIikpDQoNCiAgDQpteV9wcmVzIDwtIHBoX3dpdGgoeCA9IG15X3ByZXMsIGdnX3Bsb3QsIA0KICAgbG9jYXRpb24gPSBwaF9sb2NhdGlvbl90eXBlKHR5cGUgPSAiYm9keSIpICkNCg0KYGBgDQoNCiMgYWRkIGltYWdlDQoNCg0KYGBge3J9DQoNCg0KbXlfcHJlcyAgPC0gYWRkX3NsaWRlKG15X3ByZXMgLCBsYXlvdXQgPSAiVGl0bGUgYW5kIENvbnRlbnQiLCBtYXN0ZXIgPSAiT2ZmaWNlIFRoZW1lIikNCg0KDQpteV9wcmVzIDwtIHBoX3dpdGgobXlfcHJlcywgdmFsdWUgPSAiVGjDqm0gaMOsbmgiLCBsb2NhdGlvbiA9IHBoX2xvY2F0aW9uX3R5cGUodHlwZSA9ICJ0aXRsZSIpKQ0KDQppbWcuZmlsZSA8LSBmaWxlLnBhdGgoICJpMS5wbmciICkNCm15X3ByZXMgPC0gcGhfd2l0aCh4ID0gbXlfcHJlcywgZXh0ZXJuYWxfaW1nKGltZy5maWxlLCB3aWR0aCA9IDEuNTgqMywgaGVpZ2h0ID0gMC43OSozKSwNCiAgIGxvY2F0aW9uID0gcGhfbG9jYXRpb25fdHlwZSh0eXBlID0gImJvZHkiKSwgdXNlX2xvY19zaXplID0gVFJVRSApDQoNCg0KYGBgDQojIGFkZCB0YWJsZQ0KDQpgYGB7cn0NCg0KDQpteV9wcmVzICA8LSBhZGRfc2xpZGUobXlfcHJlcyAsIGxheW91dCA9ICJUaXRsZSBhbmQgQ29udGVudCIsIG1hc3RlciA9ICJPZmZpY2UgVGhlbWUiKQ0KDQogDQpteV9wcmVzIDwtIHBoX3dpdGgobXlfcHJlcywgdmFsdWUgPSAiVGjDqm0gYuG6o25nIiwgbG9jYXRpb24gPSBwaF9sb2NhdGlvbl90eXBlKHR5cGUgPSAidGl0bGUiKSkNCg0KZnQgPC0gZmxleHRhYmxlKGhlYWQobXRjYXJzKSkNCmZ0IDwtIHNldF90YWJsZV9wcm9wZXJ0aWVzKGZ0LCB3aWR0aCA9IDAuNSwgbGF5b3V0ID0gImF1dG9maXQiKQ0KDQpteV9wcmVzIDwtIHBoX3dpdGgoeCA9IG15X3ByZXMsIGZ0LCAgIGxvY2F0aW9uID0gcGhfbG9jYXRpb25fdHlwZSh0eXBlID0gImJvZHkiKSAgKQ0KDQpgYGANCg0KDQojIGFkZCB0YWJsZSBpbiB0aGUgY2VudGVyDQoNCg0KDQpgYGB7cn0NCg0KDQpteV9wcmVzICA8LSBhZGRfc2xpZGUobXlfcHJlcyAsIGxheW91dCA9ICJUaXRsZSBhbmQgQ29udGVudCIsIG1hc3RlciA9ICJPZmZpY2UgVGhlbWUiKQ0KDQogDQpteV9wcmVzIDwtIHBoX3dpdGgobXlfcHJlcywgdmFsdWUgPSAiVGjDqm0gYuG6o25nIiwgbG9jYXRpb24gPSBwaF9sb2NhdGlvbl90eXBlKHR5cGUgPSAidGl0bGUiKSkNCg0KZnQgPC0gZmxleHRhYmxlKGhlYWQobXRjYXJzKSkNCmZ0IDwtIHNldF90YWJsZV9wcm9wZXJ0aWVzKGZ0LCB3aWR0aCA9IDAuNSwgbGF5b3V0ID0gImF1dG9maXQiKQ0KDQpteV9wcmVzIDwtIHBoX3dpdGgoeCA9IG15X3ByZXMsIGZ0LCAgIGxvY2F0aW9uID0gcGhfbG9jYXRpb24od2lkdGggPSA3LCBoZWlnaHQgPSA1LCBuZXdsYWJlbCA9ICJoZWxsbyIpICkgIA0KDQpgYGANCg0KDQoNCiMgRXhwb3J0IHRvIHBwdHggZmlsZQ0KDQpgYGB7cn0NCnByaW50KG15X3ByZXMgLCAiZG9jdW1lbnQucHB0eCIpDQpgYGANCg==