From 85a28ed13b20616f38ed8d40dde2c3f2dd0c3e9c Mon Sep 17 00:00:00 2001 From: Liz Muehlmann <73714803+liz-muehlmann@users.noreply.github.com> Date: Mon, 3 Oct 2022 12:50:46 -0700 Subject: [PATCH] update css & html --- ...40b622142f1c98125abcfe89a76a661b0e8e343910 | 1 + ...9da247670f6f7c04b0b471f549a5e80eb45e8fd6e3 | 3 + ...a02d237db46ee18342713bf2e17128e7d000f8cc0f | 108 + ...5233eebf8084c58ba1d68077fe074457267b0fadd9 | 4 + ...a4cc8e1ab2f777c38caf6b5ff4d4ed0d90a00284c7 | 68 + ...3694f5df128dbd750a575227df5a1be391ab5a29e2 | 8 + ...f897f9e346bc088c7bc3d14f7256dfb1bf53ef5e2b | 32 + ...a76a4c6031ce4509be668425d2aaa2082744c98912 | 205 + ...cbf833021c4b374c880ef9a46e63eabc4d9bffbfe8 | 156 + ...059fdb8bc31c1014a443719ad3412c4fbd4cd26cc6 | 20 + ...0ecb0608614df2c0d563b1bce71bda46250dfa5c5b | 143 + ...411859155c5bb757ceee86c2e8495a0090aa4241c7 | 454 ++ ...2b1977183529d067fd9d69585b4f51dcd20903822e | 154 + ...6ce36aeff1d5ae58fffa2ea53bdfac7d0bd85a761b | 249 + ...f276f52962057d4dd7fa9fb130de051268fb7e655a | 2 + ...1f0394acadfc60b11c5de0450d793be198ce527721 | 3 + ...dbb369cd6a059fcc9ff8ff67398c86d84ebeab5927 | 109 + ...7a53f98375ec2f1d199cef308f7b5badf5f4aa844f | 116 + ...d538ea961b4cc318f46d0e08c95244ecca230d4b0e | 4 + ...454ccf5c4a86df38441660782eb3f5a867d3307b30 | 3 + ...bdf034f911696f194846704f251270c55d7f632572 | 72 + ...aa7e6e33a2b4df0fffc97c1f9b0807302a7c1d922b | 29 + ...9d4717b94bd4c6cecaefe914c07c35dd1b5f9dd1a8 | 2 + ...3817281d5731a79af5610c036c598d2662c5df8eee | 7 + ...a4889eaf525c2978502289cb198335afba866b029c | 184 + ...da17636faab4d4cd0907e1af1a74a91c965414b367 | 156 + ...4d01289e3b23cc68e9927e5e3769956a4e0b51a956 | 3 + ...ae1a5340dd75b688369c30df6b6540e7a7fd76391e | 156 + ...f1326ae1c89557be868a87f89e5307d8efa1946f1b | 46 + ...03dd3ef4dbdc72803996509ec8c241645c6f5ab0ac | 477 ++ ...8a4e8d4527c0af6cc9221999afdca6d8efaf2b9ce4 | 49 + ...cd6bcf87dc080b132a9f20125612209a90c029c8fc | 2 + Gemfile | 19 +- _config.yml | 64 +- _includes/figure.html | 26 + _includes/head.html | 11 - _includes/header.html | 2 - _includes/metacontent.html | 6 +- _includes/navbar.html | 101 +- _layouts/default.html | 37 +- _layouts/home.html | 41 - _layouts/page.html | 2 +- _layouts/post.html | 15 +- _sass/_root.scss | 32 +- _sass/bootstrap-reboot.scss | 8 +- _sass/bootstrap.scss | 4 +- assets/css/darkmode.css | 33 +- assets/css/day-night.css | 14 +- assets/css/main.css | 303 +- assets/css/monokai.css | 63 - assets/css/vars.css | 36 + assets/javascript/theme-toggle.js | 50 - assets/notes-images/nps/maps/usa.html | 4064 +++++++++++++++++ .../Proj4Leaflet-1.0.1/proj4leaflet.js | 272 ++ .../htmlwidgets-1.5.4/htmlwidgets.js | 903 ++++ .../usa_files/jquery-1.12.4/jquery.min.js | 5 + .../leaflet-1.3.1/images/layers-2x.png | Bin 0 -> 1259 bytes .../usa_files/leaflet-1.3.1/images/layers.png | Bin 0 -> 696 bytes .../leaflet-1.3.1/images/marker-icon-2x.png | Bin 0 -> 2464 bytes .../leaflet-1.3.1/images/marker-icon.png | Bin 0 -> 1466 bytes .../leaflet-1.3.1/images/marker-shadow.png | Bin 0 -> 618 bytes .../maps/usa_files/leaflet-1.3.1/leaflet.css | 636 +++ .../maps/usa_files/leaflet-1.3.1/leaflet.js | 5 + .../leaflet-binding-2.1.1/leaflet.js | 2785 +++++++++++ .../usa_files/leafletfix-1.0.0/leafletfix.css | 36 + .../maps/usa_files/proj4-2.6.2/proj4.min.js | 1 + .../rstudio_leaflet-1.3.1/images/1px.png | Bin 0 -> 68 bytes .../rstudio_leaflet-1.3.1/rstudio_leaflet.css | 41 + .../{images => }/notes-images/nps/nps-1.jpg | Bin assets/notes-images/nps/nps-10.jpg | Bin 0 -> 87355 bytes assets/notes-images/nps/nps-11.jpg | Bin 0 -> 40210 bytes assets/notes-images/nps/nps-12.jpg | Bin 0 -> 32041 bytes assets/notes-images/nps/nps-13.jpg | Bin 0 -> 65354 bytes assets/notes-images/nps/nps-14.jpg | Bin 0 -> 62654 bytes assets/notes-images/nps/nps-15.jpg | Bin 0 -> 52200 bytes assets/notes-images/nps/nps-16.jpg | Bin 0 -> 30000 bytes assets/notes-images/nps/nps-17.jpg | Bin 0 -> 160780 bytes assets/notes-images/nps/nps-18.jpg | Bin 0 -> 177602 bytes assets/notes-images/nps/nps-19.jpg | Bin 0 -> 145782 bytes .../{images => }/notes-images/nps/nps-2.png | Bin assets/notes-images/nps/nps-20.jpg | Bin 0 -> 131051 bytes assets/notes-images/nps/nps-3.jpg | Bin 0 -> 47681 bytes assets/notes-images/nps/nps-4.jpg | Bin 0 -> 138832 bytes assets/notes-images/nps/nps-5.jpg | Bin 0 -> 22219 bytes assets/notes-images/nps/nps-6.jpg | Bin 0 -> 150358 bytes assets/notes-images/nps/nps-7.jpg | Bin 0 -> 216403 bytes assets/notes-images/nps/nps-8.jpg | Bin 0 -> 183702 bytes assets/notes-images/nps/nps-9.jpg | Bin 0 -> 98676 bytes assets/notes-images/qgis/qgis0.jpg | Bin 0 -> 84384 bytes assets/notes-images/qgis/qgis1.jpg | Bin 0 -> 138490 bytes assets/notes-images/qgis/qgis2.jpg | Bin 0 -> 89546 bytes assets/notes-images/qgis/qgis3.jpg | Bin 0 -> 112872 bytes assets/notes-images/qgis/qgis4.jpg | Bin 0 -> 133321 bytes assets/notes-images/qgis/qgis5.jpg | Bin 0 -> 148048 bytes .../using-github/using-github-1.jpeg | Bin .../using-github/using-github-10.jpeg | Bin .../using-github/using-github-11.jpg | Bin .../using-github/using-github-12.jpg | Bin .../using-github/using-github-13.jpg | Bin .../using-github/using-github-14.jpg | Bin .../using-github/using-github-15.jpg | Bin .../using-github/using-github-16.jpg | Bin .../using-github/using-github-17.jpg | Bin .../using-github/using-github-18.jpg | Bin .../using-github/using-github-19.jpg | Bin .../using-github/using-github-2.jpeg | Bin .../using-github/using-github-20.jpg | Bin .../using-github/using-github-21.jpg | Bin .../using-github/using-github-3.jpeg | Bin .../using-github/using-github-4.jpeg | Bin .../using-github/using-github-5.jpeg | Bin .../using-github/using-github-6.jpeg | Bin .../using-github/using-github-7.jpeg | Bin .../using-github/using-github-8.jpeg | Bin .../using-github/using-github-9.jpeg | Bin assets/{images => resources}/Dognado.jpg | Bin assets/resources/Green-arrow-right.png | Bin 1794 -> 1961 bytes .../{images => resources}/Liz-Muehlmann.jpg | Bin assets/{images => resources}/Sequoias.jpg | Bin assets/resources/green-calendar.png | Bin 1747 -> 1913 bytes .../octocat-liz-books.png | Bin .../octocat-liz-coffee.png | Bin assets/{images => resources}/uci-logo.png | Bin darkmode colors.css | 322 ++ index.html | 33 + index.md | 29 - js-css.zip | Bin 0 -> 3691 bytes notes/_drafts/2022-09-21-cartography-in-r.md | 46 - .../2022-09-21-converting-gdb-files.md | 26 + notes/_drafts/2022-09-30-cartography-pt3.md | 132 + notes/_posts/2022-09-17-git-github.md | 95 +- notes/_posts/2022-09-18-github-desktop.md | 30 +- notes/_posts/2022-09-19-github-website.md | 22 +- notes/_posts/2022-09-20-dvc.md | 73 +- notes/_posts/2022-09-21-cartography-pt1.md | 398 ++ notes/_posts/2022-09-22-cartography-pt2.md | 230 + pages/cv.md | 207 +- pages/groups.md | 40 +- notes/notes.html => pages/notes.md | 2 +- pages/research.md | 14 +- notes/tag-forest.html => pages/tag-forest.md | 95 +- sandbox.code-workspace | 10 + 142 files changed, 13547 insertions(+), 897 deletions(-) create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Cache/b7/9606fb3afea5bd1609ed40b622142f1c98125abcfe89a76a661b0e8e343910 create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/06/b6d7b1178c795f1e5a8f9da247670f6f7c04b0b471f549a5e80eb45e8fd6e3 create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/08/223aa2fe9c269344baf4a02d237db46ee18342713bf2e17128e7d000f8cc0f create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/0d/413fbc18c90a4ec44b9a5233eebf8084c58ba1d68077fe074457267b0fadd9 create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/25/62ac18de72eab322aeaaa4cc8e1ab2f777c38caf6b5ff4d4ed0d90a00284c7 create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/26/3013ed2a2209813a9ad03694f5df128dbd750a575227df5a1be391ab5a29e2 create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/34/534bc9bcd322a687ccf9f897f9e346bc088c7bc3d14f7256dfb1bf53ef5e2b create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/38/4d854b0ef8a379cf8beda76a4c6031ce4509be668425d2aaa2082744c98912 create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/3d/1523d769077141cc7834cbf833021c4b374c880ef9a46e63eabc4d9bffbfe8 create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/40/709190e338593300fe1b059fdb8bc31c1014a443719ad3412c4fbd4cd26cc6 create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/40/cbffac7bea52fb9f9de40ecb0608614df2c0d563b1bce71bda46250dfa5c5b create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/45/e3358b96d4fa8ee00ca5411859155c5bb757ceee86c2e8495a0090aa4241c7 create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/46/08a0aa6fc9e937ad9cb52b1977183529d067fd9d69585b4f51dcd20903822e create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/50/1a64ad3783d75c5323536ce36aeff1d5ae58fffa2ea53bdfac7d0bd85a761b create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/70/b3846986fcdc26ca2b09f276f52962057d4dd7fa9fb130de051268fb7e655a create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/7b/f92e83f6054a694b02321f0394acadfc60b11c5de0450d793be198ce527721 create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/87/1e42347eb2f9d0b2c689dbb369cd6a059fcc9ff8ff67398c86d84ebeab5927 create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/98/50861d4debb3fa578cd97a53f98375ec2f1d199cef308f7b5badf5f4aa844f create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/99/2e2eedb77c2b4fc866b5d538ea961b4cc318f46d0e08c95244ecca230d4b0e create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/9b/430d487f1f2b12a55d4f454ccf5c4a86df38441660782eb3f5a867d3307b30 create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/9d/f88591eec86ecfc46b2dbdf034f911696f194846704f251270c55d7f632572 create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/aa/e6872ee0c6d2e69df2b9aa7e6e33a2b4df0fffc97c1f9b0807302a7c1d922b create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/b3/32bab753480f28f3fcf39d4717b94bd4c6cecaefe914c07c35dd1b5f9dd1a8 create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/b5/0ce9309704e6379f99413817281d5731a79af5610c036c598d2662c5df8eee create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/b9/227523c050f596f8c73fa4889eaf525c2978502289cb198335afba866b029c create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/ba/4db09c86dd5edae7497eda17636faab4d4cd0907e1af1a74a91c965414b367 create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/bd/10cb948906d50fdb7c3d4d01289e3b23cc68e9927e5e3769956a4e0b51a956 create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/ca/82c6e4d943b1964653d6ae1a5340dd75b688369c30df6b6540e7a7fd76391e create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/d9/d164e0a18182f8caf2e5f1326ae1c89557be868a87f89e5307d8efa1946f1b create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/e3/a1e108f51e09bfa8de6303dd3ef4dbdc72803996509ec8c241645c6f5ab0ac create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/e8/b7a6dbbcc0a0459281a08a4e8d4527c0af6cc9221999afdca6d8efaf2b9ce4 create mode 100644 .jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/e9/fe1fcfddc671dc02d718cd6bcf87dc080b132a9f20125612209a90c029c8fc create mode 100644 _includes/figure.html delete mode 100644 _includes/head.html delete mode 100644 _layouts/home.html delete mode 100644 assets/css/monokai.css create mode 100644 assets/css/vars.css create mode 100644 assets/notes-images/nps/maps/usa.html create mode 100644 assets/notes-images/nps/maps/usa_files/Proj4Leaflet-1.0.1/proj4leaflet.js create mode 100644 assets/notes-images/nps/maps/usa_files/htmlwidgets-1.5.4/htmlwidgets.js create mode 100644 assets/notes-images/nps/maps/usa_files/jquery-1.12.4/jquery.min.js create mode 100644 assets/notes-images/nps/maps/usa_files/leaflet-1.3.1/images/layers-2x.png create mode 100644 assets/notes-images/nps/maps/usa_files/leaflet-1.3.1/images/layers.png create mode 100644 assets/notes-images/nps/maps/usa_files/leaflet-1.3.1/images/marker-icon-2x.png create mode 100644 assets/notes-images/nps/maps/usa_files/leaflet-1.3.1/images/marker-icon.png create mode 100644 assets/notes-images/nps/maps/usa_files/leaflet-1.3.1/images/marker-shadow.png create mode 100644 assets/notes-images/nps/maps/usa_files/leaflet-1.3.1/leaflet.css create mode 100644 assets/notes-images/nps/maps/usa_files/leaflet-1.3.1/leaflet.js create mode 100644 assets/notes-images/nps/maps/usa_files/leaflet-binding-2.1.1/leaflet.js create mode 100644 assets/notes-images/nps/maps/usa_files/leafletfix-1.0.0/leafletfix.css create mode 100644 assets/notes-images/nps/maps/usa_files/proj4-2.6.2/proj4.min.js create mode 100644 assets/notes-images/nps/maps/usa_files/rstudio_leaflet-1.3.1/images/1px.png create mode 100644 assets/notes-images/nps/maps/usa_files/rstudio_leaflet-1.3.1/rstudio_leaflet.css rename assets/{images => }/notes-images/nps/nps-1.jpg (100%) create mode 100644 assets/notes-images/nps/nps-10.jpg create mode 100644 assets/notes-images/nps/nps-11.jpg create mode 100644 assets/notes-images/nps/nps-12.jpg create mode 100644 assets/notes-images/nps/nps-13.jpg create mode 100644 assets/notes-images/nps/nps-14.jpg create mode 100644 assets/notes-images/nps/nps-15.jpg create mode 100644 assets/notes-images/nps/nps-16.jpg create mode 100644 assets/notes-images/nps/nps-17.jpg create mode 100644 assets/notes-images/nps/nps-18.jpg create mode 100644 assets/notes-images/nps/nps-19.jpg rename assets/{images => }/notes-images/nps/nps-2.png (100%) create mode 100644 assets/notes-images/nps/nps-20.jpg create mode 100644 assets/notes-images/nps/nps-3.jpg create mode 100644 assets/notes-images/nps/nps-4.jpg create mode 100644 assets/notes-images/nps/nps-5.jpg create mode 100644 assets/notes-images/nps/nps-6.jpg create mode 100644 assets/notes-images/nps/nps-7.jpg create mode 100644 assets/notes-images/nps/nps-8.jpg create mode 100644 assets/notes-images/nps/nps-9.jpg create mode 100644 assets/notes-images/qgis/qgis0.jpg create mode 100644 assets/notes-images/qgis/qgis1.jpg create mode 100644 assets/notes-images/qgis/qgis2.jpg create mode 100644 assets/notes-images/qgis/qgis3.jpg create mode 100644 assets/notes-images/qgis/qgis4.jpg create mode 100644 assets/notes-images/qgis/qgis5.jpg rename assets/{images => }/notes-images/using-github/using-github-1.jpeg (100%) rename assets/{images => }/notes-images/using-github/using-github-10.jpeg (100%) rename assets/{images => }/notes-images/using-github/using-github-11.jpg (100%) rename assets/{images => }/notes-images/using-github/using-github-12.jpg (100%) rename assets/{images => }/notes-images/using-github/using-github-13.jpg (100%) rename assets/{images => }/notes-images/using-github/using-github-14.jpg (100%) rename assets/{images => }/notes-images/using-github/using-github-15.jpg (100%) rename assets/{images => }/notes-images/using-github/using-github-16.jpg (100%) rename assets/{images => }/notes-images/using-github/using-github-17.jpg (100%) rename assets/{images => }/notes-images/using-github/using-github-18.jpg (100%) rename assets/{images => }/notes-images/using-github/using-github-19.jpg (100%) rename assets/{images => }/notes-images/using-github/using-github-2.jpeg (100%) rename assets/{images => }/notes-images/using-github/using-github-20.jpg (100%) rename assets/{images => }/notes-images/using-github/using-github-21.jpg (100%) rename assets/{images => }/notes-images/using-github/using-github-3.jpeg (100%) rename assets/{images => }/notes-images/using-github/using-github-4.jpeg (100%) rename assets/{images => }/notes-images/using-github/using-github-5.jpeg (100%) rename assets/{images => }/notes-images/using-github/using-github-6.jpeg (100%) rename assets/{images => }/notes-images/using-github/using-github-7.jpeg (100%) rename assets/{images => }/notes-images/using-github/using-github-8.jpeg (100%) rename assets/{images => }/notes-images/using-github/using-github-9.jpeg (100%) rename assets/{images => resources}/Dognado.jpg (100%) rename assets/{images => resources}/Liz-Muehlmann.jpg (100%) rename assets/{images => resources}/Sequoias.jpg (100%) rename assets/{images => resources}/octocat-liz-books.png (100%) rename assets/{images => resources}/octocat-liz-coffee.png (100%) rename assets/{images => resources}/uci-logo.png (100%) create mode 100644 darkmode colors.css create mode 100644 index.html delete mode 100644 index.md create mode 100644 js-css.zip delete mode 100644 notes/_drafts/2022-09-21-cartography-in-r.md create mode 100644 notes/_drafts/2022-09-21-converting-gdb-files.md create mode 100644 notes/_drafts/2022-09-30-cartography-pt3.md create mode 100644 notes/_posts/2022-09-21-cartography-pt1.md create mode 100644 notes/_posts/2022-09-22-cartography-pt2.md rename notes/notes.html => pages/notes.md (86%) rename notes/tag-forest.html => pages/tag-forest.md (51%) create mode 100644 sandbox.code-workspace diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Cache/b7/9606fb3afea5bd1609ed40b622142f1c98125abcfe89a76a661b0e8e343910 b/.jekyll-cache/Jekyll/Cache/Jekyll--Cache/b7/9606fb3afea5bd1609ed40b622142f1c98125abcfe89a76a661b0e8e343910 new file mode 100644 index 0000000..2ad27ed --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Cache/b7/9606fb3afea5bd1609ed40b622142f1c98125abcfe89a76a661b0e8e343910 @@ -0,0 +1 @@ +I"˘{"source"=>"C:/Users/lizmo/Desktop/sandbox", "destination"=>"C:/Users/lizmo/Desktop/sandbox/_site", "collections_dir"=>"", "cache_dir"=>".jekyll-cache", "plugins_dir"=>"_plugins", "layouts_dir"=>"_layouts", "data_dir"=>"_data", "includes_dir"=>"_includes", "collections"=>{"posts"=>{"output"=>true, "permalink"=>"/:categories/:year/:month/:day/:title:output_ext"}}, "safe"=>false, "include"=>[".htaccess"], "exclude"=>[".sass-cache", ".jekyll-cache", "gemfiles", "Gemfile", "Gemfile.lock", "node_modules", "vendor/bundle/", "vendor/cache/", "vendor/gems/", "vendor/ruby/"], "keep_files"=>[".git", ".svn"], "encoding"=>"utf-8", "markdown_ext"=>"markdown,mkdown,mkdn,mkd,md", "strict_front_matter"=>false, "show_drafts"=>true, "limit_posts"=>0, "future"=>false, "unpublished"=>false, "whitelist"=>[], "plugins"=>[], "markdown"=>"kramdown", "highlighter"=>"rouge", "lsi"=>false, "excerpt_separator"=>"\n\n", "incremental"=>false, "detach"=>false, "port"=>"4000", "host"=>"127.0.0.1", "baseurl"=>"/", "show_dir_listing"=>false, "permalink"=>"date", "paginate_path"=>"/page:num", "timezone"=>nil, "quiet"=>false, "verbose"=>false, "defaults"=>[], "liquid"=>{"error_mode"=>"warn", "strict_filters"=>false, "strict_variables"=>false}, "kramdown"=>{"auto_ids"=>true, "toc_levels"=>[1, 2, 3, 4, 5, 6], "entity_output"=>"as_char", "smart_quotes"=>"lsquo,rsquo,ldquo,rdquo", "input"=>"GFM", "hard_wrap"=>false, "guess_lang"=>true, "footnote_nr"=>1, "show_warnings"=>false, "syntax_highlighter"=>"rouge", "syntax_highlighter_opts"=>{:default_lang=>"plaintext", :guess_lang=>true}, "coderay"=>{}}, "title"=>"Liz Muehlmann", "email"=>"liz.muehlmann@uci.edu", "description"=>"Academic website for Liz Muehlmann. PhD Candidate in Political Science at the University of Irvine, California.", "url"=>"http://localhost:4000", "twitter_username"=>"@hello_iamliz", "github_username"=>"liz-muehlmann", "author"=>"Liz", "watch"=>true, "livereload_port"=>35729, "serving"=>true}:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/06/b6d7b1178c795f1e5a8f9da247670f6f7c04b0b471f549a5e80eb45e8fd6e3 b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/06/b6d7b1178c795f1e5a8f9da247670f6f7c04b0b471f549a5e80eb45e8fd6e3 new file mode 100644 index 0000000..748c9e4 --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/06/b6d7b1178c795f1e5a8f9da247670f6f7c04b0b471f549a5e80eb45e8fd6e3 @@ -0,0 +1,3 @@ +I" 

