Suggested Citation:

Mendez C. (2020). Making maps in R: Using the sf and tmap Packages. R Studio/RPubs. Available at https://rpubs.com/quarcs-lab/tutorial-maps-in-r

This work is licensed under the Creative Commons Attribution-Share Alike 4.0 International License.

2 Tutorial objectives

  • Load spatial data files into R
  • Join non-spaital data to spatial data files
  • Create simple choropleth maps

4 Replication files

5 Orginal data sources

The non-spatial datafile is from:

The spatial (shapefile) is from:

6 Import the data

6.1 Non-spatial data

6.1.1 Explore the data

## Observations: 67
## Variables: 7
## $ id      <int> 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 2…
## $ growth  <dbl> 0.0254, -0.0254, 0.0773, 0.2583, 0.0709, 0.0247, 0.1059, 0.03…
## $ base    <dbl> 6.157, 5.900, 5.896, 5.315, 5.923, 6.198, 6.075, 6.173, 6.150…
## $ T       <dbl> 3.585, 2.896, 2.763, 3.140, 2.785, 4.118, 3.296, 3.163, 2.740…
## $ E       <dbl> 5.216, 3.458, 4.995, 3.478, 4.805, 5.492, 4.852, 5.131, 5.146…
## $ G       <dbl> 6.192, 6.048, 5.950, 5.354, 5.940, 6.200, 6.113, 6.219, 6.155…
## $ Coastal <int> 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0…

6.1.1.1 Definitions of variables

  • growth: growth rate of per capita real income 1987-2001
  • base: lograrithm of the per apita income in the base year 1987
  • T: average terrorism index
  • E: average years of schooling
  • G: real per capita government expenditures in 1987
  • Coastal: dummy variable which takes the value of one if the province is a coastal province.

6.2 Spatial data

6.2.1 Explore the data

## Observations: 67
## Variables: 21
## $ ObjectID   <int> 1946, 1949, 1952, 1957, 2116, 2150, 2186, 2236, 2278, 2371…
## $ NAME       <chr> "Adana", "Adiyaman", "Afyon", "Agri", "Amasya", "Antalya",…
## $ COUNTRY    <chr> "Turkey", "Turkey", "Turkey", "Turkey", "Turkey", "Turkey"…
## $ ISO_CODE   <chr> "TR01", "TR02", "TR03", "TR04", "TR05", "TR07", "TR08", "T…
## $ ISO_CC     <chr> "TR", "TR", "TR", "TR", "TR", "TR", "TR", "TR", "TR", "TR"…
## $ ISO_SUB    <chr> "01", "02", "03", "04", "05", "07", "08", "09", "10", "11"…
## $ ADMINTYPE  <chr> "Province", "Province", "Province", "Province", "Province"…
## $ DISPUTED   <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ NOTES      <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ AUTONOMOUS <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ COUNTRYAFF <chr> "Turkey", "Turkey", "Turkey", "Turkey", "Turkey", "Turkey"…
## $ CONTINENT  <chr> "Asia", "Asia", "Asia", "Asia", "Asia", "Asia", "Asia", "A…
## $ Land_Type  <chr> "Primary land", "Primary land", "Primary land", "Primary l…
## $ Land_Rank  <int> 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5…
## $ Shape_Leng <dbl> 8.589, 5.355, 6.698, 6.553, 4.831, 10.889, 4.740, 6.039, 9…
## $ Shape_Area <dbl> 1.6029, 0.8622, 1.4795, 1.1537, 0.6232, 2.1533, 0.7467, 0.…
## $ idnum      <int> 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19…
## $ province   <chr> "Adana", "Adiyaman", "Afyon", "Agri", "Amasya", "Antalya",…
## $ id         <dbl> 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19…
## $ name_esri  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ geometry   <POLYGON [°]> POLYGON ((36.44 38.22, 36.4..., POLYGON ((39.15 38…
  • Check the Coordinate Reference System
## Coordinate Reference System:
##   EPSG: 4326 
##   proj4string: "+proj=longlat +datum=WGS84 +no_defs"

7 Transform the data

No need to transform any data because both datasets share a common variable id

8 Merge the data

8.1 Keep data as sf object

  • Keep the data as sf class, so we will not lose the coodinate system
