版权声明:本套课程材料开源,使用和分享必须遵守「创作共用许可协议 CC BY-NC-SA」(来源引用-非商业用途使用-以相同方式共享)。


Chap12:主题配色

本章要点目录

## 本章所需R包
library(bruceR)
# library(ggplot2)  # 加载bruceR时已默认加载ggplot2

配色方案设置

主要认识两套经典调色板:Brewer和Viridis。

【实践1】配色方案设置

  • Brewer调色板(https://colorbrewer2.org/
    • 分类色(Qualitative palettes)—— 适用于离散/分类/因子型变量
      • Accent, Dark2, Paired, Pastel1, Pastel2, Set1 (常用), Set2, Set3
    • 对比色(Diverging palettes)—— 适用于连续/数值型变量
      • BrBG, PiYG, PRGn, PuOr, RdBu (常用), RdGy, RdYlBu, RdYlGn, Spectral
    • 渐变色(Sequential palettes)—— 适用于连续/数值型变量
      • Blues, BuGn, BuPu, GnBu, Greens, Greys, Oranges, OrRd, PuBu, PuBuGn, PuRd, Purples, RdPu, Reds, YlGn, YlGnBu, YlOrBr, YlOrRd

## ggplot基础图形对象设定(赋值给p,避免重复写代码)
p = ggplot(
  data = na.omit(airquality),
  mapping = aes(x=Solar.R, y=Ozone, color=(Temp-32)/1.8)
)
p = p +
  geom_point() +
  labs(x="Solar Radiation",
       y="Ozone Pollution",
       color="Temp.")
p  # 默认配色

p + scale_color_continuous(palette="Reds")

p + scale_color_continuous(palette="YlOrRd")

p + scale_color_continuous(palette="RdYlBu")

## distiller:蒸馏器(离散颜色 => 连续颜色)
p + scale_color_distiller(palette="Set1", direction=-1)

p + scale_color_distiller(palette="RdYlBu", direction=-1)

## fermenter:发酵器(连续颜色 => 离散颜色)
p + scale_color_fermenter(palette="RdYlBu", direction=-1)

p + scale_color_fermenter(palette = "RdYlBu",
                          direction = -1,
                          limits = c(10, 40),
                          breaks = seq(10, 40, 3))

  • Viridis调色板
    • "magma" (or "A")
    • "inferno" (or "B")
    • "plasma" (or "C")
    • "viridis" (or "D")
    • "cividis" (or "E")
    • "rocket" (or "F")
    • "mako" (or "G")
    • "turbo" (or "H")

p + scale_color_viridis_c(option="magma")  # "A"

p + scale_color_viridis_b(option="magma")  # "A"

p + scale_color_viridis_c(option="inferno")  # "B"

p + scale_color_viridis_b(option="inferno")  # "B"

p + scale_color_viridis_c(option="plasma")  # "C"

p + scale_color_viridis_b(option="plasma")  # "C"

p + scale_color_viridis_c(option="viridis")  # "D"

p + scale_color_viridis_b(option="viridis")  # "D"

p + scale_color_viridis_c(option="cividis")  # "E"

p + scale_color_viridis_b(option="cividis")  # "E"

p + scale_color_viridis_c(option="rocket")  # "F"

p + scale_color_viridis_b(option="rocket")  # "F"

p + scale_color_viridis_c(option="mako")  # "G"

p + scale_color_viridis_b(option="mako")  # "G"

p + scale_color_viridis_c(option="turbo")  # "H"

p + scale_color_viridis_b(option="turbo")  # "H"

主题元素设置

【实践2】主题元素设置

(1)theme()主题元素设置函数(自学theme()函数帮助文档

  • theme()函数共144个参数!(以下列出了常用参数)
    • 整张图(plot.*
      • 背景:plot.background
      • 主标题:plot.title, plot.title.position
      • 副标题:plot.subtitle
      • 说明文字:plot.caption, plot.caption.position
      • 序号标签:plot.tag, plot.tag.position
      • 边距:plot.margin
    • 绘图区(panel.*
      • 背景:panel.background
      • 网格线:panel.grid
      • 主刻度网格线:panel.grid.major
      • 副刻度网格线:panel.grid.minor
    • 坐标轴(axis.*
      • 轴线:axis.line
      • 轴标题:axis.title
      • 刻度值:axis.text
      • 刻度线:axis.ticks
    • 图例区(legend.*
      • 背景:legend.background
      • 位置:legend.position, legend.position.inside
      • 方向:legend.direction
      • 图例标题:legend.title
      • 图例刻度值:legend.text
      • 图例刻度线:legend.ticks
  • 分面图(strip.*
    • 背景:strip.background
    • 文字:strip.text

(2)element_*()元素属性设置函数(自学element_*()系列函数帮助文档

  • element_blank():设置为空(移除该元素)
  • element_rect():设置矩形元素(边框与底色)
  • element_line():设置线条元素
  • element_text():设置文本元素
p1 = p + scale_color_continuous(palette="YlOrRd")
p1  # 默认主题:theme_grey()

## 预定义的theme主题方案
p1 + theme_void()  # 空无主题

p1 + theme_bw()  # 黑白主题

p1 + theme_dark()  # 深色主题

p1 + theme_light()  # 浅色主题

p1 + theme_linedraw()  # 线条主题

p1 + theme_minimal()  # 极简主题

p1 + theme_classic()  # 经典主题

p1 + cowplot::theme_cowplot()  # cowplot主题

p1 + cowplot::theme_nothing()  # cowplot完全空无主题

p1 + theme_bruce()  # bruceR主题

复习与答疑

课程期末总复习

个性化答疑辅导

  • 对提问/作业/报告/操作的个性化反馈与指导

【期末作业】数据分析与可视化

作业要求:

  • 自主选择任意一个感兴趣的公开数据,综合运用本课程所学内容,迭代积累完成一项完整的R语言数据分析与可视化编程期末作业
    • 随堂作业1~10、个人阶段作业①②是期末大作业的基础和拆分任务,请在这些平时作业基础上,进一步修改完善R代码、文字注释和文档结构,即可作为期末大作业提交!
  • 使用R Markdown完成,对关键代码及结果要有注释说明

平台提交:

  • R Markdown原始代码文档(.Rmd)和运行得到的HTML网页文档(.html)
    • 提交文件命名格式
      • 学号-姓名-R期末作业.Rmd
      • 学号-姓名-R期末作业.html
LS0tDQp0aXRsZTogIuOAilLor63oqIDjgIvnrKwxMueroO+8muS4u+mimOmFjeiJsiINCnN1YnRpdGxlOiA8YSBocmVmPSJodHRwczovL3BzeWNoYnJ1Y2UuZ2l0aHViLmlvL1JDb3Vyc2UvIj7ov5Tlm57or77nqIvkuLvpobU8L2E+DQphdXRob3I6ICLmjojor77mlZnluIjvvJrljIXlr5LlkLTpnJwiDQojIGRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDMNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IGZhbHNlDQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBhbmNob3Jfc2VjdGlvbnM6IHRydWUNCiAgICBoaWdobGlnaHQ6IHB5Z21lbnRzDQogICAgY3NzOiBSbWRDU1MuY3NzDQotLS0NCg0KYGBgez1odG1sfQ0KPHAgc3R5bGU9ImZvbnQtc2l6ZTogMTJweCI+54mI5p2D5aOw5piO77ya5pys5aWX6K++56iL5p2Q5paZ5byA5rqQ77yM5L2/55So5ZKM5YiG5Lqr5b+F6aG76YG15a6I44CM5Yib5L2c5YWx55So6K645Y+v5Y2P6K6uIENDIEJZLU5DLVNB44CN77yI5p2l5rqQ5byV55SoLemdnuWVhuS4mueUqOmAlOS9v+eUqC3ku6Xnm7jlkIzmlrnlvI/lhbHkuqvvvInjgII8aW1nIHNyYz0iaW1nL0NDLUJZLU5DLVNBLmpwZyIgd2lkdGg9IjEyMHB4IiBoZWlnaHQ9IjQycHgiIHN0eWxlPSJmbG9hdDogcmlnaHQiIC8+PC9wPg0KYGBgDQoNCmBgYHtyIENvbmZpZywgaW5jbHVkZT1GQUxTRX0NCm9wdGlvbnMoDQogIGtuaXRyLmthYmxlLk5BID0gIiIsDQogIGRpZ2l0cyA9IDQNCikNCmtuaXRyOjpvcHRzX2NodW5rJHNldCgNCiAgY29tbWVudCA9ICIiLA0KICBmaWcud2lkdGggPSA2LA0KICBmaWcuaGVpZ2h0ID0gNCwNCiAgZHBpID0gMzAwDQopDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgQ2hhcDEy77ya5Li76aKY6YWN6ImyDQoNCiMjIyMg5b6A5pyf6KaB54K55Zue6aG+DQoNCi0gICBbQ2hhcDExIFwjIOWIhumdouWwj+Wbvl0oaHR0cHM6Ly9wc3ljaGJydWNlLmdpdGh1Yi5pby9SQ291cnNlL0NoYXAxMSMlRTUlODglODYlRTklOUQlQTIlRTUlQjAlOEYlRTUlOUIlQkUpey51cml9DQotICAgW0NoYXAxMSBcIyDlpJrlm77nu4TlkIhdKGh0dHBzOi8vcHN5Y2hicnVjZS5naXRodWIuaW8vUkNvdXJzZS9DaGFwMTEjJUU1JUE0JTlBJUU1JTlCJUJFJUU3JUJCJTg0JUU1JTkwJTg4KXsudXJpfQ0KLSAgIFtDaGFwMTEgXCMg5Zu+5b2i5paH5Lu25L+d5a2YXShodHRwczovL3BzeWNoYnJ1Y2UuZ2l0aHViLmlvL1JDb3Vyc2UvQ2hhcDExIyVFNSU5QiVCRSVFNSVCRCVBMiVFNiU5NiU4NyVFNCVCQiVCNiVFNCVCRiU5RCVFNSVBRCU5OCl7LnVyaX0NCg0KIyMjIyDmnKznq6DopoHngrnnm67lvZUNCg0KLSAgIFvjgJDlrp7ot7Ux44CR6YWN6Imy5pa55qGI6K6+572uXSgj5a6e6Le1MemFjeiJsuaWueahiOiuvue9rinvvIjph43ngrnvvIkNCi0gICBb44CQ5a6e6Le1MuOAkeS4u+mimOWFg+e0oOiuvue9rl0oI+Wunui3tTLkuLvpopjlhYPntKDorr7nva4pDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyMg5pys56ug5omA6ZyAUuWMhQ0KbGlicmFyeShicnVjZVIpDQojIGxpYnJhcnkoZ2dwbG90MikgICMg5Yqg6L29YnJ1Y2VS5pe25bey6buY6K6k5Yqg6L29Z2dwbG90Mg0KYGBgDQoNCiMg6YWN6Imy5pa55qGI6K6+572uDQoNCuS4u+imgeiupOivhuS4pOWll+e7j+WFuOiwg+iJsuadv++8mkJyZXdlcuWSjFZpcmlkaXPjgIINCg0KIyMjIyDjgJDlrp7ot7Ux44CR6YWN6Imy5pa55qGI6K6+572uIHsj5a6e6Le1MemFjeiJsuaWueahiOiuvue9rn0NCg0KLSAgIEJyZXdlcuiwg+iJsuadv++8iDxodHRwczovL2NvbG9yYnJld2VyMi5vcmcvPu+8iQ0KICAgIC0gICDliIbnsbvoibLvvIhRdWFsaXRhdGl2ZSBwYWxldHRlc++8ieKAlOKAlCDpgILnlKjkuo7nprvmlaMv5YiG57G7L+WboOWtkOWei+WPmOmHjw0KICAgICAgICAtICAgQWNjZW50LCBEYXJrMiwgUGFpcmVkLCBQYXN0ZWwxLCBQYXN0ZWwyLCAqKlNldDEgKOW4uOeUqCkqKiwgU2V0MiwgU2V0Mw0KICAgIC0gICDlr7nmr5ToibLvvIhEaXZlcmdpbmcgcGFsZXR0ZXPvvInigJTigJQg6YCC55So5LqO6L+e57utL+aVsOWAvOWei+WPmOmHjw0KICAgICAgICAtICAgQnJCRywgUGlZRywgUFJHbiwgUHVPciwgKipSZEJ1ICjluLjnlKgpKiosIFJkR3ksIFJkWWxCdSwgUmRZbEduLCBTcGVjdHJhbA0KICAgIC0gICDmuJDlj5joibLvvIhTZXF1ZW50aWFsIHBhbGV0dGVz77yJ4oCU4oCUIOmAgueUqOS6jui/nue7rS/mlbDlgLzlnovlj5jph48NCiAgICAgICAgLSAgIEJsdWVzLCBCdUduLCBCdVB1LCBHbkJ1LCBHcmVlbnMsIEdyZXlzLCBPcmFuZ2VzLCBPclJkLCBQdUJ1LCBQdUJ1R24sIFB1UmQsIFB1cnBsZXMsIFJkUHUsIFJlZHMsIFlsR24sIFlsR25CdSwgWWxPckJyLCBZbE9yUmQNCg0KIVtdKGltYWdlcy9jbGlwYm9hcmQtMTE0ODk0NTcxOC5wbmcpDQoNCiFbXShpbWFnZXMvY2xpcGJvYXJkLTMxMzgwNTg3MzcucG5nKQ0KDQohW10oaW1hZ2VzL2NsaXBib2FyZC0yNjg3MTQ1Mzk0LnBuZykNCg0KIVtdKGltYWdlcy9jbGlwYm9hcmQtMzU5NTEyMTUxMC5wbmcpDQoNCmBgYHtyfQ0KIyMgZ2dwbG905Z+656GA5Zu+5b2i5a+56LGh6K6+5a6a77yI6LWL5YC857uZcO+8jOmBv+WFjemHjeWkjeWGmeS7o+egge+8iQ0KcCA9IGdncGxvdCgNCiAgZGF0YSA9IG5hLm9taXQoYWlycXVhbGl0eSksDQogIG1hcHBpbmcgPSBhZXMoeD1Tb2xhci5SLCB5PU96b25lLCBjb2xvcj0oVGVtcC0zMikvMS44KQ0KKQ0KcCA9IHAgKw0KICBnZW9tX3BvaW50KCkgKw0KICBsYWJzKHg9IlNvbGFyIFJhZGlhdGlvbiIsDQogICAgICAgeT0iT3pvbmUgUG9sbHV0aW9uIiwNCiAgICAgICBjb2xvcj0iVGVtcC4iKQ0KcCAgIyDpu5jorqTphY3oibINCg0KcCArIHNjYWxlX2NvbG9yX2NvbnRpbnVvdXMocGFsZXR0ZT0iUmVkcyIpDQpwICsgc2NhbGVfY29sb3JfY29udGludW91cyhwYWxldHRlPSJZbE9yUmQiKQ0KcCArIHNjYWxlX2NvbG9yX2NvbnRpbnVvdXMocGFsZXR0ZT0iUmRZbEJ1IikNCg0KIyMgZGlzdGlsbGVy77ya6JK46aaP5Zmo77yI56a75pWj6aKc6ImyID0+IOi/nue7reminOiJsu+8iQ0KcCArIHNjYWxlX2NvbG9yX2Rpc3RpbGxlcihwYWxldHRlPSJTZXQxIiwgZGlyZWN0aW9uPS0xKQ0KcCArIHNjYWxlX2NvbG9yX2Rpc3RpbGxlcihwYWxldHRlPSJSZFlsQnUiLCBkaXJlY3Rpb249LTEpDQoNCiMjIGZlcm1lbnRlcu+8muWPkemFteWZqO+8iOi/nue7reminOiJsiA9PiDnprvmlaPpopzoibLvvIkNCnAgKyBzY2FsZV9jb2xvcl9mZXJtZW50ZXIocGFsZXR0ZT0iUmRZbEJ1IiwgZGlyZWN0aW9uPS0xKQ0KcCArIHNjYWxlX2NvbG9yX2Zlcm1lbnRlcihwYWxldHRlID0gIlJkWWxCdSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDEwLCA0MCksDQogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcSgxMCwgNDAsIDMpKQ0KYGBgDQoNCi0gICBWaXJpZGlz6LCD6Imy5p2/DQogICAgLSAgIGAibWFnbWEiYCAob3IgYCJBImApDQogICAgLSAgIGAiaW5mZXJubyJgIChvciBgIkIiYCkNCiAgICAtICAgYCJwbGFzbWEiYCAob3IgYCJDImApDQogICAgLSAgIGAidmlyaWRpcyJgIChvciBgIkQiYCkNCiAgICAtICAgYCJjaXZpZGlzImAgKG9yIGAiRSJgKQ0KICAgIC0gICBgInJvY2tldCJgIChvciBgIkYiYCkNCiAgICAtICAgYCJtYWtvImAgKG9yIGAiRyJgKQ0KICAgIC0gICBgInR1cmJvImAgKG9yIGAiSCJgKQ0KDQohW10oaW1hZ2VzL2NsaXBib2FyZC0zMDM1ODcxNzk4LnBuZykNCg0KIVtdKGltYWdlcy9jbGlwYm9hcmQtMTI1NzU0NjgyOS5wbmcpDQoNCmBgYHtyfQ0KcCArIHNjYWxlX2NvbG9yX3ZpcmlkaXNfYyhvcHRpb249Im1hZ21hIikgICMgIkEiDQpwICsgc2NhbGVfY29sb3JfdmlyaWRpc19iKG9wdGlvbj0ibWFnbWEiKSAgIyAiQSINCg0KcCArIHNjYWxlX2NvbG9yX3ZpcmlkaXNfYyhvcHRpb249ImluZmVybm8iKSAgIyAiQiINCnAgKyBzY2FsZV9jb2xvcl92aXJpZGlzX2Iob3B0aW9uPSJpbmZlcm5vIikgICMgIkIiDQoNCnAgKyBzY2FsZV9jb2xvcl92aXJpZGlzX2Mob3B0aW9uPSJwbGFzbWEiKSAgIyAiQyINCnAgKyBzY2FsZV9jb2xvcl92aXJpZGlzX2Iob3B0aW9uPSJwbGFzbWEiKSAgIyAiQyINCg0KcCArIHNjYWxlX2NvbG9yX3ZpcmlkaXNfYyhvcHRpb249InZpcmlkaXMiKSAgIyAiRCINCnAgKyBzY2FsZV9jb2xvcl92aXJpZGlzX2Iob3B0aW9uPSJ2aXJpZGlzIikgICMgIkQiDQoNCnAgKyBzY2FsZV9jb2xvcl92aXJpZGlzX2Mob3B0aW9uPSJjaXZpZGlzIikgICMgIkUiDQpwICsgc2NhbGVfY29sb3JfdmlyaWRpc19iKG9wdGlvbj0iY2l2aWRpcyIpICAjICJFIg0KDQpwICsgc2NhbGVfY29sb3JfdmlyaWRpc19jKG9wdGlvbj0icm9ja2V0IikgICMgIkYiDQpwICsgc2NhbGVfY29sb3JfdmlyaWRpc19iKG9wdGlvbj0icm9ja2V0IikgICMgIkYiDQoNCnAgKyBzY2FsZV9jb2xvcl92aXJpZGlzX2Mob3B0aW9uPSJtYWtvIikgICMgIkciDQpwICsgc2NhbGVfY29sb3JfdmlyaWRpc19iKG9wdGlvbj0ibWFrbyIpICAjICJHIg0KDQpwICsgc2NhbGVfY29sb3JfdmlyaWRpc19jKG9wdGlvbj0idHVyYm8iKSAgIyAiSCINCnAgKyBzY2FsZV9jb2xvcl92aXJpZGlzX2Iob3B0aW9uPSJ0dXJibyIpICAjICJIIg0KYGBgDQoNCiMg5Li76aKY5YWD57Sg6K6+572uDQoNCiMjIyMg44CQ5a6e6Le1MuOAkeS4u+mimOWFg+e0oOiuvue9riB7I+Wunui3tTLkuLvpopjlhYPntKDorr7nva59DQoNCu+8iDHvvIlgdGhlbWUoKWDkuLvpopjlhYPntKDorr7nva7lh73mlbDvvIhb6Ieq5a2mYHRoZW1lKClg5Ye95pWw5biu5Yqp5paH5qGjXShodHRwczovL2dncGxvdDIudGlkeXZlcnNlLm9yZy9yZWZlcmVuY2UvdGhlbWUuaHRtbCl7LnVyaX3vvIkNCg0KLSAgIGB0aGVtZSgpYOWHveaVsOWFsTE0NOS4quWPguaVsO+8ge+8iOS7peS4i+WIl+WHuuS6huW4uOeUqOWPguaVsO+8iQ0KICAgIC0gICDmlbTlvKDlm77vvIhgcGxvdC4qYO+8iQ0KICAgICAgICAtICAg6IOM5pmv77yaYHBsb3QuYmFja2dyb3VuZGANCiAgICAgICAgLSAgIOS4u+agh+mimO+8mmBwbG90LnRpdGxlYCwgYHBsb3QudGl0bGUucG9zaXRpb25gDQogICAgICAgIC0gICDlia/moIfpopjvvJpgcGxvdC5zdWJ0aXRsZWANCiAgICAgICAgLSAgIOivtOaYjuaWh+Wtl++8mmBwbG90LmNhcHRpb25gLCBgcGxvdC5jYXB0aW9uLnBvc2l0aW9uYA0KICAgICAgICAtICAg5bqP5Y+35qCH562+77yaYHBsb3QudGFnYCwgYHBsb3QudGFnLnBvc2l0aW9uYA0KICAgICAgICAtICAg6L656Led77yaYHBsb3QubWFyZ2luYA0KICAgIC0gICDnu5jlm77ljLrvvIhgcGFuZWwuKmDvvIkNCiAgICAgICAgLSAgIOiDjOaZr++8mmBwYW5lbC5iYWNrZ3JvdW5kYA0KICAgICAgICAtICAg572R5qC857q/77yaYHBhbmVsLmdyaWRgDQogICAgICAgIC0gICDkuLvliLvluqbnvZHmoLznur/vvJpgcGFuZWwuZ3JpZC5tYWpvcmANCiAgICAgICAgLSAgIOWJr+WIu+W6pue9keagvOe6v++8mmBwYW5lbC5ncmlkLm1pbm9yYA0KICAgIC0gICDlnZDmoIfovbTvvIhgYXhpcy4qYO+8iQ0KICAgICAgICAtICAg6L2057q/77yaYGF4aXMubGluZWANCiAgICAgICAgLSAgIOi9tOagh+mimO+8mmBheGlzLnRpdGxlYA0KICAgICAgICAtICAg5Yi75bqm5YC877yaYGF4aXMudGV4dGANCiAgICAgICAgLSAgIOWIu+W6pue6v++8mmBheGlzLnRpY2tzYA0KICAgIC0gICDlm77kvovljLrvvIhgbGVnZW5kLipg77yJDQogICAgICAgIC0gICDog4zmma/vvJpgbGVnZW5kLmJhY2tncm91bmRgDQogICAgICAgIC0gICDkvY3nva7vvJpgbGVnZW5kLnBvc2l0aW9uYCwgYGxlZ2VuZC5wb3NpdGlvbi5pbnNpZGVgDQogICAgICAgIC0gICDmlrnlkJHvvJpgbGVnZW5kLmRpcmVjdGlvbmANCiAgICAgICAgLSAgIOWbvuS+i+agh+mimO+8mmBsZWdlbmQudGl0bGVgDQogICAgICAgIC0gICDlm77kvovliLvluqblgLzvvJpgbGVnZW5kLnRleHRgDQogICAgICAgIC0gICDlm77kvovliLvluqbnur/vvJpgbGVnZW5kLnRpY2tzYA0KLSAgIOWIhumdouWbvu+8iGBzdHJpcC4qYO+8iQ0KICAgIC0gICDog4zmma/vvJpgc3RyaXAuYmFja2dyb3VuZGANCiAgICAtICAg5paH5a2X77yaYHN0cmlwLnRleHRgDQoNCu+8iDLvvIlgZWxlbWVudF8qKClg5YWD57Sg5bGe5oCn6K6+572u5Ye95pWw77yIW+iHquWtpmBlbGVtZW50XyooKWDns7vliJflh73mlbDluK7liqnmlofmoaNdKGh0dHBzOi8vZ2dwbG90Mi50aWR5dmVyc2Uub3JnL3JlZmVyZW5jZS9lbGVtZW50Lmh0bWwpey51cml977yJDQoNCi0gICBgZWxlbWVudF9ibGFuaygpYO+8muiuvue9ruS4uuepuu+8iOenu+mZpOivpeWFg+e0oO+8iQ0KLSAgIGBlbGVtZW50X3JlY3QoKWDvvJrorr7nva7nn6nlvaLlhYPntKDvvIjovrnmoYbkuI7lupXoibLvvIkNCi0gICBgZWxlbWVudF9saW5lKClg77ya6K6+572u57q/5p2h5YWD57SgDQotICAgYGVsZW1lbnRfdGV4dCgpYO+8muiuvue9ruaWh+acrOWFg+e0oA0KDQpgYGB7cn0NCnAxID0gcCArIHNjYWxlX2NvbG9yX2NvbnRpbnVvdXMocGFsZXR0ZT0iWWxPclJkIikNCnAxICAjIOm7mOiupOS4u+mimO+8mnRoZW1lX2dyZXkoKQ0KDQojIyDpooTlrprkuYnnmoR0aGVtZeS4u+mimOaWueahiA0KcDEgKyB0aGVtZV92b2lkKCkgICMg56m65peg5Li76aKYDQpwMSArIHRoZW1lX2J3KCkgICMg6buR55m95Li76aKYDQpwMSArIHRoZW1lX2RhcmsoKSAgIyDmt7HoibLkuLvpopgNCnAxICsgdGhlbWVfbGlnaHQoKSAgIyDmtYXoibLkuLvpopgNCnAxICsgdGhlbWVfbGluZWRyYXcoKSAgIyDnur/mnaHkuLvpopgNCnAxICsgdGhlbWVfbWluaW1hbCgpICAjIOaegeeugOS4u+mimA0KcDEgKyB0aGVtZV9jbGFzc2ljKCkgICMg57uP5YW45Li76aKYDQpwMSArIGNvd3Bsb3Q6OnRoZW1lX2Nvd3Bsb3QoKSAgIyBjb3dwbG905Li76aKYDQpwMSArIGNvd3Bsb3Q6OnRoZW1lX25vdGhpbmcoKSAgIyBjb3dwbG905a6M5YWo56m65peg5Li76aKYDQpwMSArIHRoZW1lX2JydWNlKCkgICMgYnJ1Y2VS5Li76aKYDQpgYGANCg0KIyDlpI3kuaDkuI7nrZTnlpENCg0KIyMg6K++56iL5pyf5pyr5oC75aSN5LmgDQoNCi0gICBb6K++56iL5aSn57qy5LiO5a2m5Lmg55uu5qCH5Zue6aG+XShodHRwczovL3BzeWNoYnJ1Y2UuZ2l0aHViLmlvL1JDb3Vyc2UvU3lsbGFidXNfUi1Qcm9ncmFtbWluZ19CYW9IV1MucGRmKQ0KDQojIyDkuKrmgKfljJbnrZTnlpHovoXlr7wNCg0KLSAgIOWvueaPkOmXri/kvZzkuJov5oql5ZGKL+aTjeS9nOeahOS4quaAp+WMluWPjemmiOS4juaMh+WvvA0KDQojIOOAkOacn+acq+S9nOS4muOAkeaVsOaNruWIhuaekOS4juWPr+inhuWMlg0KDQrkvZzkuJropoHmsYLvvJoNCg0KLSAgIOiHquS4u+mAieaLqeS7u+aEj+S4gOS4quaEn+WFtOi2o+eahOWFrOW8gOaVsOaNru+8jOe7vOWQiOi/kOeUqOacrOivvueoi+aJgOWtpuWGheWuue+8jOi/reS7o+enr+e0r+WujOaIkOS4gOmhueWujOaVtOeahFLor63oqIDmlbDmja7liIbmnpDkuI7lj6/op4bljJbnvJbnqIvmnJ/mnKvkvZzkuJoNCiAgICAtICAgKirpmo/loILkvZzkuJoxXH4xMOOAgeS4quS6uumYtuauteS9nOS4muKRoOKRoeaYr+acn+acq+Wkp+S9nOS4mueahOWfuuehgOWSjOaLhuWIhuS7u+WKoSoq77yM6K+35Zyo6L+Z5Lqb5bmz5pe25L2c5Lia5Z+656GA5LiK77yM6L+b5LiA5q2l5L+u5pS55a6M5ZaEUuS7o+eggeOAgeaWh+Wtl+azqOmHiuWSjOaWh+aho+e7k+aehO+8jOWNs+WPr+S9nOS4uuacn+acq+Wkp+S9nOS4muaPkOS6pO+8gQ0KLSAgIOS9v+eUqFIgTWFya2Rvd27lrozmiJDvvIzlr7nlhbPplK7ku6PnoIHlj4rnu5PmnpzopoHmnInms6jph4ror7TmmI4NCg0K5bmz5Y+w5o+Q5Lqk77yaDQoNCi0gICBSIE1hcmtkb3du5Y6f5aeL5Luj56CB5paH5qGj77yILlJtZO+8ieWSjOi/kOihjOW+l+WIsOeahEhUTUznvZHpobXmlofmoaPvvIguaHRtbO+8iQ0KICAgIC0gICDmj5DkuqTmlofku7blkb3lkI3moLzlvI8NCiAgICAgICAgLSAgIGDlrablj7ct5aeT5ZCNLVLmnJ/mnKvkvZzkuJouUm1kYA0KICAgICAgICAtICAgYOWtpuWPty3lp5PlkI0tUuacn+acq+S9nOS4mi5odG1sYA0K