Version control is helpful when you want to track your project’s changes. However, GitHub has one major (yet, understandable) shortcoming: file size. The free version of GitHub will warn you if your file is over 50MB and completely reject your push if the file is over 100MB. This is a huge problem when you’re working with shapefiles (.shp) which contain the geographic coordinates necessary for cartography. “Officially” there are three ways around GitHub’s file size limits, but I have a clear favorite.

+ +:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/08/223aa2fe9c269344baf4a02d237db46ee18342713bf2e17128e7d000f8cc0f b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/08/223aa2fe9c269344baf4a02d237db46ee18342713bf2e17128e7d000f8cc0f new file mode 100644 index 0000000..912a828 --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/08/223aa2fe9c269344baf4a02d237db46ee18342713bf2e17128e7d000f8cc0f @@ -0,0 +1,108 @@ +I"&

Version control is helpful when you want to track your project’s changes. However, GitHub has one major (yet, understandable) shortcoming: file size. The free version of GitHub will warn you if your file is over 50MB and completely reject your push if the file is over 100MB. This is a huge problem when you’re working with shapefiles (.shp) which contain the geographic coordinates necessary for cartography. “Officially” there are three ways around GitHub’s file size limits, but I have a clear favorite.

+ + +
  1. Pay for GitHub Premium
  2. +
  3. LFS (Large File Storage)
  4. +
  5. DVC (Data Version Control)
+ +

My favorite is using DVC, so I’m only going to go over #1 and #2 briefly.

+ +

GitHub Pro

+

GitHub has a paid-version which is available here. It starts at $48 a year. Both the free and pro versions have repo limit of 2GB, Team version limits it to 4GB, and enterprise limits files to 5GB.

+ +

You still can’t push files larger than 100MB, so unless you’re doing a lot of programming I don’t think the Pro version is worth it. I would suggest checking if your school or employer offers an enterprise account. My school does not.

+ +

LFS [Large File Storage]

+

LFS is a way around GitHub’s file size limits when pushing changes. To install LFS just go to the website and download it.

+ +

You will need to use the command line to use LFS, but it’s fairly straightforward. Once you’ve downloaded LFS and install it you’ll need to open a console or terminal. Powershell on Windows, terminal on Mac, cmder console emulator, or any other command line interface will work.

+ +

First you’ll need to navigate to wherever you store your repos and install LFS:

+ +
1
+2
+
    cd Documents\Github
+    git lfs install
+
+ +

The basic logic of LFS is to track certain file extensions so that Git ignores them, but LFS does not.

+ +

For example, I know that .shp files are very large. I would track all .shp files using LFS to get around the file size limit. To track an extension with LFS you use:

+ +
    git lfs track "*.shp"
+ +

The * before .shp tells LFS to add any file, regardless of what it’s called, that has the .shp extension.

+ +

The final step is to make a .gitattributes file.

+ +
    git add .gitattributes
+ +

Once you follow those steps, you can use Git and GitHub as you normally would.

+ +

The problem with this option is that it does not get around GitHub’s limit on total repos size. You’ll still be limited to repos no larger than 2GB. This is a problem if you’re doing a complex cartography project with multiple .shp files or you’re mapping data from something like the CES. The only way around this, that I’ve found, is to use DVC [data version control].

+ +

DVC [Data Version Control]

+

DVC is an open-source version control system for data. It works in parallel with Git.

+ +

To start, you need to download and install DVC from here. Once you do, navigate to the repo that has large files and initialize DVC:

+ +
1
+2
+
    cd Documents\Github
+    dvc init
+
+ +

Once you initialize DVC several files are created. You’ll need to push the new files to GitHub

+ +
1
+2
+3
+
    git add -A
+    git commit -m "Initialize DVC"
+    git push origin main
+
+ +

To actually track data you’ll need to add them to DVC. It’s done in much the same way as using Git in command line.

+ +

To add an individual file you’d use:

+ +
1
+
    dvc add data/filename.ext
+
+ +

where [filename.ext] is the name of your file or the directory you want to track.

+ +

Before you can push changes to DVC, you’ll need to add a remote storage site. My school gives us a lot of storage through Google and Microsoft, so I connected my DVC to my Google Drive.

+ +

If, like me, you want to use Google Drive I suggest making a folder called “DVC” on your Google Drive and using it to store your DVC files.

+ +

To use the folder you created, you’ll need to add the remote using the command line.

+ +
1
+2
+
    dvc remote add -default [remote-name] \ gdrive://[folder-ID]
+    dvc push
+
+ +

[remote-name] is whatever you want to save the drive URL to. It’s easiest just to name it “myremote” but it’s up to you.

+ +

The [Folder-ID] is the jumble of letters and numbers at the end of the URL. To get it, you’ll need to navigate to the folder you want to use on Google Drive in your browser. At the top you’ll see the URL and you’ll need to copy the bit after the last /.

+ +

+Repo Options

+ +

You only need to do this step once.

+ +

When you’re ready to use DVC all you do is add the file you want and push it.

+ +
1
+2
+
    dvc add [filename]
+    dvc push
+
+ +

Conclusion

+

DVC is feature-rich and useful. It allows you to store your data in the same repo without running into GitHub’s file size limits. The documentation for DVC is well written, so I suggest looking at it if you want to use another storage site like Microsoft One Drive or Dropbox

+ +

With all the data management and version control sorted you can turn, in earnest, to cartography in R!

+:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/0d/413fbc18c90a4ec44b9a5233eebf8084c58ba1d68077fe074457267b0fadd9 b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/0d/413fbc18c90a4ec44b9a5233eebf8084c58ba1d68077fe074457267b0fadd9 new file mode 100644 index 0000000..8e59aeb --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/0d/413fbc18c90a4ec44b9a5233eebf8084c58ba1d68077fe074457267b0fadd9 @@ -0,0 +1,4 @@ +I"n

+This area will not be a real blog, in the sense that it will probably not have regular updates. +

+:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/25/62ac18de72eab322aeaaa4cc8e1ab2f777c38caf6b5ff4d4ed0d90a00284c7 b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/25/62ac18de72eab322aeaaa4cc8e1ab2f777c38caf6b5ff4d4ed0d90a00284c7 new file mode 100644 index 0000000..120af00 --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/25/62ac18de72eab322aeaaa4cc8e1ab2f777c38caf6b5ff4d4ed0d90a00284c7 @@ -0,0 +1,68 @@ +I"F

Building off my post about using Git & GitHub, this post is about using the GitHub website to initialize repos and get URLs from existing repos to clone them.

+ + + +

Web Interface

+

Once you sign into GitHub you’re greeted with a page that looks like this:

+ +

+Github Home Screen +Note: Clicking on an image will open it in ths same tab.

+ +

On the left-hand side you’ll see a list of your repos. Clicking on any of those links will take you to the repos main page.

+ +

In the center are announcements and updates from repos you follow.

+ +

On the right are your latest changes and a list of repos that might be interesting to you.

+ +

Initializing a Repo

+

To initialize a repo using the website, you’ll click on the green button on the left that says New. (I boxed it in red in the above photo).

+ +

When you click new you’ll be asked to fill in some information: + +Repo Options

+ +
1:
+

In the box that opens, you’ll enter a repo name. This should be a descriptive, unique-to-you name for your repo. You can’t have two repos named “project.” Just choose something short and descriptive. Here, I named my repo using-git to store the information related to this post.

+ +
2:
+

The second part of initializing a repo is to give it a description. As it says, this step is optional, but I suggest giving it a useful description. I like to add an overview of what the project is about and what still needs to be done.

+ +
3:
+

Next, you can select whether you want the repo to be public or private. If you want people to see your work and your changes, choose public. If you’re working on data for a paper you want to publish or don’t want to share your code, select private. Most of my repos are private because they are projects I’m working on that I hope to publish.

+ +
4:
+

The README file operates like the description, but in a file rather than just on GitHub. I basically add a README that gives more information including any citations, where to look for other resources, and any other information that’s useful but not vital to the repo.

+ +
5:
+

A .gitignore file is a special file. It tells Git to ignore files and directories listed in the .gitignore document. You can tell git to always skip files with a certain extension. So if you want to share your data but not your R code you can select R from the .gitignore template and GitHub will skip any file with the .R extension.

+ +
6:
+

Fast Company has a good write up on what the licenses mean. I usually initialize with no license because my repos are private. I know creative commons is useful if you’re okay with people having full access to your code and modifying it in anyway they want.

+ +
7:
+

Finally, click Create Repository. Congrats! You now have a new project repo.

+ +

Cloning a Repo

+

Once you create a repo, you’ll want to add it to your hard drive. You can do this with your own repo or one created by another person. The steps are the same.

+ +

You’ll navigate to the URL of the repo. This will always follow the same format:

+ +

https://github.com/[username]/[reponame]. For example, my election guide repo is found at https://github.com/liz-muehlmann/Election_Guides.

+ +

+Github Home Screen

+ +

To clone a repo to your hard drive you’ll need the repo URL. Click on the green code button and copy the URL under HTTPS.

+ +

You can either clone it using command line or Github Desktop

+ +

Conclusion

+

The website is useful because you can find cool projects where people share their code and try to get answers for bugs they’re encountering. A lot of programs people use on a daily basis have project Repos. Some of my favorite extensions and plug-ins have been found by searching online for repos.

+ +

For example, Leaflet (the package I use for Cartography) has its own website hosted through GitHub Pages and its own GitHub repo where you can fork the project or submit an issue.

+ +

GitHub is a powerful resource and it looks great on resumes as a skill. It looks more intimidating than it is, but you should definitely spend some time using version control.

+ +

I have a guide here about using version control via command line and via GitHub desktop

+:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/26/3013ed2a2209813a9ad03694f5df128dbd750a575227df5a1be391ab5a29e2 b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/26/3013ed2a2209813a9ad03694f5df128dbd750a575227df5a1be391ab5a29e2 new file mode 100644 index 0000000..6c300bc --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/26/3013ed2a2209813a9ad03694f5df128dbd750a575227df5a1be391ab5a29e2 @@ -0,0 +1,8 @@ +I"Ž

+This area will not be a real blog, in the sense that it will probably not have regular updates. +

+

Instead, this space is for various notes on things that catch my interest. +

+As a first generation PhD student there are a lot of things I wish I knew. Additionally, it’s also a place where I can share my process as I go through the projects I’m working on.

+ +:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/34/534bc9bcd322a687ccf9f897f9e346bc088c7bc3d14f7256dfb1bf53ef5e2b b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/34/534bc9bcd322a687ccf9f897f9e346bc088c7bc3d14f7256dfb1bf53ef5e2b new file mode 100644 index 0000000..8be63c0 --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/34/534bc9bcd322a687ccf9f897f9e346bc088c7bc3d14f7256dfb1bf53ef5e2b @@ -0,0 +1,32 @@ +I">
+
+
+

Current Research:

+
+

Local News Access & Political Participation | 2022
+ I hypothesize that when citizens have access to a local newspaper, they are more likely to engage in traditional political participation activities, such as putting up yard signs and attending political meetings. However, newspapers are shuttering their offices throughout the United States leaving citizens without reliable information about their community. To interrogate these questions, I combine on local newspapers from the University of North Carolina Hussman School of Journalism’s News Deserts project with participation data from Harvard University’s Cooperative Election Study to identify areas where citizens lack access to community news. The results show that newspaper readership is the greatest predictor of whether a person will be politically participatory. The number of newspapers only had a marginal, varying effect on participation, social media use for politics, and monetary donations. +

+
+
+ +
+
+

Previous Research:

+
+

+ + Corporate Citizenship & the Threat to Democracy: Unions as a Counterbalance | 2021 +
University of California - Irvine | First Qualifying Paper +

+ Friedrichs v. California Teachers Association: Union Security, Campaign Finance, and the First Amendment | 2017 +
California State University - Fullerton | Masters Thesis +

+ Deliberative Democracy and the Media it Requires | 2012 +
California State Polytechnic University - Pomona | Bachelors Capstone Paper +

+
+
+
+:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/38/4d854b0ef8a379cf8beda76a4c6031ce4509be668425d2aaa2082744c98912 b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/38/4d854b0ef8a379cf8beda76a4c6031ce4509be668425d2aaa2082744c98912 new file mode 100644 index 0000000..435c2c8 --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/38/4d854b0ef8a379cf8beda76a4c6031ce4509be668425d2aaa2082744c98912 @@ -0,0 +1,205 @@ +I""
+
+
+
+ +
+ + + +

cartography in R part three

+
+

This is part three of my cartography in R series. The links to part one and part two are here.

+ +

In this post, we’ll process the National Park data before adding it to the base map created in part two. I’ll also add in pop up markers with images from the National Parks I’ve visited that link to the blog post where I’ve written about my adventures there.

+ + + + + | + + + +read more +
+ + + +

cartography in R part two

+
+

This is a continuation of my previous post where I walked through downloading and modifying shape data. I also showed how to shift Alaska and Hawaii so they are closer to the continental United States.

+ + + + + | + + + +read more +
+ + + +

Converting Gdb Files

+
+
    +
  1. download gdb data from the PAD-US Website: + https://www.sciencebase.gov/catalog/item/61794fc2d34ea58c3c6f9f69 + under Attached Files download “PADUS3_0Geodatabase.zip” + Unzip the folder
  2. +
+ + + + + | + + + +read more +
+ + + +

cartography in R part one

+
+

Twitter is a great resource for engaging with the academic community. For example, I saw this Tweet by @PhD_Genie asking users to name one positive skill learned during their PhD. I love this question for a number of reasons. First, it helps PhDs reframe their experience so it’s applicable outside of academia - which can help when applying to jobs. Second, it’s really cool to see what skills other people have learned during their program.

+ + + + + + | + + + +read more +
+ + + +

dvc (data version control)

+
+

Version control is helpful when you want to track your project’s changes. However, GitHub has one major (yet, understandable) shortcoming: file size. The free version of GitHub will warn you if your file is over 50MB and completely reject your push if the file is over 100MB. This is a huge problem when you’re working with shapefiles (.shp) which contain the geographic coordinates necessary for cartography. “Officially” there are three ways around GitHub’s file size limits, but I have a clear favorite.

+ + + + + + | + + + +read more +
+ + + +

github website

+
+

Building off my post about using Git & GitHub, this post is about using the GitHub website to initialize repos and get URLs from existing repos to clone them.

+ + + + + + | + + + +read more +
+ + + +

github desktop

+
+

This is part of my tutorial series on using Git and GitHub. In particular, this guide is about using GitHub’s desktop app for creating and managing repos. You can download the app here..

+ + + + + | + + + +read more +
+ + + +

git & github

+
+

Arguably one of the best things you can do before starting a PhD is invest time in learning how to properly use version control. With version control, you can track, save, and revert changes to any kind of project. There are several options available, but I’m partial to Git & GitHub. Even if you never touch a piece of code, version control is very helpful.

+ + + + + + | + + + +read more +
+ + + +

hello

+
+

+This area will not be a real blog, in the sense that it will probably not have regular updates. +

+ + + + + | + + + +read more +
+ + + +

Citation Manager

+
+

GET A CITATION MANAGER.

+ + + + + | + + + +read more +
+ + + +
+
+ +
+
+
+ + +
+
+ + +
+
+ +
+
+ +
+
+ +
+:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/3d/1523d769077141cc7834cbf833021c4b374c880ef9a46e63eabc4d9bffbfe8 b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/3d/1523d769077141cc7834cbf833021c4b374c880ef9a46e63eabc4d9bffbfe8 new file mode 100644 index 0000000..1e21f69 --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/3d/1523d769077141cc7834cbf833021c4b374c880ef9a46e63eabc4d9bffbfe8 @@ -0,0 +1,156 @@ +I".

This is part three of my cartography in R series. The links to part one and part two are here.

+ +

In this post, we’ll process the National Park data before adding it to the base map created in part two. I’ll also add in pop up markers with images from the National Parks I’ve visited that link to the blog post where I’ve written about my adventures there. +

+ +

Note: I know that my posts are verbose. I am sorry that I am not more concise but one of the biggest problems I have with code documentation is that it assumes you already know what you’re doing. I’m writing these for absolute beginners that want to know what each part of the code does. If you want more concise explanations, I suggest looking at the annotated r files in this project’s GitHub.

+ +

project outline

+
+ +

I had to break the tutorial into different parts because it became unwieldy. I list the component parts below. The annotated version of the code can be found in this project’s repository in the folder called r files.

+ +

I. cartography in R part one

+ + +

II. cartography in R part two

+ + +

III. cartography in R part three [this post]

+ + +

IV. cartography in R part four

+ + +

1. load the libraries

+
+ +
1
+2
+3
+4
+5
+6
+7
+
    ## load libraries
+    library("tidyverse")    # data manipulation & map creation
+    library("sf")           # loads shapefile
+    library("leaflet")      # creates the map
+
+    ## load data
+    states <- read_sf("~/Documents/Github/nps/shapefiles/shifted/usa/usa.shp")
+
+ +

I am not going to explain in detail what each line is doing here, because it’s already available in part one.

+ +

In line 7 be sure to change "~/Documents/Github/nps/shapefiles/shifted/usa/usa.shp" to reflect wherever you saved the shifted shapefile.

+ +

If your data processing and base map creation are in the same file, you can skip line 7 and use the variable name where the shape data is stored when you make the leaflet call below.

+ +

2. create the base map

+
+ +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+
    ## create usa basemap using leaflet()
+    map <- leaflet() %>%                        # initialize the map widget
+    addPolygons(data = states,                  # add state polygons
+        smoothFactor = 0.2,                     # lower number means more detail
+        fillColor = "#808080",                  # internal shape color
+        stroke = TRUE,                          # add outlines
+        weight = 0.5,                           # outline width
+        opacity = 0.5,                          # outline opacity
+        color = "#808080",                      # outline color    
+        highlightOptions = highlightOptions(    # define hover parameters
+            weight = 0.5,                       # outline width [hover]
+            color = "#000000",                  # internal shape color [hover]
+            fillOpacity = 0.7,                  # internal fill opacity [hover]
+            bringToFront = FALSE),              # keep base map in back
+        group = "basemap")                      # add to group
+
+ +

A detailed description of each of these lines can be found in part II of this series. Basic comments have been added for easy reference. The National and State Park data will be added on top of the base map as additional layers.

+ +

3. download national park boundaries

+
+ +

The first step is to download the data from https://public-nps.opendata.arcgis.com/. Once you click on the link you’ll see a bunch of icons that lead to data different data that you can download. Click on the one for boundaries.

+ +
+ + + Image: NPS GIS website + + +
NPS GIS website
+
+ +

I suggest taking some time to and looking through the site and seeing the kinds of data that are available. For now, after you click on boundaries the next page will have a list of all the data sets you can download. The second link should be nps boundary which is the one we’re interested in. This will have all the data for the National Park boundaries, hiking trails, rest aries, and a ton of other data.

+ +
+ + + Image: NPS download page + + +
NPS download page
+
+ +

Once you click on the nps boundary link, it will take you to a map and another download link.

+ +
+ + + Image: NPS map and download link + + +
NPS map and download link
+
+ +

From here, you’ll have a few options of what format you want the data in. We want the shapefile version.

+ +
+ + + Image: download nps shapefile + + +
download nps shapefile
+
+ +

Save it somewhere on your hard drive that you’ll remember and then unzip the file.

+ +

4. process national park data

+
+ +

5. create national park labels

+
+ +

6. add national parks to map

+
+ +

7. conclusion

+
+ +

Note: I will give the entire codeblock first. I also include the individual line before describing what it does. I find this to be cleaner than including a bunch of comments in the code itself. If you want to copy and paste the code to your own file, you only need to copy the code block and not each individual line.

+ +:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/40/709190e338593300fe1b059fdb8bc31c1014a443719ad3412c4fbd4cd26cc6 b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/40/709190e338593300fe1b059fdb8bc31c1014a443719ad3412c4fbd4cd26cc6 new file mode 100644 index 0000000..194b23b --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/40/709190e338593300fe1b059fdb8bc31c1014a443719ad3412c4fbd4cd26cc6 @@ -0,0 +1,20 @@ +I"´

GET A CITATION MANAGER. +

+ +

I think one of the first things any graduate student should do is get a citation manager. There are a lot out there and a ton of resources on how to set one up, but it bears repeating. I did not realize how helpful a citation manager was until it was too late.

+ +

Since I’m starting my second qualifying paper, I decided to write a series of posts that demonstrate how I start new projects in my citation manager and how I go through the research process.

+ +

I use Juris-M, which is an off shoot of Zotero because I do a lot of work with Supreme Court cases. Juris-M has a lot of extras that are particularly useful when citing case law and law reviews. The best thing about Juris-M/Zotero is that it is open source. Since it’s open source, it’s free! Free is better. Plus there’s a lot of really cool add-ons that are also free.

+ +

Why a Citation Manager?

+
    +
  1. Citation managers are very useful. Essentially, they do the heavy lifting for you. Instead of having to learn how to properly cite according to various organization’s preferences (APA, APSA, MLA, Chicago…), it automatically inserts the citation for you.
  2. +
  3. It also can auto-update them, so if you move sections around your citations will remain updated (this is especially useful if you use footnotes).
  4. +
  5. It’s easy to find articles because most (all?) citation managers allow you to tag and link articles.
  6. +
  7. It is a great way to keep track of what you’ve read.
  8. +
+ +

Step 1: Installation

+

Juris-M/Zotero are available for free. Click here to go to the Juris-M or Zotero download page.

+:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/40/cbffac7bea52fb9f9de40ecb0608614df2c0d563b1bce71bda46250dfa5c5b b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/40/cbffac7bea52fb9f9de40ecb0608614df2c0d563b1bce71bda46250dfa5c5b new file mode 100644 index 0000000..ad8137b --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/40/cbffac7bea52fb9f9de40ecb0608614df2c0d563b1bce71bda46250dfa5c5b @@ -0,0 +1,143 @@ +I"˙+

This is part three of my cartography in R series. The links to part one and part two are here.

+ +

In this post, we’ll process the National Park data before adding it to the base map created in part two. I’ll also add in pop up markers with images from the National Parks I’ve visited that link to the blog post where I’ve written about my adventures there. +

+ +

Note: I know that my posts are verbose. I am sorry that I am not more concise but one of the biggest problems I have with code documentation is that it assumes you already know what you’re doing. I’m writing these for absolute beginners that want to know what each part of the code does. If you want more concise explanations, I suggest looking at the annotated r files in this project’s GitHub.

+ +

project outline

+
+ +

I had to break the tutorial into different parts because it became unwieldy. I list the component parts below. The annotated version of the code can be found in this project’s repository in the folder called r files.

+ +

I. cartography in R part one

+ + +

II. cartography in R part two

+ + +

III. cartography in R part three [this post]

+ + +

IV. cartography in R part four