## Coordinate Reference System:
##   EPSG: 4326 
##   proj4string: "+proj=longlat +datum=WGS84 +no_defs"
## Observations: 67
## Variables: 27
## $ id         <dbl> 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19…
## $ growth     <dbl> 0.0254, -0.0254, 0.0773, 0.2583, 0.0709, 0.0247, 0.1059, 0…
## $ base       <dbl> 6.157, 5.900, 5.896, 5.315, 5.923, 6.198, 6.075, 6.173, 6.…
## $ T          <dbl> 3.585, 2.896, 2.763, 3.140, 2.785, 4.118, 3.296, 3.163, 2.…
## $ E          <dbl> 5.216, 3.458, 4.995, 3.478, 4.805, 5.492, 4.852, 5.131, 5.…
## $ G          <dbl> 6.192, 6.048, 5.950, 5.354, 5.940, 6.200, 6.113, 6.219, 6.…
## $ Coastal    <int> 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0…
## $ ObjectID   <int> 1946, 1949, 1952, 1957, 2116, 2150, 2186, 2236, 2278, 2371…
## $ NAME       <chr> "Adana", "Adiyaman", "Afyon", "Agri", "Amasya", "Antalya",…
## $ COUNTRY    <chr> "Turkey", "Turkey", "Turkey", "Turkey", "Turkey", "Turkey"…
## $ ISO_CODE   <chr> "TR01", "TR02", "TR03", "TR04", "TR05", "TR07", "TR08", "T…
## $ ISO_CC     <chr> "TR", "TR", "TR", "TR", "TR", "TR", "TR", "TR", "TR", "TR"…
## $ ISO_SUB    <chr> "01", "02", "03", "04", "05", "07", "08", "09", "10", "11"…
## $ ADMINTYPE  <chr> "Province", "Province", "Province", "Province", "Province"…
## $ DISPUTED   <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ NOTES      <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ AUTONOMOUS <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ COUNTRYAFF <chr> "Turkey", "Turkey", "Turkey", "Turkey", "Turkey", "Turkey"…
## $ CONTINENT  <chr> "Asia", "Asia", "Asia", "Asia", "Asia", "Asia", "Asia", "A…
## $ Land_Type  <chr> "Primary land", "Primary land", "Primary land", "Primary l…
## $ Land_Rank  <int> 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5…
## $ Shape_Leng <dbl> 8.589, 5.355, 6.698, 6.553, 4.831, 10.889, 4.740, 6.039, 9…
## $ Shape_Area <dbl> 1.6029, 0.8622, 1.4795, 1.1537, 0.6232, 2.1533, 0.7467, 0.…
## $ idnum      <int> 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19…
## $ province   <chr> "Adana", "Adiyaman", "Afyon", "Agri", "Amasya", "Antalya",…
## $ name_esri  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ geometry   <POLYGON [°]> POLYGON ((36.44 38.22, 36.4..., POLYGON ((39.15 38…

9 Plot Thematic Maps

9.1 Quick Map

  • A quick map of the Terrorism variable

9.9 Set color intervals

Enter “style =” followed by one of the options below.

  • equal: divides the range of the variable into n parts.
  • pretty: chooses a number of breaks to fit a sequence of equality spaced ‘round’ values.
  • quantile: equal number of cases in each group
  • jenks: looks for natural breaks in the data
  • cat: when the variable is categorical

Change the number of intervals in the color scheme and how the intervals are spaced. Changing the number of intervals n = 7. So, we have 7 shades instead of the default 5.

9.11 Add borders

You can edit the borders of the shapefile with the tm_borders() function which has many arguments. alpha denotes the level of transparency on a scale from 0 to 1 where 0 is completely transparent.

9.14 Interactive map

## tmap mode set to interactive viewing
## tmap mode set to plotting

Documentation

10 Save a new shapefile

