版权声明:本套课程材料开源,使用和分享必须遵守「创作共用许可协议 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+DQoNCi0gW0NoYXAxMSBcIyDliIbpnaLlsI/lm75dKGh0dHBzOi8vcHN5Y2hicnVjZS5naXRodWIuaW8vUkNvdXJzZS9DaGFwMTEjJUU1JTg4JTg2JUU5JTlEJUEyJUU1JUIwJThGJUU1JTlCJUJFKXsudXJpfQ0KLSBbQ2hhcDExIFwjIOWkmuWbvue7hOWQiF0oaHR0cHM6Ly9wc3ljaGJydWNlLmdpdGh1Yi5pby9SQ291cnNlL0NoYXAxMSMlRTUlQTQlOUElRTUlOUIlQkUlRTclQkIlODQlRTUlOTAlODgpey51cml9DQotIFtDaGFwMTEgXCMg5Zu+5b2i5paH5Lu25L+d5a2YXShodHRwczovL3BzeWNoYnJ1Y2UuZ2l0aHViLmlvL1JDb3Vyc2UvQ2hhcDExIyVFNSU5QiVCRSVFNSVCRCVBMiVFNiU5NiU4NyVFNCVCQiVCNiVFNCVCRiU5RCVFNSVBRCU5OCl7LnVyaX0NCg0KIyMjIyDmnKznq6DopoHngrnnm67lvZUNCg0KLSBb44CQ5a6e6Le1MeOAkemFjeiJsuaWueahiOiuvue9rl0oI+Wunui3tTHphY3oibLmlrnmoYjorr7nva4p77yI6YeN54K577yJDQotIFvjgJDlrp7ot7Uy44CR5Li76aKY5YWD57Sg6K6+572uXSgj5a6e6Le1MuS4u+mimOWFg+e0oOiuvue9rikNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIyDmnKznq6DmiYDpnIBS5YyFDQpsaWJyYXJ5KGJydWNlUikNCiMgbGlicmFyeShnZ3Bsb3QyKSAgIyDliqDovb1icnVjZVLml7blt7Lpu5jorqTliqDovb1nZ3Bsb3QyDQpgYGANCg0KIyDphY3oibLmlrnmoYjorr7nva4NCg0K5Li76KaB6K6k6K+G5Lik5aWX57uP5YW46LCD6Imy5p2/77yaQnJld2Vy5ZKMVmlyaWRpc+OAgg0KDQojIyMjIOOAkOWunui3tTHjgJHphY3oibLmlrnmoYjorr7nva4geyPlrp7ot7Ux6YWN6Imy5pa55qGI6K6+572ufQ0KDQotIEJyZXdlcuiwg+iJsuadv++8iDxodHRwczovL2NvbG9yYnJld2VyMi5vcmcvPu+8iQ0KICAtIOWIhuexu+iJsu+8iFF1YWxpdGF0aXZlIHBhbGV0dGVz77yJ4oCU4oCUIOmAgueUqOS6juemu+aVoy/liIbnsbsv5Zug5a2Q5Z6L5Y+Y6YePDQogICAgLSBBY2NlbnQsIERhcmsyLCBQYWlyZWQsIFBhc3RlbDEsIFBhc3RlbDIsICoqU2V0MSAo5bi455SoKSoqLCBTZXQyLCBTZXQzDQogIC0g5a+55q+U6Imy77yIRGl2ZXJnaW5nIHBhbGV0dGVz77yJ4oCU4oCUIOmAgueUqOS6jui/nue7rS/mlbDlgLzlnovlj5jph48NCiAgICAtIEJyQkcsIFBpWUcsIFBSR24sIFB1T3IsICoqUmRCdSAo5bi455SoKSoqLCBSZEd5LCBSZFlsQnUsIFJkWWxHbiwgU3BlY3RyYWwNCiAgLSDmuJDlj5joibLvvIhTZXF1ZW50aWFsIHBhbGV0dGVz77yJ4oCU4oCUIOmAgueUqOS6jui/nue7rS/mlbDlgLzlnovlj5jph48NCiAgICAtIEJsdWVzLCBCdUduLCBCdVB1LCBHbkJ1LCBHcmVlbnMsIEdyZXlzLCBPcmFuZ2VzLCBPclJkLCBQdUJ1LCBQdUJ1R24sIFB1UmQsIFB1cnBsZXMsIFJkUHUsIFJlZHMsIFlsR24sIFlsR25CdSwgWWxPckJyLCBZbE9yUmQNCg0KIVtdKGltYWdlcy9jbGlwYm9hcmQtMTE0ODk0NTcxOC5wbmcpDQoNCiFbXShpbWFnZXMvY2xpcGJvYXJkLTMxMzgwNTg3MzcucG5nKQ0KDQohW10oaW1hZ2VzL2NsaXBib2FyZC0yNjg3MTQ1Mzk0LnBuZykNCg0KIVtdKGltYWdlcy9jbGlwYm9hcmQtMzU5NTEyMTUxMC5wbmcpDQoNCmBgYHtyfQ0KIyMgZ2dwbG905Z+656GA5Zu+5b2i5a+56LGh6K6+5a6a77yI6LWL5YC857uZcO+8jOmBv+WFjemHjeWkjeWGmeS7o+egge+8iQ0KcCA9IGdncGxvdCgNCiAgZGF0YSA9IG5hLm9taXQoYWlycXVhbGl0eSksDQogIG1hcHBpbmcgPSBhZXMoeD1Tb2xhci5SLCB5PU96b25lLCBjb2xvcj0oVGVtcC0zMikvMS44KQ0KKQ0KcCA9IHAgKw0KICBnZW9tX3BvaW50KCkgKw0KICBsYWJzKHg9IlNvbGFyIFJhZGlhdGlvbiIsDQogICAgICAgeT0iT3pvbmUgUG9sbHV0aW9uIiwNCiAgICAgICBjb2xvcj0iVGVtcC4iKQ0KcCAgIyDpu5jorqTphY3oibINCg0KcCArIHNjYWxlX2NvbG9yX2NvbnRpbnVvdXMocGFsZXR0ZT0iUmVkcyIpDQpwICsgc2NhbGVfY29sb3JfY29udGludW91cyhwYWxldHRlPSJZbE9yUmQiKQ0KcCArIHNjYWxlX2NvbG9yX2NvbnRpbnVvdXMocGFsZXR0ZT0iUmRZbEJ1IikNCg0KIyMgZGlzdGlsbGVy77ya6JK46aaP5Zmo77yI56a75pWj6aKc6ImyID0+IOi/nue7reminOiJsu+8iQ0KcCArIHNjYWxlX2NvbG9yX2Rpc3RpbGxlcihwYWxldHRlPSJTZXQxIiwgZGlyZWN0aW9uPS0xKQ0KcCArIHNjYWxlX2NvbG9yX2Rpc3RpbGxlcihwYWxldHRlPSJSZFlsQnUiLCBkaXJlY3Rpb249LTEpDQoNCiMjIGZlcm1lbnRlcu+8muWPkemFteWZqO+8iOi/nue7reminOiJsiA9PiDnprvmlaPpopzoibLvvIkNCnAgKyBzY2FsZV9jb2xvcl9mZXJtZW50ZXIocGFsZXR0ZT0iUmRZbEJ1IiwgZGlyZWN0aW9uPS0xKQ0KcCArIHNjYWxlX2NvbG9yX2Zlcm1lbnRlcihwYWxldHRlID0gIlJkWWxCdSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDEwLCA0MCksDQogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcSgxMCwgNDAsIDMpKQ0KYGBgDQoNCi0gVmlyaWRpc+iwg+iJsuadvw0KICAtIGAibWFnbWEiYCAob3IgYCJBImApDQogIC0gYCJpbmZlcm5vImAgKG9yIGAiQiJgKQ0KICAtIGAicGxhc21hImAgKG9yIGAiQyJgKQ0KICAtIGAidmlyaWRpcyJgIChvciBgIkQiYCkNCiAgLSBgImNpdmlkaXMiYCAob3IgYCJFImApDQogIC0gYCJyb2NrZXQiYCAob3IgYCJGImApDQogIC0gYCJtYWtvImAgKG9yIGAiRyJgKQ0KICAtIGAidHVyYm8iYCAob3IgYCJIImApDQoNCiFbXShpbWFnZXMvY2xpcGJvYXJkLTMwMzU4NzE3OTgucG5nKQ0KDQohW10oaW1hZ2VzL2NsaXBib2FyZC0xMjU3NTQ2ODI5LnBuZykNCg0KYGBge3J9DQpwICsgc2NhbGVfY29sb3JfdmlyaWRpc19jKG9wdGlvbj0ibWFnbWEiKSAgIyAiQSINCnAgKyBzY2FsZV9jb2xvcl92aXJpZGlzX2Iob3B0aW9uPSJtYWdtYSIpICAjICJBIg0KDQpwICsgc2NhbGVfY29sb3JfdmlyaWRpc19jKG9wdGlvbj0iaW5mZXJubyIpICAjICJCIg0KcCArIHNjYWxlX2NvbG9yX3ZpcmlkaXNfYihvcHRpb249ImluZmVybm8iKSAgIyAiQiINCg0KcCArIHNjYWxlX2NvbG9yX3ZpcmlkaXNfYyhvcHRpb249InBsYXNtYSIpICAjICJDIg0KcCArIHNjYWxlX2NvbG9yX3ZpcmlkaXNfYihvcHRpb249InBsYXNtYSIpICAjICJDIg0KDQpwICsgc2NhbGVfY29sb3JfdmlyaWRpc19jKG9wdGlvbj0idmlyaWRpcyIpICAjICJEIg0KcCArIHNjYWxlX2NvbG9yX3ZpcmlkaXNfYihvcHRpb249InZpcmlkaXMiKSAgIyAiRCINCg0KcCArIHNjYWxlX2NvbG9yX3ZpcmlkaXNfYyhvcHRpb249ImNpdmlkaXMiKSAgIyAiRSINCnAgKyBzY2FsZV9jb2xvcl92aXJpZGlzX2Iob3B0aW9uPSJjaXZpZGlzIikgICMgIkUiDQoNCnAgKyBzY2FsZV9jb2xvcl92aXJpZGlzX2Mob3B0aW9uPSJyb2NrZXQiKSAgIyAiRiINCnAgKyBzY2FsZV9jb2xvcl92aXJpZGlzX2Iob3B0aW9uPSJyb2NrZXQiKSAgIyAiRiINCg0KcCArIHNjYWxlX2NvbG9yX3ZpcmlkaXNfYyhvcHRpb249Im1ha28iKSAgIyAiRyINCnAgKyBzY2FsZV9jb2xvcl92aXJpZGlzX2Iob3B0aW9uPSJtYWtvIikgICMgIkciDQoNCnAgKyBzY2FsZV9jb2xvcl92aXJpZGlzX2Mob3B0aW9uPSJ0dXJibyIpICAjICJIIg0KcCArIHNjYWxlX2NvbG9yX3ZpcmlkaXNfYihvcHRpb249InR1cmJvIikgICMgIkgiDQpgYGANCg0KIyDkuLvpopjlhYPntKDorr7nva4NCg0KIyMjIyDjgJDlrp7ot7Uy44CR5Li76aKY5YWD57Sg6K6+572uIHsj5a6e6Le1MuS4u+mimOWFg+e0oOiuvue9rn0NCg0K77yIMe+8iWB0aGVtZSgpYOS4u+mimOWFg+e0oOiuvue9ruWHveaVsO+8iFvoh6rlraZgdGhlbWUoKWDlh73mlbDluK7liqnmlofmoaNdKGh0dHBzOi8vZ2dwbG90Mi50aWR5dmVyc2Uub3JnL3JlZmVyZW5jZS90aGVtZS5odG1sKXsudXJpfe+8iQ0KDQotIGB0aGVtZSgpYOWHveaVsOWFsTE0NOS4quWPguaVsO+8ge+8iOS7peS4i+WIl+WHuuS6huW4uOeUqOWPguaVsO+8iQ0KICAtIOaVtOW8oOWbvu+8iGBwbG90Lipg77yJDQogICAgLSDog4zmma/vvJpgcGxvdC5iYWNrZ3JvdW5kYA0KICAgIC0g5Li75qCH6aKY77yaYHBsb3QudGl0bGVgLCBgcGxvdC50aXRsZS5wb3NpdGlvbmANCiAgICAtIOWJr+agh+mimO+8mmBwbG90LnN1YnRpdGxlYA0KICAgIC0g6K+05piO5paH5a2X77yaYHBsb3QuY2FwdGlvbmAsIGBwbG90LmNhcHRpb24ucG9zaXRpb25gDQogICAgLSDluo/lj7fmoIfnrb7vvJpgcGxvdC50YWdgLCBgcGxvdC50YWcucG9zaXRpb25gDQogICAgLSDovrnot53vvJpgcGxvdC5tYXJnaW5gDQogIC0g57uY5Zu+5Yy677yIYHBhbmVsLipg77yJDQogICAgLSDog4zmma/vvJpgcGFuZWwuYmFja2dyb3VuZGANCiAgICAtIOe9keagvOe6v++8mmBwYW5lbC5ncmlkYA0KICAgIC0g5Li75Yi75bqm572R5qC857q/77yaYHBhbmVsLmdyaWQubWFqb3JgDQogICAgLSDlia/liLvluqbnvZHmoLznur/vvJpgcGFuZWwuZ3JpZC5taW5vcmANCiAgLSDlnZDmoIfovbTvvIhgYXhpcy4qYO+8iQ0KICAgIC0g6L2057q/77yaYGF4aXMubGluZWANCiAgICAtIOi9tOagh+mimO+8mmBheGlzLnRpdGxlYA0KICAgIC0g5Yi75bqm5YC877yaYGF4aXMudGV4dGANCiAgICAtIOWIu+W6pue6v++8mmBheGlzLnRpY2tzYA0KICAtIOWbvuS+i+WMuu+8iGBsZWdlbmQuKmDvvIkNCiAgICAtIOiDjOaZr++8mmBsZWdlbmQuYmFja2dyb3VuZGANCiAgICAtIOS9jee9ru+8mmBsZWdlbmQucG9zaXRpb25gLCBgbGVnZW5kLnBvc2l0aW9uLmluc2lkZWANCiAgICAtIOaWueWQke+8mmBsZWdlbmQuZGlyZWN0aW9uYA0KICAgIC0g5Zu+5L6L5qCH6aKY77yaYGxlZ2VuZC50aXRsZWANCiAgICAtIOWbvuS+i+WIu+W6puWAvO+8mmBsZWdlbmQudGV4dGANCiAgICAtIOWbvuS+i+WIu+W6pue6v++8mmBsZWdlbmQudGlja3NgDQotIOWIhumdouWbvu+8iGBzdHJpcC4qYO+8iQ0KICAtIOiDjOaZr++8mmBzdHJpcC5iYWNrZ3JvdW5kYA0KICAtIOaWh+Wtl++8mmBzdHJpcC50ZXh0YA0KDQrvvIgy77yJYGVsZW1lbnRfKigpYOWFg+e0oOWxnuaAp+iuvue9ruWHveaVsO+8iFvoh6rlraZgZWxlbWVudF8qKClg57O75YiX5Ye95pWw5biu5Yqp5paH5qGjXShodHRwczovL2dncGxvdDIudGlkeXZlcnNlLm9yZy9yZWZlcmVuY2UvZWxlbWVudC5odG1sKXsudXJpfe+8iQ0KDQotIGBlbGVtZW50X2JsYW5rKClg77ya6K6+572u5Li656m677yI56e76Zmk6K+l5YWD57Sg77yJDQotIGBlbGVtZW50X3JlY3QoKWDvvJrorr7nva7nn6nlvaLlhYPntKDvvIjovrnmoYbkuI7lupXoibLvvIkNCi0gYGVsZW1lbnRfbGluZSgpYO+8muiuvue9rue6v+adoeWFg+e0oA0KLSBgZWxlbWVudF90ZXh0KClg77ya6K6+572u5paH5pys5YWD57SgDQoNCmBgYHtyfQ0KcDEgPSBwICsgc2NhbGVfY29sb3JfY29udGludW91cyhwYWxldHRlPSJZbE9yUmQiKQ0KcDEgICMg6buY6K6k5Li76aKY77yadGhlbWVfZ3JleSgpDQoNCiMjIOmihOWumuS5ieeahHRoZW1l5Li76aKY5pa55qGIDQpwMSArIHRoZW1lX3ZvaWQoKSAgIyDnqbrml6DkuLvpopgNCnAxICsgdGhlbWVfYncoKSAgIyDpu5Hnmb3kuLvpopgNCnAxICsgdGhlbWVfZGFyaygpICAjIOa3seiJsuS4u+mimA0KcDEgKyB0aGVtZV9saWdodCgpICAjIOa1heiJsuS4u+mimA0KcDEgKyB0aGVtZV9saW5lZHJhdygpICAjIOe6v+adoeS4u+mimA0KcDEgKyB0aGVtZV9taW5pbWFsKCkgICMg5p6B566A5Li76aKYDQpwMSArIHRoZW1lX2NsYXNzaWMoKSAgIyDnu4/lhbjkuLvpopgNCnAxICsgY293cGxvdDo6dGhlbWVfY293cGxvdCgpICAjIGNvd3Bsb3TkuLvpopgNCnAxICsgY293cGxvdDo6dGhlbWVfbm90aGluZygpICAjIGNvd3Bsb3Tlrozlhajnqbrml6DkuLvpopgNCnAxICsgdGhlbWVfYnJ1Y2UoKSAgIyBicnVjZVLkuLvpopgNCmBgYA0KDQojIOWkjeS5oOS4juetlOeWkQ0KDQojIyDor77nqIvmnJ/mnKvmgLvlpI3kuaANCg0KLSBb6K++56iL5aSn57qy5LiO5a2m5Lmg55uu5qCH5Zue6aG+XShodHRwczovL3BzeWNoYnJ1Y2UuZ2l0aHViLmlvL1JDb3Vyc2UvU3lsbGFidXNfUi1Qcm9ncmFtbWluZ19CYW9IV1MucGRmKQ0KDQojIyDkuKrmgKfljJbnrZTnlpHovoXlr7wNCg0KLSDlr7nmj5Dpl64v5L2c5LiaL+aKpeWRii/mk43kvZznmoTkuKrmgKfljJblj43ppojkuI7mjIflr7wNCg0KIyDjgJDmnJ/mnKvkvZzkuJrjgJHmlbDmja7liIbmnpDkuI7lj6/op4bljJYNCg0K5L2c5Lia6KaB5rGC77yaDQoNCi0g6Ieq5Li76YCJ5oup5Lu75oSP5LiA5Liq5oSf5YW06Laj55qE5YWs5byA5pWw5o2u77yM57u85ZCI6L+Q55So5pys6K++56iL5omA5a2m5YaF5a6577yM6L+t5Luj56ev57Sv5a6M5oiQ5LiA6aG55a6M5pW055qEUuivreiogOaVsOaNruWIhuaekOS4juWPr+inhuWMlue8lueoi+acn+acq+S9nOS4mg0KICAtICoq6ZqP5aCC5L2c5LiaMVx+MTDjgIHkuKrkurrpmLbmrrXkvZzkuJrikaDikaHmmK/mnJ/mnKvlpKfkvZzkuJrnmoTln7rnoYDlkozmi4bliIbku7vliqEqKu+8jOivt+WcqOi/meS6m+W5s+aXtuS9nOS4muWfuuehgOS4iu+8jOi/m+S4gOatpeS/ruaUueWujOWWhFLku6PnoIHjgIHmloflrZfms6jph4rlkozmlofmoaPnu5PmnoTvvIzljbPlj6/kvZzkuLrmnJ/mnKvlpKfkvZzkuJrmj5DkuqTvvIENCi0g5L2/55SoUiBNYXJrZG93buWujOaIkO+8jOWvueWFs+mUruS7o+eggeWPiue7k+aenOimgeacieazqOmHiuivtOaYjg0KDQrlubPlj7Dmj5DkuqTvvJoNCg0KLSBSIE1hcmtkb3du5Y6f5aeL5Luj56CB5paH5Lu277yILlJtZO+8ieWSjOi/kOihjOW+l+WIsOeahEhUTUznvZHpobXmlofku7bvvIguaHRtbO+8iQ0KICAtIOaPkOS6pOaWh+S7tuWRveWQjeagvOW8jw0KICAgIC0gYOWtpuWPty3lp5PlkI0tUuacn+acq+S9nOS4mi5SbWRgDQogICAgLSBg5a2m5Y+3LeWnk+WQjS1S5pyf5pyr5L2c5LiaLmh0bWxgDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpb6L+U5Zue6K++56iL5Li76aG1XShodHRwczovL3BzeWNoYnJ1Y2UuZ2l0aHViLmlvL1JDb3Vyc2UvKQ0KDQrCqSDljIXlr5LlkLTpnJwNCg==