+ + +

1. load the libraries

+
+ +
1
+2
+3
+4
+5
+6
+7
+
    ## load libraries
+    library("tidyverse")    # data manipulation & map creation
+    library("sf")           # loads shapefile
+    library("leaflet")      # creates the map
+
+    ## load data
+    states <- read_sf("~/Documents/Github/nps/shapefiles/shifted/usa/usa.shp")
+
+ +

I am not going to explain in detail what each line is doing here, because it’s already available in part one.

+ +

In line 7 be sure to change "~/Documents/Github/nps/shapefiles/shifted/usa/usa.shp" to reflect wherever you saved the shifted shapefile.

+ +

If your data processing and base map creation are in the same file, you can skip line 7 and use the variable name where the shape data is stored when you make the leaflet call below.

+ +

2. create the base map

+
+ +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+
    ## create usa basemap using leaflet()
+    map <- leaflet() %>%                        # initialize the map widget
+    addPolygons(data = states,                  # add state polygons
+        smoothFactor = 0.2,                     # lower number means more detail
+        fillColor = "#808080",                  # internal shape color
+        stroke = TRUE,                          # add outlines
+        weight = 0.5,                           # outline width
+        opacity = 0.5,                          # outline opacity
+        color = "#808080",                      # outline color    
+        highlightOptions = highlightOptions(    # define hover parameters
+            weight = 0.5,                       # outline width [hover]
+            color = "#000000",                  # internal shape color [hover]
+            fillOpacity = 0.7,                  # internal fill opacity [hover]
+            bringToFront = FALSE),              # keep base map in back
+        group = "basemap")                      # add to group
+
+ +

A detailed description of each of these lines can be found in part II of this series. Basic comments have been added for easy reference. The National and State Park data will be added on top of the base map as additional layers.

+ +

3. download national park boundaries

+
+ +

The first step is to download the data from https://public-nps.opendata.arcgis.com/. Once you click on the link you’ll see a bunch of icons that lead to data different data that you can download. Click on the one for boundaries.

+ +
+ + + Image: NPS GIS website + + +
NPS GIS website
+
+ +

I suggest taking some time to and looking through the site and seeing the kinds of data that are available. For now, after you click on boundaries the next page will have a list of all the data sets you can download. The second link should be nps boundary which is the one we’re interested in. This will have all the data for the National Park boundaries, hiking trails, rest aries, and a ton of other data.

+ +
+ + + Image: NPS download page + + +
NPS download page
+
+ +

Once you click on the nps boundary link, it will take you to a map and another download link.

+ +
+ + + Image: NPS map and download link + + +
NPS map and download link
+
+ +

4. process national park data

+
+ +

5. create national park labels

+
+ +

6. add national parks to map

+
+ +

7. conclusion

+
+ +

Note: I will give the entire codeblock first. I also include the individual line before describing what it does. I find this to be cleaner than including a bunch of comments in the code itself. If you want to copy and paste the code to your own file, you only need to copy the code block and not each individual line.

+ +:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/45/e3358b96d4fa8ee00ca5411859155c5bb757ceee86c2e8495a0090aa4241c7 b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/45/e3358b96d4fa8ee00ca5411859155c5bb757ceee86c2e8495a0090aa4241c7 new file mode 100644 index 0000000..5269847 --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/45/e3358b96d4fa8ee00ca5411859155c5bb757ceee86c2e8495a0090aa4241c7 @@ -0,0 +1,454 @@ +I"­. +
+
+
+ +
+ +
+
+ +
+
+ + + +
+

tutorial

+ + + + + + + + +
+ +
+ + + + + + + + + + + + +
+ + + + +
+

version control

+ + + + + + + + + + +
+ +
+ + + + + + + + + + +
+ + + + +
+

cartography

+ + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ +
+

github

+ + + + + + +
+ +
+ + + + + + + + + + + + + + +
+ +
+

nps

+ + + + + + + + + + + + + + + + + + +
+ +
+ + +
+ +
+

r

+ + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + +
+

dvc

+ + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ +
+

resources

+ + +
+ +
+ + + + + + + + + + + + + + + + + + +
+ +
+

welcome

+ + + + +
+ +
+ + + + + + + + + + + + + + + + +
+ + + +
+ + +
+
+ +
+ +
+:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/46/08a0aa6fc9e937ad9cb52b1977183529d067fd9d69585b4f51dcd20903822e b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/46/08a0aa6fc9e937ad9cb52b1977183529d067fd9d69585b4f51dcd20903822e new file mode 100644 index 0000000..c06d396 --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/46/08a0aa6fc9e937ad9cb52b1977183529d067fd9d69585b4f51dcd20903822e @@ -0,0 +1,154 @@ +I"·-

This is part three of my cartography in R series. The links to part one and part two are here.

+ +

In this post, we’ll process the National Park data before adding it to the base map created in part two. I’ll also add in pop up markers with images from the National Parks I’ve visited that link to the blog post where I’ve written about my adventures there. +

+ +

Note: I know that my posts are verbose. I am sorry that I am not more concise but one of the biggest problems I have with code documentation is that it assumes you already know what you’re doing. I’m writing these for absolute beginners that want to know what each part of the code does. If you want more concise explanations, I suggest looking at the annotated r files in this project’s GitHub.

+ +

project outline

+
+ +

I had to break the tutorial into different parts because it became unwieldy. I list the component parts below. The annotated version of the code can be found in this project’s repository in the folder called r files.

+ +

I. cartography in R part one

+ + +

II. cartography in R part two

+ + +

III. cartography in R part three [this post]

+ + +

IV. cartography in R part four

+ + +

1. load the libraries

+
+ +
1
+2
+3
+4
+5
+6
+7
+
    ## load libraries
+    library("tidyverse")    # data manipulation & map creation
+    library("sf")           # loads shapefile
+    library("leaflet")      # creates the map
+
+    ## load data
+    states <- read_sf("~/Documents/Github/nps/shapefiles/shifted/usa/usa.shp")
+
+ +

I am not going to explain in detail what each line is doing here, because it’s already available in part one.

+ +

In line 7 be sure to change "~/Documents/Github/nps/shapefiles/shifted/usa/usa.shp" to reflect wherever you saved the shifted shapefile.

+ +

If your data processing and base map creation are in the same file, you can skip line 7 and use the variable name where the shape data is stored when you make the leaflet call below.

+ +

2. create the base map

+
+ +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+
    ## create usa basemap using leaflet()
+    map <- leaflet() %>%                        # initialize the map widget
+    addPolygons(data = states,                  # add state polygons
+        smoothFactor = 0.2,                     # lower number means more detail
+        fillColor = "#808080",                  # internal shape color
+        stroke = TRUE,                          # add outlines
+        weight = 0.5,                           # outline width
+        opacity = 0.5,                          # outline opacity
+        color = "#808080",                      # outline color    
+        highlightOptions = highlightOptions(    # define hover parameters
+            weight = 0.5,                       # outline width [hover]
+            color = "#000000",                  # internal shape color [hover]
+            fillOpacity = 0.7,                  # internal fill opacity [hover]
+            bringToFront = FALSE),              # keep base map in back
+        group = "basemap")                      # add to group
+
+ +

A detailed description of each of these lines can be found in part II of this series. Basic comments have been added for easy reference. The National and State Park data will be added on top of the base map as additional layers.

+ +

3. download national park boundaries

+
+ +

The first step is to download the data from https://public-nps.opendata.arcgis.com/. Once you click on the link you’ll see a bunch of icons that lead to data different data that you can download. Click on the one for boundaries.

+ +
+ + + Image: NPS GIS website + + +
NPS GIS website
+
+ +

I suggest taking some time to and looking through the site and seeing the kinds of data that are available. For now, after you click on boundaries the next page will have a list of all the data sets you can download. The second link should be nps boundary which is the one we’re interested in. This will have all the data for the National Park boundaries, hiking trails, rest aries, and a ton of other data.

+ +
+ + + Image: NPS download page + + +
NPS download page
+
+ +

Once you click on the nps boundary link, it will take you to a map and another download link.

+ +
+ + + Image: NPS map and download link + + +
NPS map and download link
+
+ +

From here, you’ll have a few options of what format you want the data in. We want the shapefile version.

+ +
+ + + Image: download nps shapefile + + +
download nps shapefile
+
+ +

4. process national park data

+
+ +

5. create national park labels

+
+ +

6. add national parks to map

+
+ +

7. conclusion

+
+ +

Note: I will give the entire codeblock first. I also include the individual line before describing what it does. I find this to be cleaner than including a bunch of comments in the code itself. If you want to copy and paste the code to your own file, you only need to copy the code block and not each individual line.

+ +:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/50/1a64ad3783d75c5323536ce36aeff1d5ae58fffa2ea53bdfac7d0bd85a761b b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/50/1a64ad3783d75c5323536ce36aeff1d5ae58fffa2ea53bdfac7d0bd85a761b new file mode 100644 index 0000000..a30709b --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/50/1a64ad3783d75c5323536ce36aeff1d5ae58fffa2ea53bdfac7d0bd85a761b @@ -0,0 +1,249 @@ +I"P

This is a continuation of my previous post where I walked through downloading and modifying shape data. I also showed how to shift Alaska and Hawaii so they are closer to the continental United States. +

+ +

In this post, I’ll go over how to use leaflet to map the shapefile we made in the previous post. If you’ve come here from part one of the series, you most likely have the libraries and data loaded already. However, if you don’t be sure to load the libraries and shapefiles before moving to number 2.

+ +

project outline

+
+ +

I had to break the tutorial into different parts because it became unwieldy. I list the component parts below. The annotated version of the code can be found in this project’s repository in the folder called r files.

+ +

I. cartography in R part one

+ + +

II. cartography in R part two [this post]

+ + +

III. cartography in R part three

+ + +

IV. cartography in R part four

+ + +

1. load the libraries

+
+ +
1
+2
+3
+4
+5
+6
+7
+
    ## load libraries
+    library("tidyverse")    # data manipulation & map creation
+    library("sf")           # loads shapefile
+    library("leaflet")      # creates the map
+
+    ## load data
+    states <- read_sf("~/Documents/Github/nps/shapefiles/shifted/usa/usa.shp")
+
+ +

I am not going to explain in detail what each line is doing here, because it’s already available in part one.

+ +

In line 7 be sure to change "~/Documents/Github/nps/shapefiles/shifted/usa/usa.shp" to reflect wherever you saved the shifted shapefile.

+ +

If your data processing and base map creation are in the same file, you can skip line 7 and use the variable name where the shape data is stored when you make the leaflet call below.

+ +

2. create the base map

+
+ +

At its most basic, all Leaflet needs to create a map is a data source and either map tiles or polygons. The code below may look intimidating, but it’s mostly style options.

+ +

This is the map that we’re going to create. It’s a simple grey map and each state darkens in color as you hover over it. I’ll show the same map as each style option is changed so you can see what they do.

+ +
+ + + Image: Final USA basemap + + +
Final USA basemap
+
+ +

Note: I will give the entire codeblock first. I also include the individual line before describing what it does. I find this to be cleaner than including a bunch of comments in the code itself. If you want to copy and paste the code to your own file, you only need to copy the code block and not each individual line.

+ +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+
    ## create usa basemap using leaflet()