LS0tCnRpdGxlOiAiTWFraW5nIG1hcHMgaW4gUjoiCnN1YnRpdGxlOiAiVXNpbmcgdGhlIHNmIGFuZCB0bWFwIFBhY2thZ2VzIgphdXRob3I6ICJDYXJsb3MgTWVuZGV6IgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGRmX3ByaW50OiBwYWdlZAogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogZmFsc2UKICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UKICAgIHRvY19kZXB0aDogNAogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93IgogICAgdGhlbWU6ICJjb3NtbyIKICAgIGhpZ2hsaWdodDogIm1vbm9jaHJvbWUiCiAgaHRtbF9ub3RlYm9vazoKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgaGlnaGxpZ2h0OiBtb25vY2hyb21lCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdGhlbWU6IGNvc21vCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0CiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogbm8KICAgICAgc21vb3RoX3Njcm9sbDogbm8KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0CmJpYmxpb2dyYXBoeTogYmlibGlvLmJpYgotLS0KCgo8c3R5bGU+CmgxLnRpdGxlIHtmb250LXNpemU6IDE4cHQ7IGNvbG9yOiBEYXJrQmx1ZTt9IApib2R5LCBoMSwgaDIsIGgzLCBoNCB7Zm9udC1mYW1pbHk6ICJQYWxhdGlubyIsIHNlcmlmO30KYm9keSB7Zm9udC1zaXplOiAxMnB0O30KLyogSGVhZGVycyAqLwpoMSxoMixoMyxoNCxoNSxoNntmb250LXNpemU6IDE0cHQ7IGNvbG9yOiAjMDAwMDhCO30KYm9keSB7Y29sb3I6ICMzMzMzMzM7fQphLCBhOmhvdmVyIHtjb2xvcjogIzhCM0E2Mjt9CnByZSB7Zm9udC1zaXplOiAxMnB4O30KPC9zdHlsZT4KCgpTdWdnZXN0ZWQgQ2l0YXRpb246IAoKPiBNZW5kZXogQy4gKDIwMjApLiAgTWFraW5nIG1hcHMgaW4gUjogVXNpbmcgdGhlIHNmIGFuZCB0bWFwIFBhY2thZ2VzLiBSIFN0dWRpby9SUHVicy4gQXZhaWxhYmxlIGF0IDxodHRwczovL3JwdWJzLmNvbS9xdWFyY3MtbGFiL3R1dG9yaWFsLW1hcHMtaW4tcj4KClRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZSBBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAKIVtdKExpY2Vuc2UucG5nKQoKCiMgTGlicmFyaWVzCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHdhcm5pbmc9RkFMU0UpCgpsaWJyYXJ5KHRpZHl2ZXJzZSkgICMgTW9kZXJuIGRhdGEgc2NpZW5jZSB3b3JrZmxvdwpsaWJyYXJ5KHNmKSAgICAgICAgICMgU2ltcGxlIGZlYXR1cmVzIGZvciBSCmxpYnJhcnkodG1hcCkgICAgICAgIyBUaGVtYXRpYyBNYXBzCmxpYnJhcnkodG1hcHRvb2xzKSAgIyBUaGVtYXRpYyBNYXBzIFRvb2xzCmxpYnJhcnkoUkNvbG9yQnJld2VyKSAjIENvbG9yQnJld2VyIFBhbGV0dGVzCmxpYnJhcnkobGVhZmxldCkgICAgIyBJbnRlcmFjdGl2ZSB3ZWIgbWFwcwpsaWJyYXJ5KHJnZGFsKSAgICAgICMgQmluZGluZ3MgZm9yIHRoZSBHZW9zcGF0aWFsIERhdGEgQWJzdHJhY3Rpb24gTGlicmFyeQpsaWJyYXJ5KHJnZW9zKSAgICAgICMgSW50ZXJmYWNlIHRvIEdlb21ldHJ5IEVuZ2luZSAtIE9wZW4gU291cmNlIAoKCiMgQ2hhbmdlIHRoZSBwcmVzZW50YXRpb24gb2YgZGVjaW1hbCBudW1iZXJzIHRvIDQgYW5kIGF2b2lkIHNjaWVudGlmaWMgbm90YXRpb24Kb3B0aW9ucyhwcm9tcHQ9IlI+ICIsIGRpZ2l0cz00LCBzY2lwZW49OTk5KQpgYGAKCiMgVHV0b3JpYWwgb2JqZWN0aXZlcwoKLSBMb2FkIHNwYXRpYWwgZGF0YSBmaWxlcyBpbnRvIFIgCi0gSm9pbiBub24tc3BhaXRhbCBkYXRhIHRvIHNwYXRpYWwgZGF0YSBmaWxlcwotIENyZWF0ZSBzaW1wbGUgY2hvcm9wbGV0aCBtYXBzCgoKIyBQcmVsaW1pbmFyeSBtYXRlcmlhbAoKLSBbQ3JlYXRpbmcgdGhlbWF0aWMgbWFwcyBpbiBSXShodHRwczovL3lvdXR1LmJlL2tyY1JSOThDMlowKQogICAgLSBbR2l0aHViIHJlcG9zaXRvcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9tdGVubmVrZXMvdG1hcC13b3Jrc2hvcCkKCi0gW01ha2luZyBtYXBzIHdpdGggUl0oaHR0cHM6Ly9nZW9jb21wci5yb2JpbmxvdmVsYWNlLm5ldC9hZHYtbWFwLmh0bWwpCgoKIyBSZXBsaWNhdGlvbiBmaWxlcwoKLSBJZiB5b3UgYXJlIGEgbWVtYmVyIG9mIHRoZSBbUXVhUkNTIGxhYl0oaHR0cHM6Ly9xdWFyY3MtbGFiLnJiaW5kLmlvLyksIHlvdSBjYW4gcnVuIHRoaXMgdHV0b3JpYWwgaW4gW1IgU3R1ZGlvIENsb3VkXShodHRwczovL3JzdHVkaW8uY2xvdWQvc3BhY2VzLzE1NTk3L3Byb2plY3QvOTcxNzgwKS4KCiMjIERhdGEKCi0gW05vbi1zcGF0aWFsXShodHRwczovL2dpdGh1Yi5jb20vcXVhcmNzLWxhYi90dXRvcmlhbC1tYXBzLWluLXIvYmxvYi9tYXN0ZXIvREFUQVNFVC56aXA/cmF3PXRydWUpCi0gW1NwYXRpYWxdKGh0dHBzOi8vZ2l0aHViLmNvbS9xdWFyY3MtbGFiL3R1dG9yaWFsLW1hcHMtaW4tci9ibG9iL21hc3Rlci9NQVAuemlwP3Jhdz10cnVlKSAKLSBbQ29tYmluZWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9xdWFyY3MtbGFiL3R1dG9yaWFsLW1hcHMtaW4tci9ibG9iL21hc3Rlci90dXJrZXlfYWRtaW4xX21lcmdlM19hbGwuemlwP3Jhdz10cnVlKQoKIyBPcmdpbmFsIGRhdGEgc291cmNlcwoKVGhlIG5vbi1zcGF0aWFsIGRhdGFmaWxlIGlzIGZyb206IAoKLSDDlmNhbCwgTi4sICYgWWlsZGlyaW0sIEouICgyMDEwKS4gW1JlZ2lvbmFsIGVmZmVjdHMgb2YgdGVycm9yaXNtIG9uIGVjb25vbWljIGdyb3d0aCBpbiBUdXJrZXk6IEEgZ2VvZ3JhcGhpY2FsbHkgd2VpZ2h0ZWQgcmVncmVzc2lvbiBhcHByb2FjaC5dKGh0dHBzOi8vam91cm5hbHMuc2FnZXB1Yi5jb20vZG9pL2Ficy8xMC4xMTc3LzAwMjIzNDMzMTAzNjQ1NzYpIEpvdXJuYWwgb2YgUGVhY2UgUmVzZWFyY2gsIDQ3KDQpLCA0NzctNDg5LgoKVGhlIHNwYXRpYWwgKHNoYXBlZmlsZSkgaXMgZnJvbTogCgotIFtNYXR0aGV3IEMuIEluZ3JhbV0oaHR0cDovL21hdHRpbmdyYW0ubmV0LykKCgojIEltcG9ydCB0aGUgZGF0YQoKCiMjIE5vbi1zcGF0aWFsIGRhdGEKCmBgYHtyfQpkYXQgPC1yZWFkLmNzdigiREFUQVNFVC5jc3YiKQpgYGAKCiMjIyBFeHBsb3JlIHRoZSBkYXRhCgpgYGB7cn0KZ2xpbXBzZShkYXQpIApgYGAKCiMjIyMgRGVmaW5pdGlvbnMgb2YgdmFyaWFibGVzCgotIGdyb3d0aDogZ3Jvd3RoIHJhdGUgb2YgcGVyIGNhcGl0YSByZWFsIGluY29tZSAxOTg3LTIwMDEKLSBiYXNlOiBsb2dyYXJpdGhtIG9mIHRoZSBwZXIgYXBpdGEgaW5jb21lIGluIHRoZSBiYXNlIHllYXIgMTk4NwotIFQ6IGF2ZXJhZ2UgdGVycm9yaXNtIGluZGV4Ci0gRTogYXZlcmFnZSB5ZWFycyBvZiBzY2hvb2xpbmcKLSBHOiByZWFsIHBlciBjYXBpdGEgZ292ZXJubWVudCBleHBlbmRpdHVyZXMgaW4gMTk4NwotIENvYXN0YWw6IGR1bW15IHZhcmlhYmxlICB3aGljaCB0YWtlcyB0aGUgdmFsdWUgb2Ygb25lIGlmIHRoZSBwcm92aW5jZSBpcyBhIGNvYXN0YWwgcHJvdmluY2UuCgoKCiMjIFNwYXRpYWwgZGF0YQoKYGBge3J9Cm1hcERhdGEgPC0gcmVhZF9zZigiTUFQLnNocCIpCmBgYAoKIyMjIEV4cGxvcmUgdGhlIGRhdGEKCmBgYHtyfQpnbGltcHNlKG1hcERhdGEpCmBgYAoKLSBDaGVjayB0aGUgQ29vcmRpbmF0ZSBSZWZlcmVuY2UgU3lzdGVtCgpgYGB7cn0Kc3RfY3JzKG1hcERhdGEpCmBgYAoKCiMgVHJhbnNmb3JtIHRoZSBkYXRhCgpObyBuZWVkIHRvIHRyYW5zZm9ybSBhbnkgZGF0YSBiZWNhdXNlIGJvdGggZGF0YXNldHMgc2hhcmUgYSBjb21tb24gdmFyaWFibGUgYGlkYAoKCiMgTWVyZ2UgdGhlIGRhdGEKCgpgYGB7cn0KZGF0X21hcCA8LSBpbm5lcl9qb2luKAogIGRhdCwKICBtYXBEYXRhLAogIGJ5ID0gImlkIgopCmBgYAoKIyMgS2VlcCBkYXRhIGFzIHNmIG9iamVjdAoKLSBLZWVwIHRoZSBkYXRhIGFzIHNmIGNsYXNzLCBzbyB3ZSB3aWxsIG5vdCBsb3NlIHRoZSBjb29kaW5hdGUgc3lzdGVtCgpgYGB7cn0KZGF0X21hcCA8LSBzdF9hc19zZihkYXRfbWFwKQpzdF9jcnMobWFwRGF0YSkKYGBgCgpgYGB7cn0KZ2xpbXBzZShkYXRfbWFwKQpgYGAKCgoKIyBQbG90IFRoZW1hdGljIE1hcHMKCgojIyBRdWljayBNYXAgCgotIEEgcXVpY2sgbWFwIG9mIHRoZSBUZXJyb3Jpc20gdmFyaWFibGUKCmBgYHtyfQpxdG0oZGF0X21hcCwgZmlsbCA9ICJUIikKYGBgCgoKIyMgU2ltcGxlIE1hcAoKYGBge3J9CnRtX3NoYXBlKGRhdF9tYXApICsgdG1fZmlsbCgiVCIpIApgYGAKCgojIyBSZW1vdmUgZnJhbWUKCmBgYHtyfQp0bV9zaGFwZShkYXRfbWFwKSArIAogIHRtX2ZpbGwoIlQiKSArCiAgdG1fbGF5b3V0KGZyYW1lID0gRkFMU0UpCmBgYAoKCiMjIFNldCBsZWdlbmQgb3V0c2lkZQoKYGBge3J9CnRtX3NoYXBlKGRhdF9tYXApICsgdG1fZmlsbCgiVCIpICsKICB0bV9sYXlvdXQobGVnZW5kLm91dHNpZGUgPSBUUlVFLCBmcmFtZSA9IEZBTFNFKQpgYGAKCiMjIFNldCBsZWdlbmQgc2l6ZQoKYGBge3J9CnRtX3NoYXBlKGRhdF9tYXApICsgdG1fZmlsbCgiVCIpICsKICB0bV9sYXlvdXQobGVnZW5kLm91dHNpZGUgPSBUUlVFLCBmcmFtZSA9IEZBTFNFKSArCiAgdG1fbGVnZW5kKHRleHQuc2l6ZSA9IDAuMykgCmBgYAoKCgojIyBTZXQgY29sb3IgcGFsZXR0ZQoKU2VlIGNvbG9yIHJlZmVyZW5jZSBbaGVyZV0oaHR0cHM6Ly93d3cuZGF0YW5vdmlhLmNvbS9lbi9ibG9nL3RoZS1hLXotb2YtcmNvbG9yYnJld2VyLXBhbGV0dGUvKQoKYGBge3J9CnRtX3NoYXBlKGRhdF9tYXApICsgCiAgdG1fZmlsbCgiVCIsIHBhbGV0dGUgPSAiR3JlZW5zIikgKwogIHRtX2xheW91dChsZWdlbmQub3V0c2lkZSA9IFRSVUUsIGZyYW1lID0gRkFMU0UpCmBgYAoKYGBge3J9CnRtX3NoYXBlKGRhdF9tYXApICsgCiAgdG1fZmlsbCgiVCIsIHBhbGV0dGUgPSAiLUdyZWVucyIpICsKICB0bV9sYXlvdXQobGVnZW5kLm91dHNpZGUgPSBUUlVFLCBmcmFtZSA9IEZBTFNFKQpgYGAKCgpgYGB7cn0KdG1fc2hhcGUoZGF0X21hcCkgKyAKICB0bV9maWxsKCJUIiwgcGFsZXR0ZSA9ICJ2aXJpZGlzIikgKwogIHRtX2xheW91dChsZWdlbmQub3V0c2lkZSA9IFRSVUUsIGZyYW1lID0gRkFMU0UpCmBgYAoKCiMjIEFkZCBwb2x5Z29uIG5hbWVzCgpgYGB7cn0KdG1fc2hhcGUoZGF0X21hcCkgKyAKICB0bV9maWxsKCJUIiwgcGFsZXR0ZSA9ICJ2aXJpZGlzIikgKwogIHRtX2xheW91dChsZWdlbmQub3V0c2lkZSA9IFRSVUUsIGZyYW1lID0gRkFMU0UpICsKICB0bV90ZXh0KCJwcm92aW5jZSIsIHNpemUgPSAiU2hhcGVfQXJlYSIsICBhdXRvLnBsYWNlbWVudCA9IEYsIGxlZ2VuZC5zaXplLnNob3cgPSBGQUxTRSkgCmBgYAoKCgpbRG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9yZHJyLmlvL2NyYW4vdG1hcC9tYW4vdG1fdGV4dC5odG1sKQoKIyMgQWRkIHNjYWxlIGJhcgoKYGBge3J9CnRtX3NoYXBlKGRhdF9tYXApICsgCiAgdG1fZmlsbCgiVCIsIHBhbGV0dGUgPSAidmlyaWRpcyIpICsKICB0bV9sYXlvdXQobGVnZW5kLm91dHNpZGUgPSBUUlVFLCBmcmFtZSA9IEZBTFNFKSArCiAgdG1fdGV4dCgicHJvdmluY2UiLCBzaXplID0gIlNoYXBlX0FyZWEiLCAgYXV0by5wbGFjZW1lbnQgPSBGLCBsZWdlbmQuc2l6ZS5zaG93ID0gRkFMU0UpICArIAogIHRtX3NjYWxlX2Jhcihwb3NpdGlvbiA9IGMoIlJJR0hUIiwgIkJPVFRPTSIpKQpgYGAKCgojIyBTZXQgY29sb3IgaW50ZXJ2YWxzCgpFbnRlciDigJxzdHlsZSA94oCdIGZvbGxvd2VkIGJ5IG9uZSBvZiB0aGUgb3B0aW9ucyBiZWxvdy4KCi0gZXF1YWw6IGRpdmlkZXMgdGhlIHJhbmdlIG9mIHRoZSB2YXJpYWJsZSBpbnRvIG4gcGFydHMuCi0gcHJldHR5OiBjaG9vc2VzIGEgbnVtYmVyIG9mIGJyZWFrcyB0byBmaXQgYSBzZXF1ZW5jZSBvZiBlcXVhbGl0eSBzcGFjZWQg4oCYcm91bmTigJkgdmFsdWVzLiAKLSBxdWFudGlsZTogZXF1YWwgbnVtYmVyIG9mIGNhc2VzIGluIGVhY2ggZ3JvdXAKLSBqZW5rczogbG9va3MgZm9yIG5hdHVyYWwgYnJlYWtzIGluIHRoZSBkYXRhCi0gY2F0OiB3aGVuIHRoZSB2YXJpYWJsZSBpcyBjYXRlZ29yaWNhbCAKCmBgYHtyfQp0bV9zaGFwZShkYXRfbWFwKSArIAogIHRtX2ZpbGwoIlQiLAogICAgICAgICAgc3R5bGUgPSAicXVhbnRpbGUiLAogICAgICAgICAgcGFsZXR0ZSA9ICJSZWRzIgogICAgKSArCiAgdG1fbGF5b3V0KAogICAgbGVnZW5kLm91dHNpZGUgPSBUUlVFLAogICAgZnJhbWUgPSBGQUxTRSkKYGBgCgpDaGFuZ2UgdGhlIG51bWJlciBvZiBpbnRlcnZhbHMgaW4gdGhlIGNvbG9yIHNjaGVtZSBhbmQgaG93IHRoZSBpbnRlcnZhbHMgYXJlIHNwYWNlZC4gQ2hhbmdpbmcgdGhlIG51bWJlciBvZiBpbnRlcnZhbHMgbiA9IDcuIFNvLCB3ZSBoYXZlIDcgc2hhZGVzIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgNS4KCmBgYHtyfQp0bV9zaGFwZShkYXRfbWFwKSArIAogIHRtX2ZpbGwoIlQiLAogICAgICAgICAgc3R5bGUgPSAicXVhbnRpbGUiLAogICAgICAgICAgbiA9IDcsCiAgICAgICAgICBwYWxldHRlID0gIlJlZHMiCiAgICApICsKICB0bV9sYXlvdXQoCiAgICBsZWdlbmQub3V0c2lkZSA9IFRSVUUsCiAgICBmcmFtZSA9IEZBTFNFKQpgYGAKCgoKIyMgQWRkIGhpc3RvZ3JhbQoKYGBge3J9CnRtX3NoYXBlKGRhdF9tYXApICsgCiAgdG1fZmlsbCgiVCIsCiAgICAgICAgICBzdHlsZSA9ICJxdWFudGlsZSIsCiAgICAgICAgICBuID0gNSwKICAgICAgICAgIHBhbGV0dGUgPSAiWWxPckJyIiwKICAgICAgICAgIGxlZ2VuZC5oaXN0ID0gVFJVRQogICAgKSArCiAgdG1fbGF5b3V0KAogICAgbGVnZW5kLm91dHNpZGUgPSBUUlVFLAogICAgZnJhbWUgPSBGQUxTRSkKYGBgCgoKIyMgQWRkIGJvcmRlcnMKCllvdSBjYW4gZWRpdCB0aGUgYm9yZGVycyBvZiB0aGUgc2hhcGVmaWxlIHdpdGggdGhlIHRtX2JvcmRlcnMoKSBmdW5jdGlvbiB3aGljaCBoYXMgbWFueSBhcmd1bWVudHMuIGFscGhhIGRlbm90ZXMgdGhlIGxldmVsIG9mIHRyYW5zcGFyZW5jeSBvbiBhIHNjYWxlIGZyb20gMCB0byAxIHdoZXJlIDAgaXMgY29tcGxldGVseSB0cmFuc3BhcmVudC4KCmBgYHtyfQp0bV9zaGFwZShkYXRfbWFwKSArIAogIHRtX2ZpbGwoIlQiLAogICAgICAgICAgc3R5bGUgPSAicXVhbnRpbGUiLAogICAgICAgICAgcGFsZXR0ZSA9ICJCbHVlcyIKICAgICkgKyAKICB0bV9ib3JkZXJzKGFscGhhPS40KSArCiAgdG1fbGF5b3V0KAogICAgbGVnZW5kLm91dHNpZGUgPSBUUlVFLAogICAgZnJhbWUgPSBGQUxTRSkKYGBgCgojIyBBZGQgY29tcGFzcwoKYGBge3J9CnRtX3NoYXBlKGRhdF9tYXApICsgCiAgdG1fZmlsbCgiVCIsCiAgICAgICAgICBzdHlsZSA9ICJxdWFudGlsZSIsCiAgICAgICAgICBwYWxldHRlID0gInZpcmlkaXMiCiAgICApICsgCiAgdG1fYm9yZGVycyhhbHBoYT0uNCkgKyAKICB0bV9jb21wYXNzKHR5cGUgPSAiOHN0YXIiLCAKICAgICAgICAgICAgICBwb3NpdGlvbiA9IGMoIlJJR0hUIiwgIkJPVFRPTSIpLAogICAgICAgICAgICAgIHNob3cubGFiZWxzID0gMiwKICAgICAgICAgICAgICB0ZXh0LnNpemUgPSAwLjM1KSArCiAgdG1fbGF5b3V0KGxlZ2VuZC5vdXRzaWRlID0gVFJVRSwKICAgICAgICAgICAgZnJhbWUgPSBGQUxTRSkKYGBgCgpbRG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly93d3cucmRvY3VtZW50YXRpb24ub3JnL3BhY2thZ2VzL3RtYXAvdmVyc2lvbnMvMi4zLTIvdG9waWNzL3RtX2NvbXBhc3MpCgoKIyMgRWRpdCB0aGUgbGF5b3V0CgpgYGB7cn0KdG1fc2hhcGUoZGF0X21hcCkgKyAKICB0bV9maWxsKCJUIiwKICAgICAgICAgIHBhbGV0dGUgPSAidmlyaWRpcyIsCiAgICAgICAgICBzdHlsZSA9ICJxdWFudGlsZSIsCiAgICAgICAgICB0aXRsZSA9ICJUZXJyb3Jpc3QgQXR0YWNrcyIKICAgICAgICAgICkgKyAKdG1fYm9yZGVycyhhbHBoYT0uNCkgKyAKdG1fbGF5b3V0KAogIGxlZ2VuZC50ZXh0LnNpemUgPSAwLjcsCiAgbGVnZW5kLnRpdGxlLnNpemUgPSAxLAogIGxlZ2VuZC5wb3NpdGlvbiA9IGMoInJpZ2h0IiwgImJvdHRvbSIpLAogIGxlZ2VuZC5vdXRzaWRlID0gVFJVRSwKICBmcmFtZSA9IEZBTFNFCiAgKSAKYGBgCgpbRG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly93d3cucmRvY3VtZW50YXRpb24ub3JnL3BhY2thZ2VzL3RtYXAvdmVyc2lvbnMvMi4zLTIvdG9waWNzL3RtX2xheW91dCkKCiMjIEludGVyYWN0aXZlIG1hcAoKCmBgYHtyfQp0bWFwX21vZGUoInZpZXciKQoKdG1fc2hhcGUoZGF0X21hcCkgKyAKICB0bV9maWxsKCJUIiwKICAgICAgICAgIHBhbGV0dGUgPSAidmlyaWRpcyIsCiAgICAgICAgICBpZD0icHJvdmluY2UiLAogICAgICAgICAgcG9wdXAudmFycz1jKCJUIiwgImdyb3d0aCIsICJiYXNlIiwgIkUiLCAiRyIpCiAgICAgICAgICApICsgCgl0bV9sZWdlbmQob3V0c2lkZT1UUlVFKSArCiAgdG1fbGF5b3V0KGZyYW1lID0gRkFMU0UpIAoKdG1hcF9tb2RlKCJwbG90IikKYGBgCgoKW0RvY3VtZW50YXRpb25dKGh0dHBzOi8vcmRyci5pby9jcmFuL3RtYXAvbWFuL3RtX3ZpZXcuaHRtbCkKCiMgU2F2ZSBhIG5ldyBzaGFwZWZpbGUKCmBgYHtyIGV2YWw9RkFMU0V9CnN0X3dyaXRlKGRhdF9tYXAsICJkYXRfbWFwLnNocCIpCmBgYAoKCiMgT3RoZXIgdHV0b3JpYWxzCgotIFtFQ1M1MzA6IChJVikgVmlzdWFsaXphdGlvbiBvZiBzcGF0aWFsIGRhdGFdKGh0dHBzOi8vcnNiaXZhbmQuZ2l0aHViLmlvL0VDUzUzMF9oMTkvRUNTNTMwX0lWLmh0bWwpCgotIFtQcmFjdGljYWwgNTogTWFraW5nIG1hcHMgaW4gUl0oaHR0cHM6Ly9kYXRhLmNkcmMuYWMudWsvdHV0b3JpYWwvYWE1NDkxYzktY2JhYy00MDI2LTk3YzktZjkxNjg0NjJmNGFjLzcwYzRiYzYxLTA0NzUtNDgwNi05MjQwLTRlZjFmYTY0OWEwNikKCi0gW01ha2luZyBtYXBzIHdpdGggUl0oaHR0cHM6Ly9nZW9jb21wci5yb2JpbmxvdmVsYWNlLm5ldC9hZHYtbWFwLmh0bWwpCgotIFtDaGFwdGVyIDggU29sdXRpb25zXShodHRwczovL2dlb2NvbXByLmdpdGh1Yi5pby9nZW9jb21wa2cvYXJ0aWNsZXMvc29sdXRpb25zMDguaHRtbCkKCiMgUmVmZXJlbmNlcwoKLSA8aHR0cHM6Ly9yZHJyLmlvL2NyYW4vdG1hcC8+CgotIFtUZW5uZWtlcywgTS4sIDIwMTgsIHRtYXA6IFRoZW1hdGljIE1hcHMgaW4gUiwgSm91cm5hbCBvZiBTdGF0aXN0aWNhbCBTb2Z0d2FyZSwgODQoNiksIDEtMzldKGh0dHBzOi8vZG9pLm9yZy8xMC4xODYzNy9qc3MudjA4NC5pMDYpCgotIDxodHRwczovL21hcmNpbnN0ZXBuaWFrLmV1L3Bvc3QvaW50ZXJhY3RpdmUtY2hvcm9wbGV0aC1tYXBzLXdpdGgtci1hbmQtdG1hcC1wYXJ0LWkvPgoKCi0gW01vZGVybiBHZW9zcGF0aWFsIERhdGEgQW5hbHlzaXMgd2l0aCBSXShodHRwOi8vZmlsZXMuemV2cm9zcy5jb20vd29ya3Nob3BzL3NwYXRpYWwvc2xpZGVzL2h0bWwvMC1kZWNrLWxpc3QuaHRtbCkKCi0gW1dlYmluYXIgb24gU3BhdGlhbCBEYXRhIEFuYWx5c2lzIHdpdGggUl0oaHR0cHM6Ly93d3cuci1ibG9nZ2Vycy5jb20vaW5jYXNlLXlvdS1taXNzZWQtaXQtbXktd2ViaW5hci1vbi1zcGF0aWFsLWRhdGEtYW5hbHlzaXMtd2l0aC1yLykKCi0gPGh0dHBzOi8vdGxvcnVzc28uZ2l0aHViLmlvL2dlb2RhdGFfd29ya3Nob3AvdG1hcF9wYWNrYWdlPgoKLSA8aHR0cHM6Ly9yc3R1ZGlvLXB1YnMtc3RhdGljLnMzLmFtYXpvbmF3cy5jb20vMjI5NDgyX2I1YjE4MmY2NTA0MzRhMzZhY2U0ZWVlZjJkMmJjZDgzLmh0bWwjMTc+CgotIDxodHRwczovL21yYW4ubWljcm9zb2Z0LmNvbS9zbmFwc2hvdC8yMDE3LTEyLTExL3dlYi9wYWNrYWdlcy90bWFwL3ZpZ25ldHRlcy90bWFwLW51dHNoZWxsLmh0bWw+CgotIFtDaGFwdGVyIDggU29sdXRpb25zXShodHRwczovL2dlb2NvbXByLmdpdGh1Yi5pby9nZW9jb21wa2cvYXJ0aWNsZXMvc29sdXRpb25zMDguaHRtbCkKCi0gW0dlb2NvbXB1dGF0aW9uIHdpdGggUiB3ZWJzaXRlXShodHRwczovL2dlb2NvbXByLmdpdGh1Yi5pby8pCgotIDxodHRwczovL2Jvb2tkb3duLm9yZy9sZXhjb21iZXIvYnJ1bnNkb25jb21iZXIyZS8+CgoKRU5ECg==