+    map <- leaflet() %>%
+    addPolygons(data = states,
+        smoothFactor = 0.2,
+        fillColor = "#808080",
+        stroke = TRUE,
+        weight = 0.5,
+        opacity = 0.5,
+        color = "#808080",
+        highlightOptions = highlightOptions(
+            weight = 0.5,
+            color = "#000000",
+            fillOpacity = 0.7,
+            bringToFront = FALSE),
+        group = "basemap")
+
+ +
  • line 2:
  • + +
        map <- leaflet() %>% 
    + +
    leaflet() initializes the map widget. I save it to a variable called map ( map <-) so I can run other code without recreating the map each time. When you want to see the map, you can type map (or whatever you want to name your map) in the terminal and hit enter. R will display the map in the viewer.
    +


    + +
  • line 3:
  • + +
        addPolygons(data = states,
    + +
    addPolygons() adds a layer to the map widget. Leaflet has different layer options, including addTiles and addMarkers which do different things. You can read about them on the leaflet website. Since we're using a previously created shapefile, we'll add the shapefile to the map using addPolygons(). +

    + +The first argument you need to specify after calling addPolygons is data = [data-source]. [data-source] is whatever variable your data is stored in. For me, it's called states. This is either the processed data from part I of this series or the saved shapefile loaded in the first code chunk above in line 7.
    +


    +When you run only the first two lines, Leaflet will use default styling. The base color will be a light blue and the outlines of the states will be dark blue and fairly thick.

    + +
    + + + Image: USA map with default leaflet styling + + +
    USA map with default leaflet styling
    +
    + +

    You can leave the base map like this if you want, but all additional data will be added as a layer on top of this map which can become distracting very quickly. I prefer to make my base maps basic and unobtrusive as possible so the data I add on top of the base map is more prominent.

    + +
  • line 4:
  • + +
        smoothFactor = 0.2,
    + +
    The argument smoothFactor = 0.2 is how much the polygon should be smoothed at each level.The lower the number the more accurate your shapes will be while a larger number means smoother rendering. I keep the smoothFactor low because I want the United States to appear as a coherent land mass.The image below shows three different maps, each with a different smoothFactor to illustrate what this argument does. On the left the map's smoothFactor = 0.2, the center map's smoothFactor=10, and the right's smoothFactor=100.
    +


    + +
    + + + Image: SmoothFactor = 0.2 (left), 10 (center), 100 (right) + + +
    SmoothFactor = 0.2 (left), 10 (center), 100 (right)
    +
    + +
    As you can see, the higher the smoothFactor the less coherent the United States becomes.
    +


    + +

    Note: Leaflet - all map programs, really - don’t know that continents, countries, states, or any other land mass is a coherent set. It reads the shape data and spits out a map without regard to where things “should” be. It doesn’t know California goes on the left or that Alaska is part of the United States. It’s important to keep this in mind because each state’s shape is rendered individually when using addPolygons(). +

    + +
  • line 5:
  • + +
        fillColor = "#808080",
    + +
    fillColor refers to what color is on the inside of the polygons. Since I want a minimal base map, I usually set this value to be some shade of grey. If you want a different color, you only need to replace #808080 with the corresponding hex code to the color you want. Here is a useful hex code picker. If you have a hex value and you want the same color in a different shade, this is a useful site.
    +


    + +
  • line 6-9:
  • + +
        stroke = TRUE,
    +    weight = 0.5,
    +    opacity = 0.5,
    +    color = "#808080",
    + +
    stroke, weight, opacity, and color all refer to the boundary lines that outline each polygon. +

    + +The stroke property can be set to either TRUE or FALSE. When true, Leaflet adds an outline around each polygon. When false, the polygons have no outline. In the image below, the map on the left has the default outlines and on the right stroke = FALSE.
    + +
    + + + Image: Default outlines on the left, no outline on the right + + +
    Default outlines on the left, no outline on the right
    +
    + +
    weight = 0.5 sets the thickness of the outlines to be 0.5 pixels. This can be any value you want with higher numbers corresponding to thicker lines. Lower numbers correspond to thinner lines. +

    + +The opacity property operates in the same way as fill opacity above, but on the outlines. The number can be between 0 and 1. Lower numbers correspond to the lines being more transparent and 1 means fully opaque. +

    + +Color = "#808080" sets the color of the outline. I typically set it to be the same color as the fill color. +
    +


    +If you want a static base map then lines 2-9 are all you need, as shown in the image below. I like to add some functionality to my base map so that the individual states become darker when they’re hovered over. In part III of this series I use the base shapefile to include a popup that includes the state name.

    + +
    + + + Image: static base map + + +
    static base map
    +
    + +

    Lines 10-14 define the map’s behavior when the mouse hovers over the shape. A lot of the options are the same as the ones used on the base polygon shapes, so I won’t go into them with much detail.

    + +
  • line 10:
  • + +
        highlightOptions = highlightOptions()
    + +
    highlightOptions = highlightOptions() I genuinely don't know why you have to declare highlightOptions twice, but you do. Just know that all the information about the map's behavior on mouseover needs to be included in the actual function call to highlightOptions() that comes after the equal sign.
    +


    + +
  • lines 11-13:
  • + +
        weight = 0.5,
    +    color = "#000000",
    +    fillOpacity = 0.7,
    + +
    weight, color, and fillOpacity all operate in the same way as before, but the properties are only active on mouseover. +

    +weight defines what happens to the outline of the polygon. +

    + +color and fillOpacity determines what color and how opaque the polygon becomes on mouseover.
    +


    +
  • line 14:
  • + +
        bringToFront = FALSE),
    + +
    bringToFront takes one of two values: TRUE or FALSE. It only really matters when you have multiple layers (like we will in later parts of this series). When bringToFront = TRUE hovering over the state will bring it to the front. When bringToFront = FALSE it will stay in the back. +

    + +Since the base map only has one layer, there's nothing to bring the shape in front of. +
    +


    + +
  • line 15:
  • + +
        group = "basemap")
    + +
    group = basemap lets you group multiple layers together. This argument will come in handy as we add more information to the map, so I won't go into much detail here. Just know that without more layers, the group= argument is fairly useless.
    + +

    3. Conclusion

    +
    + +

    You’ve created your first base map! It’s a boring map a flat, grey map, but it’s our base and in part three of this series we’ll process and add in the National Parks.

    + +
    +
    United States base map made with Leaflet
    +:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/70/b3846986fcdc26ca2b09f276f52962057d4dd7fa9fb130de051268fb7e655a b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/70/b3846986fcdc26ca2b09f276f52962057d4dd7fa9fb130de051268fb7e655a new file mode 100644 index 0000000..4386513 --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/70/b3846986fcdc26ca2b09f276f52962057d4dd7fa9fb130de051268fb7e655a @@ -0,0 +1,2 @@ +I"p

    This is part of my tutorial series on using Git and GitHub. In particular, this guide is about using GitHub’s desktop app for creating and managing repos. You can download the app here..

    +:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/7b/f92e83f6054a694b02321f0394acadfc60b11c5de0450d793be198ce527721 b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/7b/f92e83f6054a694b02321f0394acadfc60b11c5de0450d793be198ce527721 new file mode 100644 index 0000000..1f525cf --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/7b/f92e83f6054a694b02321f0394acadfc60b11c5de0450d793be198ce527721 @@ -0,0 +1,3 @@ +I"ó

    Twitter is a great resource for engaging with the academic community. For example, I saw this Tweet by @PhD_Genie asking users to name one positive skill learned during their PhD. I love this question for a number of reasons. First, it helps PhDs reframe their experience so it’s applicable outside of academia - which can help when applying to jobs. Second, it’s really cool to see what skills other people have learned during their program.

    + +:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/87/1e42347eb2f9d0b2c689dbb369cd6a059fcc9ff8ff67398c86d84ebeab5927 b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/87/1e42347eb2f9d0b2c689dbb369cd6a059fcc9ff8ff67398c86d84ebeab5927 new file mode 100644 index 0000000..8ebff26 --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/87/1e42347eb2f9d0b2c689dbb369cd6a059fcc9ff8ff67398c86d84ebeab5927 @@ -0,0 +1,109 @@ +I"ř$

    This is part three of my cartography in R series. The links to part one and part two are here.

    + +

    In this post, we’ll process the National Park data before adding it to the base map created in part two. I’ll also add in pop up markers with images from the National Parks I’ve visited that link to the blog post where I’ve written about my adventures there. +

    + +

    Note: I know that my posts are verbose. I am sorry that I am not more concise but one of the biggest problems I have with code documentation is that it assumes you already know what you’re doing. I’m writing these for absolute beginners that want to know what each part of the code does. If you want more concise explanations, I suggest looking at the annotated r files in this project’s GitHub.

    + +

    project outline

    +
    + +

    I had to break the tutorial into different parts because it became unwieldy. I list the component parts below. The annotated version of the code can be found in this project’s repository in the folder called r files.

    + +

    I. cartography in R part one

    + + +

    II. cartography in R part two

    + + +

    III. cartography in R part three [this post]

    + + +

    IV. cartography in R part four

    + + +

    1. load the libraries

    +
    + +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +
        ## load libraries
    +    library("tidyverse")    # data manipulation & map creation
    +    library("sf")           # loads shapefile
    +    library("leaflet")      # creates the map
    +
    +    ## load data
    +    states <- read_sf("~/Documents/Github/nps/shapefiles/shifted/usa/usa.shp")
    +
    + +

    I am not going to explain in detail what each line is doing here, because it’s already available in part one.

    + +

    In line 7 be sure to change "~/Documents/Github/nps/shapefiles/shifted/usa/usa.shp" to reflect wherever you saved the shifted shapefile.

    + +

    If your data processing and base map creation are in the same file, you can skip line 7 and use the variable name where the shape data is stored when you make the leaflet call below.

    + +

    2. create the base map

    +
    + +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    +9
    +10
    +11
    +12
    +13
    +14
    +15
    +
        ## create usa basemap using leaflet()
    +    map <- leaflet() %>%                        # initialize the map widget
    +    addPolygons(data = states,                  # add state polygons
    +        smoothFactor = 0.2,                     # lower number means more detail
    +        fillColor = "#808080",                  # internal shape color
    +        stroke = TRUE,                          # add outlines
    +        weight = 0.5,                           # outline width
    +        opacity = 0.5,                          # outline opacity
    +        color = "#808080",                      # outline color    
    +        highlightOptions = highlightOptions(    # define hover parameters
    +            weight = 0.5,                       # outline width [hover]
    +            color = "#000000",                  # internal shape color [hover]
    +            fillOpacity = 0.7,                  # internal fill opacity [hover]
    +            bringToFront = FALSE),              # keep base map in back
    +        group = "basemap")                      # add to group
    +
    + +

    A detailed description of each of these lines can be found in part II of this series. Basic comments have been added for easy reference. The National and State Park data will be added on top of the base map as additional layers.

    + +

    3. download national park boundaries

    +
    + +

    4. process national park data

    +
    + +

    5. create national park labels

    +
    + +

    6. add national parks to map

    +
    + +

    7. conclusion

    +
    + +

    Note: I will give the entire codeblock first. I also include the individual line before describing what it does. I find this to be cleaner than including a bunch of comments in the code itself. If you want to copy and paste the code to your own file, you only need to copy the code block and not each individual line.

    +:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/98/50861d4debb3fa578cd97a53f98375ec2f1d199cef308f7b5badf5f4aa844f b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/98/50861d4debb3fa578cd97a53f98375ec2f1d199cef308f7b5badf5f4aa844f new file mode 100644 index 0000000..79d700f --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/98/50861d4debb3fa578cd97a53f98375ec2f1d199cef308f7b5badf5f4aa844f @@ -0,0 +1,116 @@ +I"§
    +
    +
    +
    +
    +
      +
    • + + + + + + +
      +

      Doctor of Philosophy - Political Science
      + University of California - Irvine, California | 2019-2025 (expected)

      + Master of Arts - Communications, Specialization: Research & Theory
      + California State University - Fullerton, California | May 2017
      + Thesis: Friedrichs v. California Teachers Association: Union Security Agreements, Campaign Finance, and the First Amendment

      + Bachelor of Arts - Philosophy, Specialization: Law & Society
      + California State Polytechnic University - Pomona, California | May 2
      + Capstone Paper: Deliberative Democracy and the Media it Requires

      + Associate of Science - Behavioral Science
      + Citrus Community College - Glendora, California | May 2009

      +
      +
    • +
    • + + + + + + +
      +

      "Unions as a Counterbalance to Corporate Citizenship"
      + Midwest Political Science Association
      + Spring 2021, Tensions Between Law and Democracy

      + "Corporate Citizenship and the Threat to Democracy: Unions aCounterbalance"
      + Western Political Science Association
      + Spring 2021, Judicial Review, Litigation Reform, and Political Speech

      + Featured Alumni Panel
      + World Philosophy Day
      + Fall 2018, California State Polytechnic University - Pomona

      + “Union Security Fees, Campaign Finance, and the First Amendment"
      + Colloquium Speakers Series: Labor, Justice, and the Future of Work
      + February 2018, California State Polytechnic University - Pomona

      + “Speech Rights in the Public Sector”
      + California Teachers Association, Union Meeting
      + September 2016, California State University - Fullerton

      +
      +
    • +
    • + + + + + + +
      +

      Outstanding Graduate Student, Research & Theory
      + California State University – Fullerton
      + May 2017

      + Pai Award for Outstanding Contributions to the Philosophy Department
      + California State Polytechnic University – Pomona
      + May 2012

      + Valedictorian
      + Arroyo Pacific Academy
      + May 2005

      +
      +
    • +
    • + + + + + + +
      +

      Undergraduate Research Opportunities Program | $11,000
      + University of California - Irvine

      + Diversity Recruitment Fellowship | $7,500
      + University of California - Irvine

      + Minority Serving Institution Enhancement | $7,500
      + University of California - Irvine

      +
      +
    • +
    • + + + + + + +
      +

      American Political Science Association +
      2020 - Current +

      + The Society for Political Methodology +
      2019 - Current

      +
      +
    • +
    +
    +
    +
    +:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/99/2e2eedb77c2b4fc866b5d538ea961b4cc318f46d0e08c95244ecca230d4b0e b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/99/2e2eedb77c2b4fc866b5d538ea961b4cc318f46d0e08c95244ecca230d4b0e new file mode 100644 index 0000000..95432ef --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/99/2e2eedb77c2b4fc866b5d538ea961b4cc318f46d0e08c95244ecca230d4b0e @@ -0,0 +1,4 @@ +I"Ą

    This is part three of my cartography in R series. The links to part one and part two are here.

    + +

    In this post, we’ll process the National Park data before adding it to the base map created in part two. I’ll also add in pop up markers with images from the National Parks I’ve visited that link to the blog post where I’ve written about my adventures there.

    +:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/9b/430d487f1f2b12a55d4f454ccf5c4a86df38441660782eb3f5a867d3307b30 b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/9b/430d487f1f2b12a55d4f454ccf5c4a86df38441660782eb3f5a867d3307b30 new file mode 100644 index 0000000..2d1985a --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/9b/430d487f1f2b12a55d4f454ccf5c4a86df38441660782eb3f5a867d3307b30 @@ -0,0 +1,3 @@ +I"ę

    Building off my post about using Git & GitHub, this post is about using the GitHub website to initialize repos and get URLs from existing repos to clone them.

    + +:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/9d/f88591eec86ecfc46b2dbdf034f911696f194846704f251270c55d7f632572 b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/9d/f88591eec86ecfc46b2dbdf034f911696f194846704f251270c55d7f632572 new file mode 100644 index 0000000..e1de6d4 --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/9d/f88591eec86ecfc46b2dbdf034f911696f194846704f251270c55d7f632572 @@ -0,0 +1,72 @@ +I"T

    This is part of my tutorial series on using Git and GitHub. In particular, this guide is about using GitHub’s desktop app for creating and managing repos. You can download the app here.. +

    + +

    Honestly, the desktop app is the easiest way to do version control. Sure, it’s another app you have to have on your hard drive and something new you have to use, but it’s well designed and intuitive. I find myself using it more and more.

    + +

    GitHub Desktop

    +

    If you have no open folders, you’ll see this page when you open GitHub Desktop.

    + +

    +Repo Options +Note: Clicking on an image will open it in the same tab.

    + +
    1:
    +

    From the File menu you can either create a new repository or clone an existing repository. If you created a repo on the website and want to pull it to your hard drive, choose clone. If you need to create a brand-new repo then you’d use New repository…

    + +
    2:
    +

    You’d use number 2 if the repo has already been created (by you or someone else) and you want to download it to your hard drive.

    + +
  • 2A: You can either copy (clone) a repo you created or someone else created by navigating to the repo on GitHub. From the green button that says Code copy the url under HTTPS.
  • + +

    +Repo Options

    + +

    You’ll then drop that link into the URL tab of the GitHub Desktop prompt + +Repo Options

    + +
    3:
    +

    Number 3 is the same as if you select File: and select Create New Repo.

    + +
    4:
    +

    You would use the Add an existing repository from your hard drive option if you had already created a repo on your hard drive (either previously cloned it or initialized it using the command line) and want to open it in GitHub Desktop.

    + +
    5:
    +

    If you have repos available, you can also click on them on the right.

    + +

    Once the repo is cloned to wherever you want it stored it will now be accessible on GitHub, in GitHub Desktop, and directly from your file explorer.

    + +

    Workflow

    +

    One of the benefits of the desktop app is that it’s inclusive. You don’t have to remember commands, all you have to do is open GitHub desktop before and after you work on your project.

    + +

    Before you start working on your project, you should pull any changes. This is less important if you’re only using one computer when working on the project and you’re the only one that’s making changes to the repo.

    + +
    Before working
    + +

    Github Home Screen

    + +

    To pull changes, just click on repository and select pull.

    + +
    After working
    +

    When you’re done doing work on your project, just open GitHub Desktop, enter a commit message, and hit “commit to main.”

    + +

    Github commit

    + +

    On the left hand side you’ll see a list of files you modified. All the files selected are ones you’ll be committing. If you don’t want to commit a file, just deselect it.

    + +

    At the bottom of the left hand panel you’ll see two boxes:
    +1) Summary (required)
    +2) Description

    + +

    The summary is mandatory. It’s a brief message about what changes were made. The description is optional and is a place where you can include more information about the changes.

    + +

    Next, you’ll click the button at the bottom that says “commit to main” or “commit to master.” When you’re ready to commit your changes, you can click this button.

    + +

    Finally, you’ll want to push the changes. On the top bar, GitHub Desktop has a box that tells you the current actions you can do. It will either say Fetch Origin (the same as pull) or Push Origin.

    + +

    Github Home Screen

    + +

    Conclusion:

    +

    That’s it! GitHub Desktop is very easy to use. It allows you to version control your projects and keep track of any changes that you’ve made. Whether you use the Desktop version, the website, or command line I implore you to start using version control. It saves eons of time.

    + +:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/aa/e6872ee0c6d2e69df2b9aa7e6e33a2b4df0fffc97c1f9b0807302a7c1d922b b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/aa/e6872ee0c6d2e69df2b9aa7e6e33a2b4df0fffc97c1f9b0807302a7c1d922b new file mode 100644 index 0000000..19b4de0 --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/aa/e6872ee0c6d2e69df2b9aa7e6e33a2b4df0fffc97c1f9b0807302a7c1d922b @@ -0,0 +1,29 @@ +I"?
      +
    1. download gdb data from the PAD-US Website: + https://www.sciencebase.gov/catalog/item/61794fc2d34ea58c3c6f9f69 + under Attached Files download “PADUS3_0Geodatabase.zip” + Unzip the folder
    2. +
    + +

    qgis download: https://qgis.org/en/site/ +once downloaded: + 1. you’ll see this page (qgis-1) + 2. in the browser panel (top left) navigate to where the unzipped file is. + 3. Locate the folder: PAD_US3_9.gdb (qgis-2) + inside the folder click on PADUS3_0Fee and drag it to the layers panel (bottom left) (qgis-3) + qgis will load the data without a basemap - which is fine + 4. Right click on the PADUS3_0Fee layer in the bottom left + From the pop up menu select “Export” + Then select “save features as” (qgis-4) + 5. A new window will open and there’s a couple of settings to change (qgis-5) + Select the following: + Format: “ESRI Shapefile” + File name: this is the path to where you want to save the file AND what you want to name it. + For me I named it “padus_qgis.shp” + Layer name: you can leave it blank + CRS: Default CRS: EPSG:4326 - WGS 84 + Under “Select fields to export and their export options choose “select all” + Uncheck “Add saved file to map.” this is optional, but it will load all the data that’s already loaded so I don’t see a point in having it checked. + 6. Hit Okay. + 7. Now you can load the file like normal using sf_read(“path/to/file.shp”) in R.

    +:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/b3/32bab753480f28f3fcf39d4717b94bd4c6cecaefe914c07c35dd1b5f9dd1a8 b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/b3/32bab753480f28f3fcf39d4717b94bd4c6cecaefe914c07c35dd1b5f9dd1a8 new file mode 100644 index 0000000..7d9d6b5 --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/b3/32bab753480f28f3fcf39d4717b94bd4c6cecaefe914c07c35dd1b5f9dd1a8 @@ -0,0 +1,2 @@ +I" 

    This is a continuation of my previous post where I walked through downloading and modifying shape data. I also showed how to shift Alaska and Hawaii so they are closer to the continental United States.

    +:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/b5/0ce9309704e6379f99413817281d5731a79af5610c036c598d2662c5df8eee b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/b5/0ce9309704e6379f99413817281d5731a79af5610c036c598d2662c5df8eee new file mode 100644 index 0000000..51f3883 --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/b5/0ce9309704e6379f99413817281d5731a79af5610c036c598d2662c5df8eee @@ -0,0 +1,7 @@ +I"Ó
      +
    1. download gdb data from the PAD-US Website: + https://www.sciencebase.gov/catalog/item/61794fc2d34ea58c3c6f9f69 + under Attached Files download “PADUS3_0Geodatabase.zip” + Unzip the folder
    2. +
    +:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/b9/227523c050f596f8c73fa4889eaf525c2978502289cb198335afba866b029c b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/b9/227523c050f596f8c73fa4889eaf525c2978502289cb198335afba866b029c new file mode 100644 index 0000000..8666ee5 --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/b9/227523c050f596f8c73fa4889eaf525c2978502289cb198335afba866b029c @@ -0,0 +1,184 @@ +I"?O

    Arguably one of the best things you can do before starting a PhD is invest time in learning how to properly use version control. With version control, you can track, save, and revert changes to any kind of project. There are several options available, but I’m partial to Git & GitHub. Even if you never touch a piece of code, version control is very helpful.

    + + + +

    I found a lot of information about Git & GitHub confusing. The documentation is written for software engineers and people that are immersed in writing code. I am not that person and a lot of the information isn’t relevant to my situation. This guide is written specifically for PhDs. I doubt I am leveraging these tools’ full functionality, but this is a good place to start if you’ve never heard of version control before or were overwhelmed by the documentation.

    + +

    Why Use Version Control?

    +

    Version control is important because projects never work in a linear format. Regardless of whether you’re writing a paper or writing code, things change. Version control allows you to track those changes and keep notes on the logic behind why you did the things you did.

    + +

    If you’re writing a paper, you might sometimes find yourself deleting paragraphs that you later need. With version control, you can save these paragraphs and revert to earlier writing if necessary.

    + +

    With code, you can add or remove features without worrying about damaging existing, working code. I did not understand the full functionality of version control until I started working on cartography. A lot of cartography is trial and error (or at least it has been for me) and I got tired of having files named “Code_final” and “Code_final_final” or worse: “Really_final_version.” Version control lets me branch off sections of my code, add or remove functionality, without damaging my main code.

    + +

    Definitions:

    +

    Repo/Repository: These are like directories or folders on your computer. It’s where all the information about a project is stored.

    + +

    Git: is a version control system that allows you to track and revert changes incrementally. This means that as you make changes on a project, you can describe the changes and save them. If you make a change that you don’t like or that broke something, you can revert to a previous version. Git also allows you create branches or forks which are helpful for trying out changes without affecting the main code.

    + +
  • Branches: These are like tree branches, it allows you to test out features and code without worrying about affecting the overall stability of your repo. The main branch (sometimes called master) is where you push all your final edits. Let’s say you want to try creating a map with an info box using Leaflet & Shiny. You may not want to mess up your entire leaflet map while you work with Shiny. Branching will allow you to safely work with Shiny and if you like the changes, you can merge the branch with main. If you don’t, you can continue working on the branch until you’re happy or you can discard it.
  • +
  • Forks: are similar to branches but are mostly used for copying other people’s repos and making changes. Say you find a cool project repo, but you want to modify it for your own use. You would fork the repo. It would show up in your Git and you can make the changes you want without affecting the original repo.
  • +


    +GitHub: is a cloud-based Git service. It allows you to access your Git repositories from anywhere. You can use Git without GitHub, but you can’t use GitHub without Git.

    + +

    I might use Git & GitHub interchangeably which drives software engineers bonkers.

    + +

    Accessing Repositories

    +

    There are three main ways of using Git and Github:
    +1) GitHub Website
    +2) GitHub Desktop
    +3) Command line

    + +

    Purists will tell you that you should always use the command line while others will tell you it doesn’t matter. Honestly, I use all three ways based solely on whatever I’m feeling in the moment. I’m going to focus on command line usage because it will help illuminate what’s happening behind the scenes when you use either the website or the Desktop app.

    + +

    I’ve also written about using GitHub Desktop and the GitHub website. The information across all three is the same. My suggestion is to choose whichever one you’re most comfortable with and ignore anyone who makes you feel bad because you prefer to use an app over using command line. There’s more important things to worry about.

    + +

    Keeping Organized

    +

    Repos are just directories. If you’re even mildly organized, you probably create a new folder on your hard drive for each project. If you don’t, I highly recommend it because it does help keep things neat and orderly. When you use either Git or GitHub, your repos will be stored in their own folders. This can get unwieldy very quickly. I like to store all my repos in one folder located in My Documents on my hard drive. I just created a folder called GitHub and anytime I initialize or clone a repo, I make sure I do so from this folder. Here is what my GitHub folder looks like:

    + +

    +Repo Options

    + +

    As you can see, it’s located in the Documents folder on my PC. Each folder you see listed here is a repo in my GitHub and I don’t save anything else to this folder except initialized or cloned repos.

    + +

    Consoles & Terminals

    +

    To use GitHub from command line you can either use the command prompt or powershell on Windows, terminal on Mac, or a console emulator like cmdr or cygwin. When you download Git it will also install Git CMD which does the same thing as any other console or terminal app. They all operate in the same way and do the same things, so pick whichever makes you happy.

    + +

    Before getting into the important commands, the first thing you’ll want to do is navigate to the folder you’re keeping your repos in. For me it’s the GitHub folder I created in my Documents above. There’s two ways you can do this.

    +
      +1) Either right click in the folder and select Git BASH here. If you're on Windows 11 it will be under "see more options." Also, if you're on Windows, you can type cmd in the navigation bar and hit enter and it will open a command prompt in that folder.

      +2) Or you can just open a console / terminal from the start menu or app folder and then navigate to where you are storing your repos using console.
    + +
     cd Documents\GitHub
    + 
    + +

    cd stands for change directory. It’s followed by the path to the folder you want to open.

    + +

    Your computer should allow tab complete. This just means you can start typing Doc, hit the tab key on your keyboard and it should autocomplete. Sometimes you’ll need to go up a directory or two. Say, for example, I’m in the GitHub folder, but I want to go to the Documents folder using the command line. To do so, I would put

    + +
     cd ..
    + 
    + +

    If I were to put only one dot:

    + +
     cd .\
    + +

    I could navigate to another folder inside the Documents folder.

    + +

    These are just helpful navigation options so you don’t always have to put the entire path to a folder.

    + +

    Once you’re in the folder where you want to keep the repo, you’re ready to use Git for version control.

    + +

    Important Commands

    +

    The Git documentation is full of commands, options, flags, and various other usage information. I’d say a solid 99% of it, I’ve never used. I’m only going to go over the commands I use on a daily basis because they’re all you really need to get started. I’m going to cover what each term means, then add basic workflows at the end.

    + +

    Note: Anything in [brackets] is where you would enter in information. You would omit the brackets. For example, git init using-github would initialize an new repo called using-github.

    + +
  • git init [project-directory-name]: You only need to initialize a repo once. Each repo in your GitHub has to have a unique-to-you name. That is, you can't have two repos named Project. Good repo names are short and descriptive. If I were to initialize a Git for this project I would name it using-github because that is what this guide is about.
  • +


    + +
  • git clone [project-url]: If you have previously initialized a repo (either on the website or through GitHub Desktop) and want to add it to your current hard drive you will need to clone (copy) it. This is useful if you use a desktop and a laptop. I often initialize repos on my desktop using git init and then clone them to my laptop using git clone. You can also use git clone to clone repos created by other people. If you find a cool project on GitHub.com that you want to modify for your own use, you can clone it to your hard drive using git clone project-url]. +
    +The [project-url] can be found on the repo website. For example, if you wanted to clone my election guide repo, you would navigate to the repo's page here. On the right hand side is a green button that says Code. You'd select it then copy the URL from the drop down. The URL you copied would go in place of [project-url] above.
  • +


    +After you initialize or clone a repo, you can work on your project. You would do work like any other time. Just navigate to the folder where your repo is located and create or modify any files you need to. When you’re done working for the day, you’re ready to stage and commit your changes.

    + +

    There are four steps you’ll always follow when working with a repo:

    +
    1. Adding
    2. +
    3. Staging
    4. +
    5. Committing
    6. +
    7. Pushing
    + + +

    First you have to add a file, then stage it, commit it, and push it.

    + +
  • git add [filename or directory name] You'll use git add to state individual files or directories. You just add the path to the file or directory after git add then hit enter. Once staged, you'll add a message, then commit.
  • +
  • git add -A will stage all modified files.
  • + +
  • git commit -m "A useful message here" before you can push your files, you have to commit them. Committing just records a change on the local hard drive. It's like taking a snapshot of a project in its current state. Messages allow you to describe the change and its justification. Git won't let you commit without adding a message so here is a good guide on writing good commit messages.
  • + +
  • git push origin [branch-name] usually, [branch-name] will be main. Sometimes it will be a different branch. Origin is a way of referencing a specific repo. This way you don't have to constantly refer to its url. Pushing sends your commits to GitHub. You can then access those changes on the website or on another computer by pulling the changes to the machine.
  • + +
  • git pull origin [branch name] again, [branch-name] will usually be main. Pull brings changes you pushed to GitHub onto the local machine. Think of this as syncing changes. It's especially useful when using more than one computer.
  • +
  • If you do work from multiple computers, always be sure to pull changes before you start working in the repo. It prevents a lot of headaches.
  • +


    + +

    One of the best things about Git & GitHub is that it allows branching and forking. Branching is the most useful because it creates a temporary space for you to work without threatening the integrity of the main project.

    + +
  • checkout -b [branch name] will allow you to create and switch to a new branch
  • +
  • git branch [branch name] is how you create a branch without switching to it.
  • +
  • git checkout [branch name] allows you to switch to an existing branch.
  • + +

    If you like what you did in a branch and want to merge it with main so that you can keep the updated version of the project you’ll need to switch to the main branch and then merge.

    + +
    1
    +2
    +
        git checkout main
    +    git merge [branch name]
    +
    + +

    If you don’t like what you did in a branch and want to delete it entirely, here’s how:

    + +
    1
    +2
    +3
    +4
    +5
    +
        ## to delete the branch on your local machine
    +    git branch -d localBranchName
    +
    +    ## to delete it it from the remote repo
    +    git push origin --delete remoteBranchName
    +
    + +

    Workflows

    +

    These are basic workflows that you can use.

    + +

    Initializing a repo:

    + +
    1
    +2
    +3
    +4
    +5
    +
        git init [repo name]
    +    ## do the work you need to
    +    git add -A
    +    git commit -m "a useful message"
    +    git push origin main
    +
    + +

    Cloning an existing repo:

    + +
    1
    +2
    +3
    +4
    +5
    +
        git clone https://github.com/liz-muehlmann/Election_Guides.git
    +    ## do the work you need to
    +    git add -A
    +    git commit -m "a useful message"
    +    git push origin main
    +
    + +

    Create a branch and merge it with main:

    + +
    1
    +2
    +3
    +4
    +
        git branch [branch name]
    +    ## work on the branch until you are happy
    +    git checkout main
    +    git merge [branch name]
    +
    + +

    Conclusion

    +

    Those are really the only commands you need to know to use Git & GitHub. I can’t stress enough how important version control is when programming - especially when working on cartography projects. One problem you’ll inevitably run into is file size. GitHub will warn you if your file is over 50MB and it will reject your push if any of your files are over 100MB.

    + +

    There are two ways around GitHub’s file limits which I go over in my post about DVC (Data Version Control). If you’re only using Git & GitHub to version control your writing, you don’t really need to worry about large file sizes. However, once you start working with datasets the file size limit gets in the way quickly.

    + +

    If you’re uncomfortable with the command line, GitHub has a desktop application that you can use which is very user friendly. You can learn about GitHub Desktop and the GitHub Website through my other posts.

    + +:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/ba/4db09c86dd5edae7497eda17636faab4d4cd0907e1af1a74a91c965414b367 b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/ba/4db09c86dd5edae7497eda17636faab4d4cd0907e1af1a74a91c965414b367 new file mode 100644 index 0000000..78d64ae --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/ba/4db09c86dd5edae7497eda17636faab4d4cd0907e1af1a74a91c965414b367 @@ -0,0 +1,156 @@ +I"Ö-

    This is part three of my cartography in R series. The links to part one and part two are here.

    + +

    In this post, we’ll process the National Park data before adding it to the base map created in part two. I’ll also add in pop up markers with images from the National Parks I’ve visited that link to the blog post where I’ve written about my adventures there. +

    + +

    Note: I know that my posts are verbose. I am sorry that I am not more concise but one of the biggest problems I have with code documentation is that it assumes you already know what you’re doing. I’m writing these for absolute beginners that want to know what each part of the code does. If you want more concise explanations, I suggest looking at the annotated r files in this project’s GitHub.

    + +

    project outline

    +
    + +

    I had to break the tutorial into different parts because it became unwieldy. I list the component parts below. The annotated version of the code can be found in this project’s repository in the folder called r files.

    + +

    I. cartography in R part one

    + + +

    II. cartography in R part two

    + + +

    III. cartography in R part three [this post]

    + + +

    IV. cartography in R part four

    + + +

    1. load the libraries

    +
    + +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +
        ## load libraries
    +    library("tidyverse")    # data manipulation & map creation
    +    library("sf")           # loads shapefile
    +    library("leaflet")      # creates the map
    +
    +    ## load data
    +    states <- read_sf("~/Documents/Github/nps/shapefiles/shifted/usa/usa.shp")
    +
    + +

    I am not going to explain in detail what each line is doing here, because it’s already available in part one.

    + +

    In line 7 be sure to change "~/Documents/Github/nps/shapefiles/shifted/usa/usa.shp" to reflect wherever you saved the shifted shapefile.

    + +

    If your data processing and base map creation are in the same file, you can skip line 7 and use the variable name where the shape data is stored when you make the leaflet call below.

    + +

    2. create the base map

    +
    + +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    +9
    +10
    +11
    +12
    +13
    +14
    +15
    +
        ## create usa basemap using leaflet()
    +    map <- leaflet() %>%                        # initialize the map widget
    +    addPolygons(data = states,                  # add state polygons
    +        smoothFactor = 0.2,                     # lower number means more detail
    +        fillColor = "#808080",                  # internal shape color
    +        stroke = TRUE,                          # add outlines
    +        weight = 0.5,                           # outline width
    +        opacity = 0.5,                          # outline opacity
    +        color = "#808080",                      # outline color    
    +        highlightOptions = highlightOptions(    # define hover parameters
    +            weight = 0.5,                       # outline width [hover]
    +            color = "#000000",                  # internal shape color [hover]
    +            fillOpacity = 0.7,                  # internal fill opacity [hover]
    +            bringToFront = FALSE),              # keep base map in back
    +        group = "basemap")                      # add to group
    +
    + +

    A detailed description of each of these lines can be found in part II of this series. Basic comments have been added for easy reference. The National and State Park data will be added on top of the base map as additional layers.

    + +

    3. download national park boundaries

    +
    + +

    The first step is to download the data from https://public-nps.opendata.arcgis.com/. Once you click on the link you’ll see a bunch of icons that lead to data different data that you can download. Click on the one for boundaries.

    + +
    + + + Image: NPS GIS website + + +
    NPS GIS website
    +
    + +

    I suggest taking some time to and looking through the site and seeing the kinds of data that are available. For now, after you click on boundaries the next page will have a list of all the data sets you can download. The second link should be nps boundary which is the one we’re interested in. This will have all the data for the National Park boundaries, hiking trails, rest aries, and a ton of other data.

    + +
    + + + Image: NPS download page + + +
    NPS download page
    +
    + +

    Once you click on the nps boundary link, it will take you to a map and another download link.

    + +
    + + + Image: NPS map and download link + + +
    NPS map and download link
    +
    + +

    From here, you’ll have a few options of what format you want the data in. We want the shapefile version.

    + +
    + + + Image: download nps shapefile + + +
    download nps shapefile
    +
    + +

    Once it’s downloaded

    + +

    4. process national park data

    +
    + +

    5. create national park labels

    +
    + +

    6. add national parks to map

    +
    + +

    7. conclusion

    +
    + +

    Note: I will give the entire codeblock first. I also include the individual line before describing what it does. I find this to be cleaner than including a bunch of comments in the code itself. If you want to copy and paste the code to your own file, you only need to copy the code block and not each individual line.

    + +:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/bd/10cb948906d50fdb7c3d4d01289e3b23cc68e9927e5e3769956a4e0b51a956 b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/bd/10cb948906d50fdb7c3d4d01289e3b23cc68e9927e5e3769956a4e0b51a956 new file mode 100644 index 0000000..6a0f455 --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/bd/10cb948906d50fdb7c3d4d01289e3b23cc68e9927e5e3769956a4e0b51a956 @@ -0,0 +1,3 @@ +I"Ë

    Arguably one of the best things you can do before starting a PhD is invest time in learning how to properly use version control. With version control, you can track, save, and revert changes to any kind of project. There are several options available, but I’m partial to Git & GitHub. Even if you never touch a piece of code, version control is very helpful.

    + +:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/ca/82c6e4d943b1964653d6ae1a5340dd75b688369c30df6b6540e7a7fd76391e b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/ca/82c6e4d943b1964653d6ae1a5340dd75b688369c30df6b6540e7a7fd76391e new file mode 100644 index 0000000..1e21f69 --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/ca/82c6e4d943b1964653d6ae1a5340dd75b688369c30df6b6540e7a7fd76391e @@ -0,0 +1,156 @@ +I".

    This is part three of my cartography in R series. The links to part one and part two are here.

    + +

    In this post, we’ll process the National Park data before adding it to the base map created in part two. I’ll also add in pop up markers with images from the National Parks I’ve visited that link to the blog post where I’ve written about my adventures there. +

    + +

    Note: I know that my posts are verbose. I am sorry that I am not more concise but one of the biggest problems I have with code documentation is that it assumes you already know what you’re doing. I’m writing these for absolute beginners that want to know what each part of the code does. If you want more concise explanations, I suggest looking at the annotated r files in this project’s GitHub.

    + +

    project outline

    +
    + +

    I had to break the tutorial into different parts because it became unwieldy. I list the component parts below. The annotated version of the code can be found in this project’s repository in the folder called r files.

    + +

    I. cartography in R part one

    + + +

    II. cartography in R part two

    + + +

    III. cartography in R part three [this post]

    + + +

    IV. cartography in R part four

    + + +

    1. load the libraries

    +
    + +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +
        ## load libraries
    +    library("tidyverse")    # data manipulation & map creation
    +    library("sf")           # loads shapefile
    +    library("leaflet")      # creates the map
    +
    +    ## load data
    +    states <- read_sf("~/Documents/Github/nps/shapefiles/shifted/usa/usa.shp")
    +
    + +

    I am not going to explain in detail what each line is doing here, because it’s already available in part one.

    + +

    In line 7 be sure to change "~/Documents/Github/nps/shapefiles/shifted/usa/usa.shp" to reflect wherever you saved the shifted shapefile.

    + +

    If your data processing and base map creation are in the same file, you can skip line 7 and use the variable name where the shape data is stored when you make the leaflet call below.

    + +

    2. create the base map

    +
    + +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    +9
    +10
    +11
    +12
    +13
    +14
    +15
    +
        ## create usa basemap using leaflet()
    +    map <- leaflet() %>%                        # initialize the map widget
    +    addPolygons(data = states,                  # add state polygons
    +        smoothFactor = 0.2,                     # lower number means more detail
    +        fillColor = "#808080",                  # internal shape color
    +        stroke = TRUE,                          # add outlines
    +        weight = 0.5,                           # outline width
    +        opacity = 0.5,                          # outline opacity
    +        color = "#808080",                      # outline color    
    +        highlightOptions = highlightOptions(    # define hover parameters
    +            weight = 0.5,                       # outline width [hover]
    +            color = "#000000",                  # internal shape color [hover]
    +            fillOpacity = 0.7,                  # internal fill opacity [hover]
    +            bringToFront = FALSE),              # keep base map in back
    +        group = "basemap")                      # add to group
    +
    + +

    A detailed description of each of these lines can be found in part II of this series. Basic comments have been added for easy reference. The National and State Park data will be added on top of the base map as additional layers.

    + +

    3. download national park boundaries

    +
    + +

    The first step is to download the data from https://public-nps.opendata.arcgis.com/. Once you click on the link you’ll see a bunch of icons that lead to data different data that you can download. Click on the one for boundaries.

    + +
    + + + Image: NPS GIS website + + +
    NPS GIS website
    +
    + +

    I suggest taking some time to and looking through the site and seeing the kinds of data that are available. For now, after you click on boundaries the next page will have a list of all the data sets you can download. The second link should be nps boundary which is the one we’re interested in. This will have all the data for the National Park boundaries, hiking trails, rest aries, and a ton of other data.

    + +
    + + + Image: NPS download page + + +
    NPS download page
    +
    + +

    Once you click on the nps boundary link, it will take you to a map and another download link.

    + +
    + + + Image: NPS map and download link + + +
    NPS map and download link
    +
    + +

    From here, you’ll have a few options of what format you want the data in. We want the shapefile version.

    + +
    + + + Image: download nps shapefile + + +
    download nps shapefile
    +
    + +

    Save it somewhere on your hard drive that you’ll remember and then unzip the file.

    + +

    4. process national park data

    +
    + +

    5. create national park labels

    +
    + +

    6. add national parks to map

    +
    + +

    7. conclusion

    +
    + +

    Note: I will give the entire codeblock first. I also include the individual line before describing what it does. I find this to be cleaner than including a bunch of comments in the code itself. If you want to copy and paste the code to your own file, you only need to copy the code block and not each individual line.

    + +:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/d9/d164e0a18182f8caf2e5f1326ae1c89557be868a87f89e5307d8efa1946f1b b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/d9/d164e0a18182f8caf2e5f1326ae1c89557be868a87f89e5307d8efa1946f1b new file mode 100644 index 0000000..715c1bd --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/d9/d164e0a18182f8caf2e5f1326ae1c89557be868a87f89e5307d8efa1946f1b @@ -0,0 +1,46 @@ +I" 
    +
    +
    +
    + + +
    +

    Coding

    +
    +

    Although my interest in programming started by playing on my aunt's DOS machine, I never really pursued it. As an adult, I'm attempting to learn to be more proficient and build the various tools I need to do my work more effectively. In the space below I'll posts Gists from my recent projects in web development, R, and Python. The source code for this website and a complete collection of what I'm working on can be found on GitHub.

    + + + + +

    Photography

    +
    +

    Photography has been an interest of mine since I was little. Whenever my dad put on a horror movie, I would escape and pour over his National Geographic magazines. + I was too young to understand the articles, but I was gripped by the power of the images. I believe images can change the world, bring people together, and be a light in a dark world. While I don't + shoot as often as I'd like, below is a collection of some of my latest work.

    + + + +
    + +
    +
    + +
    +
    +:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/e3/a1e108f51e09bfa8de6303dd3ef4dbdc72803996509ec8c241645c6f5ab0ac b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/e3/a1e108f51e09bfa8de6303dd3ef4dbdc72803996509ec8c241645c6f5ab0ac new file mode 100644 index 0000000..8ca8567 --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/e3/a1e108f51e09bfa8de6303dd3ef4dbdc72803996509ec8c241645c6f5ab0ac @@ -0,0 +1,477 @@ +I"‘

    Twitter is a great resource for engaging with the academic community. For example, I saw this Tweet by @PhD_Genie asking users to name one positive skill learned during their PhD. I love this question for a number of reasons. First, it helps PhDs reframe their experience so it’s applicable outside of academia - which can help when applying to jobs. Second, it’s really cool to see what skills other people have learned during their program.

    + + + +
    + + + Image: PhD Genie Tweet + + +
    PhD Genie Tweet
    +
    + +

    I responded to the tweet because during my PhD I learned how to create maps in R. I started by recreating a map from the University of North Carolina’s Hussman School of Journalism’s News Deserts project (below). Now, I am working on a personal project mapping the U.S. National and State parks.

    + +
    + + + Image: Map of US newspapers by county + + +
    Map of US newspapers by county
    +
    + +

    There was quite a bit of interest in how to do this, so in this series of posts I will document my process from start to finish.

    + +

    a few notes

    +
    + +

    First, I’m not an expert. I wanted to make a map, so I learned how. There may be easier ways and, if I learn how to do them, I’ll write another post.

    + +

    Second, before starting, I strongly suggest setting up GitHub and DVC. I wrote about how to use GitHub, the GitHub Website, and GitHub Desktop. You can use any of these methods to manage your repositories. I use all three just based on whatever mood I’m in.

    + +

    If you do use Git or GitHub, then DVC (data version control) is mandatory. GitHub will warn you that your file is too large if it’s over 50MB and reject your pushes if the files are over 100MB. The total repository size can’t exceed 2GB if you’re using the free version (which I am). DVC is useful because cartography files are large. They contain a lot of coordinates which increases with each location you try to map. DVC will store your data outside of GitHub but allows you to track changes with your data. It’s super useful.

    + +

    Third, there are several ways to make a map. R is capable of making interactive maps and static maps. Static maps are less computationally expensive and better for publication. Interactive maps are prettier and better for displaying on the web.

    + +

    I make interactive maps with Leaflet and Shiny because they offer a lot of functionality. The most common way is to use map tiles. Map tiles use data from sources like Open Street Map and Google Maps to create map squares (tiles) that users can put data over. A list of available map tiles is available on the Open Street Maps website.

    + +
    + + + Image: Earthquakes near Australia, using map tiles + + +
    Earthquakes near Australia, using map tiles
    +
    + +

    When I want to make static maps (like the one pictured above) I use ggplot.

    + +

    This guide is how to make an interactive map using leaflet() and shiny().

    + +

    project outline

    +
    + +

    I had to break the tutorial into different parts because it became unwieldy. I list the component parts below. The annotated version of the code can be found in this project’s repository in the folder called r files.

    + +

    I. cartography in R part one [this post]

    + + +

    II. cartography in R part two

    + +:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/e8/b7a6dbbcc0a0459281a08a4e8d4527c0af6cc9221999afdca6d8efaf2b9ce4 b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/e8/b7a6dbbcc0a0459281a08a4e8d4527c0af6cc9221999afdca6d8efaf2b9ce4 new file mode 100644 index 0000000..5da120a --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/e8/b7a6dbbcc0a0459281a08a4e8d4527c0af6cc9221999afdca6d8efaf2b9ce4 @@ -0,0 +1,49 @@ +I"Ć
    +
    +
    +
    + +
    +
    It made a difference to that one. + +
    +

    I have a simple motto in life: Do what you can, where you are, with what you have. As a result, I believe strongly in doing whatever is in my means to make the world a better place. Below are some groups that I have either founded or joined in order to help those around me.

    +

    Current Groups

    +
    +
      +
    • Political Science Methodology Group | Co-organizer with Melina Much
      + University of California, Irvine

    • +
    • Political Science Womxn's Caucus | Student leader
      + University of California, Irvine

    • +
    • Political Science Workshop Coordinator
      + University of California, Irvine

    • +
    • Legal Politics Writing Workshop
      + University of California, Irvine

    • +
    • Center for Democracy: Writing Workshop | Member
      + University of California, Irvine

    • +
    • UCI Humanities: Writing Workshop | Member
      + University of California, Irvine

    • +
    +

    Previous Groups

    +
    +
      +
    • Friends of the San Dimas Dog Park | Ambassador
      + San Dimas, California

    • +
    • Prisoner Education Project | Volunteer
      + Pomona, California

    • +
    • Tails of the City | Volunteer Photographer
      + Los Angeles, California

    • +
    • Philosophy Club | President, Graphic Designer, and Banquet Chair
      + California State Polytechnic University, Pomona

    • +
    • Long Distance Voter | Intern
      + Social Media Content Creator

    • +
    • Free Press | Intern
      + Social Media Content Creator
    • +
    +
    +
    +
    +
    + +
    +:ET \ No newline at end of file diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/e9/fe1fcfddc671dc02d718cd6bcf87dc080b132a9f20125612209a90c029c8fc b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/e9/fe1fcfddc671dc02d718cd6bcf87dc080b132a9f20125612209a90c029c8fc new file mode 100644 index 0000000..2a705ea --- /dev/null +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/e9/fe1fcfddc671dc02d718cd6bcf87dc080b132a9f20125612209a90c029c8fc @@ -0,0 +1,2 @@ +I"$

    GET A CITATION MANAGER.

    +:ET \ No newline at end of file diff --git a/Gemfile b/Gemfile index c46efa4..c208a55 100644 --- a/Gemfile +++ b/Gemfile @@ -1,18 +1,9 @@ -source "https://rubygems.org" - -# Hello! This is where you manage which Jekyll version is used to run. -# When you want to use a different version, change it below, save the -# file and run `bundle install`. Run Jekyll with `bundle exec`, like so: -# -# bundle exec jekyll serve -# -# This will help ensure the proper Jekyll version is running. -# Happy Jekylling! -#gem "jekyll", "~> 3.7.3" +# frozen_string_literal: true +source "https://rubygems.org" -# If you want to use GitHub Pages, remove the "gem "jekyll"" above and -# uncomment the line below. To upgrade, run `bundle update github-pages`. -gem "github-pages", group: :jekyll_plugins +# gem "rails" +gem "jekyll" +gem 'wdm', '>= 0.1.0' gem "webrick", "~> 1.7" diff --git a/_config.yml b/_config.yml index b5726b2..9379b31 100644 --- a/_config.yml +++ b/_config.yml @@ -1,58 +1,8 @@ -# Welcome to Jekyll! -# -# This config file is meant for settings that affect your whole blog, values -# which you are expected to set up once and rarely edit after that. If you find -# yourself editing this file very often, consider using Jekyll's data files -# feature for the data you need to update frequently. -# -# For technical reasons, this file is *NOT* reloaded automatically when you use -# 'bundle exec jekyll serve'. If you change this file, please restart the server process. - -# Site settings -# These are used to personalize your new site. If you look in the HTML files, -# you will see them accessed via {{ site.title }}, {{ site.email }}, and so on. -# You can create any custom variable you would like, and they will be accessible -# in the templates via {{ site.myvariable }}. -lang: en-US title: Liz Muehlmann -email: liz.muehlmann@uci.edu -description: Academic website for Liz Muehlmann, Political Science PhD Candidate at the University of California Irvine -#baseurl: "" # the subpath of your site, e.g. /blog -url: https://liz-muehlmann.github.io # the base hostname & protocol for your site, e.g. http://example.com -twitter_username: hello_iamliz -github_username: liz-muehlmann -search_full_content: false -repository: "liz-muehlmann/liz-muehlmann.github.io" - -# Build settings -plugins: - - jekyll-feed - - jekyll-sitemap - -# A list of the pages to display in the navigation bar -header_pages: - -# Exclude from processing. -# The following items will not be processed, by default. Create a custom list -# to override the default setting. -exclude: - - Gemfile - - Gemfile.lock - - node_modules - - update_boostrap.sh - -# [for] Notes: -excerpt_separator: - -markdown: kramdown -highlighter: rouge -# kramdown: -# input: GFM -# syntax_highlighter_opts: -# default_lang: r -# css_class: 'highlight' -# span: -# line_numbers: false -# block: -# line_numbers: true -# start_line: 1 \ No newline at end of file +email: 'liz.muehlmann@uci.edu' +description: Academic website for Liz Muehlmann. PhD Candidate in Political Science at the University of Irvine, California. +baseurl: / +url: https://liz-muehlmann.github.io +twitter_username: '@hello_iamliz' +github_username: liz-muehlmann +author: Liz \ No newline at end of file diff --git a/_includes/figure.html b/_includes/figure.html new file mode 100644 index 0000000..89ad76c --- /dev/null +++ b/_includes/figure.html @@ -0,0 +1,26 @@ +{% if include.caption %} +
    + {% if include.href %} + + Image: {{ include.caption }} + + {% else %} + + Image: {{ include.caption }} + + {% endif %} +
    {{ include.caption }}
    +
    +{% else %} +
    + {% if include.href %} + + Image without caption + + {% else %} + + Image without caption + + {% endif %} +
    +{% endif %} \ No newline at end of file diff --git a/_includes/head.html b/_includes/head.html deleted file mode 100644 index 4abd282..0000000 --- a/_includes/head.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - {%- seo -%} - - {%- feed_meta -%} - - - - diff --git a/_includes/header.html b/_includes/header.html index 617657b..b7a46e5 100644 --- a/_includes/header.html +++ b/_includes/header.html @@ -7,6 +7,4 @@

    {{page.headname}}

    {{ page.header}}

    - - diff --git a/_includes/metacontent.html b/_includes/metacontent.html index 6672737..472e820 100644 --- a/_includes/metacontent.html +++ b/_includes/metacontent.html @@ -1,7 +1,7 @@ + + + - - - \ No newline at end of file diff --git a/_includes/navbar.html b/_includes/navbar.html index 7734123..67ff0c3 100644 --- a/_includes/navbar.html +++ b/_includes/navbar.html @@ -1,74 +1,45 @@ - - - - + + + + \ No newline at end of file diff --git a/_layouts/default.html b/_layouts/default.html index 81103b8..deea4fc 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -1,28 +1,17 @@ - + - - - - {{ page.title }} - - {% include metacontent.html %} - - - - - {% include navbar.html %} - {% include header.html %} - - -
    -
    - {{ content }} -
    -
    - + + + {% include metacontent.html %} + {{ page.title }} + - - {% include footer.html %} + + {% include navbar.html %} + {% include header.html %} + {{ content }} + - + {% include footer.html %} + \ No newline at end of file diff --git a/_layouts/home.html b/_layouts/home.html deleted file mode 100644 index 837ba0f..0000000 --- a/_layouts/home.html +++ /dev/null @@ -1,41 +0,0 @@ ---- -layout: default ---- - -
    - - {%- if page.title -%} -
    -

    {{ page.title }}

    -
    - {%- endif -%} - -
    - {{ content }} -
    - - {%- if site.posts.size > 0 -%} -

    {{ page.list_title | default: "Posts" }}

    - - -

    subscribe via RSS

    - {%- endif -%} - -
    diff --git a/_layouts/page.html b/_layouts/page.html index 94cbc66..45dee03 100644 --- a/_layouts/page.html +++ b/_layouts/page.html @@ -11,4 +11,4 @@

    {{ page.title | escape }}

    {{ content }} - + \ No newline at end of file diff --git a/_layouts/post.html b/_layouts/post.html index 3b4600b..b7fb7f1 100644 --- a/_layouts/post.html +++ b/_layouts/post.html @@ -17,13 +17,13 @@

    {{ page.title }}

    {{ page.author }} | {{ page.date | date_to_string }}

    {% if post %} - {% assign categories = post.categories %} + {% assign tags = post.tags %} {% else %} - {% assign categories = page.categories %} + {% assign tags = page.tags %} {% endif %} - {% for category in categories %} - Categories: {{category}} - {% unless forloop.last %} {% endunless %} + tags: {% for tag in tags %} + {{tag}} + {% unless forloop.last %}, {% endunless %} {% endfor %}
    @@ -34,7 +34,6 @@

    {{ page.title }}

    -
    @@ -43,8 +42,8 @@

    {{ page.title }}

    diff --git a/_sass/_root.scss b/_sass/_root.scss index ad550df..3ee839e 100644 --- a/_sass/_root.scss +++ b/_sass/_root.scss @@ -1,19 +1,19 @@ -:root { - // Custom variable values only support SassScript inside `#{}`. - @each $color, $value in $colors { - --#{$color}: #{$value}; - } +// :root { +// // Custom variable values only support SassScript inside `#{}`. +// @each $color, $value in $colors { +// --#{$color}: #{$value}; +// } - @each $color, $value in $theme-colors { - --#{$color}: #{$value}; - } +// @each $color, $value in $theme-colors { +// --#{$color}: #{$value}; +// } - @each $bp, $value in $grid-breakpoints { - --breakpoint-#{$bp}: #{$value}; - } +// @each $bp, $value in $grid-breakpoints { +// --breakpoint-#{$bp}: #{$value}; +// } - // Use `inspect` for lists so that quoted items keep the quotes. - // See https://github.com/sass/sass/issues/2383#issuecomment-336349172 - --font-family-sans-serif: #{inspect($font-family-sans-serif)}; - --font-family-monospace: #{inspect($font-family-monospace)}; -} +// // Use `inspect` for lists so that quoted items keep the quotes. +// // See https://github.com/sass/sass/issues/2383#issuecomment-336349172 +// --font-family-sans-serif: #{inspect($font-family-sans-serif)}; +// --font-family-monospace: #{inspect($font-family-monospace)}; +// } diff --git a/_sass/bootstrap-reboot.scss b/_sass/bootstrap-reboot.scss index 2b6cfc2..b962c17 100644 --- a/_sass/bootstrap-reboot.scss +++ b/_sass/bootstrap-reboot.scss @@ -6,7 +6,7 @@ * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */ -@import "functions"; -@import "variables"; -@import "mixins"; -@import "reboot"; +// @import "functions"; +// @import "variables"; +// @import "mixins"; +// @import "reboot"; diff --git a/_sass/bootstrap.scss b/_sass/bootstrap.scss index e86c49d..3af1d4a 100644 --- a/_sass/bootstrap.scss +++ b/_sass/bootstrap.scss @@ -8,8 +8,8 @@ @import "functions"; @import "variables"; @import "mixins"; -@import "root"; -@import "reboot"; +// @import "root"; +// @import "reboot"; @import "type"; @import "images"; @import "code"; diff --git a/assets/css/darkmode.css b/assets/css/darkmode.css index 6254c61..6599af9 100644 --- a/assets/css/darkmode.css +++ b/assets/css/darkmode.css @@ -1,6 +1,6 @@ :root { --background-color: #212121; - --text-color: #eee; + --text-color: #f4f6f5; --bg-card-body: #303030; --image-dimmer: brightness(.8) contrast(1.2); --storage: #fff; @@ -8,31 +8,22 @@ --string: #add8e6; --keyword: #FFC0CB; --variable: #fed8b1; - --bg-code: #454545; + --link-hover: #C5E8C4; + --link-color: #809A6F; + --code-color: #A7D2CB; + --code-bg: #303030; + --code-nx: #F2D388; + --code-nt: #e9cec7; + --code-s1: #a390a1; + --code-kc: #4e7e8e; + --code-o: #D25959; + --code-c: #d3d3d3; + --code-p: #e7cad9; } - :root img { opacity: .75; transition: opacity .5s ease-in-out; } :root img:hover { opacity: 1; - } - - :root .highlight { - background: #454545; - border: 1px #C1C1C1; - border-radius: 3px; - } - - :root code { - background-color: #454545; - border-radius: 3px; - padding: 2px; - color:#61afef; - } - - :root pre { - background-color: #454545; - color: var(--text-color); } \ No newline at end of file diff --git a/assets/css/day-night.css b/assets/css/day-night.css index 2da12eb..b7d136d 100644 --- a/assets/css/day-night.css +++ b/assets/css/day-night.css @@ -6,17 +6,17 @@ border-radius: 5px; cursor: pointer; } -.day-night-icon .sun { +.day-night-icon .sun { transform: translateY(40%); opacity: 0; } -.day-night-icon.day .sun { +.day-night-icon.day .sun { animation: sun-grow 0.5s forwards; } @keyframes sun-grow { 0% { transform: translateY(40%); opacity: 0; fill: #f26522; } 100% { transform: translateY(0%); opacity: 1; fill: #ffde17; } } -.day-night-icon.day .tent { +.day-night-icon.day .tent { animation: day-tent-color 0.5s forwards; } @keyframes day-tent-color { @@ -30,7 +30,7 @@ 0% { transform: translateY(0%); opacity: 1; fill: #ffde17; } 100% { transform: translateY(40%); opacity: 0; fill: #f26522; } } -.day-night-icon.day-close .tent { +.day-night-icon.day-close .tent { animation: day-close-tent-color 0.5s forwards; } @keyframes day-close-tent-color { @@ -47,7 +47,7 @@ 0% { transform: translateX(-100%); opacity: 0; } 100% { transform: translateX(0%); opacity: 1; } } -.day-night-icon.night .tent { +.day-night-icon.night .tent { fill: #009444; } .day-night-icon.night-close .moon { @@ -57,6 +57,6 @@ 0% { transform: translateX(0%); opacity: 1; } 100% { transform: translateX(-100%); opacity: 0; } } -.day-night-icon.night-close .tent { +.day-night-icon.night-close .tent { fill: #009444; -} +} \ No newline at end of file diff --git a/assets/css/main.css b/assets/css/main.css index 305d7dc..87a4540 100644 --- a/assets/css/main.css +++ b/assets/css/main.css @@ -1,4 +1,4 @@ -@import "monokai.css"; +@import "vars.css"; /* general */ html { @@ -7,48 +7,80 @@ html { } body { - font-family: "Lora", serif; + font-family: "Georgia", serif; margin-bottom: 100px; /* prevents content from being blocked by footer */ - font-size: 18px; + font-size: 18.5px; background-color: var(--background-color); color: var(--text-color); } -img-fluid { - max-width: 100%; } +/* horizontal line */ +hr { + border: 1px solid #678778; +} -/* lists */ +/* images */ +figure > figcaption { + font-size: 14px; + font-style: italic; + text-align: center; +} -ul { - list-style: none; + + +/* spacing */ +.tab0 { + margin-left: 25px; +} + +.tab1 { + margin-left: 40px; +} + +.tab2 { + margin-left: 60px; +} + +.tab4 { + margin-left: 80px; } /* links */ a { - color: green; + color: var(--link-color); } a:hover { - color: #7eda84; + color: var(--link-hover); text-decoration: none; } -/* Navigation Bar */ +/* buttons */ + +.btn { + color:#678778; + border-color: #678778; +} + +.btn:hover { + background-color: #C5E8C4; + color: #000; +} + +/* navigation bar */ .uci-logo { margin-right: 15px; + width: 80px; + height: 40px; } .nav-item { margin-top: 6px; } -.switch { - top: 30px; -} - /* masthead */ .jumbotron { - background: linear-gradient(rgba(0,0,0,.5), rgba(0,0,0,.5)), url("/assets/images/Sequoias.jpg"); + background: linear-gradient(rgba(0,0,0,.5), rgba(0,0,0,.5)), url("/assets/resources/Sequoias.jpg"); background-repeat: no-repeat; background-size: cover; background-position: center center; @@ -81,7 +113,7 @@ a:hover { border-width: thick !important; } - /* Footer */ + /* footer */ .footer-styles { padding: 10px; position: absolute !important; @@ -91,114 +123,13 @@ a:hover { text-align: center; } -/* tag forest */ -.taxonomy-index { - display: grid; - grid-column-gap: 2em; - grid-template-columns: repeat(2, 1fr); - margin: 0; - padding: 0; - font-size: 0.9em; - list-style: none; -} - -.taxonomy-index a { - display: flex; - padding: .25em 0; - -webkit-box-pack: justify; - justify-content: space-between; - border-bottom: 1px solid #e7e7e7; -} - -.taxonomy-list { - list-style: none; -} - -.entry-time { - font-size: 14px; -} - -/* Groups */ -.blockquote { - font-size: 25px; -} - -/* Github Gist */ -/* body .gist .gist-file { - margin-bottom: 0; - border: 1px solid #adb5bd; -} - -body .gist .gist-data { - background-color: var(--bg-card-body); -} -body .gist .highlight { - background-color: transparent; -} - -body .gist .blob-num { - color: var(--text-color); - background-color: var(--bg-card-body); -} - -.gist .blob-code-inner .pl-s { - color: var(--storage); -} -.gist .blob-code-inner .pl-s1 { - color: var(--string); -} - -.gist .blob-code-inner .pl-c1 { - color: var(--constant) -} - -.gist .blob-code-inner .pl-k { - color: var(--keyword) -} - -.gist .blob-code-inner .pl-v { - color: var(--variable) -} - -body .gist .gist-meta { - display: none; -} */ - -/* Spacing */ -.tab1 { - margin-left: 40px; -} - -.tab2 { - margin-left: 60px; -} - -.tab4 { - margin-left: 80px; -} - -/* Syntax Highlighting */ -.highlight { - background: rgb(230, 230, 230); - border: 1px #C1C1C1; - border-radius: 3px; -} - -code { - background-color: rgb(230, 230, 230); - border-radius: 3px; - padding: 2px; - color:#61afef; -} - -pre { - background-color: rgb(230, 230, 230); - color: var(--text-color); +/* CV */ +.fas, .fa-regular { + color: #678778; } -/* CV */ -.h-line { - background-color: #e7e7e7; +label > h3 { + color: #678778; } .m-d.expand-list{ @@ -208,16 +139,10 @@ pre { .m-d.expand-list > li{ list-style-type: none; padding: 15px 0; - border-bottom: 1px solid #e7e7e7; + border-bottom: 1px solid #212121; position: relative; -/* max-width: 80%; */ - color: var(--text-color) -} -.tab_lab { - color:#008000; - padding: 10px; + max-width: 80%; } - .m-d label[class^="tab"]:hover{ cursor: pointer; } @@ -231,8 +156,7 @@ pre { height: 40px; position: absolute; left: 0; - top: 0; - color: var(--constant); + top: 0; } .m-d input[class^="tab"]:hover{ cursor: pointer; @@ -244,7 +168,6 @@ cursor: pointer; height: auto; max-height: 0; max-width: 100%; -/* background: yellow;*/ overflow: hidden; transform: translateY(20px); transition: all 180ms ease-in-out 0ms; @@ -296,7 +219,6 @@ cursor: pointer; .m-d input[class^="tab"]:checked ~ .content{ margin-bottom: 20px; } - .m-d .open-close-icon{ display: inline-block; position: absolute; @@ -325,3 +247,114 @@ cursor: pointer; transform: rotate(0deg); transition: opacity 50ms linear 0ms, transform 150ms ease-in-out 0ms; } + +/* tag forest */ +.taxonomy-index { + display: grid; + grid-column-gap: 2em; + grid-template-columns: repeat(2, 1fr); + margin: 0; + padding: 0; + font-size: 0.9em; + list-style: none; +} + +.taxonomy-index a { + display: flex; + padding: .25em 0; + -webkit-box-pack: justify; + justify-content: space-between; + border-bottom: 1px solid #e7e7e7; +} + +.taxonomy-list { + list-style: none; +} + +.entry-time { + font-size: 14px; +} + +/* groups */ +.blockquote { + font-size: 25px; +} + +/* gitbub gist */ +body .gist .gist-file { + margin-bottom: 0; + border: 1px solid #adb5bd; +} + +body .gist .gist-data { + background-color: var(--bg-card-body); +} +body .gist .highlight { + background-color: transparent; +} + +body .gist .blob-num { + color: var(--text-color); + background-color: var(--bg-card-body); +} + +.gist .blob-code-inner .pl-s { + color: var(--storage); +} +.gist .blob-code-inner .pl-s1 { + color: var(--string); +} + +.gist .blob-code-inner .pl-c1 { + color: var(--constant) +} + +.gist .blob-code-inner .pl-k { + color: var(--keyword) +} + +.gist .blob-code-inner .pl-v { + color: var(--variable) +} + +body .gist .gist-meta { + display: none; +} + +/* code */ +code, pre, .n { + color: var(--code-color); + background-color: var(--code-bg); +} + +.nx, .s2 { + color: var(--code-nx); +} + +.s1 { + color: var(--code-s1); +} + +.nt { + color: var(--code-nt); +} + +.kc { + color: var(--code-kc); +} + +.o { + color: var(--code-o); +} + +.c, .c1 { + color: var(--code-c); +} + +.p { + color: var(--code-p); +} + +pre .lineno { + color: var(--text-color); +} diff --git a/assets/css/monokai.css b/assets/css/monokai.css deleted file mode 100644 index 6cee730..0000000 --- a/assets/css/monokai.css +++ /dev/null @@ -1,63 +0,0 @@ - -.highlight .c { color: #75715e } /* Comment */ -.highlight .err { color: #960050 } /* Error */ -.highlight .k { color: #66d9ef } /* Keyword */ -.highlight .l { color: #ae81ff } /* Literal */ -.highlight .n { color: #0085ff } /* Name */ -.highlight .o { color: #f92672 } /* Operator */ -.highlight .p { color: #0085ff } /* Punctuation */ -.highlight .cm { color: #75715e } /* Comment.Multiline */ -.highlight .cp { color: #75715e } /* Comment.Preproc */ -.highlight .c1 { color: #75715e } /* Comment.Single */ -.highlight .cs { color: #75715e } /* Comment.Special */ -.highlight .ge { font-style: italic } /* Generic.Emph */ -.highlight .gs { font-weight: bold } /* Generic.Strong */ -.highlight .kc { color: #66d9ef } /* Keyword.Constant */ -.highlight .kd { color: #66d9ef } /* Keyword.Declaration */ -.highlight .kn { color: #f92672 } /* Keyword.Namespace */ -.highlight .kp { color: #66d9ef } /* Keyword.Pseudo */ -.highlight .kr { color: #66d9ef } /* Keyword.Reserved */ -.highlight .kt { color: #66d9ef } /* Keyword.Type */ -.highlight .ld { color: #00BA34 } /* Literal.Date */ -.highlight .m { color: #ae81ff } /* Literal.Number */ -.highlight .s { color: #00BA34 } /* Literal.String */ -.highlight .na { color: #00BA34 } /* Name.Attribute */ -.highlight .nb { color: #0085ff } /* Name.Builtin */ -.highlight .nc { color: #00BA34 } /* Name.Class */ -.highlight .no { color: #66d9ef } /* Name.Constant */ -.highlight .nd { color: #00BA34 } /* Name.Decorator */ -.highlight .ni { color: #0085ff } /* Name.Entity */ -.highlight .ne { color: #00BA34 } /* Name.Exception */ -.highlight .nf { color: #00BA34 } /* Name.Function */ -.highlight .nl { color: #0085ff } /* Name.Label */ -.highlight .nn { color: #0085ff } /* Name.Namespace */ -.highlight .nx { color: #00BA34 } /* Name.Other */ -.highlight .py { color: #0085ff } /* Name.Property */ -.highlight .nt { color: #f92672 } /* Name.Tag */ -.highlight .nv { color: #0085ff } /* Name.Variable */ -.highlight .ow { color: #f92672 } /* Operator.Word */ -.highlight .w { color: #0085ff } /* Text.Whitespace */ -.highlight .mf { color: #ae81ff } /* Literal.Number.Float */ -.highlight .mh { color: #ae81ff } /* Literal.Number.Hex */ -.highlight .mi { color: #ae81ff } /* Literal.Number.Integer */ -.highlight .mo { color: #ae81ff } /* Literal.Number.Oct */ -.highlight .sb { color: #00BA34 } /* Literal.String.Backtick */ -.highlight .sc { color: #00BA34 } /* Literal.String.Char */ -.highlight .sd { color: #00BA34 } /* Literal.String.Doc */ -.highlight .s2 { color: #808080 } /* Literal.String.Double */ -.highlight .se { color: #ae81ff } /* Literal.String.Escape */ -.highlight .sh { color: #00BA34 } /* Literal.String.Heredoc */ -.highlight .si { color: #00BA34 } /* Literal.String.Interpol */ -.highlight .sx { color: #00BA34 } /* Literal.String.Other */ -.highlight .sr { color: #00BA34 } /* Literal.String.Regex */ -.highlight .s1 { color: #00BA34 } /* Literal.String.Single */ -.highlight .ss { color: #00BA34 } /* Literal.String.Symbol */ -.highlight .bp { color: #0085ff } /* Name.Builtin.Pseudo */ -.highlight .vc { color: #0085ff } /* Name.Variable.Class */ -.highlight .vg { color: #0085ff } /* Name.Variable.Global */ -.highlight .vi { color: #0085ff } /* Name.Variable.Instance */ -.highlight .il { color: #ae81ff } /* Literal.Number.Integer.Long */ - -.highlight .gu { color: #75715e; } /* Generic.Subheading & Diff Unified/Comment? */ -.highlight .gd { color: #f92672; } /* Generic.Deleted & Diff Deleted */ -.highlight .gi { color: #00BA34; } /* Generic.Inserted & Diff Inserted */ \ No newline at end of file diff --git a/assets/css/vars.css b/assets/css/vars.css new file mode 100644 index 0000000..e036d1e --- /dev/null +++ b/assets/css/vars.css @@ -0,0 +1,36 @@ +/* This checks for the system state */ +:root { + --background-color: #fffafa; + --text-color: #222; + --storage: #222; + --constant: #44ee4e; + --string: #3a9fbf; + --keyword: #ff748c; + --variable: #fdb265; + --link-hover: #C5E8C4; + --link-color: #84a98c; + --code-color: #526763; + --code-bg: #f2f2f2; + --code-nx: #917f52; + --code-nt: #C98474; + --code-s1: #7B6079; + --code-kc: #02475E; + --code-o: #D25959; + --code-c: #222; + --code-p: #bc6b95; +} + +/* .light-mode { + --background-color: #f4f6f5; + --text-color: #222; + --storage: #222; + --constant: #44ee4e; + --string: #3a9fbf; + --keyword: #ff748c; + --variable: #fdb265; + --code-color: #678778; + --code-bg: #e6e6e6; + --code-n: #776743; + --code-nx: #647e7a; + --code-s2: #7d7d7c; +} */ diff --git a/assets/javascript/theme-toggle.js b/assets/javascript/theme-toggle.js index 9d77b1b..eb9a002 100644 --- a/assets/javascript/theme-toggle.js +++ b/assets/javascript/theme-toggle.js @@ -57,53 +57,3 @@ function themeToggle() { dayNightIcon("night"); } } - - - - - - - - - - - - - - - - -// function adddarkmode(){ -// if (!document.getElementById("dark-mode")){ -// var head = document.getElementsByTagName('head')[0]; -// var link = document.createElement('link'); -// link.id = "dark-mode"; -// link.rel = 'stylesheet'; -// link.type = 'text/css'; -// link.href = '/assets/css/darkmode.css'; -// link.media = 'all'; -// head.appendChild(link); -// } } -// -// -// if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { -// console.log(localStorage.getItem("theme")) -// if (localStorage.getItem("theme") === null || localStorage.getItem("theme") == "dark-mode") { -// adddarkmode(); -// localStorage.setItem('theme', 'dark-mode'); -// } -// } -// -// -// function themeToggle() { -// let element = document.body; -// let theme = localStorage.getItem("theme"); -// -// if (theme && theme === "dark-mode") { -// localStorage.setItem("theme", "light-mode"); -// document.getElementById("dark-mode").remove(); -// } else { -// localStorage.setItem("theme", "dark-mode"); -// adddarkmode(); -// } -// } diff --git a/assets/notes-images/nps/maps/usa.html b/assets/notes-images/nps/maps/usa.html new file mode 100644 index 0000000..4dc0abe --- /dev/null +++ b/assets/notes-images/nps/maps/usa.html @@ -0,0 +1,4064 @@ + + + + +leaflet + ¶ + ¶ + ¶ + ¶ + +¶ ¶ + ¶ + +¶ + + + +
    +
    + +
    +
    + + + + diff --git a/assets/notes-images/nps/maps/usa_files/Proj4Leaflet-1.0.1/proj4leaflet.js b/assets/notes-images/nps/maps/usa_files/Proj4Leaflet-1.0.1/proj4leaflet.js new file mode 100644 index 0000000..5ce8d47 --- /dev/null +++ b/assets/notes-images/nps/maps/usa_files/Proj4Leaflet-1.0.1/proj4leaflet.js @@ -0,0 +1,272 @@ +(function (factory) { + var L, proj4; + if (typeof define === 'function' && define.amd) { + // AMD + define(['leaflet', 'proj4'], factory); + } else if (typeof module === 'object' && typeof module.exports === "object") { + // Node/CommonJS + L = require('leaflet'); + proj4 = require('proj4'); + module.exports = factory(L, proj4); + } else { + // Browser globals + if (typeof window.L === 'undefined' || typeof window.proj4 === 'undefined') + throw 'Leaflet and proj4 must be loaded first'; + factory(window.L, window.proj4); + } +}(function (L, proj4) { + if (proj4.__esModule && proj4.default) { + // If proj4 was bundled as an ES6 module, unwrap it to get + // to the actual main proj4 object. + // See discussion in https://github.com/kartena/Proj4Leaflet/pull/147 + proj4 = proj4.default; + } + + L.Proj = {}; + + L.Proj._isProj4Obj = function(a) { + return (typeof a.inverse !== 'undefined' && + typeof a.forward !== 'undefined'); + }; + + L.Proj.Projection = L.Class.extend({ + initialize: function(code, def, bounds) { + var isP4 = L.Proj._isProj4Obj(code); + this._proj = isP4 ? code : this._projFromCodeDef(code, def); + this.bounds = isP4 ? def : bounds; + }, + + project: function (latlng) { + var point = this._proj.forward([latlng.lng, latlng.lat]); + return new L.Point(point[0], point[1]); + }, + + unproject: function (point, unbounded) { + var point2 = this._proj.inverse([point.x, point.y]); + return new L.LatLng(point2[1], point2[0], unbounded); + }, + + _projFromCodeDef: function(code, def) { + if (def) { + proj4.defs(code, def); + } else if (proj4.defs[code] === undefined) { + var urn = code.split(':'); + if (urn.length > 3) { + code = urn[urn.length - 3] + ':' + urn[urn.length - 1]; + } + if (proj4.defs[code] === undefined) { + throw 'No projection definition for code ' + code; + } + } + + return proj4(code); + } + }); + + L.Proj.CRS = L.Class.extend({ + includes: L.CRS, + + options: { + transformation: new L.Transformation(1, 0, -1, 0) + }, + + initialize: function(a, b, c) { + var code, + proj, + def, + options; + + if (L.Proj._isProj4Obj(a)) { + proj = a; + code = proj.srsCode; + options = b || {}; + + this.projection = new L.Proj.Projection(proj, options.bounds); + } else { + code = a; + def = b; + options = c || {}; + this.projection = new L.Proj.Projection(code, def, options.bounds); + } + + L.Util.setOptions(this, options); + this.code = code; + this.transformation = this.options.transformation; + + if (this.options.origin) { + this.transformation = + new L.Transformation(1, -this.options.origin[0], + -1, this.options.origin[1]); + } + + if (this.options.scales) { + this._scales = this.options.scales; + } else if (this.options.resolutions) { + this._scales = []; + for (var i = this.options.resolutions.length - 1; i >= 0; i--) { + if (this.options.resolutions[i]) { + this._scales[i] = 1 / this.options.resolutions[i]; + } + } + } + + this.infinite = !this.options.bounds; + + }, + + scale: function(zoom) { + var iZoom = Math.floor(zoom), + baseScale, + nextScale, + scaleDiff, + zDiff; + if (zoom === iZoom) { + return this._scales[zoom]; + } else { + // Non-integer zoom, interpolate + baseScale = this._scales[iZoom]; + nextScale = this._scales[iZoom + 1]; + scaleDiff = nextScale - baseScale; + zDiff = (zoom - iZoom); + return baseScale + scaleDiff * zDiff; + } + }, + + zoom: function(scale) { + // Find closest number in this._scales, down + var downScale = this._closestElement(this._scales, scale), + downZoom = this._scales.indexOf(downScale), + nextScale, + nextZoom, + scaleDiff; + // Check if scale is downScale => return array index + if (scale === downScale) { + return downZoom; + } + if (downScale === undefined) { + return -Infinity; + } + // Interpolate + nextZoom = downZoom + 1; + nextScale = this._scales[nextZoom]; + if (nextScale === undefined) { + return Infinity; + } + scaleDiff = nextScale - downScale; + return (scale - downScale) / scaleDiff + downZoom; + }, + + distance: L.CRS.Earth.distance, + + R: L.CRS.Earth.R, + + /* Get the closest lowest element in an array */ + _closestElement: function(array, element) { + var low; + for (var i = array.length; i--;) { + if (array[i] <= element && (low === undefined || low < array[i])) { + low = array[i]; + } + } + return low; + } + }); + + L.Proj.GeoJSON = L.GeoJSON.extend({ + initialize: function(geojson, options) { + this._callLevel = 0; + L.GeoJSON.prototype.initialize.call(this, geojson, options); + }, + + addData: function(geojson) { + var crs; + + if (geojson) { + if (geojson.crs && geojson.crs.type === 'name') { + crs = new L.Proj.CRS(geojson.crs.properties.name); + } else if (geojson.crs && geojson.crs.type) { + crs = new L.Proj.CRS(geojson.crs.type + ':' + geojson.crs.properties.code); + } + + if (crs !== undefined) { + this.options.coordsToLatLng = function(coords) { + var point = L.point(coords[0], coords[1]); + return crs.projection.unproject(point); + }; + } + } + + // Base class' addData might call us recursively, but + // CRS shouldn't be cleared in that case, since CRS applies + // to the whole GeoJSON, inluding sub-features. + this._callLevel++; + try { + L.GeoJSON.prototype.addData.call(this, geojson); + } finally { + this._callLevel--; + if (this._callLevel === 0) { + delete this.options.coordsToLatLng; + } + } + } + }); + + L.Proj.geoJson = function(geojson, options) { + return new L.Proj.GeoJSON(geojson, options); + }; + + L.Proj.ImageOverlay = L.ImageOverlay.extend({ + initialize: function (url, bounds, options) { + L.ImageOverlay.prototype.initialize.call(this, url, null, options); + this._projectedBounds = bounds; + }, + + // Danger ahead: Overriding internal methods in Leaflet. + // Decided to do this rather than making a copy of L.ImageOverlay + // and doing very tiny modifications to it. + // Future will tell if this was wise or not. + _animateZoom: function (event) { + var scale = this._map.getZoomScale(event.zoom); + var northWest = L.point(this._projectedBounds.min.x, this._projectedBounds.max.y); + var offset = this._projectedToNewLayerPoint(northWest, event.zoom, event.center); + + L.DomUtil.setTransform(this._image, offset, scale); + }, + + _reset: function () { + var zoom = this._map.getZoom(); + var pixelOrigin = this._map.getPixelOrigin(); + var bounds = L.bounds( + this._transform(this._projectedBounds.min, zoom)._subtract(pixelOrigin), + this._transform(this._projectedBounds.max, zoom)._subtract(pixelOrigin) + ); + var size = bounds.getSize(); + + L.DomUtil.setPosition(this._image, bounds.min); + this._image.style.width = size.x + 'px'; + this._image.style.height = size.y + 'px'; + }, + + _projectedToNewLayerPoint: function (point, zoom, center) { + var viewHalf = this._map.getSize()._divideBy(2); + var newTopLeft = this._map.project(center, zoom)._subtract(viewHalf)._round(); + var topLeft = newTopLeft.add(this._map._getMapPanePos()); + + return this._transform(point, zoom)._subtract(topLeft); + }, + + _transform: function (point, zoom) { + var crs = this._map.options.crs; + var transformation = crs.transformation; + var scale = crs.scale(zoom); + + return transformation.transform(point, scale); + } + }); + + L.Proj.imageOverlay = function (url, bounds, options) { + return new L.Proj.ImageOverlay(url, bounds, options); + }; + + return L.Proj; +})); diff --git a/assets/notes-images/nps/maps/usa_files/htmlwidgets-1.5.4/htmlwidgets.js b/assets/notes-images/nps/maps/usa_files/htmlwidgets-1.5.4/htmlwidgets.js new file mode 100644 index 0000000..da8b236 --- /dev/null +++ b/assets/notes-images/nps/maps/usa_files/htmlwidgets-1.5.4/htmlwidgets.js @@ -0,0 +1,903 @@ +(function() { + // If window.HTMLWidgets is already defined, then use it; otherwise create a + // new object. This allows preceding code to set options that affect the + // initialization process (though none currently exist). + window.HTMLWidgets = window.HTMLWidgets || {}; + + // See if we're running in a viewer pane. If not, we're in a web browser. + var viewerMode = window.HTMLWidgets.viewerMode = + /\bviewer_pane=1\b/.test(window.location); + + // See if we're running in Shiny mode. If not, it's a static document. + // Note that static widgets can appear in both Shiny and static modes, but + // obviously, Shiny widgets can only appear in Shiny apps/documents. + var shinyMode = window.HTMLWidgets.shinyMode = + typeof(window.Shiny) !== "undefined" && !!window.Shiny.outputBindings; + + // We can't count on jQuery being available, so we implement our own + // version if necessary. + function querySelectorAll(scope, selector) { + if (typeof(jQuery) !== "undefined" && scope instanceof jQuery) { + return scope.find(selector); + } + if (scope.querySelectorAll) { + return scope.querySelectorAll(selector); + } + } + + function asArray(value) { + if (value === null) + return []; + if ($.isArray(value)) + return value; + return [value]; + } + + // Implement jQuery's extend + function extend(target /*, ... */) { + if (arguments.length == 1) { + return target; + } + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var prop in source) { + if (source.hasOwnProperty(prop)) { + target[prop] = source[prop]; + } + } + } + return target; + } + + // IE8 doesn't support Array.forEach. + function forEach(values, callback, thisArg) { + if (values.forEach) { + values.forEach(callback, thisArg); + } else { + for (var i = 0; i < values.length; i++) { + callback.call(thisArg, values[i], i, values); + } + } + } + + // Replaces the specified method with the return value of funcSource. + // + // Note that funcSource should not BE the new method, it should be a function + // that RETURNS the new method. funcSource receives a single argument that is + // the overridden method, it can be called from the new method. The overridden + // method can be called like a regular function, it has the target permanently + // bound to it so "this" will work correctly. + function overrideMethod(target, methodName, funcSource) { + var superFunc = target[methodName] || function() {}; + var superFuncBound = function() { + return superFunc.apply(target, arguments); + }; + target[methodName] = funcSource(superFuncBound); + } + + // Add a method to delegator that, when invoked, calls + // delegatee.methodName. If there is no such method on + // the delegatee, but there was one on delegator before + // delegateMethod was called, then the original version + // is invoked instead. + // For example: + // + // var a = { + // method1: function() { console.log('a1'); } + // method2: function() { console.log('a2'); } + // }; + // var b = { + // method1: function() { console.log('b1'); } + // }; + // delegateMethod(a, b, "method1"); + // delegateMethod(a, b, "method2"); + // a.method1(); + // a.method2(); + // + // The output would be "b1", "a2". + function delegateMethod(delegator, delegatee, methodName) { + var inherited = delegator[methodName]; + delegator[methodName] = function() { + var target = delegatee; + var method = delegatee[methodName]; + + // The method doesn't exist on the delegatee. Instead, + // call the method on the delegator, if it exists. + if (!method) { + target = delegator; + method = inherited; + } + + if (method) { + return method.apply(target, arguments); + } + }; + } + + // Implement a vague facsimilie of jQuery's data method + function elementData(el, name, value) { + if (arguments.length == 2) { + return el["htmlwidget_data_" + name]; + } else if (arguments.length == 3) { + el["htmlwidget_data_" + name] = value; + return el; + } else { + throw new Error("Wrong number of arguments for elementData: " + + arguments.length); + } + } + + // http://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex + function escapeRegExp(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + } + + function hasClass(el, className) { + var re = new RegExp("\\b" + escapeRegExp(className) + "\\b"); + return re.test(el.className); + } + + // elements - array (or array-like object) of HTML elements + // className - class name to test for + // include - if true, only return elements with given className; + // if false, only return elements *without* given className + function filterByClass(elements, className, include) { + var results = []; + for (var i = 0; i < elements.length; i++) { + if (hasClass(elements[i], className) == include) + results.push(elements[i]); + } + return results; + } + + function on(obj, eventName, func) { + if (obj.addEventListener) { + obj.addEventListener(eventName, func, false); + } else if (obj.attachEvent) { + obj.attachEvent(eventName, func); + } + } + + function off(obj, eventName, func) { + if (obj.removeEventListener) + obj.removeEventListener(eventName, func, false); + else if (obj.detachEvent) { + obj.detachEvent(eventName, func); + } + } + + // Translate array of values to top/right/bottom/left, as usual with + // the "padding" CSS property + // https://developer.mozilla.org/en-US/docs/Web/CSS/padding + function unpackPadding(value) { + if (typeof(value) === "number") + value = [value]; + if (value.length === 1) { + return {top: value[0], right: value[0], bottom: value[0], left: value[0]}; + } + if (value.length === 2) { + return {top: value[0], right: value[1], bottom: value[0], left: value[1]}; + } + if (value.length === 3) { + return {top: value[0], right: value[1], bottom: value[2], left: value[1]}; + } + if (value.length === 4) { + return {top: value[0], right: value[1], bottom: value[2], left: value[3]}; + } + } + + // Convert an unpacked padding object to a CSS value + function paddingToCss(paddingObj) { + return paddingObj.top + "px " + paddingObj.right + "px " + paddingObj.bottom + "px " + paddingObj.left + "px"; + } + + // Makes a number suitable for CSS + function px(x) { + if (typeof(x) === "number") + return x + "px"; + else + return x; + } + + // Retrieves runtime widget sizing information for an element. + // The return value is either null, or an object with fill, padding, + // defaultWidth, defaultHeight fields. + function sizingPolicy(el) { + var sizingEl = document.querySelector("script[data-for='" + el.id + "'][type='application/htmlwidget-sizing']"); + if (!sizingEl) + return null; + var sp = JSON.parse(sizingEl.textContent || sizingEl.text || "{}"); + if (viewerMode) { + return sp.viewer; + } else { + return sp.browser; + } + } + + // @param tasks Array of strings (or falsy value, in which case no-op). + // Each element must be a valid JavaScript expression that yields a + // function. Or, can be an array of objects with "code" and "data" + // properties; in this case, the "code" property should be a string + // of JS that's an expr that yields a function, and "data" should be + // an object that will be added as an additional argument when that + // function is called. + // @param target The object that will be "this" for each function + // execution. + // @param args Array of arguments to be passed to the functions. (The + // same arguments will be passed to all functions.) + function evalAndRun(tasks, target, args) { + if (tasks) { + forEach(tasks, function(task) { + var theseArgs = args; + if (typeof(task) === "object") { + theseArgs = theseArgs.concat([task.data]); + task = task.code; + } + var taskFunc = tryEval(task); + if (typeof(taskFunc) !== "function") { + throw new Error("Task must be a function! Source:\n" + task); + } + taskFunc.apply(target, theseArgs); + }); + } + } + + // Attempt eval() both with and without enclosing in parentheses. + // Note that enclosing coerces a function declaration into + // an expression that eval() can parse + // (otherwise, a SyntaxError is thrown) + function tryEval(code) { + var result = null; + try { + result = eval("(" + code + ")"); + } catch(error) { + if (!(error instanceof SyntaxError)) { + throw error; + } + try { + result = eval(code); + } catch(e) { + if (e instanceof SyntaxError) { + throw error; + } else { + throw e; + } + } + } + return result; + } + + function initSizing(el) { + var sizing = sizingPolicy(el); + if (!sizing) + return; + + var cel = document.getElementById("htmlwidget_container"); + if (!cel) + return; + + if (typeof(sizing.padding) !== "undefined") { + document.body.style.margin = "0"; + document.body.style.padding = paddingToCss(unpackPadding(sizing.padding)); + } + + if (sizing.fill) { + document.body.style.overflow = "hidden"; + document.body.style.width = "100%"; + document.body.style.height = "100%"; + document.documentElement.style.width = "100%"; + document.documentElement.style.height = "100%"; + if (cel) { + cel.style.position = "absolute"; + var pad = unpackPadding(sizing.padding); + cel.style.top = pad.top + "px"; + cel.style.right = pad.right + "px"; + cel.style.bottom = pad.bottom + "px"; + cel.style.left = pad.left + "px"; + el.style.width = "100%"; + el.style.height = "100%"; + } + + return { + getWidth: function() { return cel.offsetWidth; }, + getHeight: function() { return cel.offsetHeight; } + }; + + } else { + el.style.width = px(sizing.width); + el.style.height = px(sizing.height); + + return { + getWidth: function() { return el.offsetWidth; }, + getHeight: function() { return el.offsetHeight; } + }; + } + } + + // Default implementations for methods + var defaults = { + find: function(scope) { + return querySelectorAll(scope, "." + this.name); + }, + renderError: function(el, err) { + var $el = $(el); + + this.clearError(el); + + // Add all these error classes, as Shiny does + var errClass = "shiny-output-error"; + if (err.type !== null) { + // use the classes of the error condition as CSS class names + errClass = errClass + " " + $.map(asArray(err.type), function(type) { + return errClass + "-" + type; + }).join(" "); + } + errClass = errClass + " htmlwidgets-error"; + + // Is el inline or block? If inline or inline-block, just display:none it + // and add an inline error. + var display = $el.css("display"); + $el.data("restore-display-mode", display); + + if (display === "inline" || display === "inline-block") { + $el.hide(); + if (err.message !== "") { + var errorSpan = $("").addClass(errClass); + errorSpan.text(err.message); + $el.after(errorSpan); + } + } else if (display === "block") { + // If block, add an error just after the el, set visibility:none on the + // el, and position the error to be on top of the el. + // Mark it with a unique ID and CSS class so we can remove it later. + $el.css("visibility", "hidden"); + if (err.message !== "") { + var errorDiv = $("
    ").addClass(errClass).css("position", "absolute") + .css("top", el.offsetTop) + .css("left", el.offsetLeft) + // setting width can push out the page size, forcing otherwise + // unnecessary scrollbars to appear and making it impossible for + // the element to shrink; so use max-width instead + .css("maxWidth", el.offsetWidth) + .css("height", el.offsetHeight); + errorDiv.text(err.message); + $el.after(errorDiv); + + // Really dumb way to keep the size/position of the error in sync with + // the parent element as the window is resized or whatever. + var intId = setInterval(function() { + if (!errorDiv[0].parentElement) { + clearInterval(intId); + return; + } + errorDiv + .css("top", el.offsetTop) + .css("left", el.offsetLeft) + .css("maxWidth", el.offsetWidth) + .css("height", el.offsetHeight); + }, 500); + } + } + }, + clearError: function(el) { + var $el = $(el); + var display = $el.data("restore-display-mode"); + $el.data("restore-display-mode", null); + + if (display === "inline" || display === "inline-block") { + if (display) + $el.css("display", display); + $(el.nextSibling).filter(".htmlwidgets-error").remove(); + } else if (display === "block"){ + $el.css("visibility", "inherit"); + $(el.nextSibling).filter(".htmlwidgets-error").remove(); + } + }, + sizing: {} + }; + + // Called by widget bindings to register a new type of widget. The definition + // object can contain the following properties: + // - name (required) - A string indicating the binding name, which will be + // used by default as the CSS classname to look for. + // - initialize (optional) - A function(el) that will be called once per + // widget element; if a value is returned, it will be passed as the third + // value to renderValue. + // - renderValue (required) - A function(el, data, initValue) that will be + // called with data. Static contexts will cause this to be called once per + // element; Shiny apps will cause this to be called multiple times per + // element, as the data changes. + window.HTMLWidgets.widget = function(definition) { + if (!definition.name) { + throw new Error("Widget must have a name"); + } + if (!definition.type) { + throw new Error("Widget must have a type"); + } + // Currently we only support output widgets + if (definition.type !== "output") { + throw new Error("Unrecognized widget type '" + definition.type + "'"); + } + // TODO: Verify that .name is a valid CSS classname + + // Support new-style instance-bound definitions. Old-style class-bound + // definitions have one widget "object" per widget per type/class of + // widget; the renderValue and resize methods on such widget objects + // take el and instance arguments, because the widget object can't + // store them. New-style instance-bound definitions have one widget + // object per widget instance; the definition that's passed in doesn't + // provide renderValue or resize methods at all, just the single method + // factory(el, width, height) + // which returns an object that has renderValue(x) and resize(w, h). + // This enables a far more natural programming style for the widget + // author, who can store per-instance state using either OO-style + // instance fields or functional-style closure variables (I guess this + // is in contrast to what can only be called C-style pseudo-OO which is + // what we required before). + if (definition.factory) { + definition = createLegacyDefinitionAdapter(definition); + } + + if (!definition.renderValue) { + throw new Error("Widget must have a renderValue function"); + } + + // For static rendering (non-Shiny), use a simple widget registration + // scheme. We also use this scheme for Shiny apps/documents that also + // contain static widgets. + window.HTMLWidgets.widgets = window.HTMLWidgets.widgets || []; + // Merge defaults into the definition; don't mutate the original definition. + var staticBinding = extend({}, defaults, definition); + overrideMethod(staticBinding, "find", function(superfunc) { + return function(scope) { + var results = superfunc(scope); + // Filter out Shiny outputs, we only want the static kind + return filterByClass(results, "html-widget-output", false); + }; + }); + window.HTMLWidgets.widgets.push(staticBinding); + + if (shinyMode) { + // Shiny is running. Register the definition with an output binding. + // The definition itself will not be the output binding, instead + // we will make an output binding object that delegates to the + // definition. This is because we foolishly used the same method + // name (renderValue) for htmlwidgets definition and Shiny bindings + // but they actually have quite different semantics (the Shiny + // bindings receive data that includes lots of metadata that it + // strips off before calling htmlwidgets renderValue). We can't + // just ignore the difference because in some widgets it's helpful + // to call this.renderValue() from inside of resize(), and if + // we're not delegating, then that call will go to the Shiny + // version instead of the htmlwidgets version. + + // Merge defaults with definition, without mutating either. + var bindingDef = extend({}, defaults, definition); + + // This object will be our actual Shiny binding. + var shinyBinding = new Shiny.OutputBinding(); + + // With a few exceptions, we'll want to simply use the bindingDef's + // version of methods if they are available, otherwise fall back to + // Shiny's defaults. NOTE: If Shiny's output bindings gain additional + // methods in the future, and we want them to be overrideable by + // HTMLWidget binding definitions, then we'll need to add them to this + // list. + delegateMethod(shinyBinding, bindingDef, "getId"); + delegateMethod(shinyBinding, bindingDef, "onValueChange"); + delegateMethod(shinyBinding, bindingDef, "onValueError"); + delegateMethod(shinyBinding, bindingDef, "renderError"); + delegateMethod(shinyBinding, bindingDef, "clearError"); + delegateMethod(shinyBinding, bindingDef, "showProgress"); + + // The find, renderValue, and resize are handled differently, because we + // want to actually decorate the behavior of the bindingDef methods. + + shinyBinding.find = function(scope) { + var results = bindingDef.find(scope); + + // Only return elements that are Shiny outputs, not static ones + var dynamicResults = results.filter(".html-widget-output"); + + // It's possible that whatever caused Shiny to think there might be + // new dynamic outputs, also caused there to be new static outputs. + // Since there might be lots of different htmlwidgets bindings, we + // schedule execution for later--no need to staticRender multiple + // times. + if (results.length !== dynamicResults.length) + scheduleStaticRender(); + + return dynamicResults; + }; + + // Wrap renderValue to handle initialization, which unfortunately isn't + // supported natively by Shiny at the time of this writing. + + shinyBinding.renderValue = function(el, data) { + Shiny.renderDependencies(data.deps); + // Resolve strings marked as javascript literals to objects + if (!(data.evals instanceof Array)) data.evals = [data.evals]; + for (var i = 0; data.evals && i < data.evals.length; i++) { + window.HTMLWidgets.evaluateStringMember(data.x, data.evals[i]); + } + if (!bindingDef.renderOnNullValue) { + if (data.x === null) { + el.style.visibility = "hidden"; + return; + } else { + el.style.visibility = "inherit"; + } + } + if (!elementData(el, "initialized")) { + initSizing(el); + + elementData(el, "initialized", true); + if (bindingDef.initialize) { + var result = bindingDef.initialize(el, el.offsetWidth, + el.offsetHeight); + elementData(el, "init_result", result); + } + } + bindingDef.renderValue(el, data.x, elementData(el, "init_result")); + evalAndRun(data.jsHooks.render, elementData(el, "init_result"), [el, data.x]); + }; + + // Only override resize if bindingDef implements it + if (bindingDef.resize) { + shinyBinding.resize = function(el, width, height) { + // Shiny can call resize before initialize/renderValue have been + // called, which doesn't make sense for widgets. + if (elementData(el, "initialized")) { + bindingDef.resize(el, width, height, elementData(el, "init_result")); + } + }; + } + + Shiny.outputBindings.register(shinyBinding, bindingDef.name); + } + }; + + var scheduleStaticRenderTimerId = null; + function scheduleStaticRender() { + if (!scheduleStaticRenderTimerId) { + scheduleStaticRenderTimerId = setTimeout(function() { + scheduleStaticRenderTimerId = null; + window.HTMLWidgets.staticRender(); + }, 1); + } + } + + // Render static widgets after the document finishes loading + // Statically render all elements that are of this widget's class + window.HTMLWidgets.staticRender = function() { + var bindings = window.HTMLWidgets.widgets || []; + forEach(bindings, function(binding) { + var matches = binding.find(document.documentElement); + forEach(matches, function(el) { + var sizeObj = initSizing(el, binding); + + if (hasClass(el, "html-widget-static-bound")) + return; + el.className = el.className + " html-widget-static-bound"; + + var initResult; + if (binding.initialize) { + initResult = binding.initialize(el, + sizeObj ? sizeObj.getWidth() : el.offsetWidth, + sizeObj ? sizeObj.getHeight() : el.offsetHeight + ); + elementData(el, "init_result", initResult); + } + + if (binding.resize) { + var lastSize = { + w: sizeObj ? sizeObj.getWidth() : el.offsetWidth, + h: sizeObj ? sizeObj.getHeight() : el.offsetHeight + }; + var resizeHandler = function(e) { + var size = { + w: sizeObj ? sizeObj.getWidth() : el.offsetWidth, + h: sizeObj ? sizeObj.getHeight() : el.offsetHeight + }; + if (size.w === 0 && size.h === 0) + return; + if (size.w === lastSize.w && size.h === lastSize.h) + return; + lastSize = size; + binding.resize(el, size.w, size.h, initResult); + }; + + on(window, "resize", resizeHandler); + + // This is needed for cases where we're running in a Shiny + // app, but the widget itself is not a Shiny output, but + // rather a simple static widget. One example of this is + // an rmarkdown document that has runtime:shiny and widget + // that isn't in a render function. Shiny only knows to + // call resize handlers for Shiny outputs, not for static + // widgets, so we do it ourselves. + if (window.jQuery) { + window.jQuery(document).on( + "shown.htmlwidgets shown.bs.tab.htmlwidgets shown.bs.collapse.htmlwidgets", + resizeHandler + ); + window.jQuery(document).on( + "hidden.htmlwidgets hidden.bs.tab.htmlwidgets hidden.bs.collapse.htmlwidgets", + resizeHandler + ); + } + + // This is needed for the specific case of ioslides, which + // flips slides between display:none and display:block. + // Ideally we would not have to have ioslide-specific code + // here, but rather have ioslides raise a generic event, + // but the rmarkdown package just went to CRAN so the + // window to getting that fixed may be long. + if (window.addEventListener) { + // It's OK to limit this to window.addEventListener + // browsers because ioslides itself only supports + // such browsers. + on(document, "slideenter", resizeHandler); + on(document, "slideleave", resizeHandler); + } + } + + var scriptData = document.querySelector("script[data-for='" + el.id + "'][type='application/json']"); + if (scriptData) { + var data = JSON.parse(scriptData.textContent || scriptData.text); + // Resolve strings marked as javascript literals to objects + if (!(data.evals instanceof Array)) data.evals = [data.evals]; + for (var k = 0; data.evals && k < data.evals.length; k++) { + window.HTMLWidgets.evaluateStringMember(data.x, data.evals[k]); + } + binding.renderValue(el, data.x, initResult); + evalAndRun(data.jsHooks.render, initResult, [el, data.x]); + } + }); + }); + + invokePostRenderHandlers(); + } + + + function has_jQuery3() { + if (!window.jQuery) { + return false; + } + var $version = window.jQuery.fn.jquery; + var $major_version = parseInt($version.split(".")[0]); + return $major_version >= 3; + } + + /* + / Shiny 1.4 bumped jQuery from 1.x to 3.x which means jQuery's + / on-ready handler (i.e., $(fn)) is now asyncronous (i.e., it now + / really means $(setTimeout(fn)). + / https://jquery.com/upgrade-guide/3.0/#breaking-change-document-ready-handlers-are-now-asynchronous + / + / Since Shiny uses $() to schedule initShiny, shiny>=1.4 calls initShiny + / one tick later than it did before, which means staticRender() is + / called renderValue() earlier than (advanced) widget authors might be expecting. + / https://github.com/rstudio/shiny/issues/2630 + / + / For a concrete example, leaflet has some methods (e.g., updateBounds) + / which reference Shiny methods registered in initShiny (e.g., setInputValue). + / Since leaflet is privy to this life-cycle, it knows to use setTimeout() to + / delay execution of those methods (until Shiny methods are ready) + / https://github.com/rstudio/leaflet/blob/18ec981/javascript/src/index.js#L266-L268 + / + / Ideally widget authors wouldn't need to use this setTimeout() hack that + / leaflet uses to call Shiny methods on a staticRender(). In the long run, + / the logic initShiny should be broken up so that method registration happens + / right away, but binding happens later. + */ + function maybeStaticRenderLater() { + if (shinyMode && has_jQuery3()) { + window.jQuery(window.HTMLWidgets.staticRender); + } else { + window.HTMLWidgets.staticRender(); + } + } + + if (document.addEventListener) { + document.addEventListener("DOMContentLoaded", function() { + document.removeEventListener("DOMContentLoaded", arguments.callee, false); + maybeStaticRenderLater(); + }, false); + } else if (document.attachEvent) { + document.attachEvent("onreadystatechange", function() { + if (document.readyState === "complete") { + document.detachEvent("onreadystatechange", arguments.callee); + maybeStaticRenderLater(); + } + }); + } + + + window.HTMLWidgets.getAttachmentUrl = function(depname, key) { + // If no key, default to the first item + if (typeof(key) === "undefined") + key = 1; + + var link = document.getElementById(depname + "-" + key + "-attachment"); + if (!link) { + throw new Error("Attachment " + depname + "/" + key + " not found in document"); + } + return link.getAttribute("href"); + }; + + window.HTMLWidgets.dataframeToD3 = function(df) { + var names = []; + var length; + for (var name in df) { + if (df.hasOwnProperty(name)) + names.push(name); + if (typeof(df[name]) !== "object" || typeof(df[name].length) === "undefined") { + throw new Error("All fields must be arrays"); + } else if (typeof(length) !== "undefined" && length !== df[name].length) { + throw new Error("All fields must be arrays of the same length"); + } + length = df[name].length; + } + var results = []; + var item; + for (var row = 0; row < length; row++) { + item = {}; + for (var col = 0; col < names.length; col++) { + item[names[col]] = df[names[col]][row]; + } + results.push(item); + } + return results; + }; + + window.HTMLWidgets.transposeArray2D = function(array) { + if (array.length === 0) return array; + var newArray = array[0].map(function(col, i) { + return array.map(function(row) { + return row[i] + }) + }); + return newArray; + }; + // Split value at splitChar, but allow splitChar to be escaped + // using escapeChar. Any other characters escaped by escapeChar + // will be included as usual (including escapeChar itself). + function splitWithEscape(value, splitChar, escapeChar) { + var results = []; + var escapeMode = false; + var currentResult = ""; + for (var pos = 0; pos < value.length; pos++) { + if (!escapeMode) { + if (value[pos] === splitChar) { + results.push(currentResult); + currentResult = ""; + } else if (value[pos] === escapeChar) { + escapeMode = true; + } else { + currentResult += value[pos]; + } + } else { + currentResult += value[pos]; + escapeMode = false; + } + } + if (currentResult !== "") { + results.push(currentResult); + } + return results; + } + // Function authored by Yihui/JJ Allaire + window.HTMLWidgets.evaluateStringMember = function(o, member) { + var parts = splitWithEscape(member, '.', '\\'); + for (var i = 0, l = parts.length; i < l; i++) { + var part = parts[i]; + // part may be a character or 'numeric' member name + if (o !== null && typeof o === "object" && part in o) { + if (i == (l - 1)) { // if we are at the end of the line then evalulate + if (typeof o[part] === "string") + o[part] = tryEval(o[part]); + } else { // otherwise continue to next embedded object + o = o[part]; + } + } + } + }; + + // Retrieve the HTMLWidget instance (i.e. the return value of an + // HTMLWidget binding's initialize() or factory() function) + // associated with an element, or null if none. + window.HTMLWidgets.getInstance = function(el) { + return elementData(el, "init_result"); + }; + + // Finds the first element in the scope that matches the selector, + // and returns the HTMLWidget instance (i.e. the return value of + // an HTMLWidget binding's initialize() or factory() function) + // associated with that element, if any. If no element matches the + // selector, or the first matching element has no HTMLWidget + // instance associated with it, then null is returned. + // + // The scope argument is optional, and defaults to window.document. + window.HTMLWidgets.find = function(scope, selector) { + if (arguments.length == 1) { + selector = scope; + scope = document; + } + + var el = scope.querySelector(selector); + if (el === null) { + return null; + } else { + return window.HTMLWidgets.getInstance(el); + } + }; + + // Finds all elements in the scope that match the selector, and + // returns the HTMLWidget instances (i.e. the return values of + // an HTMLWidget binding's initialize() or factory() function) + // associated with the elements, in an array. If elements that + // match the selector don't have an associated HTMLWidget + // instance, the returned array will contain nulls. + // + // The scope argument is optional, and defaults to window.document. + window.HTMLWidgets.findAll = function(scope, selector) { + if (arguments.length == 1) { + selector = scope; + scope = document; + } + + var nodes = scope.querySelectorAll(selector); + var results = []; + for (var i = 0; i < nodes.length; i++) { + results.push(window.HTMLWidgets.getInstance(nodes[i])); + } + return results; + }; + + var postRenderHandlers = []; + function invokePostRenderHandlers() { + while (postRenderHandlers.length) { + var handler = postRenderHandlers.shift(); + if (handler) { + handler(); + } + } + } + + // Register the given callback function to be invoked after the + // next time static widgets are rendered. + window.HTMLWidgets.addPostRenderHandler = function(callback) { + postRenderHandlers.push(callback); + }; + + // Takes a new-style instance-bound definition, and returns an + // old-style class-bound definition. This saves us from having + // to rewrite all the logic in this file to accomodate both + // types of definitions. + function createLegacyDefinitionAdapter(defn) { + var result = { + name: defn.name, + type: defn.type, + initialize: function(el, width, height) { + return defn.factory(el, width, height); + }, + renderValue: function(el, x, instance) { + return instance.renderValue(x); + }, + resize: function(el, width, height, instance) { + return instance.resize(width, height); + } + }; + + if (defn.find) + result.find = defn.find; + if (defn.renderError) + result.renderError = defn.renderError; + if (defn.clearError) + result.clearError = defn.clearError; + + return result; + } +})(); + diff --git a/assets/notes-images/nps/maps/usa_files/jquery-1.12.4/jquery.min.js b/assets/notes-images/nps/maps/usa_files/jquery-1.12.4/jquery.min.js new file mode 100644 index 0000000..e836475 --- /dev/null +++ b/assets/notes-images/nps/maps/usa_files/jquery-1.12.4/jquery.min.js @@ -0,0 +1,5 @@ +/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0; +}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML="
    a",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:l.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|&#?\w+;/,ha=/r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?""!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/\s*$/g,Aa=ca(d),Ba=Aa.appendChild(d.createElement("div"));function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Da(b).text=a.text,Ea(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Z.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}}function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&xa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(o&&(k=ja(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(ea(k,"script"),Da),h=i.length;o>m;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,ea(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Ea),m=0;h>m;m++)g=i[m],_.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(za,"")));k=e=null}return a}function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(ea(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(va,"<$1>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ua.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Ba.innerHTML=a.outerHTML,Ba.removeChild(f=Ba.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=ea(f),h=ea(a),g=0;null!=(e=h[g]);++g)d[g]&&Ga(e,d[g]);if(b)if(c)for(h=h||ea(a),d=d||ea(f),g=0;null!=(e=h[g]);g++)Fa(e,d[g]);else Fa(a,f);return d=ea(f,"script"),d.length>0&&fa(d,!i&&ea(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||M(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||"undefined"==typeof d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ha,detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return Y(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(ea(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return Y(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ta,""):void 0;if("string"==typeof a&&!wa.test(a)&&(l.htmlSerialize||!ua.test(a))&&(l.leadingWhitespace||!aa.test(a))&&!da[($.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ja,Ka={HTML:"block",BODY:"block"};function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(Ja||n("
    United States base map made with Leaflet
    \ No newline at end of file diff --git a/pages/cv.md b/pages/cv.md index 7425c9c..a192801 100644 --- a/pages/cv.md +++ b/pages/cv.md @@ -3,99 +3,118 @@ title: Liz Muehlmann layout: default headname: Curriculum Vitae --- - - -
      -
    • - - - - - - -
      -

      Doctor of Philosophy - Political Science
      - University of California - Irvine, California | 2019-2025 (expected)

      -

      Master of Arts - Communications, Specialization: Research & Theory
      - California State University - Fullerton, California | May 2017
      - Thesis: Friedrichs v. California Teachers Association: Union Security Agreements, Campaign Finance, and the First Amendment

      -

      Bachelor of Arts - Philosophy, Specialization: Law & Society
      - California State Polytechnic University - Pomona, California | May 2012
      - Capstone Paper: Deliberative Democracy and the Media it Requires

      -

      Associate of Science - Behavioral Science
      - Citrus Community College - Glendora, California | May 2009

      +
      +
      +
      -
    • -
    • - - - -
      -

      "Unions as a Counterbalance to Corporate Citizenship"
      - Midwest Political Science Association
      - Spring 2021, Tensions Between Law and Democracy
      -
      - "Corporate Citizenship and the Threat to Democracy: Unions as a Counterbalance"
      - Western Political Science Association
      - Spring 2021, Judicial Review, Litigation Reform, and Political Speech
      -
      - Featured Alumni Panel
      - World Philosophy Day
      - Fall 2018, California State Polytechnic University - Pomona
      -
      - “Union Security Fees, Campaign Finance, and the First Amendment"
      - Colloquium Speakers Series: Labor, Justice, and the Future of Work
      - February 2018, California State Polytechnic University - Pomona
      -
      - “Speech Rights in the Public Sector”
      - California Teachers Association, Union Meeting
      - September 2016, California State University - Fullerton

      +
      +
        +
      • + + + + + + +
        +

        Doctor of Philosophy - Political Science
        + University of California - Irvine, California | 2019-2025 (expected)

        + Master of Arts - Communications, Specialization: Research & Theory
        + California State University - Fullerton, California | May 2017
        + Thesis: Friedrichs v. California Teachers Association: Union Security Agreements, Campaign Finance, and the First Amendment

        + Bachelor of Arts - Philosophy, Specialization: Law & Society
        + California State Polytechnic University - Pomona, California | May 2
        + Capstone Paper: Deliberative Democracy and the Media it Requires

        + Associate of Science - Behavioral Science
        + Citrus Community College - Glendora, California | May 2009

        +
        +
      • +
      • + + + + + + +
        +

        "Unions as a Counterbalance to Corporate Citizenship"
        + Midwest Political Science Association
        + Spring 2021, Tensions Between Law and Democracy

        + "Corporate Citizenship and the Threat to Democracy: Unions aCounterbalance"
        + Western Political Science Association
        + Spring 2021, Judicial Review, Litigation Reform, and Political Speech

        + Featured Alumni Panel
        + World Philosophy Day
        + Fall 2018, California State Polytechnic University - Pomona

        + “Union Security Fees, Campaign Finance, and the First Amendment"
        + Colloquium Speakers Series: Labor, Justice, and the Future of Work
        + February 2018, California State Polytechnic University - Pomona

        + “Speech Rights in the Public Sector”
        + California Teachers Association, Union Meeting
        + September 2016, California State University - Fullerton

        +
        +
      • +
      • + + + + + + +
        +

        Outstanding Graduate Student, Research & Theory
        + California State University – Fullerton
        + May 2017

        + Pai Award for Outstanding Contributions to the Philosophy Department
        + California State Polytechnic University – Pomona
        + May 2012

        + Valedictorian
        + Arroyo Pacific Academy
        + May 2005

        +
        +
      • +
      • + + + + + + +
        +

        Undergraduate Research Opportunities Program | $11,000
        + University of California - Irvine

        + Diversity Recruitment Fellowship | $7,500
        + University of California - Irvine

        + Minority Serving Institution Enhancement | $7,500
        + University of California - Irvine

        +
        +
      • +
      • + + + + + + +
        +

        American Political Science Association +
        2020 - Current +

        + The Society for Political Methodology +
        2019 - Current

        +
        +
      • +
      -
    • -
    • - - - -
      -

      Outstanding Graduate Student, Research & Theory
      - California State University – Fullerton
      - May 2017
      -
      - Pai Award for Outstanding Contributions to the Philosophy Department
      - California State Polytechnic University – Pomona
      - May 2012
      -
      - Valedictorian
      - Arroyo Pacific Academy
      - May 2005

      -
      -
    • -
    • - - - -
      -

      Undergraduate Research Opportunities Program | $11,000
      - University of California - Irvine

      - Diversity Recruitment Fellowship | $7,500
      - University of California - Irvine

      - Minority Serving Institution Enhancement | $7,500
      - University of California - Irvine

      -
      -
    • -
    • - - - -
      -

      American Political Science Association -
      2020 - Current -

      - The Society for Political Methodology -
      2019 - Current -

      -
      -
    • -
    - - \ No newline at end of file + + \ No newline at end of file diff --git a/pages/groups.md b/pages/groups.md index 7a31c5f..9f43907 100644 --- a/pages/groups.md +++ b/pages/groups.md @@ -9,69 +9,45 @@ headname: Groups
    - -
    - -
    It made a difference to that one. +
    +
    It made a difference to that one.
    -

    I have a simple motto in life: Do what you can, where you are, with what you have. As a result, I believe strongly in doing whatever is in my means to make the world a better place. Below are some groups that I have either founded or joined in order to help those around me.

    - -

    Current Groups

    -
    +

    Current Groups

    +
    • Political Science Methodology Group | Co-organizer with Melina Much
      University of California, Irvine

    • -
    • Political Science Womxn's Caucus | Student leader
      University of California, Irvine

    • -
    • Political Science Workshop Coordinator
      University of California, Irvine

    • -
    • Legal Politics Writing Workshop
      University of California, Irvine

    • -
    • Center for Democracy: Writing Workshop | Member
      University of California, Irvine

    • -
    • UCI Humanities: Writing Workshop | Member
      - University of California, Irvine

    • + University of California, Irvine
    - - - -

    Previous Groups


    • Friends of the San Dimas Dog Park | Ambassador
      San Dimas, California

    • -
    • Prisoner Education Project | Volunteer
      Pomona, California

    • -
    • Tails of the City | Volunteer Photographer
      Los Angeles, California

    • -
    • Philosophy Club | President, Graphic Designer, and Banquet Chair
      California State Polytechnic University, Pomona

    • -
    • Long Distance Voter | Intern
      - Digital

    • - + Social Media Content Creator
    • Free Press | Intern
      - Digital
    • - - + Social Media Content Creator
    - -
    -
    - -
    + diff --git a/notes/notes.html b/pages/notes.md similarity index 86% rename from notes/notes.html rename to pages/notes.md index 7740377..87347b1 100644 --- a/notes/notes.html +++ b/pages/notes.md @@ -33,7 +33,7 @@

    {{ post.title }}

    diff --git a/pages/research.md b/pages/research.md index a3f42a3..5d23d9e 100644 --- a/pages/research.md +++ b/pages/research.md @@ -8,8 +8,8 @@ headname: Research

    Current Research:


    -

    Corporate Citizenship and the Threat to Democracy: Unions as a Counterbalance | 2021
    - The Supreme Court of the United States has expanded who qualifies as a citizen within American democracy to include corporations. The creation of corporate citizens threatens democratic institutions because corporations are economically motivated legal fictions whose interests do not align with the traditional understanding of what it means to be a democratic citizen. Since average citizens do not have access to the resources an average corporation has, corporate citizenship threatens to transform American democracy from a citizen-based self-government to a corporatocracy which has no incentive to be responsive to individual citizens. Traditionally, unions have acted as a counterbalance to corporate control over people’s working and political lives. However, the Court’s decision in Janus v. American Federation of State has undermined the union’s ability to fulfil its roles as collective-bargaining representative and political association. The Court’s decisions in Citizens United and Janus threaten American democracy because they focus wholly on removing government interference while expanding corporate interference in peoples’ lives. +

    Local News Access & Political Participation | 2022
    + I hypothesize that when citizens have access to a local newspaper, they are more likely to engage in traditional political participation activities, such as putting up yard signs and attending political meetings. However, newspapers are shuttering their offices throughout the United States leaving citizens without reliable information about their community. To interrogate these questions, I combine on local newspapers from the University of North Carolina Hussman School of Journalism’s News Deserts project with participation data from Harvard University’s Cooperative Election Study to identify areas where citizens lack access to community news. The results show that newspaper readership is the greatest predictor of whether a person will be politically participatory. The number of newspapers only had a marginal, varying effect on participation, social media use for politics, and monetary donations.

    @@ -18,9 +18,15 @@ headname: Research

    Previous Research:


    -

    Friedrichs v. California Teachers Association: Union Security, Campaign Finance, and the First Amendment | 2017 +

    + + Corporate Citizenship & the Threat to Democracy: Unions as a Counterbalance | 2021 +
    University of California - Irvine | First Qualifying Paper +

    + Friedrichs v. California Teachers Association: Union Security, Campaign Finance, and the First Amendment | 2017
    California State University - Fullerton | Masters Thesis -

    Deliberative Democracy and the Media it Requires | 2012
    California State Polytechnic University - Pomona | Bachelors Capstone Paper diff --git a/notes/tag-forest.html b/pages/tag-forest.md similarity index 51% rename from notes/tag-forest.html rename to pages/tag-forest.md index 811c40f..61d23b4 100644 --- a/notes/tag-forest.html +++ b/pages/tag-forest.md @@ -1,34 +1,35 @@ --- -layout: default +title: Tag-Forest headname: Tag Forest +layout: default --- - -

    + +
    -
    -
    - +
    + {%- comment -%} set tags_max to 0 {%- endcomment -%} + {% assign tags_max = 0 %} - - - {% assign tags_max = 0 %} + {%- comment -%} if the number of tags is mode than 0, set it to that number {%- endcomment -%} {% for tag in site.tags %} {% if tag[1].size > tags_max %} {% assign tags_max = tag[1].size %} - {% endif %} - {% endfor %} + {% endif %} + {% endfor %} - {% assign tag_names_array = "" %} + {%- comment -%} create an empty array and tag count {%- endcomment -%} + {% assign tag_names_array = "" %} {% assign tag_counts = "" %} {% assign first_array_element = true %} - {% for i in (1..tags_max) reversed %} + + {%- comment -%} loop through tag names and assign them to appropriate tag_name {%- endcomment -%} + {% for i in (1..tags_max) reversed %} {% assign tag_names = "" %} {% assign first_tag = true %} - - {% for tag in site.tags %} - {% if tag[1].size == i %} + {% for tag in site.tags %} + {% if tag[1].size == i %} {% if first_tag %} {% assign first_tag = false %} {% else %} @@ -38,9 +39,9 @@ {% endif %} {% endfor %} - {% if tag_names != "" %} - {% assign tag_names = tag_names | split: "," | sort | join: "," %} - + {%- comment -%} if tag name is empty, append the tag names to the array and increment {%- endcomment -%} + {% if tag_names != "" %} + {% assign tag_names = tag_names | split: "," | sort | join: "," %} {% if first_array_element %} {% assign first_array_element = false %} {% else %} @@ -51,36 +52,35 @@ {% assign tag_counts = tag_counts | append: i %} {% endif %} {% endfor %} + {% assign tag_names_array = tag_names_array | split: "|" %} - {% assign tag_names_array = tag_names_array | split: "|" %} + {%- comment -%} create two arrays [shown on website] {%- endcomment -%} {% assign tag_counts = tag_counts | split: "|" %} - -
    -
    -
    -
    - - -
    -
    +
    +
    +
    +
    {% for tag_names in tag_names_array %} {% assign tag_names_list = tag_names | split: "," %} {% for tag_name in tag_names_list %} @@ -89,23 +89,13 @@

    {{ tag_name }}

    {% for tag in site.tags %} {% if tag[0] == tag_name %}
    - {% for entry in tag.last %}
      -
    • - {% for post in site.posts %} -
      {{ post.title }}
      - {{ post.excerpt }} - - {% include readmore.html %} - - {% endfor %} + {% for post in tag[1] %} +
      {{ post.title }}
      + {% endfor %}
    - - - - {% endfor %}
    {% endif %} {% endfor %} @@ -113,15 +103,14 @@
    {{ post.title }} - +
    + {%- comment -%} all-posts button {%- endcomment -%} + + +
    -
    -
    - -
    -
    +
    diff --git a/sandbox.code-workspace b/sandbox.code-workspace new file mode 100644 index 0000000..41fa9c1 --- /dev/null +++ b/sandbox.code-workspace @@ -0,0 +1,10 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": { + "liquid.format.enable": false + } +} \ No newline at end of file