diff --git a/book/base.min.css b/book/base.min.css index 1ae36b4..b1891eb 100644 --- a/book/base.min.css +++ b/book/base.min.css @@ -1,207 +1,5 @@ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab filetype=css: */ /*! * Base CSS for pdf2htmlEX * Copyright 2012,2013 Lu Wang - * https://github.com/coolwanglu/pdf2htmlEX/blob/master/share/LICENSE - */ -/* Part 1: Web Page Layout: Free to modify, except for a few of them which are required by pdf2htmlEX.js, see the comments */ -#sidebar { /* Sidebar */ - position:absolute; - top:0; - left:0; - bottom:0; - width:250px; - padding:0; - margin:0px; - overflow:auto; -} -#page-container { /* PDF container */ - position:absolute; /* required for calculating relative positions of pages in pdf2htmlEX.js */ - top:0; - left:0px; - margin:0; - padding:0; - border:0; /* required for lazy page loading in pdf2htmlEX.js (page visibility test) */ -} -@media screen { - /* for sidebar */ - #sidebar.opened + #page-container { left:250px; } - #page-container { - /* `bottom' and `right' are required for lazy page loading in pdf2htmlEX.js (page visibility test) - * alternatively you may set width and height - */ - bottom:0; - right:0; - overflow:auto; - } - .loading-indicator { - display:none; - } - .loading-indicator.active { - display:block; - position:absolute; - width:64px; - height:64px; - top:50%; - left:50%; - margin-top:-32px; - margin-left:-32px; - } - .loading-indicator img { - position:absolute; - top:0; - left:0; - bottom:0; - right:0; - } -} -@media print { - @page { margin:0; } - html { margin:0; } - body { - margin:0; - -webkit-print-color-adjust:exact; /* enable printing background images for WebKit */ - } - #sidebar { display:none; } - #page-container { - width:auto; - height:auto; - overflow:visible; - background-color:transparent; - } - .d { display:none; } -} -/* Part 2: Page Elements: Modify with caution - * The followings are base classes, some of which are meant to be override by PDF specific classes - * So do not increase the specificity (e.g. ".classname" -> "#page-container .classname") - */ -.pf { /* page */ - position:relative; - background-color:white; - overflow: hidden; - margin:0; - border:0; /* required by pdf2htmlEX.js for page visibility test */ -} -.pc { /* content of a page */ - position:absolute; - border:0; - padding:0; - margin:0; - top:0; - left:0; - width:100%; - height:100%; - overflow:hidden; - display:block; - /* set transform-origin for scaling */ - transform-origin:0% 0%; - -ms-transform-origin:0% 0%; - -webkit-transform-origin:0% 0%; -} -.pc.opened { /* used by pdf2htmlEX.js, to show/hide pages */ - display:block; -} -.bf { /* images that occupies the whole page */ - position:absolute; - border:0; - margin:0; - top:0; - bottom:0; - width:100%; - height:100%; - -ms-user-select:none; - -moz-user-select:none; - -webkit-user-select:none; - user-select:none; -} -.bi { /* images that cover only a part of the page */ - position:absolute; - border:0; - margin:0; - -ms-user-select:none; - -moz-user-select:none; - -webkit-user-select:none; - user-select:none; -} -@media print { - .pf { - margin:0; - box-shadow:none; - page-break-after:always; - page-break-inside:avoid; - } - @-moz-document url-prefix() { - /* fix page truncation for FireFox */ - .pf { - overflow:visible; - border:1px solid #FFFFFF; - } - .pc {overflow:visible;} - } -} -.c { /* clip box */ - position:absolute; - border:0; - padding:0; - margin:0; - overflow:hidden; - display:block; -} -.t { /* text line */ - position:absolute; - white-space:pre; - font-size:1px; - transform-origin:0% 100%; - -ms-transform-origin:0% 100%; - -webkit-transform-origin:0% 100%; - unicode-bidi:bidi-override;/* For rtl languages, e.g. Hebrew, we don't want the default Unicode behaviour */ - -moz-font-feature-settings:"liga" 0;/* We don't want Firefox to recognize ligatures */ -} -.t:after { /* webkit #35443 */ - content: ''; -} -.t:before { /* Workaround Blink(up to 41)/Webkit bug of word-spacing with leading spaces (chromium #404444 and pdf2htmlEX #412) */ - content: ''; - display: inline-block; -} -.t span { /* text blocks within a line */ - /* Blink(up to 41)/Webkit have bug with negative word-spacing and inline-block (pdf2htmlEX #416), so keep normal span inline. */ - position:relative; - unicode-bidi:bidi-override; /* For rtl languages, e.g. Hebrew, we don't want the default Unicode behaviour */ -} -._ { /* text shift */ - /* Blink(up to 41)/Webkit have bug with inline element, continuous spaces and word-spacing. Workaround by inline-block. */ - display: inline-block; - color: transparent; - z-index: -1; -} -/* selection background should not be opaque, for fallback mode */ -::selection{ - background: rgba(127,255,255,0.4); -} -::-moz-selection{ - background: rgba(127,255,255,0.4); -} -.pi { /* info for Javascript */ - display:none; -} -.l { /* annotation links */ -} -/* transparent color - WebKit */ -.d { /* css drawing */ - position:absolute; - transform-origin:0% 100%; - -ms-transform-origin:0% 100%; - -webkit-transform-origin:0% 100%; -} -/* for the forms */ -.it { - border: none; - background-color: rgba(255, 255, 255, 0.0); -} - -.ir:hover { - cursor: pointer; -} - -/* Base CSS END */ + * https://github.com/pdf2htmlEX/pdf2htmlEX/blob/master/share/LICENSE + */#sidebar{position:absolute;top:0;left:0;bottom:0;width:250px;padding:0;margin:0;overflow:auto}#page-container{position:absolute;top:0;left:0;margin:0;padding:0;border:0}@media screen{#sidebar.opened+#page-container{left:250px}#page-container{bottom:0;right:0;overflow:auto}.loading-indicator{display:none}.loading-indicator.active{display:block;position:absolute;width:64px;height:64px;top:50%;left:50%;margin-top:-32px;margin-left:-32px}.loading-indicator img{position:absolute;top:0;left:0;bottom:0;right:0}}@media print{@page{margin:0}html{margin:0}body{margin:0;-webkit-print-color-adjust:exact}#sidebar{display:none}#page-container{width:auto;height:auto;overflow:visible;background-color:transparent}.d{display:none}}.pf{position:relative;background-color:white;overflow:hidden;margin:0;border:0}.pc{position:absolute;border:0;padding:0;margin:0;top:0;left:0;width:100%;height:100%;overflow:hidden;display:block;transform-origin:0 0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0}.pc.opened{display:block}.bf{position:absolute;border:0;margin:0;top:0;bottom:0;width:100%;height:100%;-ms-user-select:none;-moz-user-select:none;-webkit-user-select:none;user-select:none}.bi{position:absolute;border:0;margin:0;-ms-user-select:none;-moz-user-select:none;-webkit-user-select:none;user-select:none}@media print{.pf{margin:0;box-shadow:none;page-break-after:always;page-break-inside:avoid}@-moz-document url-prefix(){.pf{overflow:visible;border:1px solid #fff}.pc{overflow:visible}}}.c{position:absolute;border:0;padding:0;margin:0;overflow:hidden;display:block}.t{position:absolute;white-space:pre;font-size:1px;transform-origin:0 100%;-ms-transform-origin:0 100%;-webkit-transform-origin:0 100%;unicode-bidi:bidi-override;-moz-font-feature-settings:"liga" 0}.t:after{content:''}.t:before{content:'';display:inline-block}.t span{position:relative;unicode-bidi:bidi-override}._{display:inline-block;color:transparent;z-index:-1}::selection{background:rgba(127,255,255,0.4)}::-moz-selection{background:rgba(127,255,255,0.4)}.pi{display:none}.d{position:absolute;transform-origin:0 100%;-ms-transform-origin:0 100%;-webkit-transform-origin:0 100%}.it{border:0;background-color:rgba(255,255,255,0.0)}.ir:hover{cursor:pointer} \ No newline at end of file diff --git a/book/bg1.png b/book/bg1.png index b43ddab..a5ea89c 100644 Binary files a/book/bg1.png and b/book/bg1.png differ diff --git a/book/bg10.png b/book/bg10.png index 12fa327..daa8a15 100644 Binary files a/book/bg10.png and b/book/bg10.png differ diff --git a/book/bg11.png b/book/bg11.png index 99854b4..39dd120 100644 Binary files a/book/bg11.png and b/book/bg11.png differ diff --git a/book/bg12.png b/book/bg12.png index 7bda5e2..e4e597a 100644 Binary files a/book/bg12.png and b/book/bg12.png differ diff --git a/book/bg13.png b/book/bg13.png index 178f52e..455ea91 100644 Binary files a/book/bg13.png and b/book/bg13.png differ diff --git a/book/bg14.png b/book/bg14.png index 210ac15..d34b20e 100644 Binary files a/book/bg14.png and b/book/bg14.png differ diff --git a/book/bg15.png b/book/bg15.png index c490cb8..123e5a2 100644 Binary files a/book/bg15.png and b/book/bg15.png differ diff --git a/book/bg16.png b/book/bg16.png index 86ae63e..19a9a0a 100644 Binary files a/book/bg16.png and b/book/bg16.png differ diff --git a/book/bg17.png b/book/bg17.png index 26da667..d8b045e 100644 Binary files a/book/bg17.png and b/book/bg17.png differ diff --git a/book/bg18.png b/book/bg18.png index 7c65f01..4e7975d 100644 Binary files a/book/bg18.png and b/book/bg18.png differ diff --git a/book/bg19.png b/book/bg19.png index 29d96ea..31a4fd6 100644 Binary files a/book/bg19.png and b/book/bg19.png differ diff --git a/book/bg1a.png b/book/bg1a.png index 49c0bcc..9edf77e 100644 Binary files a/book/bg1a.png and b/book/bg1a.png differ diff --git a/book/bg1b.png b/book/bg1b.png index ba4e949..5bf4006 100644 Binary files a/book/bg1b.png and b/book/bg1b.png differ diff --git a/book/bg1c.png b/book/bg1c.png index 71bbd51..2567c41 100644 Binary files a/book/bg1c.png and b/book/bg1c.png differ diff --git a/book/bg1d.png b/book/bg1d.png index 6a0ba21..778ff37 100644 Binary files a/book/bg1d.png and b/book/bg1d.png differ diff --git a/book/bg1e.png b/book/bg1e.png index d22fd02..4555036 100644 Binary files a/book/bg1e.png and b/book/bg1e.png differ diff --git a/book/bg1f.png b/book/bg1f.png index cb7927f..04ef827 100644 Binary files a/book/bg1f.png and b/book/bg1f.png differ diff --git a/book/bg2.png b/book/bg2.png new file mode 100644 index 0000000..c31275c Binary files /dev/null and b/book/bg2.png differ diff --git a/book/bg20.png b/book/bg20.png index b2c6691..6b4d38e 100644 Binary files a/book/bg20.png and b/book/bg20.png differ diff --git a/book/bg21.png b/book/bg21.png index f5e0e29..55b43e0 100644 Binary files a/book/bg21.png and b/book/bg21.png differ diff --git a/book/bg22.png b/book/bg22.png index 935029f..b5dfb98 100644 Binary files a/book/bg22.png and b/book/bg22.png differ diff --git a/book/bg23.png b/book/bg23.png index 0776741..952dfbd 100644 Binary files a/book/bg23.png and b/book/bg23.png differ diff --git a/book/bg24.png b/book/bg24.png index 0b5ac51..31aeaf4 100644 Binary files a/book/bg24.png and b/book/bg24.png differ diff --git a/book/bg25.png b/book/bg25.png index 0980b65..263701e 100644 Binary files a/book/bg25.png and b/book/bg25.png differ diff --git a/book/bg26.png b/book/bg26.png index 775c23e..74ee957 100644 Binary files a/book/bg26.png and b/book/bg26.png differ diff --git a/book/bg27.png b/book/bg27.png index f2936a6..8dfdc86 100644 Binary files a/book/bg27.png and b/book/bg27.png differ diff --git a/book/bg28.png b/book/bg28.png index 26aae6b..b16137f 100644 Binary files a/book/bg28.png and b/book/bg28.png differ diff --git a/book/bg29.png b/book/bg29.png index 1c4b2d3..b83f093 100644 Binary files a/book/bg29.png and b/book/bg29.png differ diff --git a/book/bg2a.png b/book/bg2a.png index 10c7e4c..d5ef0f5 100644 Binary files a/book/bg2a.png and b/book/bg2a.png differ diff --git a/book/bg2b.png b/book/bg2b.png index cbfe59e..0e64b28 100644 Binary files a/book/bg2b.png and b/book/bg2b.png differ diff --git a/book/bg2c.png b/book/bg2c.png index 977524a..6867e04 100644 Binary files a/book/bg2c.png and b/book/bg2c.png differ diff --git a/book/bg2d.png b/book/bg2d.png index 5c9ba9a..820ae70 100644 Binary files a/book/bg2d.png and b/book/bg2d.png differ diff --git a/book/bg2e.png b/book/bg2e.png index d2fa2da..4164ea6 100644 Binary files a/book/bg2e.png and b/book/bg2e.png differ diff --git a/book/bg2f.png b/book/bg2f.png index 178f52e..455ea91 100644 Binary files a/book/bg2f.png and b/book/bg2f.png differ diff --git a/book/bg3.png b/book/bg3.png new file mode 100644 index 0000000..c31275c Binary files /dev/null and b/book/bg3.png differ diff --git a/book/bg30.png b/book/bg30.png index b67e9d3..95c278a 100644 Binary files a/book/bg30.png and b/book/bg30.png differ diff --git a/book/bg31.png b/book/bg31.png index dfdfeca..f29a747 100644 Binary files a/book/bg31.png and b/book/bg31.png differ diff --git a/book/bg32.png b/book/bg32.png index 60f9d43..c83c233 100644 Binary files a/book/bg32.png and b/book/bg32.png differ diff --git a/book/bg33.png b/book/bg33.png index 7f58eea..43153ee 100644 Binary files a/book/bg33.png and b/book/bg33.png differ diff --git a/book/bg34.png b/book/bg34.png index d1e43ad..8109ccb 100644 Binary files a/book/bg34.png and b/book/bg34.png differ diff --git a/book/bg35.png b/book/bg35.png index e12bb5e..dffcebd 100644 Binary files a/book/bg35.png and b/book/bg35.png differ diff --git a/book/bg36.png b/book/bg36.png index 9c91c9e..102559b 100644 Binary files a/book/bg36.png and b/book/bg36.png differ diff --git a/book/bg37.png b/book/bg37.png index 4f2bc36..b16b20b 100644 Binary files a/book/bg37.png and b/book/bg37.png differ diff --git a/book/bg38.png b/book/bg38.png index aeb4063..da1fb82 100644 Binary files a/book/bg38.png and b/book/bg38.png differ diff --git a/book/bg39.png b/book/bg39.png index addb03a..06d34c8 100644 Binary files a/book/bg39.png and b/book/bg39.png differ diff --git a/book/bg3a.png b/book/bg3a.png index a302774..a74e1e9 100644 Binary files a/book/bg3a.png and b/book/bg3a.png differ diff --git a/book/bg3b.png b/book/bg3b.png index 9ba06f8..e40be5f 100644 Binary files a/book/bg3b.png and b/book/bg3b.png differ diff --git a/book/bg3c.png b/book/bg3c.png index 9be8fab..5a7e109 100644 Binary files a/book/bg3c.png and b/book/bg3c.png differ diff --git a/book/bg3d.png b/book/bg3d.png index a6832b3..853ff1b 100644 Binary files a/book/bg3d.png and b/book/bg3d.png differ diff --git a/book/bg3e.png b/book/bg3e.png index 0e32a97..d92392d 100644 Binary files a/book/bg3e.png and b/book/bg3e.png differ diff --git a/book/bg3f.png b/book/bg3f.png index a1b786e..7898bd9 100644 Binary files a/book/bg3f.png and b/book/bg3f.png differ diff --git a/book/bg4.png b/book/bg4.png new file mode 100644 index 0000000..c31275c Binary files /dev/null and b/book/bg4.png differ diff --git a/book/bg40.png b/book/bg40.png index 08d944b..d3f65f6 100644 Binary files a/book/bg40.png and b/book/bg40.png differ diff --git a/book/bg41.png b/book/bg41.png index 71bd08e..eba30fd 100644 Binary files a/book/bg41.png and b/book/bg41.png differ diff --git a/book/bg42.png b/book/bg42.png index 3360aa2..1f35167 100644 Binary files a/book/bg42.png and b/book/bg42.png differ diff --git a/book/bg43.png b/book/bg43.png new file mode 100644 index 0000000..c31275c Binary files /dev/null and b/book/bg43.png differ diff --git a/book/bg44.png b/book/bg44.png index 688242d..b621a7f 100644 Binary files a/book/bg44.png and b/book/bg44.png differ diff --git a/book/bg45.png b/book/bg45.png index aba8139..7cfa3fd 100644 Binary files a/book/bg45.png and b/book/bg45.png differ diff --git a/book/bg46.png b/book/bg46.png index 999338c..cf8b264 100644 Binary files a/book/bg46.png and b/book/bg46.png differ diff --git a/book/bg47.png b/book/bg47.png index 3646caa..49f6426 100644 Binary files a/book/bg47.png and b/book/bg47.png differ diff --git a/book/bg48.png b/book/bg48.png index c4c830c..bc15369 100644 Binary files a/book/bg48.png and b/book/bg48.png differ diff --git a/book/bg49.png b/book/bg49.png index 78217e2..d698894 100644 Binary files a/book/bg49.png and b/book/bg49.png differ diff --git a/book/bg4a.png b/book/bg4a.png index 27aea88..19c750a 100644 Binary files a/book/bg4a.png and b/book/bg4a.png differ diff --git a/book/bg4b.png b/book/bg4b.png index de88765..51ad7c1 100644 Binary files a/book/bg4b.png and b/book/bg4b.png differ diff --git a/book/bg4c.png b/book/bg4c.png index 1395b24..e0983e7 100644 Binary files a/book/bg4c.png and b/book/bg4c.png differ diff --git a/book/bg4d.png b/book/bg4d.png index 499b6ba..622c1fb 100644 Binary files a/book/bg4d.png and b/book/bg4d.png differ diff --git a/book/bg4e.png b/book/bg4e.png index c34a869..19f94d4 100644 Binary files a/book/bg4e.png and b/book/bg4e.png differ diff --git a/book/bg4f.png b/book/bg4f.png index cf74f6d..52269b7 100644 Binary files a/book/bg4f.png and b/book/bg4f.png differ diff --git a/book/bg5.png b/book/bg5.png new file mode 100644 index 0000000..c31275c Binary files /dev/null and b/book/bg5.png differ diff --git a/book/bg50.png b/book/bg50.png index 40591ba..95c2a06 100644 Binary files a/book/bg50.png and b/book/bg50.png differ diff --git a/book/bg51.png b/book/bg51.png index b265168..a24850d 100644 Binary files a/book/bg51.png and b/book/bg51.png differ diff --git a/book/bg52.png b/book/bg52.png index 51f312a..a75b94a 100644 Binary files a/book/bg52.png and b/book/bg52.png differ diff --git a/book/bg53.png b/book/bg53.png index 67d7ba5..d0d629f 100644 Binary files a/book/bg53.png and b/book/bg53.png differ diff --git a/book/bg54.png b/book/bg54.png index d4fcc30..81efcdf 100644 Binary files a/book/bg54.png and b/book/bg54.png differ diff --git a/book/bg55.png b/book/bg55.png index 9d9fac1..8fc4d72 100644 Binary files a/book/bg55.png and b/book/bg55.png differ diff --git a/book/bg56.png b/book/bg56.png index eca3f69..85cc625 100644 Binary files a/book/bg56.png and b/book/bg56.png differ diff --git a/book/bg57.png b/book/bg57.png index be061ad..ca0f238 100644 Binary files a/book/bg57.png and b/book/bg57.png differ diff --git a/book/bg58.png b/book/bg58.png index fb559cc..decd34f 100644 Binary files a/book/bg58.png and b/book/bg58.png differ diff --git a/book/bg59.png b/book/bg59.png index 974b65b..7aaad75 100644 Binary files a/book/bg59.png and b/book/bg59.png differ diff --git a/book/bg5a.png b/book/bg5a.png index a897445..d83ee1e 100644 Binary files a/book/bg5a.png and b/book/bg5a.png differ diff --git a/book/bg5b.png b/book/bg5b.png index d5e1321..5e6d81d 100644 Binary files a/book/bg5b.png and b/book/bg5b.png differ diff --git a/book/bg5c.png b/book/bg5c.png index a451844..d67d06c 100644 Binary files a/book/bg5c.png and b/book/bg5c.png differ diff --git a/book/bg5d.png b/book/bg5d.png index 68ff79d..fcbf492 100644 Binary files a/book/bg5d.png and b/book/bg5d.png differ diff --git a/book/bg5e.png b/book/bg5e.png index 224c204..aae3687 100644 Binary files a/book/bg5e.png and b/book/bg5e.png differ diff --git a/book/bg5f.png b/book/bg5f.png index 78323e8..9019666 100644 Binary files a/book/bg5f.png and b/book/bg5f.png differ diff --git a/book/bg6.png b/book/bg6.png new file mode 100644 index 0000000..c31275c Binary files /dev/null and b/book/bg6.png differ diff --git a/book/bg60.png b/book/bg60.png index 98bcbf2..397389e 100644 Binary files a/book/bg60.png and b/book/bg60.png differ diff --git a/book/bg61.png b/book/bg61.png index 42bbe2c..3b75d66 100644 Binary files a/book/bg61.png and b/book/bg61.png differ diff --git a/book/bg62.png b/book/bg62.png index f7a5feb..c9baab7 100644 Binary files a/book/bg62.png and b/book/bg62.png differ diff --git a/book/bg63.png b/book/bg63.png index 13377cb..fd42bb3 100644 Binary files a/book/bg63.png and b/book/bg63.png differ diff --git a/book/bg64.png b/book/bg64.png index 77adfb3..ea075d8 100644 Binary files a/book/bg64.png and b/book/bg64.png differ diff --git a/book/bg65.png b/book/bg65.png index c1a614f..906a9b5 100644 Binary files a/book/bg65.png and b/book/bg65.png differ diff --git a/book/bg66.png b/book/bg66.png index 226c7aa..7038af1 100644 Binary files a/book/bg66.png and b/book/bg66.png differ diff --git a/book/bg67.png b/book/bg67.png index 8ebdf0d..dcc2858 100644 Binary files a/book/bg67.png and b/book/bg67.png differ diff --git a/book/bg68.png b/book/bg68.png index 9d2deba..143d7a4 100644 Binary files a/book/bg68.png and b/book/bg68.png differ diff --git a/book/bg69.png b/book/bg69.png index 7c7b878..8b8db6b 100644 Binary files a/book/bg69.png and b/book/bg69.png differ diff --git a/book/bg6a.png b/book/bg6a.png index 603ed09..f93bec4 100644 Binary files a/book/bg6a.png and b/book/bg6a.png differ diff --git a/book/bg6b.png b/book/bg6b.png index b3ce6ff..06a6785 100644 Binary files a/book/bg6b.png and b/book/bg6b.png differ diff --git a/book/bg6c.png b/book/bg6c.png index 263b1b1..e50309d 100644 Binary files a/book/bg6c.png and b/book/bg6c.png differ diff --git a/book/bg6d.png b/book/bg6d.png index 24a49d0..eea1178 100644 Binary files a/book/bg6d.png and b/book/bg6d.png differ diff --git a/book/bg6e.png b/book/bg6e.png index 1e57d66..9e90ef4 100644 Binary files a/book/bg6e.png and b/book/bg6e.png differ diff --git a/book/bg6f.png b/book/bg6f.png index 6f16b46..6ddd4e5 100644 Binary files a/book/bg6f.png and b/book/bg6f.png differ diff --git a/book/bg7.png b/book/bg7.png new file mode 100644 index 0000000..c31275c Binary files /dev/null and b/book/bg7.png differ diff --git a/book/bg70.png b/book/bg70.png index d45ecb2..6da7fb5 100644 Binary files a/book/bg70.png and b/book/bg70.png differ diff --git a/book/bg71.png b/book/bg71.png index 81ee45e..71610a6 100644 Binary files a/book/bg71.png and b/book/bg71.png differ diff --git a/book/bg72.png b/book/bg72.png index 85968fd..8d6cf93 100644 Binary files a/book/bg72.png and b/book/bg72.png differ diff --git a/book/bg73.png b/book/bg73.png index 2ef351f..11ed7be 100644 Binary files a/book/bg73.png and b/book/bg73.png differ diff --git a/book/bg74.png b/book/bg74.png index fc459b8..eaf02c8 100644 Binary files a/book/bg74.png and b/book/bg74.png differ diff --git a/book/bg75.png b/book/bg75.png index 951eb0e..8e1152f 100644 Binary files a/book/bg75.png and b/book/bg75.png differ diff --git a/book/bg76.png b/book/bg76.png index 3193516..66c9fe2 100644 Binary files a/book/bg76.png and b/book/bg76.png differ diff --git a/book/bg77.png b/book/bg77.png index 07d6da3..f9d78a8 100644 Binary files a/book/bg77.png and b/book/bg77.png differ diff --git a/book/bg78.png b/book/bg78.png index 3317157..ffbbb95 100644 Binary files a/book/bg78.png and b/book/bg78.png differ diff --git a/book/bg79.png b/book/bg79.png index 36fd63f..a004920 100644 Binary files a/book/bg79.png and b/book/bg79.png differ diff --git a/book/bg7a.png b/book/bg7a.png index 72a6b89..ae565dd 100644 Binary files a/book/bg7a.png and b/book/bg7a.png differ diff --git a/book/bg7b.png b/book/bg7b.png new file mode 100644 index 0000000..c31275c Binary files /dev/null and b/book/bg7b.png differ diff --git a/book/bg7c.png b/book/bg7c.png new file mode 100644 index 0000000..c31275c Binary files /dev/null and b/book/bg7c.png differ diff --git a/book/bg7d.png b/book/bg7d.png index 730977a..85f7438 100644 Binary files a/book/bg7d.png and b/book/bg7d.png differ diff --git a/book/bg7e.png b/book/bg7e.png index 30ac1f6..ff01fe1 100644 Binary files a/book/bg7e.png and b/book/bg7e.png differ diff --git a/book/bg7f.png b/book/bg7f.png index 29b9a23..204a140 100644 Binary files a/book/bg7f.png and b/book/bg7f.png differ diff --git a/book/bg8.png b/book/bg8.png new file mode 100644 index 0000000..c31275c Binary files /dev/null and b/book/bg8.png differ diff --git a/book/bg80.png b/book/bg80.png index a41fe24..503abf0 100644 Binary files a/book/bg80.png and b/book/bg80.png differ diff --git a/book/bg81.png b/book/bg81.png index 42f10fd..c6ce8f8 100644 Binary files a/book/bg81.png and b/book/bg81.png differ diff --git a/book/bg82.png b/book/bg82.png index 33fb85f..c281461 100644 Binary files a/book/bg82.png and b/book/bg82.png differ diff --git a/book/bg83.png b/book/bg83.png index c0ea842..ae8cefa 100644 Binary files a/book/bg83.png and b/book/bg83.png differ diff --git a/book/bg84.png b/book/bg84.png index 3d0e501..ab6c58e 100644 Binary files a/book/bg84.png and b/book/bg84.png differ diff --git a/book/bg85.png b/book/bg85.png index ad3ad06..038fa0b 100644 Binary files a/book/bg85.png and b/book/bg85.png differ diff --git a/book/bg86.png b/book/bg86.png index b310f13..d32dbb0 100644 Binary files a/book/bg86.png and b/book/bg86.png differ diff --git a/book/bg87.png b/book/bg87.png index aaf8ed6..0900e7f 100644 Binary files a/book/bg87.png and b/book/bg87.png differ diff --git a/book/bg88.png b/book/bg88.png index a5d68f3..0350932 100644 Binary files a/book/bg88.png and b/book/bg88.png differ diff --git a/book/bg89.png b/book/bg89.png index e0fdd9a..0aaf2f5 100644 Binary files a/book/bg89.png and b/book/bg89.png differ diff --git a/book/bg8a.png b/book/bg8a.png index d62b8c5..df0fcb1 100644 Binary files a/book/bg8a.png and b/book/bg8a.png differ diff --git a/book/bg8b.png b/book/bg8b.png index 97d102a..9c1ee29 100644 Binary files a/book/bg8b.png and b/book/bg8b.png differ diff --git a/book/bg8c.png b/book/bg8c.png index e7653be..f3e6543 100644 Binary files a/book/bg8c.png and b/book/bg8c.png differ diff --git a/book/bg8d.png b/book/bg8d.png index 8eb7bf2..e3a5644 100644 Binary files a/book/bg8d.png and b/book/bg8d.png differ diff --git a/book/bg8e.png b/book/bg8e.png index 92ddd30..5bcdf2d 100644 Binary files a/book/bg8e.png and b/book/bg8e.png differ diff --git a/book/bg8f.png b/book/bg8f.png index e13c2ff..13bd3aa 100644 Binary files a/book/bg8f.png and b/book/bg8f.png differ diff --git a/book/bg9.png b/book/bg9.png new file mode 100644 index 0000000..c31275c Binary files /dev/null and b/book/bg9.png differ diff --git a/book/bg90.png b/book/bg90.png new file mode 100644 index 0000000..c31275c Binary files /dev/null and b/book/bg90.png differ diff --git a/book/bg91.png b/book/bg91.png index 54d9d25..ea76542 100644 Binary files a/book/bg91.png and b/book/bg91.png differ diff --git a/book/bg92.png b/book/bg92.png index fb06049..0f8c4b7 100644 Binary files a/book/bg92.png and b/book/bg92.png differ diff --git a/book/bg93.png b/book/bg93.png index ab182d3..e343f27 100644 Binary files a/book/bg93.png and b/book/bg93.png differ diff --git a/book/bg94.png b/book/bg94.png index 746a05d..48c1a03 100644 Binary files a/book/bg94.png and b/book/bg94.png differ diff --git a/book/bg95.png b/book/bg95.png index 83bdbdc..0743b38 100644 Binary files a/book/bg95.png and b/book/bg95.png differ diff --git a/book/bg96.png b/book/bg96.png new file mode 100644 index 0000000..c31275c Binary files /dev/null and b/book/bg96.png differ diff --git a/book/bg97.png b/book/bg97.png index 806d041..ccf5c92 100644 Binary files a/book/bg97.png and b/book/bg97.png differ diff --git a/book/bg98.png b/book/bg98.png index 1a3b8f8..ca514ae 100644 Binary files a/book/bg98.png and b/book/bg98.png differ diff --git a/book/bga.png b/book/bga.png new file mode 100644 index 0000000..c31275c Binary files /dev/null and b/book/bga.png differ diff --git a/book/bgb.png b/book/bgb.png new file mode 100644 index 0000000..c31275c Binary files /dev/null and b/book/bgb.png differ diff --git a/book/bgc.png b/book/bgc.png new file mode 100644 index 0000000..c31275c Binary files /dev/null and b/book/bgc.png differ diff --git a/book/bgd.png b/book/bgd.png new file mode 100644 index 0000000..c31275c Binary files /dev/null and b/book/bgd.png differ diff --git a/book/bge.png b/book/bge.png new file mode 100644 index 0000000..c31275c Binary files /dev/null and b/book/bge.png differ diff --git a/book/bgf.png b/book/bgf.png new file mode 100644 index 0000000..c31275c Binary files /dev/null and b/book/bgf.png differ diff --git a/book/f1.woff b/book/f1.woff index 9a94ed6..fa12cc4 100644 Binary files a/book/f1.woff and b/book/f1.woff differ diff --git a/book/f10.woff b/book/f10.woff index 97df489..f9bc204 100644 Binary files a/book/f10.woff and b/book/f10.woff differ diff --git a/book/f11.woff b/book/f11.woff index 575995a..7b8864a 100644 Binary files a/book/f11.woff and b/book/f11.woff differ diff --git a/book/f12.woff b/book/f12.woff index f98b18d..e1371f7 100644 Binary files a/book/f12.woff and b/book/f12.woff differ diff --git a/book/f13.woff b/book/f13.woff index 7374012..27f34d6 100644 Binary files a/book/f13.woff and b/book/f13.woff differ diff --git a/book/f14.woff b/book/f14.woff index f0901eb..d69a91b 100644 Binary files a/book/f14.woff and b/book/f14.woff differ diff --git a/book/f15.woff b/book/f15.woff index 2afe7c2..3b360ef 100644 Binary files a/book/f15.woff and b/book/f15.woff differ diff --git a/book/f16.woff b/book/f16.woff index b893f7a..1a00957 100644 Binary files a/book/f16.woff and b/book/f16.woff differ diff --git a/book/f17.woff b/book/f17.woff index 676e99f..b0d837c 100644 Binary files a/book/f17.woff and b/book/f17.woff differ diff --git a/book/f18.woff b/book/f18.woff index f5d7af3..58fcc83 100644 Binary files a/book/f18.woff and b/book/f18.woff differ diff --git a/book/f19.woff b/book/f19.woff index a4498c0..65860bb 100644 Binary files a/book/f19.woff and b/book/f19.woff differ diff --git a/book/f1a.woff b/book/f1a.woff index d19490c..e66e735 100644 Binary files a/book/f1a.woff and b/book/f1a.woff differ diff --git a/book/f1b.woff b/book/f1b.woff index 3a653c1..74426e6 100644 Binary files a/book/f1b.woff and b/book/f1b.woff differ diff --git a/book/f1c.woff b/book/f1c.woff index d7628d6..a2963d2 100644 Binary files a/book/f1c.woff and b/book/f1c.woff differ diff --git a/book/f1d.woff b/book/f1d.woff index 184f59f..11af064 100644 Binary files a/book/f1d.woff and b/book/f1d.woff differ diff --git a/book/f1e.woff b/book/f1e.woff index 8f1937d..e4f94be 100644 Binary files a/book/f1e.woff and b/book/f1e.woff differ diff --git a/book/f1f.woff b/book/f1f.woff index e3dbdab..d81fb0b 100644 Binary files a/book/f1f.woff and b/book/f1f.woff differ diff --git a/book/f2.woff b/book/f2.woff index 2ea99d9..55fbfc0 100644 Binary files a/book/f2.woff and b/book/f2.woff differ diff --git a/book/f20.woff b/book/f20.woff index 90dacca..9c6864a 100644 Binary files a/book/f20.woff and b/book/f20.woff differ diff --git a/book/f21.woff b/book/f21.woff index f211789..8c6898d 100644 Binary files a/book/f21.woff and b/book/f21.woff differ diff --git a/book/f22.woff b/book/f22.woff index 62fed2d..b4514ad 100644 Binary files a/book/f22.woff and b/book/f22.woff differ diff --git a/book/f23.woff b/book/f23.woff index 61d302a..55f9189 100644 Binary files a/book/f23.woff and b/book/f23.woff differ diff --git a/book/f24.woff b/book/f24.woff index 2018aa9..1a2038e 100644 Binary files a/book/f24.woff and b/book/f24.woff differ diff --git a/book/f25.woff b/book/f25.woff index decda08..293b85d 100644 Binary files a/book/f25.woff and b/book/f25.woff differ diff --git a/book/f26.woff b/book/f26.woff index a34cd85..ccce30d 100644 Binary files a/book/f26.woff and b/book/f26.woff differ diff --git a/book/f27.woff b/book/f27.woff index d3c169f..b7acb0a 100644 Binary files a/book/f27.woff and b/book/f27.woff differ diff --git a/book/f28.woff b/book/f28.woff index d8cb2a2..8554e3b 100644 Binary files a/book/f28.woff and b/book/f28.woff differ diff --git a/book/f29.woff b/book/f29.woff index fdf6d10..11877f0 100644 Binary files a/book/f29.woff and b/book/f29.woff differ diff --git a/book/f2a.woff b/book/f2a.woff index 0baa8b9..3411468 100644 Binary files a/book/f2a.woff and b/book/f2a.woff differ diff --git a/book/f2b.woff b/book/f2b.woff index f83cf09..72717a8 100644 Binary files a/book/f2b.woff and b/book/f2b.woff differ diff --git a/book/f2c.woff b/book/f2c.woff index 255e06a..735613a 100644 Binary files a/book/f2c.woff and b/book/f2c.woff differ diff --git a/book/f2d.woff b/book/f2d.woff index 6410577..01eaa58 100644 Binary files a/book/f2d.woff and b/book/f2d.woff differ diff --git a/book/f2e.woff b/book/f2e.woff index 161074d..62cec3d 100644 Binary files a/book/f2e.woff and b/book/f2e.woff differ diff --git a/book/f2f.woff b/book/f2f.woff index 66d6b2e..3d2f302 100644 Binary files a/book/f2f.woff and b/book/f2f.woff differ diff --git a/book/f3.woff b/book/f3.woff index 2041df7..36d8c4f 100644 Binary files a/book/f3.woff and b/book/f3.woff differ diff --git a/book/f30.woff b/book/f30.woff index abcaca9..483af9a 100644 Binary files a/book/f30.woff and b/book/f30.woff differ diff --git a/book/f31.woff b/book/f31.woff index 4b3d5ac..be6d0db 100644 Binary files a/book/f31.woff and b/book/f31.woff differ diff --git a/book/f32.woff b/book/f32.woff index 92dae36..7de137e 100644 Binary files a/book/f32.woff and b/book/f32.woff differ diff --git a/book/f33.woff b/book/f33.woff index e35f8d4..df44894 100644 Binary files a/book/f33.woff and b/book/f33.woff differ diff --git a/book/f34.woff b/book/f34.woff index 66d6b2e..3d2f302 100644 Binary files a/book/f34.woff and b/book/f34.woff differ diff --git a/book/f35.woff b/book/f35.woff index 1154299..19141ec 100644 Binary files a/book/f35.woff and b/book/f35.woff differ diff --git a/book/f36.woff b/book/f36.woff index 05d8c8e..7f3ce25 100644 Binary files a/book/f36.woff and b/book/f36.woff differ diff --git a/book/f37.woff b/book/f37.woff index 48dbad1..b0328b7 100644 Binary files a/book/f37.woff and b/book/f37.woff differ diff --git a/book/f38.woff b/book/f38.woff index 56d1105..0d253af 100644 Binary files a/book/f38.woff and b/book/f38.woff differ diff --git a/book/f39.woff b/book/f39.woff index 569042e..c85c85f 100644 Binary files a/book/f39.woff and b/book/f39.woff differ diff --git a/book/f3a.woff b/book/f3a.woff index d1782a8..2a41beb 100644 Binary files a/book/f3a.woff and b/book/f3a.woff differ diff --git a/book/f3b.woff b/book/f3b.woff index 1de890f..ea35ecf 100644 Binary files a/book/f3b.woff and b/book/f3b.woff differ diff --git a/book/f3c.woff b/book/f3c.woff index e879e7c..3656aa0 100644 Binary files a/book/f3c.woff and b/book/f3c.woff differ diff --git a/book/f3d.woff b/book/f3d.woff index c1f74d5..48b69bb 100644 Binary files a/book/f3d.woff and b/book/f3d.woff differ diff --git a/book/f3e.woff b/book/f3e.woff index 47abd7b..0dfc4dc 100644 Binary files a/book/f3e.woff and b/book/f3e.woff differ diff --git a/book/f3f.woff b/book/f3f.woff index 29be2b8..225ddca 100644 Binary files a/book/f3f.woff and b/book/f3f.woff differ diff --git a/book/f4.woff b/book/f4.woff index 7052d44..c078a1a 100644 Binary files a/book/f4.woff and b/book/f4.woff differ diff --git a/book/f40.woff b/book/f40.woff index 51a096a..9df17c5 100644 Binary files a/book/f40.woff and b/book/f40.woff differ diff --git a/book/f41.woff b/book/f41.woff index 1b489d4..e2daf3d 100644 Binary files a/book/f41.woff and b/book/f41.woff differ diff --git a/book/f42.woff b/book/f42.woff index 5081c1c..5b27f5c 100644 Binary files a/book/f42.woff and b/book/f42.woff differ diff --git a/book/f43.woff b/book/f43.woff index 5dbf507..7af0b54 100644 Binary files a/book/f43.woff and b/book/f43.woff differ diff --git a/book/f44.woff b/book/f44.woff index f7d96cf..0aa3a2e 100644 Binary files a/book/f44.woff and b/book/f44.woff differ diff --git a/book/f45.woff b/book/f45.woff index 1b489d4..e2daf3d 100644 Binary files a/book/f45.woff and b/book/f45.woff differ diff --git a/book/f46.woff b/book/f46.woff index 7cd5c27..c159b52 100644 Binary files a/book/f46.woff and b/book/f46.woff differ diff --git a/book/f47.woff b/book/f47.woff index ba7cd22..8de7cc3 100644 Binary files a/book/f47.woff and b/book/f47.woff differ diff --git a/book/f48.woff b/book/f48.woff index 57083c9..3f5a01a 100644 Binary files a/book/f48.woff and b/book/f48.woff differ diff --git a/book/f49.woff b/book/f49.woff index e0dc71e..8d75884 100644 Binary files a/book/f49.woff and b/book/f49.woff differ diff --git a/book/f4a.woff b/book/f4a.woff index 421a5c4..b8ecc44 100644 Binary files a/book/f4a.woff and b/book/f4a.woff differ diff --git a/book/f4b.woff b/book/f4b.woff index d3f34a6..07e369d 100644 Binary files a/book/f4b.woff and b/book/f4b.woff differ diff --git a/book/f4c.woff b/book/f4c.woff index 14ac2e0..c635afd 100644 Binary files a/book/f4c.woff and b/book/f4c.woff differ diff --git a/book/f4d.woff b/book/f4d.woff index 099697b..2f2543d 100644 Binary files a/book/f4d.woff and b/book/f4d.woff differ diff --git a/book/f4e.woff b/book/f4e.woff index cddfdfb..8d75884 100644 Binary files a/book/f4e.woff and b/book/f4e.woff differ diff --git a/book/f4f.woff b/book/f4f.woff index 791a1c0..eed1211 100644 Binary files a/book/f4f.woff and b/book/f4f.woff differ diff --git a/book/f5.woff b/book/f5.woff index c311f27..b435ab3 100644 Binary files a/book/f5.woff and b/book/f5.woff differ diff --git a/book/f50.woff b/book/f50.woff index f812691..8e39601 100644 Binary files a/book/f50.woff and b/book/f50.woff differ diff --git a/book/f51.woff b/book/f51.woff index b92e644..bc3a819 100644 Binary files a/book/f51.woff and b/book/f51.woff differ diff --git a/book/f52.woff b/book/f52.woff index f796427..702e098 100644 Binary files a/book/f52.woff and b/book/f52.woff differ diff --git a/book/f53.woff b/book/f53.woff index 271b745..c24eeab 100644 Binary files a/book/f53.woff and b/book/f53.woff differ diff --git a/book/f54.woff b/book/f54.woff index 83d0349..a683dfc 100644 Binary files a/book/f54.woff and b/book/f54.woff differ diff --git a/book/f55.woff b/book/f55.woff index 6e78376..c92f31c 100644 Binary files a/book/f55.woff and b/book/f55.woff differ diff --git a/book/f56.woff b/book/f56.woff index fbf7baf..e2daf3d 100644 Binary files a/book/f56.woff and b/book/f56.woff differ diff --git a/book/f57.woff b/book/f57.woff index e559138..4c68a76 100644 Binary files a/book/f57.woff and b/book/f57.woff differ diff --git a/book/f58.woff b/book/f58.woff index db00943..0b312e3 100644 Binary files a/book/f58.woff and b/book/f58.woff differ diff --git a/book/f59.woff b/book/f59.woff index 73eaa21..5646c09 100644 Binary files a/book/f59.woff and b/book/f59.woff differ diff --git a/book/f5a.woff b/book/f5a.woff index f8d97d6..7be20d8 100644 Binary files a/book/f5a.woff and b/book/f5a.woff differ diff --git a/book/f5b.woff b/book/f5b.woff index 4857b21..e2daf3d 100644 Binary files a/book/f5b.woff and b/book/f5b.woff differ diff --git a/book/f5c.woff b/book/f5c.woff index 5d8e6a9..3cbc67b 100644 Binary files a/book/f5c.woff and b/book/f5c.woff differ diff --git a/book/f5d.woff b/book/f5d.woff index 8016af2..8dd96ec 100644 Binary files a/book/f5d.woff and b/book/f5d.woff differ diff --git a/book/f5e.woff b/book/f5e.woff index c26f5e5..6dda5f4 100644 Binary files a/book/f5e.woff and b/book/f5e.woff differ diff --git a/book/f5f.woff b/book/f5f.woff index ec62b82..ad9b0d7 100644 Binary files a/book/f5f.woff and b/book/f5f.woff differ diff --git a/book/f6.woff b/book/f6.woff index 0173c6f..fd8cfee 100644 Binary files a/book/f6.woff and b/book/f6.woff differ diff --git a/book/f60.woff b/book/f60.woff index b800477..7957325 100644 Binary files a/book/f60.woff and b/book/f60.woff differ diff --git a/book/f61.woff b/book/f61.woff index a9e6b8e..985e8d4 100644 Binary files a/book/f61.woff and b/book/f61.woff differ diff --git a/book/f62.woff b/book/f62.woff index ea19953..7c49927 100644 Binary files a/book/f62.woff and b/book/f62.woff differ diff --git a/book/f63.woff b/book/f63.woff index 85941df..531e66a 100644 Binary files a/book/f63.woff and b/book/f63.woff differ diff --git a/book/f64.woff b/book/f64.woff index c52726c..3933850 100644 Binary files a/book/f64.woff and b/book/f64.woff differ diff --git a/book/f65.woff b/book/f65.woff index b800477..7957325 100644 Binary files a/book/f65.woff and b/book/f65.woff differ diff --git a/book/f66.woff b/book/f66.woff index 22af52d..764b644 100644 Binary files a/book/f66.woff and b/book/f66.woff differ diff --git a/book/f67.woff b/book/f67.woff index cdf4355..01d5ad1 100644 Binary files a/book/f67.woff and b/book/f67.woff differ diff --git a/book/f68.woff b/book/f68.woff index ebd173d..b80b3a4 100644 Binary files a/book/f68.woff and b/book/f68.woff differ diff --git a/book/f69.woff b/book/f69.woff index 38aed6b..2527300 100644 Binary files a/book/f69.woff and b/book/f69.woff differ diff --git a/book/f6a.woff b/book/f6a.woff index bc57c8f..da350b1 100644 Binary files a/book/f6a.woff and b/book/f6a.woff differ diff --git a/book/f6b.woff b/book/f6b.woff index cb92137..a546f68 100644 Binary files a/book/f6b.woff and b/book/f6b.woff differ diff --git a/book/f6c.woff b/book/f6c.woff index 9653645..3ba0587 100644 Binary files a/book/f6c.woff and b/book/f6c.woff differ diff --git a/book/f6d.woff b/book/f6d.woff index ab9fb91..6ff2b55 100644 Binary files a/book/f6d.woff and b/book/f6d.woff differ diff --git a/book/f6e.woff b/book/f6e.woff index c5dce58..a546f68 100644 Binary files a/book/f6e.woff and b/book/f6e.woff differ diff --git a/book/f6f.woff b/book/f6f.woff index 9653645..3ba0587 100644 Binary files a/book/f6f.woff and b/book/f6f.woff differ diff --git a/book/f7.woff b/book/f7.woff index 0924658..276fb99 100644 Binary files a/book/f7.woff and b/book/f7.woff differ diff --git a/book/f70.woff b/book/f70.woff index ab9fb91..6ff2b55 100644 Binary files a/book/f70.woff and b/book/f70.woff differ diff --git a/book/f71.woff b/book/f71.woff index c5dce58..a546f68 100644 Binary files a/book/f71.woff and b/book/f71.woff differ diff --git a/book/f72.woff b/book/f72.woff index 2ec8de5..db27eff 100644 Binary files a/book/f72.woff and b/book/f72.woff differ diff --git a/book/f73.woff b/book/f73.woff index ab9fb91..6ff2b55 100644 Binary files a/book/f73.woff and b/book/f73.woff differ diff --git a/book/f74.woff b/book/f74.woff index c5dce58..a546f68 100644 Binary files a/book/f74.woff and b/book/f74.woff differ diff --git a/book/f75.woff b/book/f75.woff index c559e01..7957325 100644 Binary files a/book/f75.woff and b/book/f75.woff differ diff --git a/book/f76.woff b/book/f76.woff index ab9fb91..6ff2b55 100644 Binary files a/book/f76.woff and b/book/f76.woff differ diff --git a/book/f77.woff b/book/f77.woff index c5dce58..a546f68 100644 Binary files a/book/f77.woff and b/book/f77.woff differ diff --git a/book/f78.woff b/book/f78.woff index c559e01..7957325 100644 Binary files a/book/f78.woff and b/book/f78.woff differ diff --git a/book/f79.woff b/book/f79.woff index 7fe3184..6ff2b55 100644 Binary files a/book/f79.woff and b/book/f79.woff differ diff --git a/book/f7a.woff b/book/f7a.woff index 9339801..a546f68 100644 Binary files a/book/f7a.woff and b/book/f7a.woff differ diff --git a/book/f7b.woff b/book/f7b.woff index 5fcdf0d..db27eff 100644 Binary files a/book/f7b.woff and b/book/f7b.woff differ diff --git a/book/f7c.woff b/book/f7c.woff index 96bd45c..6ff2b55 100644 Binary files a/book/f7c.woff and b/book/f7c.woff differ diff --git a/book/f7d.woff b/book/f7d.woff index 9339801..a546f68 100644 Binary files a/book/f7d.woff and b/book/f7d.woff differ diff --git a/book/f7e.woff b/book/f7e.woff index 9339801..a546f68 100644 Binary files a/book/f7e.woff and b/book/f7e.woff differ diff --git a/book/f7f.woff b/book/f7f.woff index 96bd45c..6ff2b55 100644 Binary files a/book/f7f.woff and b/book/f7f.woff differ diff --git a/book/f8.woff b/book/f8.woff index 0e617b7..76c895b 100644 Binary files a/book/f8.woff and b/book/f8.woff differ diff --git a/book/f80.woff b/book/f80.woff index ee856aa..2527300 100644 Binary files a/book/f80.woff and b/book/f80.woff differ diff --git a/book/f81.woff b/book/f81.woff index db8db3f..a546f68 100644 Binary files a/book/f81.woff and b/book/f81.woff differ diff --git a/book/f82.woff b/book/f82.woff index f890ecc..739595c 100644 Binary files a/book/f82.woff and b/book/f82.woff differ diff --git a/book/f83.woff b/book/f83.woff index 98e6eaa..4db8c6b 100644 Binary files a/book/f83.woff and b/book/f83.woff differ diff --git a/book/f84.woff b/book/f84.woff index db8db3f..a546f68 100644 Binary files a/book/f84.woff and b/book/f84.woff differ diff --git a/book/f85.woff b/book/f85.woff index f890ecc..739595c 100644 Binary files a/book/f85.woff and b/book/f85.woff differ diff --git a/book/f86.woff b/book/f86.woff index 9a6dc02..3ba0587 100644 Binary files a/book/f86.woff and b/book/f86.woff differ diff --git a/book/f87.woff b/book/f87.woff index a731c58..fce9756 100644 Binary files a/book/f87.woff and b/book/f87.woff differ diff --git a/book/f88.woff b/book/f88.woff index 13fbcd3..d318110 100644 Binary files a/book/f88.woff and b/book/f88.woff differ diff --git a/book/f89.woff b/book/f89.woff index 7c21aba..e7c725a 100644 Binary files a/book/f89.woff and b/book/f89.woff differ diff --git a/book/f8a.woff b/book/f8a.woff index 83353df..7e4756e 100644 Binary files a/book/f8a.woff and b/book/f8a.woff differ diff --git a/book/f8b.woff b/book/f8b.woff index eccbedc..4026684 100644 Binary files a/book/f8b.woff and b/book/f8b.woff differ diff --git a/book/f8c.woff b/book/f8c.woff index f45ed4f..a88387b 100644 Binary files a/book/f8c.woff and b/book/f8c.woff differ diff --git a/book/f8d.woff b/book/f8d.woff index e3d5408..53f8a46 100644 Binary files a/book/f8d.woff and b/book/f8d.woff differ diff --git a/book/f8e.woff b/book/f8e.woff index 5cf7cc1..e7c725a 100644 Binary files a/book/f8e.woff and b/book/f8e.woff differ diff --git a/book/f8f.woff b/book/f8f.woff index eccbedc..4026684 100644 Binary files a/book/f8f.woff and b/book/f8f.woff differ diff --git a/book/f9.woff b/book/f9.woff index 3c0f88c..9cd3fb0 100644 Binary files a/book/f9.woff and b/book/f9.woff differ diff --git a/book/f90.woff b/book/f90.woff index f45ed4f..a88387b 100644 Binary files a/book/f90.woff and b/book/f90.woff differ diff --git a/book/f91.woff b/book/f91.woff index aeba47e..cf2710e 100644 Binary files a/book/f91.woff and b/book/f91.woff differ diff --git a/book/f92.woff b/book/f92.woff index 83353df..7e4756e 100644 Binary files a/book/f92.woff and b/book/f92.woff differ diff --git a/book/f93.woff b/book/f93.woff index 8c8e68f..7e4756e 100644 Binary files a/book/f93.woff and b/book/f93.woff differ diff --git a/book/f94.woff b/book/f94.woff index 58b9b00..a261155 100644 Binary files a/book/f94.woff and b/book/f94.woff differ diff --git a/book/f95.woff b/book/f95.woff index 8845e98..8d7b8b8 100644 Binary files a/book/f95.woff and b/book/f95.woff differ diff --git a/book/f96.woff b/book/f96.woff index 2efaf92..fd91365 100644 Binary files a/book/f96.woff and b/book/f96.woff differ diff --git a/book/f97.woff b/book/f97.woff index 347f594..cab9538 100644 Binary files a/book/f97.woff and b/book/f97.woff differ diff --git a/book/f98.woff b/book/f98.woff index 1b61922..1e4f507 100644 Binary files a/book/f98.woff and b/book/f98.woff differ diff --git a/book/f99.woff b/book/f99.woff index 9be37ef..18fff2a 100644 Binary files a/book/f99.woff and b/book/f99.woff differ diff --git a/book/f9a.woff b/book/f9a.woff index 347f594..cab9538 100644 Binary files a/book/f9a.woff and b/book/f9a.woff differ diff --git a/book/f9b.woff b/book/f9b.woff index 6c4a0f6..14d2fd4 100644 Binary files a/book/f9b.woff and b/book/f9b.woff differ diff --git a/book/f9c.woff b/book/f9c.woff index 6e8aeb6..b7b0157 100644 Binary files a/book/f9c.woff and b/book/f9c.woff differ diff --git a/book/f9d.woff b/book/f9d.woff index f399fff..29a9ea9 100644 Binary files a/book/f9d.woff and b/book/f9d.woff differ diff --git a/book/f9e.woff b/book/f9e.woff index db192d5..369eb79 100644 Binary files a/book/f9e.woff and b/book/f9e.woff differ diff --git a/book/f9f.woff b/book/f9f.woff index acda4d7..4b5ecb8 100644 Binary files a/book/f9f.woff and b/book/f9f.woff differ diff --git a/book/fa.woff b/book/fa.woff index 981a4bc..51adac5 100644 Binary files a/book/fa.woff and b/book/fa.woff differ diff --git a/book/fa0.woff b/book/fa0.woff index 2bdfa83..cab9538 100644 Binary files a/book/fa0.woff and b/book/fa0.woff differ diff --git a/book/fa1.woff b/book/fa1.woff index 5defa2e..c8605d3 100644 Binary files a/book/fa1.woff and b/book/fa1.woff differ diff --git a/book/fa2.woff b/book/fa2.woff index af862ad..5fa4c2a 100644 Binary files a/book/fa2.woff and b/book/fa2.woff differ diff --git a/book/fa3.woff b/book/fa3.woff index 5761ab3..8e3eee1 100644 Binary files a/book/fa3.woff and b/book/fa3.woff differ diff --git a/book/fa4.woff b/book/fa4.woff index 47f062d..37fd0b1 100644 Binary files a/book/fa4.woff and b/book/fa4.woff differ diff --git a/book/fa5.woff b/book/fa5.woff index f8c31f7..d62a70d 100644 Binary files a/book/fa5.woff and b/book/fa5.woff differ diff --git a/book/fa6.woff b/book/fa6.woff index 5761ab3..8e3eee1 100644 Binary files a/book/fa6.woff and b/book/fa6.woff differ diff --git a/book/fa7.woff b/book/fa7.woff index 47f062d..37fd0b1 100644 Binary files a/book/fa7.woff and b/book/fa7.woff differ diff --git a/book/fa8.woff b/book/fa8.woff index f8c31f7..d62a70d 100644 Binary files a/book/fa8.woff and b/book/fa8.woff differ diff --git a/book/fa9.woff b/book/fa9.woff index 5761ab3..8e3eee1 100644 Binary files a/book/fa9.woff and b/book/fa9.woff differ diff --git a/book/faa.woff b/book/faa.woff index b496cc2..5256bbf 100644 Binary files a/book/faa.woff and b/book/faa.woff differ diff --git a/book/fab.woff b/book/fab.woff index 3f81821..37fd0b1 100644 Binary files a/book/fab.woff and b/book/fab.woff differ diff --git a/book/fac.woff b/book/fac.woff index a609577..9201e18 100644 Binary files a/book/fac.woff and b/book/fac.woff differ diff --git a/book/fad.woff b/book/fad.woff index d406dd1..6f91eb1 100644 Binary files a/book/fad.woff and b/book/fad.woff differ diff --git a/book/fae.woff b/book/fae.woff index ca207ae..d1de3ce 100644 Binary files a/book/fae.woff and b/book/fae.woff differ diff --git a/book/fancy.min.css b/book/fancy.min.css index 21d40d3..a1f1e7a 100644 --- a/book/fancy.min.css +++ b/book/fancy.min.css @@ -1,88 +1,5 @@ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab filetype=css: */ /*! * Fancy styles for pdf2htmlEX * Copyright 2012,2013 Lu Wang - * https://github.com/coolwanglu/pdf2htmlEX/blob/master/share/LICENSE - */ -@keyframes fadein { from { opacity:0;} to { opacity:1;} } -@-webkit-keyframes fadein { from { opacity:0;} to { opacity:1;} } -@keyframes swing { - 0% { transform: rotate(0deg); } - 10% { transform: rotate(0deg); } - 90% { transform: rotate(720deg); } - 100%{ transform: rotate(720deg); } -} -@-webkit-keyframes swing { - 0% { -webkit-transform: rotate(0deg); } - 10% { -webkit-transform: rotate(0deg); } - 90% { -webkit-transform: rotate(720deg); } - 100%{ -webkit-transform: rotate(720deg); } -} -@media screen { - #sidebar { - background-color:#2f3236; - /* modified from http://philbit.com/svgpatterns/#crossstripes */ - background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0IiBoZWlnaHQ9IjQiPgo8cmVjdCB3aWR0aD0iNCIgaGVpZ2h0PSI0IiBmaWxsPSIjNDAzYzNmIj48L3JlY3Q+CjxwYXRoIGQ9Ik0wIDBMNCA0Wk00IDBMMCA0WiIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2U9IiMxZTI5MmQiPjwvcGF0aD4KPC9zdmc+"); - } - #outline { - font-family:Georgia,Times,"Times New Roman",serif; - font-size:13px; - margin:2em 1em; - } - #outline ul { - padding:0; - } - #outline li { - list-style-type:none; - margin:1em 0; - } - #outline li > ul { - margin-left: 1em; - } - #outline a, - #outline a:visited, - #outline a:hover, - #outline a:active { - line-height:1.2; - color:#e8e8e8; - text-overflow:ellipsis; - white-space:nowrap; - text-decoration:none; - display:block; - overflow:hidden; - outline:0; - } - #outline a:hover { - color:rgb(0,204,255); - } - #page-container { - background-color:#9e9e9e; - /* http://philbit.com/svgpatterns/#thinstripes */ - background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1IiBoZWlnaHQ9IjUiPgo8cmVjdCB3aWR0aD0iNSIgaGVpZ2h0PSI1IiBmaWxsPSIjOWU5ZTllIj48L3JlY3Q+CjxwYXRoIGQ9Ik0wIDVMNSAwWk02IDRMNCA2Wk0tMSAxTDEgLTFaIiBzdHJva2U9IiM4ODgiIHN0cm9rZS13aWR0aD0iMSI+PC9wYXRoPgo8L3N2Zz4="); - -webkit-transition:left 500ms; - transition:left 500ms; - } - .pf { - margin: 13px auto; - box-shadow: 1px 1px 3px 1px #333; - /* Needed by IE to make box-shadow works * https://developer.mozilla.org/en-US/docs/Web/CSS/box-shadow */ - border-collapse: separate; - } - .pc.opened { /* used by pdf2htmlEX.js, to show/hide pages */ - -webkit-animation: fadein 100ms; - animation: fadein 100ms; - } - .loading-indicator.active { - /* - * use 0.01s instead of 0s, - * since YUI Compressor will change 0s to 0, - * which is not recognized by Firefox - */ - -webkit-animation: swing 1.5s ease-in-out 0.01s infinite alternate none; - animation: swing 1.5s ease-in-out 0.01s infinite alternate none; - } - .checked { - background: no-repeat url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3goQDSYgDiGofgAAAslJREFUOMvtlM9LFGEYx7/vvOPM6ywuuyPFihWFBUsdNnA6KLIh+QPx4KWExULdHQ/9A9EfUodYmATDYg/iRewQzklFWxcEBcGgEplDkDtI6sw4PzrIbrOuedBb9MALD7zv+3m+z4/3Bf7bZS2bzQIAcrmcMDExcTeXy10DAFVVAQDksgFUVZ1ljD3yfd+0LOuFpmnvVVW9GHhkZAQcxwkNDQ2FSCQyRMgJxnVdy7KstKZpn7nwha6urqqfTqfPBAJAuVymlNLXoigOhfd5nmeiKL5TVTV+lmIKwAOA7u5u6Lped2BsbOwjY6yf4zgQQkAIAcedaPR9H67r3uYBQFEUFItFtLe332lpaVkUBOHK3t5eRtf1DwAwODiIubk5DA8PM8bYW1EU+wEgCIJqsCAIQAiB7/u253k2BQDDMJBKpa4mEon5eDx+UxAESJL0uK2t7XosFlvSdf0QAEmlUnlRFJ9Waho2Qghc1/U9z3uWz+eX+Wr+lL6SZfleEAQIggA8z6OpqSknimIvYyybSCReMsZ6TislhCAIAti2Dc/zejVNWwCAavN8339j27YbTg0AGGM3WltbP4WhlRWq6Q/btrs1TVsYHx+vNgqKoqBUKn2NRqPFxsbGJzzP05puUlpt0ukyOI6z7zjOwNTU1OLo6CgmJyf/gA3DgKIoWF1d/cIY24/FYgOU0pp0z/Ityzo8Pj5OTk9PbwHA+vp6zWghDC+VSiuRSOQgGo32UErJ38CO42wdHR09LBQK3zKZDDY2NupmFmF4R0cHVlZWlmRZ/iVJUn9FeWWcCCE4ODjYtG27Z2Zm5juAOmgdGAB2d3cBADs7O8uSJN2SZfl+WKlpmpumaT6Yn58vn/fs6XmbhmHMNjc3tzDGFI7jYJrm5vb29sDa2trPC/9aiqJUy5pOp4f6+vqeJ5PJBAB0dnZe/t8NBajx/z37Df5OGX8d13xzAAAAAElFTkSuQmCC); - } -} -/* Fancy CSS END */ + * https://github.com/pdf2htmlEX/pdf2htmlEX/blob/master/share/LICENSE + */@keyframes fadein{from{opacity:0}to{opacity:1}}@-webkit-keyframes fadein{from{opacity:0}to{opacity:1}}@keyframes swing{0{transform:rotate(0)}10%{transform:rotate(0)}90%{transform:rotate(720deg)}100%{transform:rotate(720deg)}}@-webkit-keyframes swing{0{-webkit-transform:rotate(0)}10%{-webkit-transform:rotate(0)}90%{-webkit-transform:rotate(720deg)}100%{-webkit-transform:rotate(720deg)}}@media screen{#sidebar{background-color:#2f3236;background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0IiBoZWlnaHQ9IjQiPgo8cmVjdCB3aWR0aD0iNCIgaGVpZ2h0PSI0IiBmaWxsPSIjNDAzYzNmIj48L3JlY3Q+CjxwYXRoIGQ9Ik0wIDBMNCA0Wk00IDBMMCA0WiIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2U9IiMxZTI5MmQiPjwvcGF0aD4KPC9zdmc+")}#outline{font-family:Georgia,Times,"Times New Roman",serif;font-size:13px;margin:2em 1em}#outline ul{padding:0}#outline li{list-style-type:none;margin:1em 0}#outline li>ul{margin-left:1em}#outline a,#outline a:visited,#outline a:hover,#outline a:active{line-height:1.2;color:#e8e8e8;text-overflow:ellipsis;white-space:nowrap;text-decoration:none;display:block;overflow:hidden;outline:0}#outline a:hover{color:#0cf}#page-container{background-color:#9e9e9e;background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1IiBoZWlnaHQ9IjUiPgo8cmVjdCB3aWR0aD0iNSIgaGVpZ2h0PSI1IiBmaWxsPSIjOWU5ZTllIj48L3JlY3Q+CjxwYXRoIGQ9Ik0wIDVMNSAwWk02IDRMNCA2Wk0tMSAxTDEgLTFaIiBzdHJva2U9IiM4ODgiIHN0cm9rZS13aWR0aD0iMSI+PC9wYXRoPgo8L3N2Zz4=");-webkit-transition:left 500ms;transition:left 500ms}.pf{margin:13px auto;box-shadow:1px 1px 3px 1px #333;border-collapse:separate}.pc.opened{-webkit-animation:fadein 100ms;animation:fadein 100ms}.loading-indicator.active{-webkit-animation:swing 1.5s ease-in-out .01s infinite alternate none;animation:swing 1.5s ease-in-out .01s infinite alternate none}.checked{background:no-repeat url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3goQDSYgDiGofgAAAslJREFUOMvtlM9LFGEYx7/vvOPM6ywuuyPFihWFBUsdNnA6KLIh+QPx4KWExULdHQ/9A9EfUodYmATDYg/iRewQzklFWxcEBcGgEplDkDtI6sw4PzrIbrOuedBb9MALD7zv+3m+z4/3Bf7bZS2bzQIAcrmcMDExcTeXy10DAFVVAQDksgFUVZ1ljD3yfd+0LOuFpmnvVVW9GHhkZAQcxwkNDQ2FSCQyRMgJxnVdy7KstKZpn7nwha6urqqfTqfPBAJAuVymlNLXoigOhfd5nmeiKL5TVTV+lmIKwAOA7u5u6Lped2BsbOwjY6yf4zgQQkAIAcedaPR9H67r3uYBQFEUFItFtLe332lpaVkUBOHK3t5eRtf1DwAwODiIubk5DA8PM8bYW1EU+wEgCIJqsCAIQAiB7/u253k2BQDDMJBKpa4mEon5eDx+UxAESJL0uK2t7XosFlvSdf0QAEmlUnlRFJ9Waho2Qghc1/U9z3uWz+eX+Wr+lL6SZfleEAQIggA8z6OpqSknimIvYyybSCReMsZ6TislhCAIAti2Dc/zejVNWwCAavN8339j27YbTg0AGGM3WltbP4WhlRWq6Q/btrs1TVsYHx+vNgqKoqBUKn2NRqPFxsbGJzzP05puUlpt0ukyOI6z7zjOwNTU1OLo6CgmJyf/gA3DgKIoWF1d/cIY24/FYgOU0pp0z/Ityzo8Pj5OTk9PbwHA+vp6zWghDC+VSiuRSOQgGo32UErJ38CO42wdHR09LBQK3zKZDDY2NupmFmF4R0cHVlZWlmRZ/iVJUn9FeWWcCCE4ODjYtG27Z2Zm5juAOmgdGAB2d3cBADs7O8uSJN2SZfl+WKlpmpumaT6Yn58vn/fs6XmbhmHMNjc3tzDGFI7jYJrm5vb29sDa2trPC/9aiqJUy5pOp4f6+vqeJ5PJBAB0dnZe/t8NBajx/z37Df5OGX8d13xzAAAAAElFTkSuQmCC)}} \ No newline at end of file diff --git a/book/fb.woff b/book/fb.woff index 49c6254..5782a4e 100644 Binary files a/book/fb.woff and b/book/fb.woff differ diff --git a/book/fc.woff b/book/fc.woff index aec7c37..78e3af6 100644 Binary files a/book/fc.woff and b/book/fc.woff differ diff --git a/book/fd.woff b/book/fd.woff index 5cf3bde..751fedd 100644 Binary files a/book/fd.woff and b/book/fd.woff differ diff --git a/book/fe.woff b/book/fe.woff index 21fef10..86d5503 100644 Binary files a/book/fe.woff and b/book/fe.woff differ diff --git a/book/ff.woff b/book/ff.woff index a66a6f1..de92596 100644 Binary files a/book/ff.woff and b/book/ff.woff differ diff --git a/book/pdf2htmlEX.min.js b/book/pdf2htmlEX.min.js index 6ddd457..9839086 100644 --- a/book/pdf2htmlEX.min.js +++ b/book/pdf2htmlEX.min.js @@ -1,968 +1,27 @@ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab filetype=javascript : */ -/** - * @license pdf2htmlEX.js: Core UI functions for pdf2htmlEX - * Copyright 2012,2013 Lu Wang and other contributors - * https://github.com/coolwanglu/pdf2htmlEX/blob/master/share/LICENSE - */ - -/* - * Attention: - * This files is to be optimized by closure-compiler, - * so pay attention to the forms of property names: - * - * string/bracket form is safe, won't be optimized: - * var obj={ 'a':'b' }; obj['a'] = 'b'; - * name/dot form will be optimized, the name is likely to be modified: - * var obj={ a:'b' }; obj.a = 'b'; - * - * Either form can be used for internal objects, - * but must be consistent for each one respectively. - * - * string/bracket form must be used for external objects - * e.g. DEFAULT_CONFIG, object stored in page-data - * property names are part of the `protocol` in these cases. - * - */ - -'use strict'; - -var pdf2htmlEX = window['pdf2htmlEX'] = window['pdf2htmlEX'] || {}; - -/** - * @const - * @struct - */ -var CSS_CLASS_NAMES = { - page_frame : 'pf', - page_content_box : 'pc', - page_data : 'pi', - background_image : 'bi', - link : 'l', - input_radio : 'ir', - __dummy__ : 'no comma' -}; - -/** - * configurations of Viewer - * @const - * @dict - */ -var DEFAULT_CONFIG = { - // id of the element to put the pages in - 'container_id' : 'page-container', - // id of the element for sidebar (to open and close) - 'sidebar_id' : 'sidebar', - // id of the element for outline - 'outline_id' : 'outline', - // class for the loading indicator - 'loading_indicator_cls' : 'loading-indicator', - // How many page shall we preload that are below the last visible page - 'preload_pages' : 3, - // how many ms should we wait before actually rendering the pages and after a scroll event - 'render_timeout' : 100, - // zoom ratio step for each zoom in/out event - 'scale_step' : 0.9, - // register global key handler, allowing navigation by keyboard - 'key_handler' : true, - // register hashchange handler, navigate to the location specified by the hash - 'hashchange_handler' : true, - // register view history handler, allowing going back to the previous location - 'view_history_handler' : true, - - '__dummy__' : 'no comma' -}; - -/** @const */ -var EPS = 1e-6; - -/************************************/ -/* utility function */ -/** - * @param{Array.} ctm - */ -function invert(ctm) { - var det = ctm[0] * ctm[3] - ctm[1] * ctm[2]; - return [ ctm[3] / det - ,-ctm[1] / det - ,-ctm[2] / det - ,ctm[0] / det - ,(ctm[2] * ctm[5] - ctm[3] * ctm[4]) / det - ,(ctm[1] * ctm[4] - ctm[0] * ctm[5]) / det - ]; -}; -/** - * @param{Array.} ctm - * @param{Array.} pos - */ -function transform(ctm, pos) { - return [ctm[0] * pos[0] + ctm[2] * pos[1] + ctm[4] - ,ctm[1] * pos[0] + ctm[3] * pos[1] + ctm[5]]; -}; - -/** - * @param{Element} ele - */ -function get_page_number(ele) { - return parseInt(ele.getAttribute('data-page-no'), 16); -}; - -/** - * @param{NodeList} eles - */ -function disable_dragstart(eles) { - for (var i = 0, l = eles.length; i < l; ++i) { - eles[i].addEventListener('dragstart', function() { - return false; - }, false); - } -}; - -/** - * @param{...Object} var_args - */ -function clone_and_extend_objs(var_args) { - var result_obj = {}; - for (var i = 0, l = arguments.length; i < l; ++i) { - var cur_obj = arguments[i]; - for (var k in cur_obj) { - if (cur_obj.hasOwnProperty(k)) { - result_obj[k] = cur_obj[k]; - } - } - } - return result_obj; -}; - -/** - * @constructor - * @param{Element} page The element for the page - */ -function Page(page) { - if (!page) return; - - this.loaded = false; - this.shown = false; - this.page = page; // page frame element - - this.num = get_page_number(page); - - // page size - // Need to make rescale work when page_content_box is not loaded, yet - this.original_height = page.clientHeight; - this.original_width = page.clientWidth; - - // content box - var content_box = page.getElementsByClassName(CSS_CLASS_NAMES.page_content_box)[0]; - - // if page is loaded - if (content_box) { - this.content_box = content_box; - /* - * scale ratios - * - * original_scale : the first one - * cur_scale : currently using - */ - this.original_scale = this.cur_scale = this.original_height / content_box.clientHeight; - this.page_data = JSON.parse(page.getElementsByClassName(CSS_CLASS_NAMES.page_data)[0].getAttribute('data-data')); - - this.ctm = this.page_data['ctm']; - this.ictm = invert(this.ctm); - - this.loaded = true; - } -}; -Page.prototype = { - /* hide & show are for contents, the page frame is still there */ - hide : function(){ - if (this.loaded && this.shown) { - this.content_box.classList.remove('opened'); - this.shown = false; - } - }, - show : function(){ - if (this.loaded && !this.shown) { - this.content_box.classList.add('opened'); - this.shown = true; - } - }, - /** - * @param{number} ratio - */ - rescale : function(ratio) { - if (ratio === 0) { - // reset scale - this.cur_scale = this.original_scale; - } else { - this.cur_scale = ratio; - } - - // scale the content box - if (this.loaded) { - var cbs = this.content_box.style; - cbs.msTransform = cbs.webkitTransform = cbs.transform = 'scale('+this.cur_scale.toFixed(3)+')'; - } - - // stretch the page frame to hold the place - { - var ps = this.page.style; - ps.height = (this.original_height * this.cur_scale) + 'px'; - ps.width = (this.original_width * this.cur_scale) + 'px'; - } - }, - /* - * return the coordinate of the top-left corner of container - * in our coordinate system - * assuming that p.parentNode === p.offsetParent - */ - view_position : function () { - var p = this.page; - var c = p.parentNode; - return [c.scrollLeft - p.offsetLeft - p.clientLeft - ,c.scrollTop - p.offsetTop - p.clientTop]; - }, - height : function () { - return this.page.clientHeight; - }, - width : function () { - return this.page.clientWidth; - } -}; - -/** - * @constructor - * @param{Object=} config - */ -function Viewer(config) { - this.config = clone_and_extend_objs(DEFAULT_CONFIG, (arguments.length > 0 ? config : {})); - this.pages_loading = []; - this.init_before_loading_content(); - - var self = this; - document.addEventListener('DOMContentLoaded', function(){ - self.init_after_loading_content(); - }, false); -}; - -Viewer.prototype = { - scale : 1, - /* - * index of the active page (the one with largest visible area) - * which estimates the page currently being viewed - */ - cur_page_idx : 0, - - /* - * index of the first visible page - * used when determining current view - */ - first_page_idx : 0, - - init_before_loading_content : function() { - /* hide all pages before loading, will reveal only visible ones later */ - this.pre_hide_pages(); - }, - - initialize_radio_button : function() { - var elements = document.getElementsByClassName(CSS_CLASS_NAMES.input_radio); - - for(var i = 0; i < elements.length; i++) { - var r = elements[i]; - - r.addEventListener('click', function() { - this.classList.toggle("checked"); - }); - } - }, - - init_after_loading_content : function() { - this.sidebar = document.getElementById(this.config['sidebar_id']); - this.outline = document.getElementById(this.config['outline_id']); - this.container = document.getElementById(this.config['container_id']); - this.loading_indicator = document.getElementsByClassName(this.config['loading_indicator_cls'])[0]; - - - { - // Open the outline if nonempty - var empty = true; - var nodes = this.outline.childNodes; - for (var i = 0, l = nodes.length; i < l; ++i) { - var cur_node = nodes[i]; - if (cur_node.nodeName.toLowerCase() === 'ul') { - empty = false; - break; - } - } - if (!empty) - this.sidebar.classList.add('opened'); - } - - this.find_pages(); - // do nothing if there's nothing - if(this.pages.length == 0) return; - - // disable dragging of background images - disable_dragstart(document.getElementsByClassName(CSS_CLASS_NAMES.background_image)); - - if (this.config['key_handler']) - this.register_key_handler(); - - var self = this; - - if (this.config['hashchange_handler']) { - window.addEventListener('hashchange', function(e) { - self.navigate_to_dest(document.location.hash.substring(1)); - }, false); - } - - if (this.config['view_history_handler']) { - window.addEventListener('popstate', function(e) { - if(e.state) self.navigate_to_dest(e.state); - }, false); - } - - // register schedule rendering - // renew old schedules since scroll() may be called frequently - this.container.addEventListener('scroll', function() { - self.update_page_idx(); - self.schedule_render(true); - }, false); - - // handle links - [this.container, this.outline].forEach(function(ele) { - ele.addEventListener('click', self.link_handler.bind(self), false); - }); - - this.initialize_radio_button(); - this.render(); - }, - - /* - * set up this.pages and this.page_map - * pages is an array holding all the Page objects - * page-Map maps an original page number (in PDF) to the corresponding index in page - */ - find_pages : function() { - var new_pages = []; - var new_page_map = {}; - var nodes = this.container.childNodes; - for (var i = 0, l = nodes.length; i < l; ++i) { - var cur_node = nodes[i]; - if ((cur_node.nodeType === Node.ELEMENT_NODE) - && cur_node.classList.contains(CSS_CLASS_NAMES.page_frame)) { - var p = new Page(cur_node); - new_pages.push(p); - new_page_map[p.num] = new_pages.length - 1; - } - } - this.pages = new_pages; - this.page_map = new_page_map; - }, - - /** - * @param{number} idx - * @param{number=} pages_to_preload - * @param{function(Page)=} callback - * - * TODO: remove callback -> promise ? - */ - load_page : function(idx, pages_to_preload, callback) { - var pages = this.pages; - if (idx >= pages.length) - return; // Page does not exist - - var cur_page = pages[idx]; - if (cur_page.loaded) - return; // Page is loaded - - if (this.pages_loading[idx]) - return; // Page is already loading - - var cur_page_ele = cur_page.page; - var url = cur_page_ele.getAttribute('data-page-url'); - if (url) { - this.pages_loading[idx] = true; // set semaphore - - // add a copy of the loading indicator if not already present - var new_loading_indicator = cur_page_ele.getElementsByClassName(this.config['loading_indicator_cls'])[0]; - if (typeof new_loading_indicator === 'undefined'){ - new_loading_indicator = this.loading_indicator.cloneNode(true); - new_loading_indicator.classList.add('active'); - cur_page_ele.appendChild(new_loading_indicator); - } - - // load data - { - var self = this; - var _idx = idx; - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, true); - xhr.onload = function(){ - if (xhr.status === 200 || xhr.status === 0) { - // find the page element in the data - var div = document.createElement('div'); - div.innerHTML = xhr.responseText; - - var new_page = null; - var nodes = div.childNodes; - for (var i = 0, l = nodes.length; i < l; ++i) { - var cur_node = nodes[i]; - if ((cur_node.nodeType === Node.ELEMENT_NODE) - && cur_node.classList.contains(CSS_CLASS_NAMES.page_frame)) { - new_page = cur_node; - break; - } - } - - // replace the old page with loaded data - // the loading indicator on this page should also be destroyed - var p = self.pages[_idx]; - self.container.replaceChild(new_page, p.page); - p = new Page(new_page); - self.pages[_idx] = p; - - p.hide(); - p.rescale(self.scale); - - // disable background image dragging - disable_dragstart(new_page.getElementsByClassName(CSS_CLASS_NAMES.background_image)); - - self.schedule_render(false); - - if (callback){ callback(p); } - } - - // Reset loading token - delete self.pages_loading[_idx]; - }; - xhr.send(null); - } - } - // Concurrent prefetch of the next pages - if (pages_to_preload === undefined) - pages_to_preload = this.config['preload_pages']; - - if (--pages_to_preload > 0) { - var self = this; - setTimeout(function() { - self.load_page(idx+1, pages_to_preload); - },0); - } - }, - - /* - * Hide all pages that have no 'opened' class - * The 'opened' class will be added to visible pages by JavaScript - * We cannot add this in the default CSS because JavaScript may be disabled - */ - pre_hide_pages : function() { - /* pages might have not been loaded yet, so add a CSS rule */ - var s = '@media screen{.'+CSS_CLASS_NAMES.page_content_box+'{display:none;}}'; - var n = document.createElement('style'); - if (n.styleSheet) { - n.styleSheet.cssText = s; - } else { - n.appendChild(document.createTextNode(s)); - } - document.head.appendChild(n); - }, - - /* - * show visible pages and hide invisible pages - */ - render : function () { - var container = this.container; - /* - * show the pages that are 'nearly' visible -- it's right above or below the container - * - * all the y values are in the all-page element's coordinate system - */ - var container_min_y = container.scrollTop; - var container_height = container.clientHeight; - var container_max_y = container_min_y + container_height; - var visible_min_y = container_min_y - container_height; - var visible_max_y = container_max_y + container_height; - - var cur_page_fully_visible = false; - var cur_page_idx = this.cur_page_idx; - var max_visible_page_idx = cur_page_idx; - var max_visible_ratio = 0.0; - - var pl = this.pages; - for (var i = 0, l = pl.length; i < l; ++i) { - var cur_page = pl[i]; - var cur_page_ele = cur_page.page; - var page_min_y = cur_page_ele.offsetTop + cur_page_ele.clientTop; - var page_height = cur_page_ele.clientHeight; - var page_max_y = page_min_y + page_height; - if ((page_min_y <= visible_max_y) && (page_max_y >= visible_min_y)) - { - // cur_page is 'nearly' visible, show it or load it - if (cur_page.loaded) { - cur_page.show(); - } else { - this.load_page(i); - } - } else { - cur_page.hide(); - } - } - }, - /* - * update cur_page_idx and first_page_idx - * normally called upon scrolling - */ - update_page_idx: function () { - var pages = this.pages; - var pages_len = pages.length; - // there is no chance that cur_page_idx or first_page_idx is modified - if (pages_len < 2) return; - - var container = this.container; - var container_min_y = container.scrollTop; - var container_max_y = container_min_y + container.clientHeight; - - // binary search for the first page - // whose bottom border is below the top border of the container - var first_idx = -1; - var last_idx = pages_len; - var rest_len = last_idx - first_idx; - // TODO: use current first_page_idx as a hint? - while(rest_len > 1) { - var idx = first_idx + Math.floor(rest_len / 2); - var cur_page_ele = pages[idx].page; - if (cur_page_ele.offsetTop + cur_page_ele.clientTop + cur_page_ele.clientHeight >= container_min_y) { - last_idx = idx; - } else { - first_idx = idx; - } - rest_len = last_idx - first_idx; - } - - /* - * with malformed settings it is possible that no page is visible, e.g. - * - the container is to thin, which lies in the margin between two pages - * - all pages are completely above or below the container - * but we just assume that they won't happen. - */ - this.first_page_idx = last_idx; - - // find the page with largest visible area - var cur_page_idx = this.cur_page_idx; - var max_visible_page_idx = cur_page_idx; - var max_visible_ratio = 0.0; - - for(var i = last_idx; i < pages_len; ++i) { - var cur_page_ele = pages[i].page; - var page_min_y = cur_page_ele.offsetTop + cur_page_ele.clientTop; - var page_height = cur_page_ele.clientHeight; - var page_max_y = page_min_y + page_height; - if (page_min_y > container_max_y) break; - - // check the visible fraction of the page - var page_visible_ratio = ( Math.min(container_max_y, page_max_y) - - Math.max(container_min_y, page_min_y) - ) / page_height; - - // stay with the current page if it is still fully visible - if ((i === cur_page_idx) && (Math.abs(page_visible_ratio - 1.0) <= EPS)) { - max_visible_page_idx = cur_page_idx; - break; - } - - if (page_visible_ratio > max_visible_ratio) { - max_visible_ratio = page_visible_ratio; - max_visible_page_idx = i; - } - } - - this.cur_page_idx = max_visible_page_idx; - }, - - /** - * @param{boolean} renew renew the existing schedule instead of using the old one - */ - schedule_render : function(renew) { - if (this.render_timer !== undefined) { - if (!renew) return; - clearTimeout(this.render_timer); - } - - var self = this; - this.render_timer = setTimeout(function () { - /* - * render() may trigger load_page(), which may in turn trigger another render() - * so delete render_timer first - */ - delete self.render_timer; - self.render(); - }, this.config['render_timeout']); - }, - - /* - * Handling key events, zooming, scrolling etc. - */ - register_key_handler: function () { - /* - * When user try to zoom in/out using ctrl + +/- or mouse wheel - * handle this and prevent the default behaviours - * - * Code credit to PDF.js - */ - var self = this; - - // Firefox specific event, so that we can prevent browser from zooming - window.addEventListener('DOMMouseScroll', function(e) { - if (e.ctrlKey) { - e.preventDefault(); - var container = self.container; - var rect = container.getBoundingClientRect(); - var fixed_point = [e.clientX - rect['left'] - container.clientLeft - ,e.clientY - rect['top'] - container.clientTop]; - self.rescale(Math.pow(self.config['scale_step'], e.detail), true, fixed_point); - } - }, false); - - window.addEventListener('keydown', function(e) { - var handled = false; - /* - var cmd = (e.ctrlKey ? 1 : 0) - | (e.altKey ? 2 : 0) - | (e.shiftKey ? 4 : 0) - | (e.metaKey ? 8 : 0) - ; - */ - var with_ctrl = e.ctrlKey || e.metaKey; - var with_alt = e.altKey; - switch (e.keyCode) { - case 61: // FF/Mac '=' - case 107: // FF '+' and '=' - case 187: // Chrome '+' - if (with_ctrl){ - self.rescale(1.0 / self.config['scale_step'], true); - handled = true; - } - break; - case 173: // FF/Mac '-' - case 109: // FF '-' - case 189: // Chrome '-' - if (with_ctrl){ - self.rescale(self.config['scale_step'], true); - handled = true; - } - break; - case 48: // '0' - if (with_ctrl){ - self.rescale(0, false); - handled = true; - } - break; - case 33: // Page UP: - if (with_alt) { // alt-pageup -> scroll one page up - self.scroll_to(self.cur_page_idx - 1); - } else { // pageup -> scroll one screen up - self.container.scrollTop -= self.container.clientHeight; - } - handled = true; - break; - case 34: // Page DOWN - if (with_alt) { // alt-pagedown -> scroll one page down - self.scroll_to(self.cur_page_idx + 1); - } else { // pagedown -> scroll one screen down - self.container.scrollTop += self.container.clientHeight; - } - handled = true; - break; - case 35: // End - self.container.scrollTop = self.container.scrollHeight; - handled = true; - break; - case 36: // Home - self.container.scrollTop = 0; - handled = true; - break; - } - if (handled) { - e.preventDefault(); - return; - } - }, false); - }, - - /** - * @param{number} ratio - * @param{boolean} is_relative - * @param{Array.=} fixed_point preserve the position (relative to the top-left corner of the viewer) after rescaling - */ - rescale : function (ratio, is_relative, fixed_point) { - var old_scale = this.scale; - var new_scale = old_scale; - // set new scale - if (ratio === 0) { - new_scale = 1; - is_relative = false; - } else if (is_relative) - new_scale *= ratio; - else - new_scale = ratio; - - this.scale = new_scale; - - if (!fixed_point) - fixed_point = [0,0]; - - // translate fixed_point to the coordinate system of all pages - var container = this.container; - fixed_point[0] += container.scrollLeft; - fixed_point[1] += container.scrollTop; - - // find the visible page that contains the fixed point - // if the fixed point lies between two pages (including their borders), it's contained in the first one - var pl = this.pages; - var pl_len = pl.length; - for (var i = this.first_page_idx; i < pl_len; ++i) { - var p = pl[i].page; - if (p.offsetTop + p.clientTop >= fixed_point[1]) - break; - } - var fixed_point_page_idx = i - 1; - - // determine the new scroll position - // each-value consists of two parts, one inside the page, which is affected by rescaling, - // the other is outside, (e.g. borders and margins), which is not affected - - // if the fixed_point is above the first page, use the first page as the reference - if (fixed_point_page_idx < 0) - fixed_point_page_idx = 0; - - var fp_p = pl[fixed_point_page_idx].page; - var fp_p_width = fp_p.clientWidth; - var fp_p_height = fp_p.clientHeight; - - var fp_x_ref = fp_p.offsetLeft + fp_p.clientLeft; - var fp_x_inside = fixed_point[0] - fp_x_ref; - if (fp_x_inside < 0) - fp_x_inside = 0; - else if (fp_x_inside > fp_p_width) - fp_x_inside = fp_p_width; - - var fp_y_ref = fp_p.offsetTop + fp_p.clientTop; - var fp_y_inside = fixed_point[1] - fp_y_ref; - if (fp_y_inside < 0) - fp_y_inside = 0; - else if (fp_y_inside > fp_p_height) - fp_y_inside = fp_p_height; - - // Rescale pages - for (var i = 0; i < pl_len; ++i) - pl[i].rescale(new_scale); - - // Correct container scroll to keep view aligned while zooming - container.scrollLeft += fp_x_inside / old_scale * new_scale + fp_p.offsetLeft + fp_p.clientLeft - fp_x_inside - fp_x_ref; - container.scrollTop += fp_y_inside / old_scale * new_scale + fp_p.offsetTop + fp_p.clientTop - fp_y_inside - fp_y_ref; - - // some pages' visibility may be toggled, wait for next render() - // renew old schedules since rescale() may be called frequently - this.schedule_render(true); - }, - - fit_width : function () { - var page_idx = this.cur_page_idx; - this.rescale(this.container.clientWidth / this.pages[page_idx].width(), true); - this.scroll_to(page_idx); - }, - - fit_height : function () { - var page_idx = this.cur_page_idx; - this.rescale(this.container.clientHeight / this.pages[page_idx].height(), true); - this.scroll_to(page_idx); - }, - /** - * @param{Node} ele - */ - get_containing_page : function(ele) { - /* get the page obj containing obj */ - while(ele) { - if ((ele.nodeType === Node.ELEMENT_NODE) - && ele.classList.contains(CSS_CLASS_NAMES.page_frame)) { - /* - * Get original page number and map it to index of pages - * TODO: store the index on the dom element - */ - var pn = get_page_number(/** @type{Element} */(ele)); - var pm = this.page_map; - return (pn in pm) ? this.pages[pm[pn]] : null; - } - ele = ele.parentNode; - } - return null; - }, - - /** - * @param{Event} e - */ - link_handler : function (e) { - var target = /** @type{Node} */(e.target); - var detail_str = /** @type{string} */ (target.getAttribute('data-dest-detail')); - if (!detail_str) return; - - if (this.config['view_history_handler']) { - try { - var cur_hash = this.get_current_view_hash(); - window.history.replaceState(cur_hash, '', '#' + cur_hash); - window.history.pushState(detail_str, '', '#' + detail_str); - } catch(ex) { } - } - this.navigate_to_dest(detail_str, this.get_containing_page(target)); - e.preventDefault(); - }, - - /** - * @param{string} detail_str may come from user provided hashtag, need sanitizing - * @param{Page=} src_page page containing the source event (e.g. link) - */ - navigate_to_dest : function(detail_str, src_page) { - try { - var detail = JSON.parse(detail_str); - } catch(e) { - return; - } - - if(!(detail instanceof Array)) return; - - var target_page_no = detail[0]; - var page_map = this.page_map; - if (!(target_page_no in page_map)) return; - var target_page_idx = page_map[target_page_no]; - var target_page = this.pages[target_page_idx]; - - for (var i = 2, l = detail.length; i < l; ++i) { - var d = detail[i]; - if(!((d === null) || (typeof d === 'number'))) - return; - } - - while(detail.length < 6) - detail.push(null); - - // cur_page might be undefined, e.g. from Outline - var cur_page = src_page || this.pages[this.cur_page_idx]; - - var cur_pos = cur_page.view_position(); - cur_pos = transform(cur_page.ictm, [cur_pos[0], cur_page.height()-cur_pos[1]]); - - var zoom = this.scale; - var pos = [0,0]; - var upside_down = true; - var ok = false; - - // position specified in `detail` are in the raw coordinate system of the page (unscaled) - var scale = this.scale; - // TODO: fitb* - // TODO: BBox - switch(detail[1]) { - case 'XYZ': - pos = [ (detail[2] === null) ? cur_pos[0] : detail[2] * scale - , (detail[3] === null) ? cur_pos[1] : detail[3] * scale ]; - zoom = detail[4]; - if ((zoom === null) || (zoom === 0)) - zoom = this.scale; - ok = true; - break; - case 'Fit': - case 'FitB': - pos = [0,0]; - ok = true; - break; - case 'FitH': - case 'FitBH': - pos = [0, (detail[2] === null) ? cur_pos[1] : detail[2] * scale]; - ok = true; - break; - case 'FitV': - case 'FitBV': - pos = [(detail[2] === null) ? cur_pos[0] : detail[2] * scale, 0]; - ok = true; - break; - case 'FitR': - /* locate the top-left corner of the rectangle */ - // TODO - pos = [detail[2] * scale, detail[5] * scale]; - upside_down = false; - ok = true; - break; - default: - break; - } - - if (!ok) return; - - this.rescale(zoom, false); - - var self = this; - /** - * page should have type Page - * @param{Page} page - */ - var transform_and_scroll = function(page) { - pos = transform(page.ctm, pos); - if (upside_down) { - pos[1] = page.height() - pos[1]; - } - self.scroll_to(target_page_idx, pos); - }; - - if (target_page.loaded) { - transform_and_scroll(target_page); - } else { - // TODO: scroll_to may finish before load_page - - // Scroll to the exact position once loaded. - this.load_page(target_page_idx, undefined, transform_and_scroll); - - // In the meantime page gets loaded, scroll approximately position for maximum responsiveness. - this.scroll_to(target_page_idx); - } - }, - - /** - * @param{number} page_idx - * @param{Array.=} pos [x,y] where (0,0) is the top-left corner - */ - scroll_to : function(page_idx, pos) { - var pl = this.pages; - if ((page_idx < 0) || (page_idx >= pl.length)) return; - var target_page = pl[page_idx]; - var cur_target_pos = target_page.view_position(); - - if (pos === undefined) - pos = [0,0]; - - var container = this.container; - container.scrollLeft += pos[0] - cur_target_pos[0]; - container.scrollTop += pos[1] - cur_target_pos[1]; - }, - - /** - * generate the hash for the current view - */ - get_current_view_hash : function() { - var detail = []; - var cur_page = this.pages[this.cur_page_idx]; - - detail.push(cur_page.num); - detail.push('XYZ'); - - var cur_pos = cur_page.view_position(); - cur_pos = transform(cur_page.ictm, [cur_pos[0], cur_page.height()-cur_pos[1]]); - detail.push(cur_pos[0] / this.scale); - detail.push(cur_pos[1] / this.scale); - - detail.push(this.scale); - - return JSON.stringify(detail); - } -}; - -// export pdf2htmlEX.Viewer -pdf2htmlEX['Viewer'] = Viewer; +(function(){/* + pdf2htmlEX.js: Core UI functions for pdf2htmlEX + Copyright 2012,2013 Lu Wang and other contributors + https://github.com/pdf2htmlEX/pdf2htmlEX/blob/master/share/LICENSE +*/ +var pdf2htmlEX=window.pdf2htmlEX=window.pdf2htmlEX||{},CSS_CLASS_NAMES={page_frame:"pf",page_content_box:"pc",page_data:"pi",background_image:"bi",link:"l",input_radio:"ir",__dummy__:"no comma"},DEFAULT_CONFIG={container_id:"page-container",sidebar_id:"sidebar",outline_id:"outline",loading_indicator_cls:"loading-indicator",preload_pages:3,render_timeout:100,scale_step:0.9,key_handler:!0,hashchange_handler:!0,view_history_handler:!0,__dummy__:"no comma"},EPS=1E-6; +function invert(a){var b=a[0]*a[3]-a[1]*a[2];return[a[3]/b,-a[1]/b,-a[2]/b,a[0]/b,(a[2]*a[5]-a[3]*a[4])/b,(a[1]*a[4]-a[0]*a[5])/b]}function transform(a,b){return[a[0]*b[0]+a[2]*b[1]+a[4],a[1]*b[0]+a[3]*b[1]+a[5]]}function get_page_number(a){return parseInt(a.getAttribute("data-page-no"),16)}function disable_dragstart(a){for(var b=0,c=a.length;b=e.length||(e=e[a],e.loaded||this.pages_loading[a]))){var e=e.page,h=e.getAttribute("data-page-url");if(h){this.pages_loading[a]=!0;var d=e.getElementsByClassName(this.config.loading_indicator_cls)[0];"undefined"===typeof d&& +(d=this.loading_indicator.cloneNode(!0),d.classList.add("active"),e.appendChild(d));var f=this,g=new XMLHttpRequest;g.open("GET",h,!0);g.onload=function(){if(200===g.status||0===g.status){var b=document.createElement("div");b.innerHTML=g.responseText;for(var d=null,b=b.childNodes,e=0,h=b.length;e=a?d.loaded?d.show():this.load_page(e):d.hide()}},update_page_idx:function(){var a=this.pages,b=a.length;if(!(2>b)){for(var c=this.container,e=c.scrollTop,c=e+c.clientHeight,h=-1,d=b,f=d-h;1=e?d=g:h=g;f=d-h}this.first_page_idx=d;for(var g=h=this.cur_page_idx, +k=0;dc)break;f=(Math.min(c,l+f)-Math.max(e,l))/f;if(d===h&&Math.abs(f-1)<=EPS){g=h;break}f>k&&(k=f,g=d)}this.cur_page_idx=g}},schedule_render:function(a){if(void 0!==this.render_timer){if(!a)return;clearTimeout(this.render_timer)}var b=this;this.render_timer=setTimeout(function(){delete b.render_timer;b.render()},this.config.render_timeout)},register_key_handler:function(){var a=this;window.addEventListener("DOMMouseScroll",function(b){if(b.ctrlKey){b.preventDefault(); +var c=a.container,e=c.getBoundingClientRect(),c=[b.clientX-e.left-c.clientLeft,b.clientY-e.top-c.clientTop];a.rescale(Math.pow(a.config.scale_step,b.detail),!0,c)}},!1);window.addEventListener("keydown",function(b){var c=!1,e=b.ctrlKey||b.metaKey,h=b.altKey;switch(b.keyCode){case 61:case 107:case 187:e&&(a.rescale(1/a.config.scale_step,!0),c=!0);break;case 173:case 109:case 189:e&&(a.rescale(a.config.scale_step,!0),c=!0);break;case 48:e&&(a.rescale(0,!1),c=!0);break;case 33:h?a.scroll_to(a.cur_page_idx- +1):a.container.scrollTop-=a.container.clientHeight;c=!0;break;case 34:h?a.scroll_to(a.cur_page_idx+1):a.container.scrollTop+=a.container.clientHeight;c=!0;break;case 35:a.container.scrollTop=a.container.scrollHeight;c=!0;break;case 36:a.container.scrollTop=0,c=!0}c&&b.preventDefault()},!1)},rescale:function(a,b,c){var e=this.scale;this.scale=a=0===a?1:b?e*a:a;c||(c=[0,0]);b=this.container;c[0]+=b.scrollLeft;c[1]+=b.scrollTop;for(var h=this.pages,d=h.length,f=this.first_page_idx;f=c[1])break}g=f-1;0>g&&(g=0);var g=h[g].page,k=g.clientWidth,f=g.clientHeight,l=g.offsetLeft+g.clientLeft,m=c[0]-l;0>m?m=0:m>k&&(m=k);k=g.offsetTop+g.clientTop;c=c[1]-k;0>c?c=0:c>f&&(c=f);for(f=0;fc.length;)c.push(null);var g=b||this.pages[this.cur_page_idx],d=g.view_position(), +d=transform(g.ictm,[d[0],g.height()-d[1]]),g=this.scale,l=[0,0],m=!0,k=!1,n=this.scale;switch(c[1]){case "XYZ":l=[null===c[2]?d[0]:c[2]*n,null===c[3]?d[1]:c[3]*n];g=c[4];if(null===g||0===g)g=this.scale;k=!0;break;case "Fit":case "FitB":l=[0,0];k=!0;break;case "FitH":case "FitBH":l=[0,null===c[2]?d[1]:c[2]*n];k=!0;break;case "FitV":case "FitBV":l=[null===c[2]?d[0]:c[2]*n,0];k=!0;break;case "FitR":l=[c[2]*n,c[5]*n],m=!1,k=!0}if(k){this.rescale(g,!1);var p=this,c=function(a){l=transform(a.ctm,l);m&& +(l[1]=a.height()-l[1]);p.scroll_to(f,l)};h.loaded?c(h):(this.load_page(f,void 0,c),this.scroll_to(f))}}}},scroll_to:function(a,b){var c=this.pages;if(!(0>a||a>=c.length)){c=c[a].view_position();void 0===b&&(b=[0,0]);var e=this.container;e.scrollLeft+=b[0]-c[0];e.scrollTop+=b[1]-c[1]}},get_current_view_hash:function(){var a=[],b=this.pages[this.cur_page_idx];a.push(b.num);a.push("XYZ");var c=b.view_position(),c=transform(b.ictm,[c[0],b.height()-c[1]]);a.push(c[0]/this.scale);a.push(c[1]/this.scale); +a.push(this.scale);return JSON.stringify(a)}};pdf2htmlEX.Viewer=Viewer;})(); diff --git a/book/riscv-book-1.page b/book/riscv-book-1.page index 10c983c..7ff5dc1 100644 --- a/book/riscv-book-1.page +++ b/book/riscv-book-1.page @@ -1 +1 @@ -
An Introduction to
Assembly Programming
with RISC-V
Prof. Edson Borin
Institute of Computing
Unicamp
1
st
edition
+
An Introduction to
Assembly Programming
with RISC-V
Prof. Edson Borin
Institute of Computing
Unicamp
1
st
edition
diff --git a/book/riscv-book-10.page b/book/riscv-book-10.page index 12ea234..30b682a 100644 --- a/book/riscv-book-10.page +++ b/book/riscv-book-10.page @@ -1 +1 @@ -
Acronyms
ABI Application Binary Interface. v, 47, 71, 76–79, 83, 85, 86, 104
ASCII American Standard Code for Information Interchange. v, 14–16
bit Binary digit. v, 2–4, 10–16, 18, 19, 22, 24, 25, 30, 32, 34, 37–39, 41–43, 86, 91–96, 100, 101, 104
CPU Central Processing Unit. v, 2–5, 27, 31, 42, 45, 47, 90–92, 94–105, 107–110
CSR Control and Status Register. v, 100–104, 107–110
ISA Instruction Set Architecture. v, 3, 4, 21, 22, 33, 34, 42, 43, 46–49, 53–57, 59–61, 63, 64, 70, 91, 92,
100, 101, 103, 104, 106–108
ISR interrupt service routine. v, 98–100, 103–105
PC program counter. v, 4, 5, 23, 27, 98, 101, 102, 104, 107–109
UTF-8 Universal Coded Character Set (or Unicode) Transformation Format - 8-bit. v, 14–16
vii
+
Acronyms
ABI Application Binary Interface. vi, 58, 87, 94–97, 103, 105–107, 129
ASCII American Standard Code for Information Interchange. vi, 17–19
bit Binary digit. vi, ix, 2–4, 12–17, 19, 20, 23, 24, 26, 29, 30, 37, 39, 42, 45, 46, 49–53, 106, 112–114,
116–119, 123–125, 129
CPU Central Processing Unit. vi, viii, ix, 2–5, 33, 38, 52, 55, 57, 111–114, 116, 118–129, 132–136
CSR Control and Status Register. vi, viii, 124–129, 133–136
ISA Instruction Set Architecture. vi, viii–x, 4, 25–27, 40–42, 51, 53, 57–59, 65–67, 69–71, 73, 75, 78,
79, 87, 113, 114, 124, 128, 129, 132, 133
ISR interrupt service routine. vi, ix, 121–124, 128, 129
PC program counter. vi, ix, 4, 5, 28, 33, 121, 125–128, 133, 135
UTF-8 Universal Coded Character Set (or Unicode) Transformation Format - 8-bit. vi, 17–19
vii
diff --git a/book/riscv-book-100.page b/book/riscv-book-100.page index 4f410f0..6b110d4 100644 --- a/book/riscv-book-100.page +++ b/book/riscv-book-100.page @@ -1 +1 @@ -
6.3. INVOKING AND RETURNING FROM ROUTINES
label usually defines the routine name
6
and the fragment of code contains the instructions that implement
the routine. The following code shows an example of a routine called update x. This routine stores in
variable x the value from register a0 and then returns.
1 # The update_x routine
2 update_x:
3 la t1, x
4 sw a0, (t1)
5 ret
Invoking a routine is as simple as jumping to the label that defines its entry point. However, before
invoking (jumping to) the routine, it is important to save the return address so that the
routine can return to the calling site after its execution.
As discussed in Section 5.7.3, the RV32I ISA contains a special jump instruction to facilitate saving
the return address when invoking a routine. This instruction, called jump and link, or jal lab, stores
the return address
7
(PC+4) on the return address register (ra) and then jumps to the label lab.
The following fragment of code shows how to invoke the update x routine to update the value of
variable x with value 42. First, it loads value 42 into register a0, then it invokes the update x routine
using the jump and link (jal) instruction.
1 .data
2 x: .skip 4
3
4 li a0, 42 # load 42 into a0
5 jal update_x # invoke the update_x routine
When the update x routine finishes executing, it needs to return to the calling site. This operation
can be performed by jumping to the address stored in register ra, which was set by the jal instruction
when the routine was invoked. The pseudo-instruction ret performs this operation.
NOTE: As discussed above, the return address is automatically stored at register ra by the jal
instruction. This operation destroys the previous contents of register ra, hence, before invoking
a routine, it may be necessary to save the contents of this register so that it may be recovered
later. This is especially important when invoking a routine B from within another routine A since
the contents of register ra must be preserved so that routine A can return after its completion.
Chapter 7 discusses how to save and recover the contents of ra when invoking routines.
6.3.1 Returning values from functions
A function is a routine that can accept arguments and returns one or more values. A procedure, on
the other hand, is a routine that can accept arguments but does not return any values.
Returning a value from a function is a matter of convention and is usually defined by the Application
Binary Interface, or ABI. The RISC-V ABI defines that functions must return values by storing them
on register a0. Section 7.3 further discusses the Application Binary Interface and its importance for
software composition.
6
When translating “C” code into assembly code, the routine entry-point labels are exactly the same as the routine
name.
7
The return address is the address of the next instruction on memory, i.e., the address of the current instruction (PC)
plus four.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
87
+
6.3. INVOKING AND RETURNING FROM ROUTINES
label usually defines the routine name
6
and the fragment of code contains the instructions that implement
the routine. The following code shows an example of a routine called update x. This routine stores in
variable x the value from register a0 and then returns.
1 # The update_x routine
2 update_x:
3 la t1, x
4 sw a0, (t1)
5 ret
Invoking a routine is as simple as jumping to the label that defines its entry point. However, before
invoking (jumping to) the routine, it is important to save the return address so that the
routine can return to the calling site after its execution.
As discussed in Section 5.7.3, the RV32I ISA contains a special jump instruction to facilitate saving
the return address when invoking a routine. This instruction, called jump and link, or jal lab, stores
the return address
7
(PC+4) on the return address register (ra) and then jumps to the label lab.
The following fragment of code shows how to invoke the update x routine to update the value of
variable x with value 42. First, it loads value 42 into register a0, then it invokes the update x routine
using the jump and link (jal) instruction.
1 .data
2 x: .skip 4
3
4 li a0, 42 # load 42 into a0
5 jal update_x # invoke the update_x routine
When the update x routine finishes executing, it needs to return to the calling site. This operation
can be performed by jumping to the address stored in register ra, which was set by the jal instruction
when the routine was invoked. The pseudo-instruction ret performs this operation.
NOTE: As discussed above, the return address is automatically stored at register ra by the jal
instruction. This operation destroys the previous contents of register ra, hence, before invoking
a routine, it may be necessary to save the contents of this register so that it may be recovered
later. This is especially important when invoking a routine B from within another routine A since
the contents of register ra must be preserved so that routine A can return after its completion.
Chapter 7 discusses how to save and recover the contents of ra when invoking routines.
6.3.1 Returning values from functions
A function is a routine that can accept arguments and returns one or more values. A procedure, on
the other hand, is a routine that can accept arguments but does not return any values.
Returning a value from a function is a matter of convention and is usually defined by the Application
Binary Interface, or ABI. The RISC-V ABI defines that functions must return values by storing them
on register a0. Section 7.3 further discusses the Application Binary Interface and its importance for
software composition.
6
When translating “C” code into assembly code, the routine entry-point labels are exactly the same as the routine
name.
7
The return address is the address of the next instruction on memory, i.e., the address of the current instruction (PC)
plus four.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
87
diff --git a/book/riscv-book-101.page b/book/riscv-book-101.page index 2e51b44..ef70f13 100644 --- a/book/riscv-book-101.page +++ b/book/riscv-book-101.page @@ -1 +1 @@ -
6.4. EXAMPLES
6.4 Examples
6.4.1 Searching for the maximum value on an array
The following “C” code shows a global array variable named numbers and a function that returns the
largest value from the array.
1 /* Global array */
2 int numbers[10];
3
4 /* Returns the largest value from array numbers. */
5 int get_largest_number()
6 {
7 int largest = numbers[0];
8 for (int i=1; i<10; i++) {
9 if (numbers[i] > largest)
10 largest = numbers[i];
11 }
12 return largest;
13 }
1 .data
2 # Allocate the numbers array (10 integers = 40 bytes)
3 numbers: .skip 40
4
5 .text
6 get_largest_number:
7 la a5, numbers # a5 := &numbers
8 lw a0, (a5) # a0 (largest) := numbers[0]
9 li a1, 1 # a1 (i) := 1
10 li t4, 10
11 for:
12 bge a1, t4, end # if i >= 10, then exit the loop (end label)
13 slli t1, a1, 2 # t1 := i * 4
14 add t2, a5, t1 # t2 := &numbers + i*4
15 lw t3, (t2) # t3 := numbers[i]
16 blt t3, a0, skip # if numbers[i] < largest, then skip
17 mv a0, t3 # update largest
18 skip:
19 addi a1, a1, 1 # i := i + 1
20 j for
21 end:
22 ret # return
Alternative solutions:
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
88
+
6.4. EXAMPLES
6.4 Examples
6.4.1 Searching for the maximum value on an array
The following “C” code shows a global array variable named numbers and a function that returns the
largest value from the array.
1 /* Global array */
2 int numbers[10];
3
4 /* Returns the largest value from array numbers. */
5 int get_largest_number()
6 {
7 int largest = numbers[0];
8 for (int i=1; i<10; i++) {
9 if (numbers[i] > largest)
10 largest = numbers[i];
11 }
12 return largest;
13 }
1 .data
2 # Allocate the numbers array (10 integers = 40 bytes)
3 numbers: .skip 40
4
5 .text
6 get_largest_number:
7 la a5, numbers # a5 := &numbers
8 lw a0, (a5) # a0 (largest) := numbers[0]
9 li a1, 1 # a1 (i) := 1
10 li t4, 10
11 for:
12 bge a1, t4, end # if i >= 10, then exit the loop (end label)
13 slli t1, a1, 2 # t1 := i * 4
14 add t2, a5, t1 # t2 := &numbers + i*4
15 lw t3, (t2) # t3 := numbers[i]
16 blt t3, a0, skip # if numbers[i] < largest, then skip
17 mv a0, t3 # update largest
18 skip:
19 addi a1, a1, 1 # i := i + 1
20 j for
21 end:
22 ret # return
Alternative solutions:
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
88
diff --git a/book/riscv-book-102.page b/book/riscv-book-102.page index 3794c68..f4d787b 100644 --- a/book/riscv-book-102.page +++ b/book/riscv-book-102.page @@ -1 +1 @@ -
6.4. EXAMPLES
1 get_largest_number:
2 lui a5,%hi(numbers)
3 lw a0,%lo(numbers)(a5)
4 addi a5,a5,%lo(numbers)
5 addi a3,a5,36
6 .L3:
7 lw a4,4(a5)
8 addi a5,a5,4
9 bge a0,a4,.L2
10 mv a0,a4
11 .L2:
12 bne a5,a3,.L3
13 ret
1 get_largest_number:
2 la a5, numbers # a5: pointer to current element
3 addi a6, a5, 40 # a6: address after last element
4 lw a0, (a5) # load first element (number[0])
5 addi a5, a5, 4 # advance pointer to next element
6 do_while:
7 lw a4, (a5) # load current element
8 bge a0, a4, skip # if largest >= current, skip
9 mv a0, a4 # else, update largest
10 skip:
11 addi a5, a5, 4 # advance pointer to next element
12 bne a5, a6, do_while # do while a5 != a6
13 ret
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
89
+
6.4. EXAMPLES
1 get_largest_number:
2 lui a5,%hi(numbers)
3 lw a0,%lo(numbers)(a5)
4 addi a5,a5,%lo(numbers)
5 addi a3,a5,36
6 .L3:
7 lw a4,4(a5)
8 addi a5,a5,4
9 bge a0,a4,.L2
10 mv a0,a4
11 .L2:
12 bne a5,a3,.L3
13 ret
1 get_largest_number:
2 la a5, numbers # a5: pointer to current element
3 addi a6, a5, 40 # a6: address after last element
4 lw a0, (a5) # load first element (number[0])
5 addi a5, a5, 4 # advance pointer to next element
6 do_while:
7 lw a4, (a5) # load current element
8 bge a0, a4, skip # if largest >= current, skip
9 mv a0, a4 # else, update largest
10 skip:
11 addi a5, a5, 4 # advance pointer to next element
12 bne a5, a6, do_while # do while a5 != a6
13 ret
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
89
diff --git a/book/riscv-book-103.page b/book/riscv-book-103.page index ca2d792..d7b831d 100644 --- a/book/riscv-book-103.page +++ b/book/riscv-book-103.page @@ -1 +1 @@ -
Chapter 7
Implementing routines
7.1 The program memory layout
A stored-program computer architecture is a computer architecture that stores both data and code on
memory. A Von Neumann architecture is a computer architecture that stores both the data and the
code at the same address space. Most modern computer architectures are Von Neumann architectures.
Figure 7.1 shows a common way of organizing programs on the memory of Von Neumann architectures.
The code space is a memory space that stores the program code and is usually placed first,
in the lowest addresses. The static data space is a memory space that stores the program
static data (e.g., global variables) and is placed after the code. The heap space is a memory space
managed by the memory allocation library
1
and is allocated after the static data. The heap starts
small and, whenever the memory allocation library needs more space, it invokes the operating system
to grow the heap area, which does it by increasing the “program break” address
2
. Finally, the stack
space is a memory space that stores the program stack and is usually placed at the end (high
addresses) of the memory.
0x0000
Addresses
Code
Static Data
Stack
Main Memory
Top of
the stack
Heap
Program
break
Free space
Figure 7.1: Common program memory layout.
1
The memory allocation library allows the program to dynamically allocate (and free) data on the heap. Data allocated
using the malloc routine, for example, is allocated into the heap. The memory allocation library is responsible for keeping
track of which addresses within the heap are free or allocated.
2
The program break defines the end of the heap.
90
+
Chapter 7
Implementing routines
7.1 The program memory layout
A stored-program computer architecture is a computer architecture that stores both data and code on
memory. A Von Neumann architecture is a computer architecture that stores both the data and the
code at the same address space. Most modern computer architectures are Von Neumann architectures.
Figure 7.1 shows a common way of organizing programs on the memory of Von Neumann architectures.
The code space is a memory space that stores the program code and is usually placed first,
in the lowest addresses. The static data space is a memory space that stores the program
static data (e.g., global variables) and is placed after the code. The heap space is a memory space
managed by the memory allocation library
1
and is allocated after the static data. The heap starts
small and, whenever the memory allocation library needs more space, it invokes the operating system
to grow the heap area, which does it by increasing the “program break” address
2
. Finally, the stack
space is a memory space that stores the program stack and is usually placed at the end (high
addresses) of the memory.
0x0000
Addresses
Code
Static Data
Stack
Main Memory
Top of
the stack
Heap
Program
break
Free space
Figure 7.1: Common program memory layout.
1
The memory allocation library allows the program to dynamically allocate (and free) data on the heap. Data allocated
using the malloc routine, for example, is allocated into the heap. The memory allocation library is responsible for keeping
track of which addresses within the heap are free or allocated.
2
The program break defines the end of the heap.
90
diff --git a/book/riscv-book-104.page b/book/riscv-book-104.page index 1f098b6..e511217 100644 --- a/book/riscv-book-104.page +++ b/book/riscv-book-104.page @@ -1 +1 @@ -
7.2. THE PROGRAM STACK
7.2 The program stack
An active routine is a routine that was invoked but did not return yet. Notice that there may
be multiple active routines at a given point of the execution. For example, in the following code, routine
fun is invoked by routine bar, which is invoked by routine main. Initially, the main routine is active.
Then, it invokes the bar routine, which also becomes active. Finally, the fun routine is invoked and it
also becomes active. At this point, there are three active routines in the system.
1 int a = 10;
2
3 int main()
4 {
5 return bar() + 2;
6 }
7 int bar()
8 {
9 return fun() + 4;
10 }
11 int fun()
12 {
13 return a;
14 }
The set of active routines increases whenever a routine is invoked and decreases whenever a routine
returns. Routines are activated and deactivated in a last-in-first-out fashion, i.e., the last one to be
activated must be the first one to be deactivated. Consequently, the most natural data structure
to keep track of active routines is a stack.
Routines usually need memory space to store important information, such as local variables, param-
eters, and the return address. Hence, whenever a routine is invoked (and becomes active), the system
needs to allocate memory space to store information related to the routine. Once it returns (is de-
activated), all the information associated with the routine invocation is not needed anymore and this
memory space must be freed.
The program stack is a stack data structure that stores information belonging to active
routines, such as local variables, parameters, and the return address. The program stack is stored in
the main memory and, whenever a routine is invoked, the information belonging to the routine is pushed
on top of the stack, which causes it to grow. Also, whenever a routine returns, the information belonging
to the routine is discarded by dropping the contents at the top of the stack, which causes it to shrink.
The program stack is allocated at the stack space, which is usually placed at the end (high addresses)
of the memory. As a consequence, the program stack must grow towards low addresses.
The stack pointer is a pointer to the top of the stack, i.e., it stores the address of the top of
the stack. Growing or shrinking the stack is performed by adjusting the stack pointer.
In RISC-V, the stack pointer is stored by register sp. Also, in RISC-V, the stack grows towards
low addresses, hence, growing (or allocating space on) the stack can be performed by decreasing the
value of register sp (the stack pointer). The following code shows how to push the contents of register
a0 into the stack. First, the stack pointer is decreased to allocate space (4 bytes), then, the contents of
register a0 (4 bytes) are stored on the top of the program stack using the sw instruction.
1 addi sp, sp, -4 # allocate stack space
2 sw a0, 0(sp) # store data into the stack
Alternatively, shrinking the stack can be performed by increasing the value of register sp. The
following code shows how to pop a value from the top of the stack into register a0. First, the value on
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
91
+
7.2. THE PROGRAM STACK
7.2 The program stack
An active routine is a routine that was invoked but did not return yet. Notice that there may
be multiple active routines at a given point of the execution. For example, in the following code, routine
fun is invoked by routine bar, which is invoked by routine main. Initially, the main routine is active.
Then, it invokes the bar routine, which also becomes active. Finally, the fun routine is invoked and it
also becomes active. At this point, there are three active routines in the system.
1 int a = 10;
2
3 int main()
4 {
5 return bar() + 2;
6 }
7 int bar()
8 {
9 return fun() + 4;
10 }
11 int fun()
12 {
13 return a;
14 }
The set of active routines increases whenever a routine is invoked and decreases whenever a routine
returns. Routines are activated and deactivated in a last-in-first-out fashion, i.e., the last one to be
activated must be the first one to be deactivated. Consequently, the most natural data structure
to keep track of active routines is a stack.
Routines usually need memory space to store important information, such as local variables, param-
eters, and the return address. Hence, whenever a routine is invoked (and becomes active), the system
needs to allocate memory space to store information related to the routine. Once it returns (is de-
activated), all the information associated with the routine invocation is not needed anymore and this
memory space must be freed.
The program stack is a stack data structure that stores information belonging to active
routines, such as local variables, parameters, and the return address. The program stack is stored in
the main memory and, whenever a routine is invoked, the information belonging to the routine is pushed
on top of the stack, which causes it to grow. Also, whenever a routine returns, the information belonging
to the routine is discarded by dropping the contents at the top of the stack, which causes it to shrink.
The program stack is allocated at the stack space, which is usually placed at the end (high addresses)
of the memory. As a consequence, the program stack must grow towards low addresses.
The stack pointer is a pointer to the top of the stack, i.e., it stores the address of the top of
the stack. Growing or shrinking the stack is performed by adjusting the stack pointer.
In RISC-V, the stack pointer is stored by register sp. Also, in RISC-V, the stack grows towards
low addresses, hence, growing (or allocating space on) the stack can be performed by decreasing the
value of register sp (the stack pointer). The following code shows how to push the contents of register
a0 into the stack. First, the stack pointer is decreased to allocate space (4 bytes), then, the contents of
register a0 (4 bytes) are stored on the top of the program stack using the sw instruction.
1 addi sp, sp, -4 # allocate stack space
2 sw a0, 0(sp) # store data into the stack
Alternatively, shrinking the stack can be performed by increasing the value of register sp. The
following code shows how to pop a value from the top of the stack into register a0. First, the value on
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
91
diff --git a/book/riscv-book-105.page b/book/riscv-book-105.page index b1c1d0b..2b1478a 100644 --- a/book/riscv-book-105.page +++ b/book/riscv-book-105.page @@ -1 +1 @@ -
7.2. THE PROGRAM STACK
the top of the program stack is loaded into register a0 (4 bytes) using the lw instruction. Then, the
stack pointer is increased to deallocate the space (4 bytes).
1 lw a0, 0(sp) # retrieve data from stack
2 addi sp, sp, 4 # deallocate space
Figure 7.2 (a) illustrates a program stack that starts at address 0x0500 and grows down to address
0x04E4. Since the stack pointer points to the top of the stack, the contents of the register sp is equal to
0x04E4.
Main
Memory
0x0500
0x04FC
0x04F8
0x04F4
0x04F0
0x04EC
0x04E8
0x04E4
0x04E0
0x04DC
0x04D8
0x0000
...
sp (0x04E4)
(a)
Main
Memory
sp (0x04E0)
0x0500
0x04FC
0x04F8
0x04F4
0x04F0
0x04EC
0x04E8
0x04E4
FA0312B0
0x04E0
0x04DC
0x04D8
0x0000
...
(b)
Figure 7.2: Example of a program stack starting at address 0x0500 and growing downward to address
0x04E4 (a) before and (b) after pushing value 0xFA0312B0 into the stack.
Figure 7.2 (b) shows how the program stack is modified after executing the following code, i.e., after
pushing the contents of register a0 into the stack. Notice that the value of the stack pointer (sp) was
decremented by 4 units and the contents of register a0 (0xFA0312B0) was stored at the memory starting
at address 0x04E0.
1 li a0, 0xFA0312B0
2 addi sp, sp, -4 # allocate stack space
3 sw a0, 0(sp) # store data into the stack
The previous examples discussed how to push and pop a single word (4-byte value) to and from the
stack. In many situations, a program may need to push or pop multiple values to or from the stack. For
example, the program may need to save a set of register values on the stack. In these cases, the code
may be optimized by adjusting (increasing or decreasing) the stack pointer only once. The following
code shows how to push four values from registers a0, a1, a2, and a3 into the program stack. Notice
that the stack pointer was adjusted only once and the immediate field of the store word instruction (sw)
was used to select the proper position to store each one of the values. In this example, the last value
pushed into the stack was the value stored in the register a3.
1 addi sp, sp, -16 # allocate stack space (4 words)
2 sw a0, 12(sp) # store the first value (SP+12)
3 sw a1, 8(sp) # store the second value (SP+8)
4 sw a2, 4(sp) # store the third value (SP+4)
5 sw a3, 0(sp) # store the fourth value (SP+0)
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
92
+
7.2. THE PROGRAM STACK
the top of the program stack is loaded into register a0 (4 bytes) using the lw instruction. Then, the
stack pointer is increased to deallocate the space (4 bytes).
1 lw a0, 0(sp) # retrieve data from stack
2 addi sp, sp, 4 # deallocate space
Figure 7.2 (a) illustrates a program stack that starts at address 0x0500 and grows down to address
0x04E4. Since the stack pointer points to the top of the stack, the contents of the register sp is equal to
0x04E4.
Main
Memory
0x0500
0x04FC
0x04F8
0x04F4
0x04F0
0x04EC
0x04E8
0x04E4
0x04E0
0x04DC
0x04D8
0x0000
...
sp (0x04E4)
(a)
Main
Memory
sp (0x04E0)
0x0500
0x04FC
0x04F8
0x04F4
0x04F0
0x04EC
0x04E8
0x04E4
FA0312B0
0x04E0
0x04DC
0x04D8
0x0000
...
(b)
Figure 7.2: Example of a program stack starting at address 0x0500 and growing downward to address
0x04E4 (a) before and (b) after pushing value 0xFA0312B0 into the stack.
Figure 7.2 (b) shows how the program stack is modified after executing the following code, i.e., after
pushing the contents of register a0 into the stack. Notice that the value of the stack pointer (sp) was
decremented by 4 units and the contents of register a0 (0xFA0312B0) was stored at the memory starting
at address 0x04E0.
1 li a0, 0xFA0312B0
2 addi sp, sp, -4 # allocate stack space
3 sw a0, 0(sp) # store data into the stack
The previous examples discussed how to push and pop a single word (4-byte value) to and from the
stack. In many situations, a program may need to push or pop multiple values to or from the stack. For
example, the program may need to save a set of register values on the stack. In these cases, the code
may be optimized by adjusting (increasing or decreasing) the stack pointer only once. The following
code shows how to push four values from registers a0, a1, a2, and a3 into the program stack. Notice
that the stack pointer was adjusted only once and the immediate field of the store word instruction (sw)
was used to select the proper position to store each one of the values. In this example, the last value
pushed into the stack was the value stored in the register a3.
1 addi sp, sp, -16 # allocate stack space (4 words)
2 sw a0, 12(sp) # store the first value (SP+12)
3 sw a1, 8(sp) # store the second value (SP+8)
4 sw a2, 4(sp) # store the third value (SP+4)
5 sw a3, 0(sp) # store the fourth value (SP+0)
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
92
diff --git a/book/riscv-book-106.page b/book/riscv-book-106.page index 3e45a11..d997ba0 100644 --- a/book/riscv-book-106.page +++ b/book/riscv-book-106.page @@ -1 +1 @@ -
7.2. THE PROGRAM STACK
The following code shows how to pop four values from the program stack into registers a3, a2, a1,
and a0. Notice that the stack pointer was adjusted only once and the immediate field of the load word
instruction (lw) was used to select the proper position to load each one of the values. In this example,
the first value popped from the stack was stored into register a3.
1 lw a3, 0(sp) # retrieve the first value (SP+0)
2 lw a2, 4(sp) # retrieve the second value (SP+4)
3 lw a1, 8(sp) # retrieve the third value (SP+8)
4 lw a0, 12(sp) # retrieve the last value (SP+12)
5 addi sp, sp, 16 # deallocate stack space (4 words)
Previous examples showed how to perform push and pop operations on the program stack. Popping
data from the stack consists of retrieving the data and then deallocating the stack space, however, if
the data is not needed anymore, then, only the deallocation process needs to be performed. As we will
discuss in sections 7.4 and 7.6, allocating or deallocating stack space without immediately storing or
retrieving data to or from the stack is useful in many cases.
Initializing the stack pointer
The stack pointer register must be initialized to the base of the program stack before executing the
program. When running the program without the support of an operating system (for example, in an
embedded system) the stack pointer must be initialized by the system initialization code. On the other
hand, when running the program on top of an operating system, the execution environment (e.g., the
operating system kernel) usually initializes the stack pointer before jumping to the program’s entry point.
7.2.1 Types of stacks
Program stacks can be classified as: full descending, full ascending, empty descending, and empty as-
cending.
A full descending stack is a stack that: (a) grows towards low addresses, and (b) the stack
pointer points to the last element pushed into the stack. Pushing a value into a full descending
stack is performed by decreasing the stack pointer and then storing the value into the memory word
pointed by the stack pointer. Popping a value from a full descending stack is performed by first loading
the value from the memory word pointed by the stack pointer and then increasing the stack pointer.
An empty descending stack is a stack that: (a) grows towards low addresses, and (b) the
stack pointer points to the next available memory position, i.e., the memory position that must
be used to store the next item to be pushed into the stack. Pushing a value into an empty descending
stack is performed by first storing the value into the memory word pointed by the stack pointer (an
empty memory word), then decreasing the stack pointer. Popping a value from a full descending stack
is performed by first increasing the stack pointer then loading the value from the memory word pointed
by the stack pointer.
A full ascending stack is a stack that: (a) grows towards high addresses, and (b) the
stack pointer points to the last element pushed into the stack. Pushing a value into a full
ascending stack is performed by increasing the stack pointer and then storing the value into the memory
word pointed by the stack pointer. Popping a value from a full ascending stack is performed by first
loading the value from the memory word pointed by the stack pointer and then decreasing the stack
pointer.
An empty ascending stack is a stack that: (a) grows towards high addresses, and (b) the
stack pointer points to the next available memory position, i.e., the memory position that must
be used to store the next item to be pushed into the stack. Pushing a value into an empty ascending
stack is performed by first storing the value into the memory word pointed by the stack pointer (an
empty memory word), then increasing the stack pointer. Popping a value from a full ascending stack is
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
93
+
7.2. THE PROGRAM STACK
The following code shows how to pop four values from the program stack into registers a3, a2, a1,
and a0. Notice that the stack pointer was adjusted only once and the immediate field of the load word
instruction (lw) was used to select the proper position to load each one of the values. In this example,
the first value popped from the stack was stored into register a3.
1 lw a3, 0(sp) # retrieve the first value (SP+0)
2 lw a2, 4(sp) # retrieve the second value (SP+4)
3 lw a1, 8(sp) # retrieve the third value (SP+8)
4 lw a0, 12(sp) # retrieve the last value (SP+12)
5 addi sp, sp, 16 # deallocate stack space (4 words)
Previous examples showed how to perform push and pop operations on the program stack. Popping
data from the stack consists of retrieving the data and then deallocating the stack space, however, if
the data is not needed anymore, then, only the deallocation process needs to be performed. As we will
discuss in sections 7.4 and 7.6, allocating or deallocating stack space without immediately storing or
retrieving data to or from the stack is useful in many cases.
Initializing the stack pointer
The stack pointer register must be initialized to the base of the program stack before executing the
program. When running the program without the support of an operating system (for example, in an
embedded system) the stack pointer must be initialized by the system initialization code. On the other
hand, when running the program on top of an operating system, the execution environment (e.g., the
operating system kernel) usually initializes the stack pointer before jumping to the program’s entry point.
7.2.1 Types of stacks
Program stacks can be classified as: full descending, full ascending, empty descending, and empty as-
cending.
A full descending stack is a stack that: (a) grows towards low addresses, and (b) the stack
pointer points to the last element pushed into the stack. Pushing a value into a full descending
stack is performed by decreasing the stack pointer and then storing the value into the memory word
pointed by the stack pointer. Popping a value from a full descending stack is performed by first loading
the value from the memory word pointed by the stack pointer and then increasing the stack pointer.
An empty descending stack is a stack that: (a) grows towards low addresses, and (b) the
stack pointer points to the next available memory position, i.e., the memory position that must
be used to store the next item to be pushed into the stack. Pushing a value into an empty descending
stack is performed by first storing the value into the memory word pointed by the stack pointer (an
empty memory word), then decreasing the stack pointer. Popping a value from a full descending stack
is performed by first increasing the stack pointer then loading the value from the memory word pointed
by the stack pointer.
A full ascending stack is a stack that: (a) grows towards high addresses, and (b) the
stack pointer points to the last element pushed into the stack. Pushing a value into a full
ascending stack is performed by increasing the stack pointer and then storing the value into the memory
word pointed by the stack pointer. Popping a value from a full ascending stack is performed by first
loading the value from the memory word pointed by the stack pointer and then decreasing the stack
pointer.
An empty ascending stack is a stack that: (a) grows towards high addresses, and (b) the
stack pointer points to the next available memory position, i.e., the memory position that must
be used to store the next item to be pushed into the stack. Pushing a value into an empty ascending
stack is performed by first storing the value into the memory word pointed by the stack pointer (an
empty memory word), then increasing the stack pointer. Popping a value from a full ascending stack is
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
93
diff --git a/book/riscv-book-107.page b/book/riscv-book-107.page index 8ddb8e1..3cde553 100644 --- a/book/riscv-book-107.page +++ b/book/riscv-book-107.page @@ -1 +1 @@ -
7.3. THE ABI AND SOFTWARE COMPOSITION
performed by first decreasing the stack pointer then loading the value from the memory word pointed
by the stack pointer.
NOTE: The RISC-V program stack is a full descending stack.
7.3 The ABI and software composition
The Application Binary Interface, or ABI, is a set of conventions defined to facilitate the
composition of software. The ABI defines, for example, the calling convention, which determines
how and where parameters must be passed to routines and how and where values must be returned from
routines.
To illustrate its importance, let us assume John implemented a routine called jsort that takes two
arguments: a pointer to an array of characters and an integer that indicates the size of the array. The
following code shows the prototype of the jsort routine:
void jsort(char* a, int n);
Also, lets assume John made this routine available through a binary library.
Now, let us assume Mary has John’s library and wants to invoke the jsort routine. So far, we know
that Mary can link her program with John’s library and invoke the jsort routine by executing a jal
jsort instruction. However, where should Mary place the routine parameters, i.e., the pointer to the
array (char* a) and the size of the array (int n)?
The answer to the previous question is “it depends on where the code implemented by John is
expecting the parameters”. For example, if the jsort routine is expecting the first parameter (the
pointer to the array) to be placed at register a0 and the second one (the array size) to be placed at
register a1, then, Mary has to place these parameters in these two registers, otherwise, John’s code will
not work properly.
The calling convention, defined by the ABI, defines where routine parameters must be passed. As-
suming John and Mary are following the same ABI, it should be easy for Mary to place the routine
parameters in the correct registers.
There may be multiple, different, ABIs defined for a single computer architecture. This is the case for
x86, for example, with different ABIs defined for different operating systems. The RISC-V consortium
defines several ABIs
3
. Unless otherwise stated, in this text we will use the RISC-V ilp32 ABI, which
defines that int, long, and pointers are all 32-bits long. It also defines that long long is a 64-bit
type, char is 8-bit, and short is 16-bit.
NOTE: Only code generated for the same ABI can be linked together by the linker.
NOTE: When generating code with GCC, the user may specify the ABI using the -mabi flag.
For example, the following command may be used to compile and assemble the program.c file
using the ilp32 ABI: gcc -c program.c -mabi=ilp32 -o program.o
7.4 Passing parameters to and returning values from routines
7.4.1 Passing parameters to routines
Some routines have parameters, hence, when invoking them, the program needs to pass these parameters.
Routine parameters can be passed through registers or the program stack. As discussed in Section 7.3,
the proper places to pass parameters to a routine is defined by the ABI.
3
As of August 2020, there are two integer ABIs and three floating-point ABIs for RISC-V
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
94
+
7.3. THE ABI AND SOFTWARE COMPOSITION
performed by first decreasing the stack pointer then loading the value from the memory word pointed
by the stack pointer.
NOTE: The RISC-V program stack is a full descending stack.
7.3 The ABI and software composition
The Application Binary Interface, or ABI, is a set of conventions defined to facilitate the
composition of software. The ABI defines, for example, the calling convention, which determines
how and where parameters must be passed to routines and how and where values must be returned from
routines.
To illustrate its importance, let us assume John implemented a routine called jsort that takes two
arguments: a pointer to an array of characters and an integer that indicates the size of the array. The
following code shows the prototype of the jsort routine:
void jsort(char* a, int n);
Also, lets assume John made this routine available through a binary library.
Now, let us assume Mary has John’s library and wants to invoke the jsort routine. So far, we know
that Mary can link her program with John’s library and invoke the jsort routine by executing a jal
jsort instruction. However, where should Mary place the routine parameters, i.e., the pointer to the
array (char* a) and the size of the array (int n)?
The answer to the previous question is “it depends on where the code implemented by John is
expecting the parameters”. For example, if the jsort routine is expecting the first parameter (the
pointer to the array) to be placed at register a0 and the second one (the array size) to be placed at
register a1, then, Mary has to place these parameters in these two registers, otherwise, John’s code will
not work properly.
The calling convention, defined by the ABI, defines where routine parameters must be passed. As-
suming John and Mary are following the same ABI, it should be easy for Mary to place the routine
parameters in the correct registers.
There may be multiple, different, ABIs defined for a single computer architecture. This is the case for
x86, for example, with different ABIs defined for different operating systems. The RISC-V consortium
defines several ABIs
3
. Unless otherwise stated, in this text we will use the RISC-V ilp32 ABI, which
defines that int, long, and pointers are all 32-bits long. It also defines that long long is a 64-bit
type, char is 8-bit, and short is 16-bit.
NOTE: Only code generated for the same ABI can be linked together by the linker.
NOTE: When generating code with GCC, the user may specify the ABI using the -mabi flag.
For example, the following command may be used to compile and assemble the program.c file
using the ilp32 ABI: gcc -c program.c -mabi=ilp32 -o program.o
7.4 Passing parameters to and returning values from routines
7.4.1 Passing parameters to routines
Some routines have parameters, hence, when invoking them, the program needs to pass these parameters.
Routine parameters can be passed through registers or the program stack. As discussed in Section 7.3,
the proper places to pass parameters to a routine is defined by the ABI.
3
As of August 2020, there are two integer ABIs and three floating-point ABIs for RISC-V
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
94
diff --git a/book/riscv-book-108.page b/book/riscv-book-108.page index a734ed2..f0ad1fc 100644 --- a/book/riscv-book-108.page +++ b/book/riscv-book-108.page @@ -1 +1 @@ -
7.4. PASSING PARAMETERS TO AND RETURNING VALUES FROM ROUTINES
The RISC-V ilp32 ABI defines a set of conventions to pass parameters to routines
4
. These conven-
tions specify how different types of values (char, integer, structs, ...) must be passed on registers or the
stack. To simplify the discussion, we will focus on scalar values that can be represented with 32 or fewer
bits. These values can be (unsigned) char, (unsigned) short, (unsigned) integer, or pointer values.
The integer calling convention specifies the following rules to pass these type of values as parameters:
The first eight scalar parameters of the routine are passed through registers a0 to a7, being one
parameter per register. Hence, if the routine has less than 9 parameters, all of them are passed
through registers. Integer scalars narrower than 32 bits (e.g., char or short) are widened according
to the sign of their type up to 32 bits, then sign-extended to 32 bits.
In case there are more than 8 parameters, the remaining parameters, i.e., parameters 9 to N, are
passed through the stack. In this case, the parameters must be pushed into the program stack.
The last parameter, i.e., the N
th
parameter, must be pushed first and the 9
th
one must be pushed
last. These parameters must be later removed from the stack by the same routine that pushed
them into the stack. Again, integer scalars narrower than 32 bits (e.g., char or short) are widened
according to the sign of their type up to 32 bits, then sign-extended to 32 bits. Consequently, scalar
values smaller than 32 bits are expanded to 32 bits and occupy 4 bytes when passed as parameters
through the program stack.
Before invoking a routine, the caller must set the parameters, i.e., they must be placed in the registers
and into the stack accordingly to the ABI. To illustrate how to pass parameters, let us assume there is
a routine called sum10 that takes, as parameters, 10 integer values, sums them, and returns the result.
The following code shows the sum10 prototype:
1 int sum10(int a, int b, int c, int d, int e,
2 int f, int g, int h, int i, int j);
According to the RISC-V ilp32 ABI, to invoke this routine, one must place parameters a, b, c, d, e,
f, g, and h on registers a0, a1, a2, a3, a4, a5, a6, and a7, respectively. Also, parameters i and j must
be placed on the stack, being the value of j pushed first and the value of i last.
The following code shows how to call the sum10 routine passing as arguments values 10, 20, 30, 40,
50, 60, 70, 80, 90, 100. Notice that the 9
th
and the 10
th
parameters are pushed into the stack (lines
11-15). Also, notice that these parameters are later removed from the program stack by the same routine
that placed them on the program stack (line 17), i.e., the main routine.
4
https://github.com/riscv/riscv-elf-psabi-doc/blob/master/riscv-elf.md
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
95
+
7.4. PASSING PARAMETERS TO AND RETURNING VALUES FROM ROUTINES
The RISC-V ilp32 ABI defines a set of conventions to pass parameters to routines
4
. These conven-
tions specify how different types of values (char, integer, structs, ...) must be passed on registers or the
stack. To simplify the discussion, we will focus on scalar values that can be represented with 32 or fewer
bits. These values can be (unsigned) char, (unsigned) short, (unsigned) integer, or pointer values.
The integer calling convention specifies the following rules to pass these type of values as parameters:
The first eight scalar parameters of the routine are passed through registers a0 to a7, being one
parameter per register. Hence, if the routine has less than 9 parameters, all of them are passed
through registers. Integer scalars narrower than 32 bits (e.g., char or short) are widened according
to the sign of their type up to 32 bits, then sign-extended to 32 bits.
In case there are more than 8 parameters, the remaining parameters, i.e., parameters 9 to N, are
passed through the stack. In this case, the parameters must be pushed into the program stack.
The last parameter, i.e., the N
th
parameter, must be pushed first and the 9
th
one must be pushed
last. These parameters must be later removed from the stack by the same routine that pushed
them into the stack. Again, integer scalars narrower than 32 bits (e.g., char or short) are widened
according to the sign of their type up to 32 bits, then sign-extended to 32 bits. Consequently, scalar
values smaller than 32 bits are expanded to 32 bits and occupy 4 bytes when passed as parameters
through the program stack.
Before invoking a routine, the caller must set the parameters, i.e., they must be placed in the registers
and into the stack accordingly to the ABI. To illustrate how to pass parameters, let us assume there is
a routine called sum10 that takes, as parameters, 10 integer values, sums them, and returns the result.
The following code shows the sum10 prototype:
1 int sum10(int a, int b, int c, int d, int e,
2 int f, int g, int h, int i, int j);
According to the RISC-V ilp32 ABI, to invoke this routine, one must place parameters a, b, c, d, e,
f, g, and h on registers a0, a1, a2, a3, a4, a5, a6, and a7, respectively. Also, parameters i and j must
be placed on the stack, being the value of j pushed first and the value of i last.
The following code shows how to call the sum10 routine passing as arguments values 10, 20, 30, 40,
50, 60, 70, 80, 90, 100. Notice that the 9
th
and the 10
th
parameters are pushed into the stack (lines
11-15). Also, notice that these parameters are later removed from the program stack by the same routine
that placed them on the program stack (line 17), i.e., the main routine.
4
https://github.com/riscv/riscv-elf-psabi-doc/blob/master/riscv-elf.md
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
95
diff --git a/book/riscv-book-109.page b/book/riscv-book-109.page index de1b661..0ddf1b8 100644 --- a/book/riscv-book-109.page +++ b/book/riscv-book-109.page @@ -1 +1 @@ -
7.5. VALUE AND REFERENCE PARAMETERS
1 # sum10(10,20,30,40,50,60,70,80,90,100);
2 main:
3 li a0, 10 # 1st parameter
4 li a1, 20 # 2nd parameter
5 li a2, 30 # 3rd parameter
6 li a3, 40 # 4th parameter
7 li a4, 50 # 5th parameter
8 li a5, 60 # 6th parameter
9 li a6, 70 # 7th parameter
10 li a7, 80 # 8th parameter
11 addi sp, sp, -8 # allocate stack space for two parameters
12 li t1, 100 # push the 10th parameter
13 sw t1, 4(sp)
14 li t1, 90 # push the 9th parameter
15 sw t1, 0(sp)
16 jal sum10 # invoke sum10
17 addi sp, sp, 8 # deallocate the parameters from stack
18 ret
The routine that was invoked (sum10 in this example) must retrieve the parameters from the registers
and the stack accordingly to the ABI. The following code shows a possible implementation for the sum10
routine and illustrates this process. It loads the values of the 9
th
and the 10
th
parameters from the stack
into registers t1 and t2. Notice that, even though it loads these values from the program stack, it does
not pop (deallocate) the values from the program stack - this cleaning process must be performed by the
caller routine, i.e., the routine that invoked the sum10 routine.
1 sum10:
2 lw t1, 0(sp) # load the 9th parameter into t1
3 lw t2, 4(sp) # load the 10th parameter into t2
4 add a0, a0, a1 # sum all parameters
5 add a0, a0, a2
6 add a0, a0, a3
7 add a0, a0, a4
8 add a0, a0, a5
9 add a0, a0, a6
10 add a0, a0, a7
11 add a0, a0, t1
12 add a0, a0, t2 # place return value on a0
13 ret # return
7.4.2 Returning values from routines
The RISC-V ilp32 ABI defines that values should be returned in register a0. In case the value being
returned is 64-bit long, then the least significant 32 bits must be returned in register a0 and the most
significant 32 bits must be returned in register a1.
7.5 Value and reference parameters
Parameters may be passed as values or as references to variables. Value parameters are parameters
that contain the value itself, i.e., the value is placed directly into the registers or the program stack.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
96
+
7.5. VALUE AND REFERENCE PARAMETERS
1 # sum10(10,20,30,40,50,60,70,80,90,100);
2 main:
3 li a0, 10 # 1st parameter
4 li a1, 20 # 2nd parameter
5 li a2, 30 # 3rd parameter
6 li a3, 40 # 4th parameter
7 li a4, 50 # 5th parameter
8 li a5, 60 # 6th parameter
9 li a6, 70 # 7th parameter
10 li a7, 80 # 8th parameter
11 addi sp, sp, -8 # allocate stack space for two parameters
12 li t1, 100 # push the 10th parameter
13 sw t1, 4(sp)
14 li t1, 90 # push the 9th parameter
15 sw t1, 0(sp)
16 jal sum10 # invoke sum10
17 addi sp, sp, 8 # deallocate the parameters from stack
18 ret
The routine that was invoked (sum10 in this example) must retrieve the parameters from the registers
and the stack accordingly to the ABI. The following code shows a possible implementation for the sum10
routine and illustrates this process. It loads the values of the 9
th
and the 10
th
parameters from the stack
into registers t1 and t2. Notice that, even though it loads these values from the program stack, it does
not pop (deallocate) the values from the program stack - this cleaning process must be performed by the
caller routine, i.e., the routine that invoked the sum10 routine.
1 sum10:
2 lw t1, 0(sp) # load the 9th parameter into t1
3 lw t2, 4(sp) # load the 10th parameter into t2
4 add a0, a0, a1 # sum all parameters
5 add a0, a0, a2
6 add a0, a0, a3
7 add a0, a0, a4
8 add a0, a0, a5
9 add a0, a0, a6
10 add a0, a0, a7
11 add a0, a0, t1
12 add a0, a0, t2 # place return value on a0
13 ret # return
7.4.2 Returning values from routines
The RISC-V ilp32 ABI defines that values should be returned in register a0. In case the value being
returned is 64-bit long, then the least significant 32 bits must be returned in register a0 and the most
significant 32 bits must be returned in register a1.
7.5 Value and reference parameters
Parameters may be passed as values or as references to variables. Value parameters are parameters
that contain the value itself, i.e., the value is placed directly into the registers or the program stack.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
96
diff --git a/book/riscv-book-11.page b/book/riscv-book-11.page index 0b1f52c..700a97f 100644 --- a/book/riscv-book-11.page +++ b/book/riscv-book-11.page @@ -1 +1 @@ -
Glossary
32-bit address space is the set of addresses represented by 32-bit unsigned numbers. v, 46
binary digit is a digit that may assume one of two values: “0” (zero) or “1” (one). v, 10
bus is a communication system that transfers information between the computer components. This
system is usually composed of wires that are responsible for transmitting the information and
associated circuitry, which are responsible for orchestrating the communication. v, 2, 90, 91, 94
byte addressable memory is a memory in which each memory word stores a single byte. v, 2–4,
15–19, 47
Central Processing Unit (CPU) is the computer component responsible for executing the computer
programs. v, 2, 3
column-major order specifies that the elements of a two-dimensional array are organized in memory
column by column. In this context, the elements of the first column are placed first then the
elements of the second column are placed after the elements of the first one and so on. v
Control and Status Register (CSR) is an internal CPU register that exposes the CPU status to the
software and allows software to control the CPU behavior. v, 100, 101, 107, 109
endianness refers to the order in which the bytes are stored on a computing system. There are two
common formats: little-endian and big-endian. The little-endian format places the least significant
byte on the memory position associated with the lowest address while the big-endian format places
the most significant byte on the memory position associated with the lowest address. v, 16, 39, 54,
56, 57
exceptions are events generated by the CPU in response to exceptional conditions when executing
instructions. v
external interrupts are interrupts caused by external (non-CPU) hardware, such as peripherals, to
inform the CPU they require attention. v
hardware interrupts are events generated by hardware, such as peripherals, to inform the CPU they
require attention. v
immediate value is a number that is encoded into the instruction encoding. As a consequence, it is a
constant. v, 49–58, 61, 112, 113
Instruction Set Architecture (ISA) defines the computer instructions set, including, but not limited
to, the behavior of the instructions, their encoding, and resources that may be accessed by the
instructions, such as CPU registers. v, 3, 42, 46, 52, 100, 106
viii
+
Glossary
32-bit address space is the set of addresses represented by 32-bit unsigned numbers. vi, 57
binary digit is a digit that may assume one of two values: “0” (zero) or “1” (one). vi, vii, 12
bus is a communication system that transfers information between the computer components. This
system is usually composed of wires that are responsible for transmitting the information and
associated circuitry, which are responsible for orchestrating the communication. vi, 3, 111, 113,
116
byte addressable memory is a memory in which each memory word stores a single byte. vi, 3–5,
18–22, 24, 57
Central Processing Unit (CPU) is the computer component responsible for executing the computer
programs. vi, vii, ix, 2, 3
column-major order specifies that the elements of a two-dimensional array are organized in memory
column by column. In this context, the elements of the first column are placed first then the
elements of the second column are placed after the elements of the first one and so on. vi
Control and Status Register (CSR) is an internal CPU register that exposes the CPU status to the
software and allows software to control the CPU behavior. vi, vii, 124, 125, 133, 135
endianness refers to the order in which the bytes are stored on a computing system. There are two
common formats: little-endian and big-endian. The little-endian format places the least significant
byte on the memory position associated with the lowest address while the big-endian format places
the most significant byte on the memory position associated with the lowest address. vi, 20, 49,
67, 69–71
exceptions are events generated by the CPU in response to exceptional conditions when executing
instructions. vi
external interrupts are interrupts caused by external (non-CPU) hardware, such as peripherals, to
inform the CPU they require attention. vi
hardware interrupts are events generated by hardware, such as peripherals, to inform the CPU they
require attention. vi
immediate value is a number that is encoded into the instruction encoding. As a consequence, it is a
constant. vi, 60–72, 76, 138, 139
Instruction Set Architecture (ISA) defines the computer instructions set, including, but not limited
to, the behavior of the instructions, their encoding, and resources that may be accessed by the
instructions, such as CPU registers. vi, vii, 4, 51, 56, 64, 124, 131, 132
viii
diff --git a/book/riscv-book-110.page b/book/riscv-book-110.page index 2301a22..58d68a6 100644 --- a/book/riscv-book-110.page +++ b/book/riscv-book-110.page @@ -1 +1 @@ -
7.5. VALUE AND REFERENCE PARAMETERS
The following code shows a routine that expects its parameter to be passed by value. This routine takes
a value as a parameter, computes its power of two, and returns the result.
1 int pow2(int v)
2 {
3 return v*v;
4 }
Accordingly to the RISC-V ilp32 ABI, this parameter must be passed in register a0. Since it is
passed as value, register a0 will contain the value itself. The following code shows the implementation
of the previous “C” code in assembly language. Notice that the code multiplies the contents of register
a0 by itself.
1 pow2:
2 mul a0, a0, a0 # a0 := a0 * a0
3 ret # return
The following code shows how to invoke the pow2 routine to compute the square of 32. Notice that
the value itself is directly placed into register a0.
1 main:
2 li a0, 32 # set the parameter with value 32
3 jal pow2 # invoke pow2
4 ret
Reference parameters are parameters that contain a reference to a variable. This “refer-
ence” is the variable memory address. Hence, the routine may use this address to read or update the
variable value. The following code shows a routine that expects its parameter to be passed by reference.
This routine updates the variable value by increasing its contents by one.
1 void inc(int* v)
2 {
3 *v = *v + 1;
4 }
Again, accordingly to the RISC-V ilp32 ABI, this parameter must be passed in register a0. Since it
is passed as reference, register a0 will contain the address of the variable. The following code shows the
implementation of the previous “C” code in assembly language. Notice that the code uses the address
passed in register a0 to update the contents of the variable.
1 inc:
2 lw a1, (a0) # a1 := *v
3 addi a1, a1, 1 # a1 := a1 + 1
4 sw a1, (a0) # *v := a1
5 ret
The following code shows how the inc routine can be invoked to increase the value of variable y.
Notice that the address of variable y, instead of its value, is loaded into register a0.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
97
+
7.5. VALUE AND REFERENCE PARAMETERS
The following code shows a routine that expects its parameter to be passed by value. This routine takes
a value as a parameter, computes its power of two, and returns the result.
1 int pow2(int v)
2 {
3 return v*v;
4 }
Accordingly to the RISC-V ilp32 ABI, this parameter must be passed in register a0. Since it is
passed as value, register a0 will contain the value itself. The following code shows the implementation
of the previous “C” code in assembly language. Notice that the code multiplies the contents of register
a0 by itself.
1 pow2:
2 mul a0, a0, a0 # a0 := a0 * a0
3 ret # return
The following code shows how to invoke the pow2 routine to compute the square of 32. Notice that
the value itself is directly placed into register a0.
1 main:
2 li a0, 32 # set the parameter with value 32
3 jal pow2 # invoke pow2
4 ret
Reference parameters are parameters that contain a reference to a variable. This “refer-
ence” is the variable memory address. Hence, the routine may use this address to read or update the
variable value. The following code shows a routine that expects its parameter to be passed by reference.
This routine updates the variable value by increasing its contents by one.
1 void inc(int* v)
2 {
3 *v = *v + 1;
4 }
Again, accordingly to the RISC-V ilp32 ABI, this parameter must be passed in register a0. Since it
is passed as reference, register a0 will contain the address of the variable. The following code shows the
implementation of the previous “C” code in assembly language. Notice that the code uses the address
passed in register a0 to update the contents of the variable.
1 inc:
2 lw a1, (a0) # a1 := *v
3 addi a1, a1, 1 # a1 := a1 + 1
4 sw a1, (a0) # *v := a1
5 ret
The following code shows how the inc routine can be invoked to increase the value of variable y.
Notice that the address of variable y, instead of its value, is loaded into register a0.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
97
diff --git a/book/riscv-book-111.page b/book/riscv-book-111.page index d6215f0..4494b28 100644 --- a/book/riscv-book-111.page +++ b/book/riscv-book-111.page @@ -1 +1 @@ -
7.6. GLOBAL VS LOCAL VARIABLES
1 .data
2 y: .skip 4
3
4 .text
5 main:
6 la a0, y # set the parameter with the address of y
7 jal inc # invoke inc
8 ret
Reference parameters can be used to pass information in and out of routines. Since a reference is
essentially a memory address, the information being passed into or out of the routine must be located
in the memory.
7.6 Global vs local variables
In high-level languages, such as “C”, global variables are variables declared outside routines, and they
can be accessed on any routine in the program.
The following code shows an example of a “C” program with a global variable named x. Notice that
the global variable may be accessed from within any routine.
1 int x;
2
3 int main()
4 {
5 return x+1;
6 }
Global variables are allocated on the static data space by the assembler and are usually
declared on assembly programs with the help of directives. The following code shows the
assembly code for the previous “C” program.
1 .data
2 x:
3 .skip 4
4
5 .text
6 main:
7 la a0, x # load the address of variable x
8 lw a0, 0(a0) # load the value o x
9 addi a0, a0, 1 # increment the value
10 ret # return
In the previous code, the .data directive (line 1) informs the assembler that the following contents
must be placed into the static data space. The x label marks the address of variable x. The .skip 4
directive (line 3) instructs the assembler to skip four bytes, which is used to allocate space for variable
x. The .text directive (line 5) informs the assembler that the following contents must now be placed
into the code space. The remainder of the code (lines 6-10) implements the main routine.
In high-level languages, such as in “C”, local variables are variables declared inside routines, and can
be used only inside the routine that declared it.
Ideally, local variables should be allocated on registers. The following code contains a local variable
called tmp that can be allocated on a register.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
98
+
7.6. GLOBAL VS LOCAL VARIABLES
1 .data
2 y: .skip 4
3
4 .text
5 main:
6 la a0, y # set the parameter with the address of y
7 jal inc # invoke inc
8 ret
Reference parameters can be used to pass information in and out of routines. Since a reference is
essentially a memory address, the information being passed into or out of the routine must be located
in the memory.
7.6 Global vs local variables
In high-level languages, such as “C”, global variables are variables declared outside routines, and they
can be accessed on any routine in the program.
The following code shows an example of a “C” program with a global variable named x. Notice that
the global variable may be accessed from within any routine.
1 int x;
2
3 int main()
4 {
5 return x+1;
6 }
Global variables are allocated on the static data space by the assembler and are usually
declared on assembly programs with the help of directives. The following code shows the
assembly code for the previous “C” program.
1 .data
2 x:
3 .skip 4
4
5 .text
6 main:
7 la a0, x # load the address of variable x
8 lw a0, 0(a0) # load the value o x
9 addi a0, a0, 1 # increment the value
10 ret # return
In the previous code, the .data directive (line 1) informs the assembler that the following contents
must be placed into the static data space. The x label marks the address of variable x. The .skip 4
directive (line 3) instructs the assembler to skip four bytes, which is used to allocate space for variable
x. The .text directive (line 5) informs the assembler that the following contents must now be placed
into the code space. The remainder of the code (lines 6-10) implements the main routine.
In high-level languages, such as in “C”, local variables are variables declared inside routines, and can
be used only inside the routine that declared it.
Ideally, local variables should be allocated on registers. The following code contains a local variable
called tmp that can be allocated on a register.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
98
diff --git a/book/riscv-book-112.page b/book/riscv-book-112.page index 53d8687..cf82dca 100644 --- a/book/riscv-book-112.page +++ b/book/riscv-book-112.page @@ -1 +1 @@ -
7.6. GLOBAL VS LOCAL VARIABLES
1 void exchange(int* a, int* b)
2 {
3 int tmp = *b;
4 *b = *a
5 *a = tmp;
6 }
The following code shows the assembly code for the previous “C” code. Notice that the local variable
tmp was allocated on register a2.
1 exchange:
2 lw a2, (a1) # tmp := *b
3 lw a3, (a0) # a3 := *a
4 sw a3, (a1) # *b := a3
5 sw a2, (a0) # *a := tmp
6 ret
7.6.1 Allocating local variables on memory
There are several situations in which local variables must be allocated on memory, for
example:
When a routine has a large number of local variables and there are not enough registers to allocate
them; or
When a local variable is an array or a structure; or
When the code needs the address of the local variable. This may be the case when passing a local
variable as reference to other routines.
Local variables that need to be allocated on memory, are allocated on the program stack
whenever a routine is invoked and become active, and deallocated whenever the routine
returns, i.e., it is not active anymore. These variables must be allocated and deallocated by the routine
that contains them. They must be allocated upon the entry of a routine and deallocated before returning
from the routine.
Allocating space at the program stack is performed by decreasing the value of the stack pointer by
the number of bytes that need to be allocated. The following code shows an example in which a local
variable named userid needs to be allocated on memory. The address of this variable, which is a 4-byte
integer, is passed to routines get uid.
1 int foo()
2 {
3 int userid;
4 get_uid(&userid);
5 return userid;
6 }
The following code shows the assembly code for the foo routine. First, the stack pointer is decreased
to allocate space for the userid variable (line 2). Then, the address of the userid variable is loaded into
register a0 to be passed as parameter to routine get uid (line 3). Notice that, since the last element
added to the program stack was the userid variable, the stack pointer points to (contains the address
of) this variable. Next, the get uid routine is invoked (line 4) and, after returning, the value of the
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
99
+
7.6. GLOBAL VS LOCAL VARIABLES
1 void exchange(int* a, int* b)
2 {
3 int tmp = *b;
4 *b = *a
5 *a = tmp;
6 }
The following code shows the assembly code for the previous “C” code. Notice that the local variable
tmp was allocated on register a2.
1 exchange:
2 lw a2, (a1) # tmp := *b
3 lw a3, (a0) # a3 := *a
4 sw a3, (a1) # *b := a3
5 sw a2, (a0) # *a := tmp
6 ret
7.6.1 Allocating local variables on memory
There are several situations in which local variables must be allocated on memory, for
example:
When a routine has a large number of local variables and there are not enough registers to allocate
them; or
When a local variable is an array or a structure; or
When the code needs the address of the local variable. This may be the case when passing a local
variable as reference to other routines.
Local variables that need to be allocated on memory, are allocated on the program stack
whenever a routine is invoked and become active, and deallocated whenever the routine
returns, i.e., it is not active anymore. These variables must be allocated and deallocated by the routine
that contains them. They must be allocated upon the entry of a routine and deallocated before returning
from the routine.
Allocating space at the program stack is performed by decreasing the value of the stack pointer by
the number of bytes that need to be allocated. The following code shows an example in which a local
variable named userid needs to be allocated on memory. The address of this variable, which is a 4-byte
integer, is passed to routines get uid.
1 int foo()
2 {
3 int userid;
4 get_uid(&userid);
5 return userid;
6 }
The following code shows the assembly code for the foo routine. First, the stack pointer is decreased
to allocate space for the userid variable (line 2). Then, the address of the userid variable is loaded into
register a0 to be passed as parameter to routine get uid (line 3). Notice that, since the last element
added to the program stack was the userid variable, the stack pointer points to (contains the address
of) this variable. Next, the get uid routine is invoked (line 4) and, after returning, the value of the
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
99
diff --git a/book/riscv-book-113.page b/book/riscv-book-113.page index fb0b34e..3bbe0d9 100644 --- a/book/riscv-book-113.page +++ b/book/riscv-book-113.page @@ -1 +1 @@ -
7.6. GLOBAL VS LOCAL VARIABLES
userid variable is loaded into register a0 to be returned (line 5)
5
. Finally, before returning from the
foo routine, the stack pointer is increased to deallocate the userid variable from the program stack.
1 foo:
2 addi sp, sp, -4 # allocate userid
3 mv a0, sp # a0 := address of userid (&userid)
4 jal get_uid # invoke the get_uid routine
5 lw a0, (sp) # a0 := userid
6 addi sp, sp, 4 # deallocate userid
7 ret
NOTE: In the previous and following examples, the value of the return address register (ra) is
supposed to be saved at the beginning of the routine and restored before returning from it. To
simplify the examples, we omitted this process in these examples. Section 7.7.2 will discuss how
to save and restore the return address.
The following code shows another example in which a local variable needs to be allocated in memory.
In this case, the my array local variable needs to be allocated on memory because it is an array. Also,
the address of this variable is passed to routine init array.
1 int bar()
2 {
3 int my_array[8];
4 init_array(my_array);
5 return my_array[4];
6 }
The following code shows the assembly code for the bar routine. First, the stack pointer is decreased
to allocate space for the my array variable (line 2)
6
. Then, the address of the my array variable is
loaded into register a0 to be passed as parameter to routine init array (line 3). Again, since the last
element added to the program stack was the my array variable, the stack pointer points to (contains
the address) of this variable
7
. Next, the init array routine is invoked (line 4) and, after returning, the
value of my array[4] is loaded into register a0 for return (line 5)
8
. Finally, before returning from the
bar routine, the stack pointer is increased to deallocate the my array variable (line 6) from the program
stack.
1 bar:
2 addi sp, sp, -32 # allocate my_array
3 mv a0, sp # a0 := address of my_array
4 jal init_array # invoke the init_array routine
5 lw a0, 16(sp) # load my_array[4] into a0
6 addi sp, sp, 32 # deallocate my_array
7 ret
5
Since the value of variable userid may have been modified by the get uid routine, the code needs to load the value of
variable userid from memory after the execution of the get uid routine.
6
Notice that the my array variable is a 32-byte long array - It contains eight 4-byte integers.
7
At this point, the stack pointer points to the first element of the my array array, i.e., my array[0].
8
Since the stack pointer (sp) is pointing to my array[0] and each array element has four bytes, my array[4] is located
starting at memory position SP+16.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
100
+
7.6. GLOBAL VS LOCAL VARIABLES
userid variable is loaded into register a0 to be returned (line 5)
5
. Finally, before returning from the
foo routine, the stack pointer is increased to deallocate the userid variable from the program stack.
1 foo:
2 addi sp, sp, -4 # allocate userid
3 mv a0, sp # a0 := address of userid (&userid)
4 jal get_uid # invoke the get_uid routine
5 lw a0, (sp) # a0 := userid
6 addi sp, sp, 4 # deallocate userid
7 ret
NOTE: In the previous and following examples, the value of the return address register (ra) is
supposed to be saved at the beginning of the routine and restored before returning from it. To
simplify the examples, we omitted this process in these examples. Section 7.7.2 will discuss how
to save and restore the return address.
The following code shows another example in which a local variable needs to be allocated in memory.
In this case, the my array local variable needs to be allocated on memory because it is an array. Also,
the address of this variable is passed to routine init array.
1 int bar()
2 {
3 int my_array[8];
4 init_array(my_array);
5 return my_array[4];
6 }
The following code shows the assembly code for the bar routine. First, the stack pointer is decreased
to allocate space for the my array variable (line 2)
6
. Then, the address of the my array variable is
loaded into register a0 to be passed as parameter to routine init array (line 3). Again, since the last
element added to the program stack was the my array variable, the stack pointer points to (contains
the address) of this variable
7
. Next, the init array routine is invoked (line 4) and, after returning, the
value of my array[4] is loaded into register a0 for return (line 5)
8
. Finally, before returning from the
bar routine, the stack pointer is increased to deallocate the my array variable (line 6) from the program
stack.
1 bar:
2 addi sp, sp, -32 # allocate my_array
3 mv a0, sp # a0 := address of my_array
4 jal init_array # invoke the init_array routine
5 lw a0, 16(sp) # load my_array[4] into a0
6 addi sp, sp, 32 # deallocate my_array
7 ret
5
Since the value of variable userid may have been modified by the get uid routine, the code needs to load the value of
variable userid from memory after the execution of the get uid routine.
6
Notice that the my array variable is a 32-byte long array - It contains eight 4-byte integers.
7
At this point, the stack pointer points to the first element of the my array array, i.e., my array[0].
8
Since the stack pointer (sp) is pointing to my array[0] and each array element has four bytes, my array[4] is located
starting at memory position SP+16.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
100
diff --git a/book/riscv-book-114.page b/book/riscv-book-114.page index 6e83763..9bc7958 100644 --- a/book/riscv-book-114.page +++ b/book/riscv-book-114.page @@ -1 +1 @@ -
7.7. REGISTER USAGE POLICIES
The following code shows yet another example in which a local variable needs to be allocated in
memory. In this case, the d local variable needs to be allocated on memory because it is a struct. Also,
the address of this variable is passed to routine init date.
1 typedef struct
2 {
3 int year;
4 int month;
5 int day;
6 } date_t;
7
8 int get_current_day()
9 {
10 date_t d;
11 init_date(&d);
12 return d.day;
13 }
The following code shows the assembly code for the get current day routine. First, the stack pointer
is decreased to allocate space for the d variable (line 2)
9
. Then, the address of variable d variable is
loaded into register a0 to be passed as parameter to routine init date (line 3). Again, since the last
element added to the program stack was variable d, the stack pointer points to (contains the address) of
this variable
10
. Next, the init date routine is invoked (line 4) and, after returning, the value of d.day is
loaded into register a0 for return (line 5)
11
. Finally, before returning from the get current day routine,
the stack pointer is increased to deallocate the d variable (line 6) from the program stack.
1 get_current_day:
2 addi sp, sp, -12 # allocate d
3 mv a0, sp # a0 := address of d
4 jal init_date # invoke the init_date routine
5 lw a0, 8(sp) # load d.day into a0
6 addi sp, sp, 12 # deallocate d
7 ret
7.7 Register usage policies
The assembly code examples in the previous sections have used registers to hold variables and temporary
values, to return values from routines, and to pass parameters to routines. In fact, registers are frequently
used resources. Before using a register, however, it may be necessary to save its contents to memory so
that it can be restored later.
Let us use as an example the exchange routine, introduced in Section 7.6. The following code shows
its implementation in assembly language.
9
Notice that the d variable is a 12-byte long struct - It contains three 4-byte integers.
10
At this point, the stack pointer points to the first element of the data t struct, i.e., the year field.
11
Since the stack pointer (sp) is pointing to d.year) and each field has four bytes, d.day is located at memory position
SP+8.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
101
+
7.7. REGISTER USAGE POLICIES
The following code shows yet another example in which a local variable needs to be allocated in
memory. In this case, the d local variable needs to be allocated on memory because it is a struct. Also,
the address of this variable is passed to routine init date.
1 typedef struct
2 {
3 int year;
4 int month;
5 int day;
6 } date_t;
7
8 int get_current_day()
9 {
10 date_t d;
11 init_date(&d);
12 return d.day;
13 }
The following code shows the assembly code for the get current day routine. First, the stack pointer
is decreased to allocate space for the d variable (line 2)
9
. Then, the address of variable d variable is
loaded into register a0 to be passed as parameter to routine init date (line 3). Again, since the last
element added to the program stack was variable d, the stack pointer points to (contains the address) of
this variable
10
. Next, the init date routine is invoked (line 4) and, after returning, the value of d.day is
loaded into register a0 for return (line 5)
11
. Finally, before returning from the get current day routine,
the stack pointer is increased to deallocate the d variable (line 6) from the program stack.
1 get_current_day:
2 addi sp, sp, -12 # allocate d
3 mv a0, sp # a0 := address of d
4 jal init_date # invoke the init_date routine
5 lw a0, 8(sp) # load d.day into a0
6 addi sp, sp, 12 # deallocate d
7 ret
7.7 Register usage policies
The assembly code examples in the previous sections have used registers to hold variables and temporary
values, to return values from routines, and to pass parameters to routines. In fact, registers are frequently
used resources. Before using a register, however, it may be necessary to save its contents to memory so
that it can be restored later.
Let us use as an example the exchange routine, introduced in Section 7.6. The following code shows
its implementation in assembly language.
9
Notice that the d variable is a 12-byte long struct - It contains three 4-byte integers.
10
At this point, the stack pointer points to the first element of the data t struct, i.e., the year field.
11
Since the stack pointer (sp) is pointing to d.year) and each field has four bytes, d.day is located at memory position
SP+8.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
101
diff --git a/book/riscv-book-115.page b/book/riscv-book-115.page index cef8dfc..6da288b 100644 --- a/book/riscv-book-115.page +++ b/book/riscv-book-115.page @@ -1 +1 @@ -
7.7. REGISTER USAGE POLICIES
1 exchange:
2 lw a2, (a1) # tmp := *b
3 lw a3, (a0) # a3 := *a
4 sw a3, (a1) # *b := a3
5 sw a2, (a0) # *a := tmp
6 ret
Notice that the assembly code uses registers a2 and a3 to perform the computation. In this case, the
contents of these two registers are destroyed by the lw instructions (lines 2 and 3).
Now, lets assume that the mix routine loads an “important information” on register a2 and, before
using this information, it invokes the exchange routine. The following code illustrates this situation.
First, the mix routine loads the important information into register a2 (line 2). Then, it sets the
parameters and invoke the exchange routine (lines 3-5). Finally, the mix routine returns the important
information by copying it from register a2 to register a0 (line 6) and executing the ret instruction (line
7).
1 mix:
2 lw a2, (a0) # load important information into a2
3 la a0, x # set parameter 0 with address of var. x
4 la a1, y # set parameter 1 with address of var. y
5 jal exchange # invoke exchange to swap x and y values
6 mv a0, a2 # move important information into a0 to return
7 ret
Notice, however, that the exchange routine destroys the contents of registers a2. Consequently, the
value returned by the mix routine is not the “important information” that was loaded into register a2
at line 2.
To solve the problem, the mix routine could save the contents of register a2 on the program stack
before invoking the exchange routine and restore it after the exchange routine returns. The following
code illustrates this situation. Notice that the value in register a2 is saved into the program stack (lines
3 and 4) before invoking the exchange routine and restored (lines 8 and 9) after the exchange routine
returns.
1 mix:
2 lw a2, (a0) # load important information into a2
3 addi sp, sp, -4 # save a2: Allocate stack space and
4 sw a2, (sp) # store a2 into the stack
5 la a0, x # set parameter 1 with address of var. x
6 la a1, y # set parameter 2 with address of var. y
7 jal exchange # invoke exchange to swap x and y values
8 lw a2, (sp) # restore a2: Loads a2 from the stack and
9 addi sp, sp, 4 # deallocate the stack space
10 mv a0, a2 # move important information into a0 to return
11 ret
Another way to solve this problem is to modify the exchange routine to save and restore all the
registers that it might change. The following code illustrates this situation. Notice that the contents
of registers a2 and a3 are saved into the program stack (lines 2-4) at the beginning of the routine and
restored (lines 9-11) before returning from the routine.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
102
+
7.7. REGISTER USAGE POLICIES
1 exchange:
2 lw a2, (a1) # tmp := *b
3 lw a3, (a0) # a3 := *a
4 sw a3, (a1) # *b := a3
5 sw a2, (a0) # *a := tmp
6 ret
Notice that the assembly code uses registers a2 and a3 to perform the computation. In this case, the
contents of these two registers are destroyed by the lw instructions (lines 2 and 3).
Now, lets assume that the mix routine loads an “important information” on register a2 and, before
using this information, it invokes the exchange routine. The following code illustrates this situation.
First, the mix routine loads the important information into register a2 (line 2). Then, it sets the
parameters and invoke the exchange routine (lines 3-5). Finally, the mix routine returns the important
information by copying it from register a2 to register a0 (line 6) and executing the ret instruction (line
7).
1 mix:
2 lw a2, (a0) # load important information into a2
3 la a0, x # set parameter 0 with address of var. x
4 la a1, y # set parameter 1 with address of var. y
5 jal exchange # invoke exchange to swap x and y values
6 mv a0, a2 # move important information into a0 to return
7 ret
Notice, however, that the exchange routine destroys the contents of registers a2. Consequently, the
value returned by the mix routine is not the “important information” that was loaded into register a2
at line 2.
To solve the problem, the mix routine could save the contents of register a2 on the program stack
before invoking the exchange routine and restore it after the exchange routine returns. The following
code illustrates this situation. Notice that the value in register a2 is saved into the program stack (lines
3 and 4) before invoking the exchange routine and restored (lines 8 and 9) after the exchange routine
returns.
1 mix:
2 lw a2, (a0) # load important information into a2
3 addi sp, sp, -4 # save a2: Allocate stack space and
4 sw a2, (sp) # store a2 into the stack
5 la a0, x # set parameter 1 with address of var. x
6 la a1, y # set parameter 2 with address of var. y
7 jal exchange # invoke exchange to swap x and y values
8 lw a2, (sp) # restore a2: Loads a2 from the stack and
9 addi sp, sp, 4 # deallocate the stack space
10 mv a0, a2 # move important information into a0 to return
11 ret
Another way to solve this problem is to modify the exchange routine to save and restore all the
registers that it might change. The following code illustrates this situation. Notice that the contents
of registers a2 and a3 are saved into the program stack (lines 2-4) at the beginning of the routine and
restored (lines 9-11) before returning from the routine.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
102
diff --git a/book/riscv-book-116.page b/book/riscv-book-116.page index cb043e4..cb777df 100644 --- a/book/riscv-book-116.page +++ b/book/riscv-book-116.page @@ -1 +1 @@ -
7.7. REGISTER USAGE POLICIES
1 exchange:
2 addi sp, sp, -8 # allocate stack space
3 sw a2, 4(sp) # save contents of a2
4 sw a3, 0(sp) # save contents of a3
5 lw a2, (a1) # tmp := *b
6 lw a3, (a0) # a3 := *a
7 sw a3, (a1) # *b := a3
8 sw a2, (a0) # *a := tmp
9 lw a3, 0(sp) # restore contents of a3
10 lw a2, 4(sp) # restore contents of a2
11 addi sp, sp, 8 # deallocate stack space
12 ret
7.7.1 Caller-saved vs callee-saved registers
A call site is a place from which a routine is being invoked. In the previous example, the jal
exchange instruction defines a call site. For each call site, there is a caller and a callee routine. The
caller routine is the routine that is invoking the other routine, i.e., the routine that contains
the call site. The callee routine is the routine that is being invoked by the call site. In the
previous example, the callee is the exchange routine and the caller is the mix routine.
The previous examples discussed two alternative solutions to preserving the contents of register a2
across a call site: the contents are saved and restored by the caller routine or the contents are saved and
restored by the callee routine. Even though both approaches are correct, there should be a convention
so that programmers (and compilers) do not need to inspect the code of the callee routine to figure out
whether or not to save the contents of a register before invoking the callee.
The ABI defines which registers must be saved by the caller, i.e., the routine that is invoking, and
which registers must be saved by the callee routine, i.e., the routine that is being invoked. Caller-saved
registers are registers that must be saved by the caller routine and callee-saved registers
are registers that must be saved by the callee routine.
The RISC-V ilp32 ABI defines that registers t0-t6, a0-a7, and ra are caller-saved. Also, it
defines that registers s0-s11 are callee-saved.
According to the RISC-V ilp32 ABI, the contents of register a2 must be preserved by the caller
routine, hence, in previous example, the mix routine is responsible for saving the contents of register a2
before invoking the exchange routine.
It is important to notice that there is no need to save all the caller-saved registers before invoking a
routine only the registers that contain values that might be used by the caller routine after the call
site. In the previous example, the mix routine must save a2 because it needs the value of a2 after the
call site.
Also, it is important to notice that there is no need for the callee routine to save and restore all the
callee-saved registers, only the ones that are modified by the routine. As an example, there is no need
for the exchange routine to save registers s0-s11 since it does not modify these registers.
7.7.2 Saving and restoring the return address
As discussed before, whenever a routine is invoked, the return address is stored at the return address
register (ra). In other words, whenever a routine is invoked, register ra is updated with a new value,
and its previous contents are destroyed. Consequently, if the contents of register ra are required after
the call site, then it must be saved and restored. This is usually the case because the code that is
invoking a routine usually belongs to another routine, hence, it might need the return address to return
its execution to the caller Notice that the ret pseudo-instruction reads the contents of register ra to
return the execution flow to the correct place.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
103
+
7.7. REGISTER USAGE POLICIES
1 exchange:
2 addi sp, sp, -8 # allocate stack space
3 sw a2, 4(sp) # save contents of a2
4 sw a3, 0(sp) # save contents of a3
5 lw a2, (a1) # tmp := *b
6 lw a3, (a0) # a3 := *a
7 sw a3, (a1) # *b := a3
8 sw a2, (a0) # *a := tmp
9 lw a3, 0(sp) # restore contents of a3
10 lw a2, 4(sp) # restore contents of a2
11 addi sp, sp, 8 # deallocate stack space
12 ret
7.7.1 Caller-saved vs callee-saved registers
A call site is a place from which a routine is being invoked. In the previous example, the jal
exchange instruction defines a call site. For each call site, there is a caller and a callee routine. The
caller routine is the routine that is invoking the other routine, i.e., the routine that contains
the call site. The callee routine is the routine that is being invoked by the call site. In the
previous example, the callee is the exchange routine and the caller is the mix routine.
The previous examples discussed two alternative solutions to preserving the contents of register a2
across a call site: the contents are saved and restored by the caller routine or the contents are saved and
restored by the callee routine. Even though both approaches are correct, there should be a convention
so that programmers (and compilers) do not need to inspect the code of the callee routine to figure out
whether or not to save the contents of a register before invoking the callee.
The ABI defines which registers must be saved by the caller, i.e., the routine that is invoking, and
which registers must be saved by the callee routine, i.e., the routine that is being invoked. Caller-saved
registers are registers that must be saved by the caller routine and callee-saved registers
are registers that must be saved by the callee routine.
The RISC-V ilp32 ABI defines that registers t0-t6, a0-a7, and ra are caller-saved. Also, it
defines that registers s0-s11 are callee-saved.
According to the RISC-V ilp32 ABI, the contents of register a2 must be preserved by the caller
routine, hence, in previous example, the mix routine is responsible for saving the contents of register a2
before invoking the exchange routine.
It is important to notice that there is no need to save all the caller-saved registers before invoking a
routine only the registers that contain values that might be used by the caller routine after the call
site. In the previous example, the mix routine must save a2 because it needs the value of a2 after the
call site.
Also, it is important to notice that there is no need for the callee routine to save and restore all the
callee-saved registers, only the ones that are modified by the routine. As an example, there is no need
for the exchange routine to save registers s0-s11 since it does not modify these registers.
7.7.2 Saving and restoring the return address
As discussed before, whenever a routine is invoked, the return address is stored at the return address
register (ra). In other words, whenever a routine is invoked, register ra is updated with a new value,
and its previous contents are destroyed. Consequently, if the contents of register ra are required after
the call site, then it must be saved and restored. This is usually the case because the code that is
invoking a routine usually belongs to another routine, hence, it might need the return address to return
its execution to the caller Notice that the ret pseudo-instruction reads the contents of register ra to
return the execution flow to the correct place.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
103
diff --git a/book/riscv-book-117.page b/book/riscv-book-117.page index 236f855..13a5b04 100644 --- a/book/riscv-book-117.page +++ b/book/riscv-book-117.page @@ -1 +1 @@ -
7.8. STACK FRAMES AND THE FRAME POINTER
Since register ra is a caller-save register, the caller routine must save its contents. In the previous
example, the mix routine must have saved and restored the contents of ra to prevent it from being
destroyed when invoking the exchange routine. The following code shows the correct code for the mix
routine.
1 mix:
2 addi sp, sp, -4 # save ra: Allocate stack space and
3 sw ra, (sp) # store ra into the stack
4 lw a2, (a0) # load important information into a2
5 addi sp, sp, -4 # save a2: Allocate stack space and
6 sw a2, (sp) # store a2 into the stack
7 la a0, x # set parameter 1 with address of var. x
8 la a1, y # set parameter 2 with address of var. y
9 jal exchange # invoke exchange to swap x and y values
10 lw a2, (sp) # restore a2: Load a2 from the stack and
11 addi sp, sp, 4 # deallocate the stack space
12 mv a0, a2 # move important information into a0 to return
13 lw ra, (sp) # restore ra: Load ra from the stack and
14 addi sp, sp, 4 # deallocate the stack space
15 ret
Leaf routines are routines that do not call other routines. Since they do not call other
routines, the contents of register ra are not modified. Hence, there is no need to save the return address
on the stack when implementing leaf routines. In the previous examples, the exchange routine is a leaf
routine, hence, there is no need to save and restore the contents of the return address.
Finally, the standard ABI specifies that routines should not modify the integer registers tp and gp,
because signal handlers may rely upon their values.
7.8 Stack frames and the frame pointer
7.8.1 Stack frames
All active routines may contain information in the program stack. Also, this information is naturally
grouped and sorted accordingly to the call order. For example, lets assume that routine A invoked routine
B, routine B invoked routine C, and routine C is currently being executed. Notice that routines A and B
are still active. The contents added by routine A on the stack are placed before the contents of routine B.
Also, the contents added by routine B on the stack are placed before the contents of routine C. Figure 7.3
illustrates the state of the program stack when routine C is executing.
A stack frame is a consecutive segment of data on the program stack that stores infor-
mation belonging to an active routine. In the previous example, there are three stack frames when
routine C is executing. The first one, comprised by addresses 0x0500 and 0x04F8, is the stack frame for
routine A
12
.
7.8.2 The frame pointer
The previous sections discussed several situations in which the program stack is used to store information
about active routines. Whenever new information is added to the program stack, the stack pointer moves
and this must be accounted for when accessing information that was pushed before. For example, lets
analyze the addijx routine, which takes ten arguments, invokes the get x routine, adds its return value
to the 9
th
(i) and the 10
th
(j) parameters and returns the result.
12
Notice that the same routine may be invoked multiple times before returning, hence, this routine may have multiple
activations and, hence, multiple stack frames. This is usually the case of recursive routines.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
104
+
7.8. STACK FRAMES AND THE FRAME POINTER
Since register ra is a caller-save register, the caller routine must save its contents. In the previous
example, the mix routine must have saved and restored the contents of ra to prevent it from being
destroyed when invoking the exchange routine. The following code shows the correct code for the mix
routine.
1 mix:
2 addi sp, sp, -4 # save ra: Allocate stack space and
3 sw ra, (sp) # store ra into the stack
4 lw a2, (a0) # load important information into a2
5 addi sp, sp, -4 # save a2: Allocate stack space and
6 sw a2, (sp) # store a2 into the stack
7 la a0, x # set parameter 1 with address of var. x
8 la a1, y # set parameter 2 with address of var. y
9 jal exchange # invoke exchange to swap x and y values
10 lw a2, (sp) # restore a2: Load a2 from the stack and
11 addi sp, sp, 4 # deallocate the stack space
12 mv a0, a2 # move important information into a0 to return
13 lw ra, (sp) # restore ra: Load ra from the stack and
14 addi sp, sp, 4 # deallocate the stack space
15 ret
Leaf routines are routines that do not call other routines. Since they do not call other
routines, the contents of register ra are not modified. Hence, there is no need to save the return address
on the stack when implementing leaf routines. In the previous examples, the exchange routine is a leaf
routine, hence, there is no need to save and restore the contents of the return address.
Finally, the standard ABI specifies that routines should not modify the integer registers tp and gp,
because signal handlers may rely upon their values.
7.8 Stack frames and the frame pointer
7.8.1 Stack frames
All active routines may contain information in the program stack. Also, this information is naturally
grouped and sorted accordingly to the call order. For example, lets assume that routine A invoked routine
B, routine B invoked routine C, and routine C is currently being executed. Notice that routines A and B
are still active. The contents added by routine A on the stack are placed before the contents of routine B.
Also, the contents added by routine B on the stack are placed before the contents of routine C. Figure 7.3
illustrates the state of the program stack when routine C is executing.
A stack frame is a consecutive segment of data on the program stack that stores infor-
mation belonging to an active routine. In the previous example, there are three stack frames when
routine C is executing. The first one, comprised by addresses 0x0500 and 0x04F8, is the stack frame for
routine A
12
.
7.8.2 The frame pointer
The previous sections discussed several situations in which the program stack is used to store information
about active routines. Whenever new information is added to the program stack, the stack pointer moves
and this must be accounted for when accessing information that was pushed before. For example, lets
analyze the addijx routine, which takes ten arguments, invokes the get x routine, adds its return value
to the 9
th
(i) and the 10
th
(j) parameters and returns the result.
12
Notice that the same routine may be invoked multiple times before returning, hence, this routine may have multiple
activations and, hence, multiple stack frames. This is usually the case of recursive routines.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
104
diff --git a/book/riscv-book-118.page b/book/riscv-book-118.page index 92263eb..bd493c6 100644 --- a/book/riscv-book-118.page +++ b/book/riscv-book-118.page @@ -1 +1 @@ -
7.8. STACK FRAMES AND THE FRAME POINTER
0x04E4
Main
Memory
sp
0x0500
0x04FC
0x04F8
0x04F4
0x04F0
0x04EC
0x04E8
0x04E0
0x04DC
0x04D8
0x0000
...
A
B
C
Figure 7.3: Program stack with data from three active routines A, B, and C.
1 int addijx(int a, int b, int c, int d, int e,
2 int f, int g, int h, int i, int j)
3 {
4 return get_x() + i + j;
5 }
The following code shows the addijx routine implemented in assembly. Notice that the return address
is saved to (lines 2 and 3) and restored from (lines 9 and 10) the program stack. At the entry point,
the stack pointer points to the 9
th
parameter (i), however, after the return address is saved on (pushed
into) the stack, the stack pointer points to the return address. Hence, to access the 9
th
parameter after
this point, the code must add four to the stack pointer (line 5).
1 addijx:
2 addi sp, sp, -4 # save the
3 sw ra, (sp) # return address
4 jal get_x # invoke the get_x routine
5 lw a1, 4(sp) # load i from the program stack
6 lw a2, 8(sp) # load j from the program stack
7 add a0, a1, a1 # a0 := get_x() + i
8 add a0, a2, a2 # a0 := get_x() + i + j
9 lw ra, (sp) # restore the
10 addi sp, sp, 4 # return address
11 ret # return
The more information is added to the stack, the harder it may get to track the addresses of all
parameters and local variables across the routine. One way of mitigating this problem is to keep a fixed
pointer to the stack so that all parameters and local variables can be accessed using this pointer plus a
fixed offset. The frame pointer points to the beginning of the stack frame of the currently
executing routine. As a consequence, it provides a fixed pointer to the stack across the execution of
a routine and may be used as a fixed reference to access parameters and local variables.
In the RISC-V ilp32 ABI, the frame pointer is stored by the frame pointer register, or fp. The fp
register must be initialized at the beginning of the routine, however, its previous contents must be saved
so that it can be restored before returning from the routine. Also, in most cases, instead of pushing
information one by one on the program stack, each stack frame can be allocated with a single instruction
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
105
+
7.8. STACK FRAMES AND THE FRAME POINTER
0x04E4
Main
Memory
sp
0x0500
0x04FC
0x04F8
0x04F4
0x04F0
0x04EC
0x04E8
0x04E0
0x04DC
0x04D8
0x0000
...
A
B
C
Figure 7.3: Program stack with data from three active routines A, B, and C.
1 int addijx(int a, int b, int c, int d, int e,
2 int f, int g, int h, int i, int j)
3 {
4 return get_x() + i + j;
5 }
The following code shows the addijx routine implemented in assembly. Notice that the return address
is saved to (lines 2 and 3) and restored from (lines 9 and 10) the program stack. At the entry point,
the stack pointer points to the 9
th
parameter (i), however, after the return address is saved on (pushed
into) the stack, the stack pointer points to the return address. Hence, to access the 9
th
parameter after
this point, the code must add four to the stack pointer (line 5).
1 addijx:
2 addi sp, sp, -4 # save the
3 sw ra, (sp) # return address
4 jal get_x # invoke the get_x routine
5 lw a1, 4(sp) # load i from the program stack
6 lw a2, 8(sp) # load j from the program stack
7 add a0, a1, a1 # a0 := get_x() + i
8 add a0, a2, a2 # a0 := get_x() + i + j
9 lw ra, (sp) # restore the
10 addi sp, sp, 4 # return address
11 ret # return
The more information is added to the stack, the harder it may get to track the addresses of all
parameters and local variables across the routine. One way of mitigating this problem is to keep a fixed
pointer to the stack so that all parameters and local variables can be accessed using this pointer plus a
fixed offset. The frame pointer points to the beginning of the stack frame of the currently
executing routine. As a consequence, it provides a fixed pointer to the stack across the execution of
a routine and may be used as a fixed reference to access parameters and local variables.
In the RISC-V ilp32 ABI, the frame pointer is stored by the frame pointer register, or fp. The fp
register must be initialized at the beginning of the routine, however, its previous contents must be saved
so that it can be restored before returning from the routine. Also, in most cases, instead of pushing
information one by one on the program stack, each stack frame can be allocated with a single instruction
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
105
diff --git a/book/riscv-book-119.page b/book/riscv-book-119.page index db9c668..2d16476 100644 --- a/book/riscv-book-119.page +++ b/book/riscv-book-119.page @@ -1 +1 @@ -
7.9. IMPLEMENTING RISC-V ILP32 COMPATIBLE ROUTINES
at the beginning of the routine and deallocated with a single instruction before returning. The following
code shows an example in which the stack frame is allocated (deallocate) in the beginning (end) of the
routine (lines 2 and 15) and the frame pointer is used to access the parameters using a fixed offset (lines
8 and 9).
1 addijx:
2 addi sp, sp, -8 # allocate the stack frame
3 sw ra, 4(sp) # save return address
4 sw fp, 0(sp) # save previous frame pointer
5 addi fp, sp, 8 # adjust frame pointer
6
7 jal get_x # invoke the get_x routine
8 lw a1, (fp) # load i from the program stack
9 lw a2, 4(fp) # load j from the program stack
10 add a0, a0, a1 # a0 := get_x() + i
11 add a0, a0, a2 # a0 := get_x() + i + j
12
13 lw fp, 0(sp) # restore previous frame pointer
14 lw ra, 4(sp) # restore return address
15 addi sp, sp, 8 # deallocate the stack frame
16 ret # return
In the previous example, the addijx stack frame had 8 bytes and stored the return address and the
previous frame pointer. In case more registers need to be saved or local variables need to be stored on
the program stack, the stack frame may be easily increased by changing the constant (8) in lines 2 and
15.
7.8.3 Keeping the stack pointer aligned
The RISC-V ilp32 ABI specifies that the stack pointer shall always be aligned to a 128-bit boundary
upon routine entry. Also, the documentation states that “In the standard ABI, the stack pointer must
remain aligned throughout procedure execution. Non-standard ABI code must realign the stack pointer
prior to invoking standard ABI procedures.”
One way of ensuring that the stack pointer is always aligned throughout the routine execution is to
always increase and decrease it by multiples of 16 since 16 bytes is equal to 128 bits. In this context, the
programmer (or the compiler) can always allocate stack frames using multiples of 16 bytes.
7.9 Implementing RISC-V ilp32 compatible routines
The following list provides guidelines to help programmers implement RISC-V assembly routines com-
patible with the RISC-V ilp32 ABI.
Include a label to define the routine entry point. When translating “C” code to assembly code,
the label must match the “C” routine name;
Use the return instruction (ret) to return from the routine. This instruction jumps to the address
that is stored in the return address register (ra);
Parameters must be accessed accordingly to the RISC-V ilp32 ABI. Considering scalar parameters
smaller than or equal to 32 bits, the first eight parameters are expected in registers a0 to a7, and
the remaining ones on the stack. Also, integer scalars narrower than 32 bits (e.g., char or short)
are widened according to the sign of their type up to 32 bits;
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
106
+
7.9. IMPLEMENTING RISC-V ILP32 COMPATIBLE ROUTINES
at the beginning of the routine and deallocated with a single instruction before returning. The following
code shows an example in which the stack frame is allocated (deallocate) in the beginning (end) of the
routine (lines 2 and 15) and the frame pointer is used to access the parameters using a fixed offset (lines
8 and 9).
1 addijx:
2 addi sp, sp, -8 # allocate the stack frame
3 sw ra, 4(sp) # save return address
4 sw fp, 0(sp) # save previous frame pointer
5 addi fp, sp, 8 # adjust frame pointer
6
7 jal get_x # invoke the get_x routine
8 lw a1, (fp) # load i from the program stack
9 lw a2, 4(fp) # load j from the program stack
10 add a0, a0, a1 # a0 := get_x() + i
11 add a0, a0, a2 # a0 := get_x() + i + j
12
13 lw fp, 0(sp) # restore previous frame pointer
14 lw ra, 4(sp) # restore return address
15 addi sp, sp, 8 # deallocate the stack frame
16 ret # return
In the previous example, the addijx stack frame had 8 bytes and stored the return address and the
previous frame pointer. In case more registers need to be saved or local variables need to be stored on
the program stack, the stack frame may be easily increased by changing the constant (8) in lines 2 and
15.
7.8.3 Keeping the stack pointer aligned
The RISC-V ilp32 ABI specifies that the stack pointer shall always be aligned to a 128-bit boundary
upon routine entry. Also, the documentation states that “In the standard ABI, the stack pointer must
remain aligned throughout procedure execution. Non-standard ABI code must realign the stack pointer
prior to invoking standard ABI procedures.”
One way of ensuring that the stack pointer is always aligned throughout the routine execution is to
always increase and decrease it by multiples of 16 since 16 bytes is equal to 128 bits. In this context, the
programmer (or the compiler) can always allocate stack frames using multiples of 16 bytes.
7.9 Implementing RISC-V ilp32 compatible routines
The following list provides guidelines to help programmers implement RISC-V assembly routines com-
patible with the RISC-V ilp32 ABI.
Include a label to define the routine entry point. When translating “C” code to assembly code,
the label must match the “C” routine name;
Use the return instruction (ret) to return from the routine. This instruction jumps to the address
that is stored in the return address register (ra);
Parameters must be accessed accordingly to the RISC-V ilp32 ABI. Considering scalar parameters
smaller than or equal to 32 bits, the first eight parameters are expected in registers a0 to a7, and
the remaining ones on the stack. Also, integer scalars narrower than 32 bits (e.g., char or short)
are widened according to the sign of their type up to 32 bits;
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
106
diff --git a/book/riscv-book-12.page b/book/riscv-book-12.page index b96fb56..aa5f178 100644 --- a/book/riscv-book-12.page +++ b/book/riscv-book-12.page @@ -1 +1 @@ -
integer overflow occurs when the result of an arithmetic operation on two integer m-bit binary numbers
is outside of the range that can be represented by an m-bit binary number. v, 13, 14
interrupt service routine (ISR) is a software routine that handles interrupts. It is also known as
interrupt handler. v, 98, 99, 101–103, 105, 107–110
interrupt vector table is a table that maps interrupt/exception identifiers to routines that must be
invoked to handle the interrupt/exception. The interrupt vector table is usually stored in main
memory and accessed by the CPU hardware to invoke the proper routine when handling an inter-
rupt/exception. v, 109
ISA native datatype is a datatype that can be naturally processed by the ISA. v, 47, 55
load instruction is an instruction that loads a value from main memory into a register. v, 48
Load/Store architecture is a computer architecture that requires values to be loaded/stored explicitly
from/to main memory before operating on them. v, 48
machine language is a low-level language that can be directly processed by the computer’s central
processing unit (CPU). v, 22
main memory is a storage device used to store the instructions and data of programs that are being
executed. v, 2–5, 15, 17–19, 23, 27, 28, 30, 31, 41, 90–92, 94, 96–100, 103, 104, 107
native program is a program encoded using instructions that can be directly executed by the CPU,
without help from an emulator or a virtual machine. v, 2, 21, 22
numeral system is a system used for expressing numbers. v, 6–10
opcode (operation code) is a code that indicates the operation that an instruction must perform. It is
usually encoded as a binary number into the instruction. v, 49
peripherals are input/output, or I/O, devices that are connected to the computer. Examples of periph-
eral devices include video cards (also known as graphics cards), USB controllers, network cards,
etc. v, 2, 90
persistent storage is a storage device capable of preserving its contents when the power is shut down.
Hard disk drives (HDDs), solid state drives (SSDs), and flash drives are example of persistent
storage devices. v, 2, 90
positional numeral system is a numeral system in which the value of a digit d
i
depends on the its
position on the sequence. v, 6–10
privilege level defines which ISA resources are accessible by the software being executed. v, 100, 106
privilege mode defines the privilege level for the currently executing software. v, 106–109
program counter (PC) is the register that holds the address of the next instruction to be executed.
In other words, it holds the address of the memory position that contains the next instruction to
be executed. It is also known as instruction pointer, or IP, in some computer architectures. v, 48
pseudo-instruction is an assembly instruction that does not have a corresponding machine instruction
on the ISA, but can be translated automatically by the assembler into one, or more, alternative
machine instructions to achieve the same effect. v, 34, 49, 50, 58
register is a small memory device usually located inside the Central Processing Unit (CPU) for quick
read and write access. v, 3
+
integer overflow occurs when the result of an arithmetic operation on two integer m-bit binary numbers
is outside of the range that can be represented by an m-bit binary number. vi, 16, 17
interrupt service routine (ISR) is a software routine that handles interrupts. It is also known as
interrupt handler. vi, vii, 121, 122, 125–129, 132, 133, 135, 136
interrupt vector table is a table that maps interrupt/exception identifiers to routines that must be
invoked to handle the interrupt/exception. The interrupt vector table is usually stored in main
memory and accessed by the CPU hardware to invoke the proper routine when handling an inter-
rupt/exception. vi, 135
ISA native datatype is a datatype that can be naturally processed by the ISA. vi, 57, 67
load instruction is an instruction that loads a value from main memory into a register. vi, 58, 59
Load/Store architecture is a computer architecture that requires values to be loaded/stored explicitly
from/to main memory before operating on them. vi, 58
machine language is a low-level language that can be directly processed by the computer’s central
processing unit (CPU). vi, 26
main memory is a storage device used to store the instructions and data of programs that are being
executed. vi, ix, 2–6, 18, 21, 22, 24, 28, 33, 34, 37, 38, 50, 111, 113, 114, 116, 118–123, 127–129,
132
native program is a program encoded using instructions that can be directly executed by the CPU,
without help from an emulator or a virtual machine. vi, 2, 25, 27
numeral system is a system used for expressing numbers. vi, ix, 7–12
opcode (operation code) is a code that indicates the operation that an instruction must perform. It is
usually encoded as a binary number into the instruction. vi, 60
peripherals are input/output, or I/O, devices that are connected to the computer. Examples of periph-
eral devices include video cards (also known as graphics cards), USB controllers, network cards,
etc. vi, 2, 111
persistent storage is a storage device capable of preserving its contents when the power is shut down.
Hard disk drives (HDDs), solid state drives (SSDs), and flash drives are example of persistent
storage devices. vi, 2, 3, 111
positional numeral system is a numeral system in which the value of a digit d
i
depends on the its
position on the sequence. vi, 8, 9, 11, 12
privilege level defines which ISA resources are accessible by the software being executed. vi, 124, 131,
132
privilege mode defines the privilege level for the currently executing software. vi, x, 132–134
program counter (PC) is the register that holds the address of the next instruction to be executed.
In other words, it holds the address of the memory position that contains the next instruction to
be executed. It is also known as instruction pointer, or IP, in some computer architectures. vi, vii,
58
pseudo-instruction is an assembly instruction that does not have a corresponding machine instruction
on the ISA, but can be translated automatically by the assembler into one, or more, alternative
machine instructions to achieve the same effect. vi, 41, 42, 59–61, 71, 72
diff --git a/book/riscv-book-120.page b/book/riscv-book-120.page index 7bf7bc3..807fa18 100644 --- a/book/riscv-book-120.page +++ b/book/riscv-book-120.page @@ -1 +1 @@ -
7.10. EXAMPLES
Parameters passed on the stack are organized so that, the last parameter, i.e., the N
th
parameter,
is pushed first and the 9
th
is pushed last. As a consequence, upon the routine entrance, the stack
pointer points to the 9
th
parameter, sp+4 points to the 10
th
parameter, and so on. Parameters
are allocated on the program stack by the caller routine and must also be deallocated by the caller
routine. The callee must not deallocate parameters allocated by the caller;
In case the routine needs to store information on the program stack, a stack frame should be
allocated at the beginning of the routine and deallocated before returning. The size of the stack
frame must be a multiple of 16 to ensure the stack pointer keeps aligned to a 128-bit boundary, as
required by the standard ABI;
The routine may use registers to implement its functionality, however, callee-saved registers that
are modified by the routine must be saved in the beginning of the routine and restored before
returning from it. These registers must be saved on the stack frame;
The routine may modify and use caller-saved registers without saving them, however, in case their
value needs to be preserved across a call site, the routine must save (restore) its contents before
(after) the call site. Routines that call other routines must save and restore the return address
register to preserve its contents across call sites. These registers must be saved on the stack frame;
Local variables may be allocated on registers or on memory. Local variables that need to be
allocated on memory must be allocated on the stack frame;
Optionally, the frame pointer register (fp) may be used to keep a pointer to the beginning of the
stack frame and provide a fixed reference to access parameters and local variables. In this case, the
previous frame pointer must be preserved when returning from the routine, hence, the contents of
the frame pointer register must be saved in the stack frame at the beginning of the function and
restored before returning.
The standard ABI specifies that routines should not modify the integer registers tp and gp.
7.10 Examples
This section presents examples of assembly code generated for “C” routines.
7.10.1 Recursive routines
Recursive routines are routines that call themselves. The following code shows an example of a
recursive routine that computes the factorial of a number.
1 int factorial(int n)
2 {
3 if (n>1)
4 return n * factorial(n-1);
5 else
6 return 1;
7 }
Notice that, if the parameter n is greater than one, then factorial of n is computed by multiplying
the value of n by the factorial of n-1, which is computed by a recursive call to the factorial routine.
Generating code for a recursive routine is as simple as generating code for any non-leaf routine. The
following code shows how the previous recursive routine can be implemented in assembly. First, the
stack frame is allocated and the return address is saved on it (lines 2 and 3). Then, n is compared with
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
107
+
7.10. EXAMPLES
Parameters passed on the stack are organized so that, the last parameter, i.e., the N
th
parameter,
is pushed first and the 9
th
is pushed last. As a consequence, upon the routine entrance, the stack
pointer points to the 9
th
parameter, sp+4 points to the 10
th
parameter, and so on. Parameters
are allocated on the program stack by the caller routine and must also be deallocated by the caller
routine. The callee must not deallocate parameters allocated by the caller;
In case the routine needs to store information on the program stack, a stack frame should be
allocated at the beginning of the routine and deallocated before returning. The size of the stack
frame must be a multiple of 16 to ensure the stack pointer keeps aligned to a 128-bit boundary, as
required by the standard ABI;
The routine may use registers to implement its functionality, however, callee-saved registers that
are modified by the routine must be saved in the beginning of the routine and restored before
returning from it. These registers must be saved on the stack frame;
The routine may modify and use caller-saved registers without saving them, however, in case their
value needs to be preserved across a call site, the routine must save (restore) its contents before
(after) the call site. Routines that call other routines must save and restore the return address
register to preserve its contents across call sites. These registers must be saved on the stack frame;
Local variables may be allocated on registers or on memory. Local variables that need to be
allocated on memory must be allocated on the stack frame;
Optionally, the frame pointer register (fp) may be used to keep a pointer to the beginning of the
stack frame and provide a fixed reference to access parameters and local variables. In this case, the
previous frame pointer must be preserved when returning from the routine, hence, the contents of
the frame pointer register must be saved in the stack frame at the beginning of the function and
restored before returning.
The standard ABI specifies that routines should not modify the integer registers tp and gp.
7.10 Examples
This section presents examples of assembly code generated for “C” routines.
7.10.1 Recursive routines
Recursive routines are routines that call themselves. The following code shows an example of a
recursive routine that computes the factorial of a number.
1 int factorial(int n)
2 {
3 if (n>1)
4 return n * factorial(n-1);
5 else
6 return 1;
7 }
Notice that, if the parameter n is greater than one, then factorial of n is computed by multiplying
the value of n by the factorial of n-1, which is computed by a recursive call to the factorial routine.
Generating code for a recursive routine is as simple as generating code for any non-leaf routine. The
following code shows how the previous recursive routine can be implemented in assembly. First, the
stack frame is allocated and the return address is saved on it (lines 2 and 3). Then, n is compared with
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
107
diff --git a/book/riscv-book-121.page b/book/riscv-book-121.page index 6fadb4e..6e72526 100644 --- a/book/riscv-book-121.page +++ b/book/riscv-book-121.page @@ -1 +1 @@ -
7.10. EXAMPLES
1 (lines 4 and 5) and, if n is less or equal to one, the code jumps to the “else block” (lines 12 and 13),
otherwise, it proceeds to the “then block” (lines 6 to 11). The “else block” simply sets a0 with 1 for
return and proceeds with the routine finalization code, i.e., the code that restores the return address,
deallocates the stack frame and returns (lines 15 to 17). The “then block” (lines 6 to 11) implements the
code that performs the recursive call (i.e., n * factorial(n-1)). First, it saves the value of a0 (n) on
the stack frame to preserve it across the call site (line 6). Then, it sets the parameter for the recursive
call and invokes the routine
13
(lines 7 and 8). Next, it recovers the value of n from the stack frame into
register a1 (line 9) and multiplies it by the value returned by the recursive call, which is located in a0
(line 10). Finally, it jumps to the fact end label to execute the routine finalization code.
1 factorial:
2 addi sp, sp, -16 # allocate the routine stack frame
3 sw ra, 12(sp) # save the return address
4 li a1, 1
5 ble a0, a1, else # if (n>1)
6 sw a0, 8(sp) # save n (a0) on the routine frame
7 addi a0, a0, -1 # set the parameter (n-1)
8 jal factorial # perform the recursive call
9 lw a1, 8(sp) # load n from the routine frame (into a1)
10 mul a0, a0, a1 # a0 := factorial(n-1) * n
11 j fact_end # jump to end
12 else:
13 li a0, 1 # set the return value to 1
14 fact_end:
15 lw ra, 12(sp) # restore the return address
16 addi sp, sp, 16 # deallocate the routine frame
17 ret # return
7.10.2 The standard “C” library syscall routines
As discussed in Section 5.7.4, user programs usually invoke operating system service routines to perform
input and output operations. This operation, called syscall, is performed in RISC-V by executing the
ecall instruction. In this case, the program must set the a7 register with the proper syscall code. The
standard “C” library provides routines to help users invoke the syscalls. The write routine is one of
these routines and has the following prototype:
1 ssize_t write(int fildes, const void *buf, size_t nbytes);
This routine takes three parameters: the file descriptor (fildes), a pointer to the buffer (buf) that
contains the information that must be written to the file, and the number of bytes that must be written
(nbytes). Also, it returns the number of bytes written to the file.
The following assembly code shows a possible implementation for the write routine. This routine
receives parameters fildes, buf, and nbytes on registers a0, a1, and a2, respectively. These parameters
are the same parameters that must be passed to the syscall and are already placed on the correct registers,
hence, there is no need to adjust the parameters when invoking the system call on line 5.
13
The only difference between a recursive routine and a non-leaf regular routine, is that the recursive one is invoking the
same routine while other on-leaf routines invoke other routines.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
108
+
7.10. EXAMPLES
1 (lines 4 and 5) and, if n is less or equal to one, the code jumps to the “else block” (lines 12 and 13),
otherwise, it proceeds to the “then block” (lines 6 to 11). The “else block” simply sets a0 with 1 for
return and proceeds with the routine finalization code, i.e., the code that restores the return address,
deallocates the stack frame and returns (lines 15 to 17). The “then block” (lines 6 to 11) implements the
code that performs the recursive call (i.e., n * factorial(n-1)). First, it saves the value of a0 (n) on
the stack frame to preserve it across the call site (line 6). Then, it sets the parameter for the recursive
call and invokes the routine
13
(lines 7 and 8). Next, it recovers the value of n from the stack frame into
register a1 (line 9) and multiplies it by the value returned by the recursive call, which is located in a0
(line 10). Finally, it jumps to the fact end label to execute the routine finalization code.
1 factorial:
2 addi sp, sp, -16 # allocate the routine stack frame
3 sw ra, 12(sp) # save the return address
4 li a1, 1
5 ble a0, a1, else # if (n>1)
6 sw a0, 8(sp) # save n (a0) on the routine frame
7 addi a0, a0, -1 # set the parameter (n-1)
8 jal factorial # perform the recursive call
9 lw a1, 8(sp) # load n from the routine frame (into a1)
10 mul a0, a0, a1 # a0 := factorial(n-1) * n
11 j fact_end # jump to end
12 else:
13 li a0, 1 # set the return value to 1
14 fact_end:
15 lw ra, 12(sp) # restore the return address
16 addi sp, sp, 16 # deallocate the routine frame
17 ret # return
7.10.2 The standard “C” library syscall routines
As discussed in Section 5.7.4, user programs usually invoke operating system service routines to perform
input and output operations. This operation, called syscall, is performed in RISC-V by executing the
ecall instruction. In this case, the program must set the a7 register with the proper syscall code. The
standard “C” library provides routines to help users invoke the syscalls. The write routine is one of
these routines and has the following prototype:
1 ssize_t write(int fildes, const void *buf, size_t nbytes);
This routine takes three parameters: the file descriptor (fildes), a pointer to the buffer (buf) that
contains the information that must be written to the file, and the number of bytes that must be written
(nbytes). Also, it returns the number of bytes written to the file.
The following assembly code shows a possible implementation for the write routine. This routine
receives parameters fildes, buf, and nbytes on registers a0, a1, and a2, respectively. These parameters
are the same parameters that must be passed to the syscall and are already placed on the correct registers,
hence, there is no need to adjust the parameters when invoking the system call on line 5.
13
The only difference between a recursive routine and a non-leaf regular routine, is that the recursive one is invoking the
same routine while other on-leaf routines invoke other routines.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
108
diff --git a/book/riscv-book-122.page b/book/riscv-book-122.page index 74e841a..4e31b88 100644 --- a/book/riscv-book-122.page +++ b/book/riscv-book-122.page @@ -1 +1 @@ -
7.10. EXAMPLES
1 write:
2 addi sp, sp, -16 # allocate the stack frame
3 sw ra, 12(sp) # save the return address
4 li a7, 64 # set the syscall code (64 = write)
5 ecall # invoke the operating system
6 lw ra, 12(sp) # restore the return address
7 addi sp, sp, 16 # deallocate the stack frame
8 ret # return
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
109
+
7.10. EXAMPLES
1 write:
2 addi sp, sp, -16 # allocate the stack frame
3 sw ra, 12(sp) # save the return address
4 li a7, 64 # set the syscall code (64 = write)
5 ecall # invoke the operating system
6 lw ra, 12(sp) # restore the return address
7 addi sp, sp, 16 # deallocate the stack frame
8 ret # return
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
109
diff --git a/book/riscv-book-123.page b/book/riscv-book-123.page index 38fb830..8267b89 100644 --- a/book/riscv-book-123.page +++ b/book/riscv-book-123.page @@ -1 +1 @@ -
Part III
System-level programming
110
+
Part III
System-level programming
110
diff --git a/book/riscv-book-124.page b/book/riscv-book-124.page index 37a9190..b9ffc92 100644 --- a/book/riscv-book-124.page +++ b/book/riscv-book-124.page @@ -1 +1 @@ -
Chapter 8
Accessing peripherals
As discussed in the previous chapters, the CPU executes programs that are stored on the main memory.
In this process, the CPU fetches the program’s instructions from the main memory and executes them,
which may cause the CPU to load or store data on the main memory. The previous chapters also explain
that user-level programs perform input and output operations by invoking the operating system.
This chapter discusses how programs may directly interact with input and output hardware devices
to perform input and output operations. This task is useful when developing software for a system that
does not contain an operating system or when implementing operating systems’ components, such as
device drivers.
The remainder of the chapter is organized as follows: Section 8.1 introduces the concept of peripherals
and discusses how they are connected to the CPU. Section 8.2 presents the two main methods for
programs to interact with peripherals: port-mapped I/O and memory-mapped I/O. Section 8.3 discusses
how I/O operations are performed on RISC-V-based computing systems. Finally, Section 8.4 discusses
the busy waiting concept.
8.1 Peripherals
Peripherals are input/output, or I/O, devices that are connected to the computer. There
are several kinds of peripherals. Mouse, keyboard, image scanners, barcode readers, game controllers,
microphones, webcams, and read-only memories are examples of input devices. Monitors, projectors,
printers, headphones, and computer speakers are examples of output devices. There are also devices that
perform both input and output operations, such as data storage devices (including a disk drive, USB
flash drive, memory card, and tape drive), network cards, etc
Input and output devices interface with the CPU through a bus, which is a communication system
that transfers information between the computer components. This system is usually composed of
wires that are responsible for transmitting the information and associated circuitries, which orchestrate
communication. Figure 8.1 illustrates a computer system in which a system bus connects the CPU, the
main memory, a persistent storage device (HDD), an input device, and an output device.
Peripherals usually contain registers or an internal memory that are accessed by the CPU to perform
input and output operations. To discuss this concept, let us consider a hypothetical computing system
that has a seven-segment display (an output peripheral) attached to a display controller, which, in turn,
is connected to the CPU through the bus, as illustrated in Figure 8.2.
Seven-segment displays are devices that contain seven segments and one dot that can be light up
individually. Modern seven-segment displays are implemented using one light-emitting diode (LED) per
segment and one for the dot. The segments and the dot are positioned on the display so that it is possible
to display patterns that resemble decimal digits by lighting up a subset of the display segments. For
example, one may turn on segments a, f, g, c, and d to show a pattern that resembles the decimal digit
‘5’, as illustrated in Figure 8.2.
111
+
Chapter 8
Accessing peripherals
As discussed in the previous chapters, the CPU executes programs that are stored on the main memory.
In this process, the CPU fetches the program’s instructions from the main memory and executes them,
which may cause the CPU to load or store data on the main memory. The previous chapters also explain
that user-level programs perform input and output operations by invoking the operating system.
This chapter discusses how programs may directly interact with input and output hardware devices
to perform input and output operations. This task is useful when developing software for a system that
does not contain an operating system or when implementing operating systems’ components, such as
device drivers.
The remainder of the chapter is organized as follows: Section 8.1 introduces the concept of peripherals
and discusses how they are connected to the CPU. Section 8.2 presents the two main methods for
programs to interact with peripherals: port-mapped I/O and memory-mapped I/O. Section 8.3 discusses
how I/O operations are performed on RISC-V-based computing systems. Finally, Section 8.4 discusses
the busy waiting concept.
8.1 Peripherals
Peripherals are input/output, or I/O, devices that are connected to the computer. There
are several kinds of peripherals. Mouse, keyboard, image scanners, barcode readers, game controllers,
microphones, webcams, and read-only memories are examples of input devices. Monitors, projectors,
printers, headphones, and computer speakers are examples of output devices. There are also devices that
perform both input and output operations, such as data storage devices (including a disk drive, USB
flash drive, memory card, and tape drive), network cards, etc
Input and output devices interface with the CPU through a bus, which is a communication system
that transfers information between the computer components. This system is usually composed of
wires that are responsible for transmitting the information and associated circuitries, which orchestrate
communication. Figure 8.1 illustrates a computer system in which a system bus connects the CPU, the
main memory, a persistent storage device (HDD), an input device, and an output device.
Peripherals usually contain registers or an internal memory that are accessed by the CPU to perform
input and output operations. To discuss this concept, let us consider a hypothetical computing system
that has a seven-segment display (an output peripheral) attached to a display controller, which, in turn,
is connected to the CPU through the bus, as illustrated in Figure 8.2.
Seven-segment displays are devices that contain seven segments and one dot that can be light up
individually. Modern seven-segment displays are implemented using one light-emitting diode (LED) per
segment and one for the dot. The segments and the dot are positioned on the display so that it is possible
to display patterns that resemble decimal digits by lighting up a subset of the display segments. For
example, one may turn on segments a, f, g, c, and d to show a pattern that resembles the decimal digit
‘5’, as illustrated in Figure 8.2.
111
diff --git a/book/riscv-book-125.page b/book/riscv-book-125.page index 2504c3d..77a3f41 100644 --- a/book/riscv-book-125.page +++ b/book/riscv-book-125.page @@ -1 +1 @@ -
8.1. PERIPHERALS
bus
CPU
Main
Memory
Output
device
Input
device
HDD
Figure 8.1: Computer system components connected through a system bus.
CPU Main Memory
bus
Control Reg.
(0x40)
Display Controller
f
b
a
e
c
g
d
p
segments
dot
electrical
wires
Figure 8.2: Computing system with a seven-segment display and a display controller.
The display controller is the device responsible for controlling the seven-segment display. It is con-
nected to the seven-segment display LEDs using electrical wires, and it turns on or off each one of the
segments and the dot according to the contents of an eight-bit register called control register. Each bit
of the control register (Control Reg.) controls whether each display segment or dot must be turned on or
off. In this case, bits 7, 6, 5, 4, 3, 2, 1, and 0 (the rightmost one) control the dot (p), and the segments
a, b, c, d, e, f, and g, respectively. Figure 8.3 shows the value that must be written into the control
register (0x5b) to turn on the segments that show a pattern that resembles the decimal digit ‘5’.
0
Control Reg.
(0x40)
Display Controller
f
b
a
e
c
g
d
p
segments
dot
1 0 1 1 0 1 1
p a b c d e f g
electrical
wires
Figure 8.3: A detailed view of the display controller control register.
In the previous example, the seven-segment display is controlled by a display controller, which, in
turn, turns on and off the display segments and the dot accordingly to the contents of the control register.
In this context, to perform an output operation using the display controller, the CPU must write a value
into the display controller control register. In general, to perform an output or input operation using an
I/O device, the CPU writes to or reads from a register, or internal memory, that belongs to the input
device controller.
The next section discusses how the CPU may write/read to/from peripheral registers and their
internal memories.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
112
+
8.1. PERIPHERALS
bus
CPU
Main
Memory
Output
device
Input
device
HDD
Figure 8.1: Computer system components connected through a system bus.
CPU Main Memory
bus
Control Reg.
(0x40)
Display Controller
f
b
a
e
c
g
d
p
segments
dot
electrical
wires
Figure 8.2: Computing system with a seven-segment display and a display controller.
The display controller is the device responsible for controlling the seven-segment display. It is con-
nected to the seven-segment display LEDs using electrical wires, and it turns on or off each one of the
segments and the dot according to the contents of an eight-bit register called control register. Each bit
of the control register (Control Reg.) controls whether each display segment or dot must be turned on or
off. In this case, bits 7, 6, 5, 4, 3, 2, 1, and 0 (the rightmost one) control the dot (p), and the segments
a, b, c, d, e, f, and g, respectively. Figure 8.3 shows the value that must be written into the control
register (0x5b) to turn on the segments that show a pattern that resembles the decimal digit ‘5’.
0
Control Reg.
(0x40)
Display Controller
f
b
a
e
c
g
d
p
segments
dot
1 0 1 1 0 1 1
p a b c d e f g
electrical
wires
Figure 8.3: A detailed view of the display controller control register.
In the previous example, the seven-segment display is controlled by a display controller, which, in
turn, turns on and off the display segments and the dot accordingly to the contents of the control register.
In this context, to perform an output operation using the display controller, the CPU must write a value
into the display controller control register. In general, to perform an output or input operation using an
I/O device, the CPU writes to or reads from a register, or internal memory, that belongs to the input
device controller.
The next section discusses how the CPU may write/read to/from peripheral registers and their
internal memories.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
112
diff --git a/book/riscv-book-126.page b/book/riscv-book-126.page index ce3c208..c77db70 100644 --- a/book/riscv-book-126.page +++ b/book/riscv-book-126.page @@ -1 +1 @@ -
8.2. INTERACTING WITH PERIPHERALS
8.2 Interacting with peripherals
The CPU interacts with the main memory by sending addresses, data, and commands through the bus.
For example, to write the 8-bit value 0x55 into the memory word associated with address 0x8000, a
CPU may send the WRITE command, the address, and the value to the main memory through the bus.
Alternatively, to read data from a memory word, the CPU may send the READ command and the memory
word address and wait for the main memory to place the data on the bus so it can copy the data into
one of its internal registers. The CPU employs the same process to interact with peripherals’ controllers,
i.e., the CPU sends/receives information (commands, addresses, and data) to/from controllers through
the bus.
CPUs are usually connected physically to the main memory and to peripherals’ controllers through
one or more buses. There are several kinds of buses and their organization and implementation may vary
dramatically. For example, some buses may employ a single set of wires to transmit addresses, data, and
commands, while others may use dedicated wires for each one of these tasks. Also, the number of buses
and their disposition on the system may vary significantly across computing systems.
Even though buses’ implementation and organization may vary dramatically, their characteristics
are usually transparent to the programmer, i.e., they do not affect how the programmer generates code
that interacts with peripherals’ controllers nor the main memory. The CPU ISA usually provides the
programmer with instructions that hide the details (e.g., their protocols and inner workings) of how the
CPU or the peripherals interact with each other or the bus. These instructions allow the programmer
to instruct the CPU to write/read data to/from peripherals’ registers and their internal memories in a
simple way. For example, the RV32I ISA contains load and store instructions (e.g., lw and sw
1
) that allow
the programmer to instruct the CPU to read/write data from/to the main memory without worrying
how the bus that connects the CPU to the main memory works.
There may be several peripherals on the system, and each one of them may have multiple registers or
internal memories. Hence, there must be a way for programmers to specify the proper peripheral register
or internal memory position to be accessed by the instruction. This is usually performed by associating
each peripheral register and internal memory position with a different identifier, often an integer number,
which may be known as an address or an I/O port. In this context, instructions used for interacting
with peripherals usually identify the peripheral register or memory position by its address or I/O port.
Sections 8.2.1 and 8.2.2 discuss the two main methods of accessing peripheral registers and their
internal memories by executing CPU instructions.
8.2.1 Port-mapped I/O
Port-mapped I/O, also known as isolated I/O, is a method of accessing peripheral’s regis-
ters and their internal memories that employ special ISA instructions for I/O operations.
There are two central concepts in this method: I/O ports and I/O instructions. An I/O instruction
is a special instruction dedicated to access peripherals. In contrast, an I/O port is an un-
signed integer number that identifies peripherals’ registers and internal memory words.
The programmer uses this identifier to specify which peripheral register or internal memory words must
be accessed when performing an I/O operation with an I/O instruction.
To illustrate this concept, let us consider the IA-32 ISA family
2
. These ISAs contain two I/O
instructions that copy data between CPU registers and a peripheral register or an internal memory
word: “input from port” [2] and “output to port” [3].
The input from port instruction, or in, takes two operands, the I/O port and a destination CPU
register, al, ax, or eax
3
. The instruction copies a value from a peripheral register, or internal memory
word, identified by the I/O port operand, into the destination CPU register. The following code shows
an example in which the in instruction is used to read an 8-bit value from I/O port 0x71 and place it
on the al CPU register.
1
See Section 5.6 for more information on RV32I load and store instructions.
2
The IA-32 ISA family is a set of ISAs developed by Intel and based on the ISA used on the 8086 microprocessor.
3
al, ax, and eax are 8-bit, 16-bit, and 32-bit CPU registers on the IA-32 ISA.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
113
+
8.2. INTERACTING WITH PERIPHERALS
8.2 Interacting with peripherals
The CPU interacts with the main memory by sending addresses, data, and commands through the bus.
For example, to write the 8-bit value 0x55 into the memory word associated with address 0x8000, a
CPU may send the WRITE command, the address, and the value to the main memory through the bus.
Alternatively, to read data from a memory word, the CPU may send the READ command and the memory
word address and wait for the main memory to place the data on the bus so it can copy the data into
one of its internal registers. The CPU employs the same process to interact with peripherals’ controllers,
i.e., the CPU sends/receives information (commands, addresses, and data) to/from controllers through
the bus.
CPUs are usually connected physically to the main memory and to peripherals’ controllers through
one or more buses. There are several kinds of buses and their organization and implementation may vary
dramatically. For example, some buses may employ a single set of wires to transmit addresses, data, and
commands, while others may use dedicated wires for each one of these tasks. Also, the number of buses
and their disposition on the system may vary significantly across computing systems.
Even though buses’ implementation and organization may vary dramatically, their characteristics
are usually transparent to the programmer, i.e., they do not affect how the programmer generates code
that interacts with peripherals’ controllers nor the main memory. The CPU ISA usually provides the
programmer with instructions that hide the details (e.g., their protocols and inner workings) of how the
CPU or the peripherals interact with each other or the bus. These instructions allow the programmer
to instruct the CPU to write/read data to/from peripherals’ registers and their internal memories in a
simple way. For example, the RV32I ISA contains load and store instructions (e.g., lw and sw
1
) that allow
the programmer to instruct the CPU to read/write data from/to the main memory without worrying
how the bus that connects the CPU to the main memory works.
There may be several peripherals on the system, and each one of them may have multiple registers or
internal memories. Hence, there must be a way for programmers to specify the proper peripheral register
or internal memory position to be accessed by the instruction. This is usually performed by associating
each peripheral register and internal memory position with a different identifier, often an integer number,
which may be known as an address or an I/O port. In this context, instructions used for interacting
with peripherals usually identify the peripheral register or memory position by its address or I/O port.
Sections 8.2.1 and 8.2.2 discuss the two main methods of accessing peripheral registers and their
internal memories by executing CPU instructions.
8.2.1 Port-mapped I/O
Port-mapped I/O, also known as isolated I/O, is a method of accessing peripheral’s regis-
ters and their internal memories that employ special ISA instructions for I/O operations.
There are two central concepts in this method: I/O ports and I/O instructions. An I/O instruction
is a special instruction dedicated to access peripherals. In contrast, an I/O port is an un-
signed integer number that identifies peripherals’ registers and internal memory words.
The programmer uses this identifier to specify which peripheral register or internal memory words must
be accessed when performing an I/O operation with an I/O instruction.
To illustrate this concept, let us consider the IA-32 ISA family
2
. These ISAs contain two I/O
instructions that copy data between CPU registers and a peripheral register or an internal memory
word: “input from port” [2] and “output to port” [3].
The input from port instruction, or in, takes two operands, the I/O port and a destination CPU
register, al, ax, or eax
3
. The instruction copies a value from a peripheral register, or internal memory
word, identified by the I/O port operand, into the destination CPU register. The following code shows
an example in which the in instruction is used to read an 8-bit value from I/O port 0x71 and place it
on the al CPU register.
1
See Section 5.6 for more information on RV32I load and store instructions.
2
The IA-32 ISA family is a set of ISAs developed by Intel and based on the ISA used on the 8086 microprocessor.
3
al, ax, and eax are 8-bit, 16-bit, and 32-bit CPU registers on the IA-32 ISA.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
113
diff --git a/book/riscv-book-127.page b/book/riscv-book-127.page index decba5b..9e7cf93 100644 --- a/book/riscv-book-127.page +++ b/book/riscv-book-127.page @@ -1 +1 @@ -
8.3. I/O OPERATIONS ON RISC-V
1 in 0x71, %al
The output to port instruction, or out, also takes two operands; however, the first one specifies the
target I/O port and the second one the source CPU register. The out instruction copies the value from
the source CPU register into the peripheral register, or internal memory word, identified by the I/O port
operand. The following code shows an example in which the out instruction is used to write the 8-bit
value stored at the CPU register al into the peripheral register (or internal memory word) identified by
the I/O port 0x70.
1 out %al, 0x70
8.2.2 Memory-mapped I/O
The I/O address space defines the set of valid I/O port values. For example, in IA-32 ISAs, the
I/O address space consists of 2
16
(64 KB) individually addressable 8-bit I/O ports, numbered 0 through
0xFFFF [1]. In the Port-mapped I/O method, the I/O address space is distinct from the main memory
address space. In other words, a main memory word may be associated with a memory address (e.g.,
0x70) that has the same value of an I/O port (e.g., 0x70) that is mapped to a peripheral register.
Memory-mapped I/O is a method of accessing peripheral’s registers and their inter-
nal memories that employ regular memory access instructions. In the memory-mapped I/O
method, there is a single address space, and some subsets of this space are mapped to main memory
words while others are mapped to peripheral registers and internal memory words. In this context, the
same instructions that read/write data from/to the main memory (e.g., load and store instructions) are
used to read/write data from/to peripheral registers and their internal memories. The address is the
information that defines whether a main-memory word or a peripheral register or internal memory is
accessed. Figure 8.4 shows an address space mapped to the main memory and multiple peripherals on
a real computing system
4
. Addresses 0x70000000 to 0x80000000 are mapped to main memory words;
hence, load and store operations on these addresses cause the CPU to read and store data on the main
memory. On the other hand, performing a load/store operation on address 0x53F84000 causes the CPU
to read/write data from/to a register on the GPIO peripheral.
8.3 I/O operations on RISC-V
Input and output operations on RISC-V ISAs, including the RV32I ISA, are performed using the memory-
mapped I/O method. Hence, input operations are performed by executing load instructions (e.g., lw)
while output operations are performed with store instructions (e.g., sw) on addresses that are mapped
to peripheral registers or internal memory words.
To illustrate I/O operations on RISC-V, let us consider an elevator computing system that contains an
RV32I CPU, the main memory, a seven-segment display, and a floor sensor, as illustrated in Figure 8.5.
The seven-segment display is controlled by a display controller, as discussed in previous sections.
Nonetheless, in this example, the control register is mapped to address 0x00000040. The floor sensor
detects on which floor the elevator is located while the floor sensor controller registers this information
on the data register (Data Reg.), an 8-bit register situated in the floor sensor controller, and mapped to
address 0x00000080. For example, if the elevator is located on the fourth floor, the floor sensor controller
stores the value four (0b00000100) on the data register.
The following code shows a routine that reads the elevator floor from the floor sensor controller (lines
6 and 7), translates the floor number into a configuration byte (lines 8 to 10), and writes the configuration
byte into the display controller control register to set the seven-segment display (lines 11 and 12).
4
This is the address mapping employed on the Freescale i.MX53 platform. The UART (Universal asynchronous receiver-
transmitter), the GPT (General Purpose Timer), the GPIO (General-Purpose Input/Output), and the TZIC (Trusted-Zone
Interrupt Controller) are peripherals in the system.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
114
+
8.3. I/O OPERATIONS ON RISC-V
1 in 0x71, %al
The output to port instruction, or out, also takes two operands; however, the first one specifies the
target I/O port and the second one the source CPU register. The out instruction copies the value from
the source CPU register into the peripheral register, or internal memory word, identified by the I/O port
operand. The following code shows an example in which the out instruction is used to write the 8-bit
value stored at the CPU register al into the peripheral register (or internal memory word) identified by
the I/O port 0x70.
1 out %al, 0x70
8.2.2 Memory-mapped I/O
The I/O address space defines the set of valid I/O port values. For example, in IA-32 ISAs, the
I/O address space consists of 2
16
(64 KB) individually addressable 8-bit I/O ports, numbered 0 through
0xFFFF [1]. In the Port-mapped I/O method, the I/O address space is distinct from the main memory
address space. In other words, a main memory word may be associated with a memory address (e.g.,
0x70) that has the same value of an I/O port (e.g., 0x70) that is mapped to a peripheral register.
Memory-mapped I/O is a method of accessing peripheral’s registers and their inter-
nal memories that employ regular memory access instructions. In the memory-mapped I/O
method, there is a single address space, and some subsets of this space are mapped to main memory
words while others are mapped to peripheral registers and internal memory words. In this context, the
same instructions that read/write data from/to the main memory (e.g., load and store instructions) are
used to read/write data from/to peripheral registers and their internal memories. The address is the
information that defines whether a main-memory word or a peripheral register or internal memory is
accessed. Figure 8.4 shows an address space mapped to the main memory and multiple peripherals on
a real computing system
4
. Addresses 0x70000000 to 0x80000000 are mapped to main memory words;
hence, load and store operations on these addresses cause the CPU to read and store data on the main
memory. On the other hand, performing a load/store operation on address 0x53F84000 causes the CPU
to read/write data from/to a register on the GPIO peripheral.
8.3 I/O operations on RISC-V
Input and output operations on RISC-V ISAs, including the RV32I ISA, are performed using the memory-
mapped I/O method. Hence, input operations are performed by executing load instructions (e.g., lw)
while output operations are performed with store instructions (e.g., sw) on addresses that are mapped
to peripheral registers or internal memory words.
To illustrate I/O operations on RISC-V, let us consider an elevator computing system that contains an
RV32I CPU, the main memory, a seven-segment display, and a floor sensor, as illustrated in Figure 8.5.
The seven-segment display is controlled by a display controller, as discussed in previous sections.
Nonetheless, in this example, the control register is mapped to address 0x00000040. The floor sensor
detects on which floor the elevator is located while the floor sensor controller registers this information
on the data register (Data Reg.), an 8-bit register situated in the floor sensor controller, and mapped to
address 0x00000080. For example, if the elevator is located on the fourth floor, the floor sensor controller
stores the value four (0b00000100) on the data register.
The following code shows a routine that reads the elevator floor from the floor sensor controller (lines
6 and 7), translates the floor number into a configuration byte (lines 8 to 10), and writes the configuration
byte into the display controller control register to set the seven-segment display (lines 11 and 12).
4
This is the address mapping employed on the Freescale i.MX53 platform. The UART (Universal asynchronous receiver-
transmitter), the GPT (General Purpose Timer), the GPIO (General-Purpose Input/Output), and the TZIC (Trusted-Zone
Interrupt Controller) are peripherals in the system.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
114
diff --git a/book/riscv-book-128.page b/book/riscv-book-128.page index 6abd481..b890d95 100644 --- a/book/riscv-book-128.page +++ b/book/riscv-book-128.page @@ -1 +1 @@ -
8.3. I/O OPERATIONS ON RISC-V
Device
0000 0000
Internal RAM
(boot memory)
0001 0000
...
...
53FB C000
UART-1
53FB FFFF
...
...
53FA 0000
GPT
53FA 3FFF
...
...
53F8 4000
GPIO
53F8 400B
...
...
0FFF C000
TZIC
0FFF FFFF
...
...
7000 0000
Main Memory
(off-chip DDR2)
8000 0000
64 KB
16 KB
16 KB
12 B
16 KB
256 MB
Address space
Figure 8.4: A single address space mapped to main memory (addresses 0x70000000 to 0x80000000) and
multiple peripherals.
1 .section .text
2 .set DISPLAY_CONTROL_REG_PORT, 0x00000040
3 .set FLOOR_DATA_REG_PORT, 0x00000080
4
5 update_display:
6 li a0, FLOOR_DATA_REG_PORT # reads the floor number and
7 lb a1, (a0) # store into a1
8 la a0, floor_to_pattern_table # convert the floor number
9 add t0, a0, a1 # into a configuration
10 lb a1, (t0) # byte
11 li a0, DISPLAY_CONTROL_REG_PORT # set the display controller
12 sb a1, (a0) # with the configuration byte
13 ret # return
14
15 .section .rodata
16 floor_to_pattern_table:
17 .byte 0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b
00110011
RV32I
CPU
Main Memory
(0x10000000-0xFFFFFFF)
Control Reg.
(0x00000040)
Display Controller
f
b
a
e
c
g
d
p
segments
dot
00000100
Data Reg.
(0x00000080)
Floor Sensor Controller
bus
Floor Sensor
Figure 8.5: RV32I-based computing system with a seven-segment display and a floor sensor.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
115
+
8.3. I/O OPERATIONS ON RISC-V
Device
0000 0000
Internal RAM
(boot memory)
0001 0000
...
...
53FB C000
UART-1
53FB FFFF
...
...
53FA 0000
GPT
53FA 3FFF
...
...
53F8 4000
GPIO
53F8 400B
...
...
0FFF C000
TZIC
0FFF FFFF
...
...
7000 0000
Main Memory
(off-chip DDR2)
8000 0000
64 KB
16 KB
16 KB
12 B
16 KB
256 MB
Address space
Figure 8.4: A single address space mapped to main memory (addresses 0x70000000 to 0x80000000) and
multiple peripherals.
1 .section .text
2 .set DISPLAY_CONTROL_REG_PORT, 0x00000040
3 .set FLOOR_DATA_REG_PORT, 0x00000080
4
5 update_display:
6 li a0, FLOOR_DATA_REG_PORT # reads the floor number and
7 lb a1, (a0) # store into a1
8 la a0, floor_to_pattern_table # convert the floor number
9 add t0, a0, a1 # into a configuration
10 lb a1, (t0) # byte
11 li a0, DISPLAY_CONTROL_REG_PORT # set the display controller
12 sb a1, (a0) # with the configuration byte
13 ret # return
14
15 .section .rodata
16 floor_to_pattern_table:
17 .byte 0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b
00110011
RV32I
CPU
Main Memory
(0x10000000-0xFFFFFFF)
Control Reg.
(0x00000040)
Display Controller
f
b
a
e
c
g
d
p
segments
dot
00000100
Data Reg.
(0x00000080)
Floor Sensor Controller
bus
Floor Sensor
Figure 8.5: RV32I-based computing system with a seven-segment display and a floor sensor.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
115
diff --git a/book/riscv-book-129.page b/book/riscv-book-129.page index d27c90e..ec3d6e3 100644 --- a/book/riscv-book-129.page +++ b/book/riscv-book-129.page @@ -1 +1 @@ -
8.4. BUSY WAITING
As discussed in Section 8.1, each bit of the configuration byte controls whether each segment (or
the dot) is turned on or off. In this context, the code must convert the floor number to a configuration
byte that turns on a subset of the segments so the pattern displayed resembles the floor number. For
example, if the elevator is located on the fourth floor (floor number = 4), the code must write the value
0x33 (0b00110011) to turn on segments b, c, f, and g, as illustrated in Figure 8.5. Notice that the
code employs a table (floor to pattern table) that can be indexed by the floor number to retrieve
the proper configuration byte.
8.4 Busy waiting
Busy waiting is a technique in which the code waits for some condition to become true by
repeatedly checking the condition on a loop. Once the condition becomes true, the code
leaves the loop and proceeds with the rest of the execution.
In many situations, when interacting with peripherals, the program may need to wait for some
condition to become true before performing an output or input operation. In these cases, the programmer
may employ the busy waiting technique to control the execution flow. To illustrate this concept, let us
consider a computing system that contains an RV32I CPU, the main memory, and a keypad, as shown
in Figure 8.6.
electrical
wires
00001000
RV32I
CPU
Main Memory
(0x10000000-0xFFFFFFF)
bus
Data Reg.
(0x00000050)
Keypad Controller
1 2 3
4 5 6
7 8
9
* 0 #
00000000
Status Reg.
(0x00000054)
Figure 8.6: RV32I-based computing system with a keypad.
The keypad is connected to a keypad controller, which, in turn, is connected to the CPU through the
bus. The keypad controller contains two 8-bit registers: the data register and the status register. The
data register, which is mapped to address 0x00000050, stores a value that indicates the last key pressed
on the keypad. For example, if the keypad key ‘8’ is pressed, then, the data register is set with number
8
5
.
The status register, which is mapped to address 0x00000054, contains a value that indicates the
keypad’s current status. The least significant bit of the status register (bit 0), called the READY bit,
indicates whether the keypad was pressed since the last time the CPU read a value from the data register.
If it contains the value 0, it means no keys were pressed since the last time the CPU read a value from
the data register. If it contains the value 1, at least one key was pressed since the last time the CPU
read a value from the data register. The second least significant bit of the status register (bit 1), called
the OVRN bit, indicates whether the keypad was pressed more than once since the last time the CPU
read a value from the data register. If it contains the value 1, it means the keypad was pressed more
than once since the last time the CPU read a value from the data register. Notice that, since the keypad
controller contains only one data register, and it stores the value of the last key pressed, if the keypad
is pressed more than once before the CPU gets the chance to read the data register, one or more key
values will be lost. This situation, known as overrun (OVRN), may be detected by inspecting the status
register’s OVRN bit.
Now, let us suppose the programmer needs to implement a routine called read keypad that waits
until the keypad is pressed and then returns the value of the last key pressed. This routine also needs
5
Keys ’#’ and ’*’ produces the numbers 10 and 11.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
116
+
8.4. BUSY WAITING
As discussed in Section 8.1, each bit of the configuration byte controls whether each segment (or
the dot) is turned on or off. In this context, the code must convert the floor number to a configuration
byte that turns on a subset of the segments so the pattern displayed resembles the floor number. For
example, if the elevator is located on the fourth floor (floor number = 4), the code must write the value
0x33 (0b00110011) to turn on segments b, c, f, and g, as illustrated in Figure 8.5. Notice that the
code employs a table (floor to pattern table) that can be indexed by the floor number to retrieve
the proper configuration byte.
8.4 Busy waiting
Busy waiting is a technique in which the code waits for some condition to become true by
repeatedly checking the condition on a loop. Once the condition becomes true, the code
leaves the loop and proceeds with the rest of the execution.
In many situations, when interacting with peripherals, the program may need to wait for some
condition to become true before performing an output or input operation. In these cases, the programmer
may employ the busy waiting technique to control the execution flow. To illustrate this concept, let us
consider a computing system that contains an RV32I CPU, the main memory, and a keypad, as shown
in Figure 8.6.
electrical
wires
00001000
RV32I
CPU
Main Memory
(0x10000000-0xFFFFFFF)
bus
Data Reg.
(0x00000050)
Keypad Controller
1 2 3
4 5 6
7 8
9
* 0 #
00000000
Status Reg.
(0x00000054)
Figure 8.6: RV32I-based computing system with a keypad.
The keypad is connected to a keypad controller, which, in turn, is connected to the CPU through the
bus. The keypad controller contains two 8-bit registers: the data register and the status register. The
data register, which is mapped to address 0x00000050, stores a value that indicates the last key pressed
on the keypad. For example, if the keypad key ‘8’ is pressed, then, the data register is set with number
8
5
.
The status register, which is mapped to address 0x00000054, contains a value that indicates the
keypad’s current status. The least significant bit of the status register (bit 0), called the READY bit,
indicates whether the keypad was pressed since the last time the CPU read a value from the data register.
If it contains the value 0, it means no keys were pressed since the last time the CPU read a value from
the data register. If it contains the value 1, at least one key was pressed since the last time the CPU
read a value from the data register. The second least significant bit of the status register (bit 1), called
the OVRN bit, indicates whether the keypad was pressed more than once since the last time the CPU
read a value from the data register. If it contains the value 1, it means the keypad was pressed more
than once since the last time the CPU read a value from the data register. Notice that, since the keypad
controller contains only one data register, and it stores the value of the last key pressed, if the keypad
is pressed more than once before the CPU gets the chance to read the data register, one or more key
values will be lost. This situation, known as overrun (OVRN), may be detected by inspecting the status
register’s OVRN bit.
Now, let us suppose the programmer needs to implement a routine called read keypad that waits
until the keypad is pressed and then returns the value of the last key pressed. This routine also needs
5
Keys ’#’ and ’*’ produces the numbers 10 and 11.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
116
diff --git a/book/riscv-book-13.page b/book/riscv-book-13.page index 6bc3fb2..20e3ef1 100644 --- a/book/riscv-book-13.page +++ b/book/riscv-book-13.page @@ -1 +1 @@ -
row-major order specifies that the elements of a two-dimensional array are organized in memory row
by row. In this context, the elements of the first row are placed first then the elements of the
second row are placed after the elements of the first one and so on. v, 17
stack pointer is a pointer that points to the top of the program stack. In other words, it holds the
address of the top of the program stack. In RISC-V, the stack pointer is stored by the sp register.
v
store instruction is an instruction that stores values into main memory. v
unprivileged ISA is the sub-set of the ISA that is accessible by the software running on unprivileged
mode. v, 48, 106
unprivileged mode is the privilege mode with least privileges. In RISC-V, it is the User/Application
privilege mode. v, 106, 107
unprivileged registers are a set of registers accessible on the unprivileged mode. v, 48
user application is an application designed to be executed at user-mode on a system managed by an
operating system. v
user-mode on RISC-V, the user-mode is equivalent to the User/Application mode. v, 106
+
register is a small memory device usually located inside the Central Processing Unit (CPU) for quick
read and write access. vi, 3
row-major order specifies that the elements of a two-dimensional array are organized in memory row
by row. In this context, the elements of the first row are placed first then the elements of the
second row are placed after the elements of the first one and so on. vi, 21
stack pointer is a pointer that points to the top of the program stack. In other words, it holds the
address of the top of the program stack. In RISC-V, the stack pointer is stored by the sp register.
vi
store instruction is an instruction that stores values into main memory. vi
unprivileged ISA is the sub-set of the ISA that is accessible by the software running on unprivileged
mode. vi, 58, 132
unprivileged mode is the privilege mode with least privileges. In RISC-V, it is the User/Application
privilege mode. vi, x, 132
unprivileged registers are a set of registers accessible on the unprivileged mode. vi, 58, 59
user application is an application designed to be executed at user-mode on a system managed by an
operating system. vi
user-mode on RISC-V, the user-mode is equivalent to the User/Application mode. vi, x, 132
diff --git a/book/riscv-book-130.page b/book/riscv-book-130.page index a37ff21..d3d3ec1 100644 --- a/book/riscv-book-130.page +++ b/book/riscv-book-130.page @@ -1 +1 @@ -
8.4. BUSY WAITING
to return the value -1 if the keypad was pressed more than once since a value was read from the keypad
controller’s data register. The following code shows an implementation of the read keypad routine that
employs the busy waiting technique to wait for the keypad to be pressed before reading the keypad
controller’s data register. First, it reads the contents of the keypad status register into register a0 (lines
8 and 9) and then it checks whether the READY bit is set by performing a bit-wise and operation with
the mask defined by the READY MASK symbol (line 10) and jumping back to the beginning of the routine in
case the result is zero (line 11). Next, it checks if the keypad was pressed more than once by performing
a bit-wise and operation with the mask defined by the OVRN MASK symbol (line 12) and jumping to the
ovrn occured label in case the result is not zero (line 13). Finally, it reads the key value from the keypad
controller’s data register (lines 14 and 15) and returns.
1 .text
2 .set DATA_REG_PORT, 0x00000050
3 .set STAT_REG_PORT, 0x00000054
4 .set READY_MASK, 0b00000001
5 .set OVRN_MASK, 0b00000010
6
7 read_keypad:
8 li a0, STAT_REG_PORT # read the keypad
9 lb a0, 0(a0) # status into a0
10 andi t0, a0, READY_MASK # check the READY bit and
11 beqz t0, read_keypad # loop until it is equal to 1
12 andi t0, a0, OVRN_MASK # check the OVRN bit and jump to
13 bnez t0, ovrn_occured # ovrn_occured if it is equal to 1
14 la a0, DATA_REG_PORT # read the key from the
15 lb a0, 0(a0) # data register into a0
16 ret # return
17 ovrn_occured:
18 li a0, -1 # set return value to -1
19 ret # return
Busy waiting is a simple technique, but it may be very inefficient because it keeps the CPU busy
until the release condition becomes true (e.g., a key is pressed). The next chapter discusses techniques
(polling and interrupts) that can be employed to release the CPU to perform useful work while waiting
for the release condition to become true.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
117
+
8.4. BUSY WAITING
to return the value -1 if the keypad was pressed more than once since a value was read from the keypad
controller’s data register. The following code shows an implementation of the read keypad routine that
employs the busy waiting technique to wait for the keypad to be pressed before reading the keypad
controller’s data register. First, it reads the contents of the keypad status register into register a0 (lines
8 and 9) and then it checks whether the READY bit is set by performing a bit-wise and operation with
the mask defined by the READY MASK symbol (line 10) and jumping back to the beginning of the routine in
case the result is zero (line 11). Next, it checks if the keypad was pressed more than once by performing
a bit-wise and operation with the mask defined by the OVRN MASK symbol (line 12) and jumping to the
ovrn occured label in case the result is not zero (line 13). Finally, it reads the key value from the keypad
controller’s data register (lines 14 and 15) and returns.
1 .text
2 .set DATA_REG_PORT, 0x00000050
3 .set STAT_REG_PORT, 0x00000054
4 .set READY_MASK, 0b00000001
5 .set OVRN_MASK, 0b00000010
6
7 read_keypad:
8 li a0, STAT_REG_PORT # read the keypad
9 lb a0, 0(a0) # status into a0
10 andi t0, a0, READY_MASK # check the READY bit and
11 beqz t0, read_keypad # loop until it is equal to 1
12 andi t0, a0, OVRN_MASK # check the OVRN bit and jump to
13 bnez t0, ovrn_occured # ovrn_occured if it is equal to 1
14 la a0, DATA_REG_PORT # read the key from the
15 lb a0, 0(a0) # data register into a0
16 ret # return
17 ovrn_occured:
18 li a0, -1 # set return value to -1
19 ret # return
Busy waiting is a simple technique, but it may be very inefficient because it keeps the CPU busy
until the release condition becomes true (e.g., a key is pressed). The next chapter discusses techniques
(polling and interrupts) that can be employed to release the CPU to perform useful work while waiting
for the release condition to become true.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
117
diff --git a/book/riscv-book-131.page b/book/riscv-book-131.page index 7853472..a58293c 100644 --- a/book/riscv-book-131.page +++ b/book/riscv-book-131.page @@ -1 +1 @@ -
Chapter 9
External interrupts
9.1 Introduction
As discussed in previous chapters, the CPU fetches and executes instructions from the main memory.
In this context, most of the actions that happen in the system are initiated by the CPU, as a result
of executing instructions. For example, reading/writing data to/from the main memory and to/from
peripherals are events triggered by the CPU when executing instructions. However, there are some
events that are initiated by other hardware components, such as peripherals. For example, in the system
discussed in Section 8.4, when a keypad key is pressed, the keypad controller registers this information
on the keypad controller registers. Even though the events were not initiated by the CPU, it might
require the CPU attention, i.e., it might require the CPU to perform some action. Hence, there must be
a way to inform the CPU that the peripheral needs its attention.
To illustrate this concept, let us consider the computing system depicted in Figure 9.1, which contains
a RV32I CPU, the main memory, and a keypad.
electrical
wires
00001000
RV32I
CPU
Main Memory
(0x10000000-0xFFFFFFF)
bus
Data Reg.
(0x00000050)
Keypad Controller
1 2 3
4 5 6
7 8
9
* 0 #
00000000
Status Reg.
(0x00000054)
Figure 9.1: RV32I-based computing system with a keypad.
The keypad is connected to a keypad controller, which, in turn, contains two 8-bit registers: the data
register and the status register. The data register, which is mapped to address 0x00000050, stores a
value that indicates the last key pressed on the keypad. The status register, which is mapped to address
0x00000054, contains a value that indicates the keypad’s current status. The least significant bit of the
status register (bit 0), called the READY bit, indicates whether the keypad was pressed since the last
time the CPU read a value from the data register. If it contains the value 0, it means no keys were
pressed since the last time the CPU read a value from the data register, otherwise, it contains the value
1. The second least significant bit of the status register (bit 1), called the OVRN bit, indicates whether
the keypad was pressed more than once since the last time the CPU read a value from the data register.
If it contains the value 1, it means the keypad was pressed more than once since the last time the CPU
read a value from the data register. Since the keypad controller contains only one data register, if the
keypad is pressed more than once before the CPU gets the chance to read the data register, one or more
118
+
Chapter 9
External interrupts
9.1 Introduction
As discussed in previous chapters, the CPU fetches and executes instructions from the main memory.
In this context, most of the actions that happen in the system are initiated by the CPU, as a result
of executing instructions. For example, reading/writing data to/from the main memory and to/from
peripherals are events triggered by the CPU when executing instructions. However, there are some
events that are initiated by other hardware components, such as peripherals. For example, in the system
discussed in Section 8.4, when a keypad key is pressed, the keypad controller registers this information
on the keypad controller registers. Even though the events were not initiated by the CPU, it might
require the CPU attention, i.e., it might require the CPU to perform some action. Hence, there must be
a way to inform the CPU that the peripheral needs its attention.
To illustrate this concept, let us consider the computing system depicted in Figure 9.1, which contains
a RV32I CPU, the main memory, and a keypad.
electrical
wires
00001000
RV32I
CPU
Main Memory
(0x10000000-0xFFFFFFF)
bus
Data Reg.
(0x00000050)
Keypad Controller
1 2 3
4 5 6
7 8
9
* 0 #
00000000
Status Reg.
(0x00000054)
Figure 9.1: RV32I-based computing system with a keypad.
The keypad is connected to a keypad controller, which, in turn, contains two 8-bit registers: the data
register and the status register. The data register, which is mapped to address 0x00000050, stores a
value that indicates the last key pressed on the keypad. The status register, which is mapped to address
0x00000054, contains a value that indicates the keypad’s current status. The least significant bit of the
status register (bit 0), called the READY bit, indicates whether the keypad was pressed since the last
time the CPU read a value from the data register. If it contains the value 0, it means no keys were
pressed since the last time the CPU read a value from the data register, otherwise, it contains the value
1. The second least significant bit of the status register (bit 1), called the OVRN bit, indicates whether
the keypad was pressed more than once since the last time the CPU read a value from the data register.
If it contains the value 1, it means the keypad was pressed more than once since the last time the CPU
read a value from the data register. Since the keypad controller contains only one data register, if the
keypad is pressed more than once before the CPU gets the chance to read the data register, one or more
118
diff --git a/book/riscv-book-132.page b/book/riscv-book-132.page index d15884f..afb961e 100644 --- a/book/riscv-book-132.page +++ b/book/riscv-book-132.page @@ -1 +1 @@ -
9.1. INTRODUCTION
key values are lost. This situation, known as data overrun (OVRN), may be detected by inspecting the
status register’s OVRN bit.
The longer the program takes to read the data register contents, the higher is the chance of a data
overrun. To prevent data overruns, it is customary to copy the data register value to a first-in first-out
(FIFO) queue
1
located at the main memory as soon as the keypad is pressed. This approach is illustrated
in Figure 9.2, which implements the FIFO queue using an 8-element circular buffer and two pointers,
one that points to the queue head (oldest element inserted) and another that points to the queue tail
(last element inserted). In this example, the keypad keys ‘1’, ‘9’, and ‘6’, have been pressed and stored
on the queue.
0x06
RV32I
CPU
bus
Data Reg.
(0x00000050)
Keypad Controller
1 2 3
4 5 6
7 8
9
* 0 #
0x00
Status Reg.
(0x00000054)
Main Memory (0x10000000-0xFFFFFFF)
01 09 06
Keypad
queue
head tail
Figure 9.2: Storing the contents of the data register on a queue located at the main memory.
In this approach, whenever a key is pressed, its value is pushed into the queue’s tail, and whenever
the user program needs to read a key, it pops it from the queue’s head, instead of reading from the
keypad data register. Notice that the queue works as a buffer that is capable of storing multiple key
values, allowing the program to perform longer computations before reading each key value. Figure 9.3
illustrates what happens when the keypad key ‘9’ is pressed. First, the key ‘9’ is pressed 1 . Then, the
keypad controller registers this information on the data and the status registers 2 . Finally, the CPU
executes a routine that pushes the data register value on the queue’s tail 3 .
0x09
RV32I
CPU
bus
Data Reg.
(0x00000050)
Keypad Controller
1 2 3
4 5 6
7 8
9
* 0 #
0x01
Status Reg.
(0x00000054)
Main Memory (0x10000000-0xFFFFFFF)
01 09 06 09
Keypad
queue
head tail
1
2
3
Figure 9.3: Storing the key value on the queue when the keypad key ‘9’ is pressed.
Copying the value from the keypad’s data register to the queue located at the main memory is
usually performed by the CPU, through the execution of a routine. In this context, whenever the keypad
is pressed, the CPU must execute this routine as soon as possible to prevent data overruns. There are
two main methods to direct the CPU attention to handle events caused by external hardware: Polling
and Hardware Interrupts.
1
Fixed-length queues can be efficiently implemented on memory using circular buffers.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
119
+
9.1. INTRODUCTION
key values are lost. This situation, known as data overrun (OVRN), may be detected by inspecting the
status register’s OVRN bit.
The longer the program takes to read the data register contents, the higher is the chance of a data
overrun. To prevent data overruns, it is customary to copy the data register value to a first-in first-out
(FIFO) queue
1
located at the main memory as soon as the keypad is pressed. This approach is illustrated
in Figure 9.2, which implements the FIFO queue using an 8-element circular buffer and two pointers,
one that points to the queue head (oldest element inserted) and another that points to the queue tail
(last element inserted). In this example, the keypad keys ‘1’, ‘9’, and ‘6’, have been pressed and stored
on the queue.
0x06
RV32I
CPU
bus
Data Reg.
(0x00000050)
Keypad Controller
1 2 3
4 5 6
7 8
9
* 0 #
0x00
Status Reg.
(0x00000054)
Main Memory (0x10000000-0xFFFFFFF)
01 09 06
Keypad
queue
head tail
Figure 9.2: Storing the contents of the data register on a queue located at the main memory.
In this approach, whenever a key is pressed, its value is pushed into the queue’s tail, and whenever
the user program needs to read a key, it pops it from the queue’s head, instead of reading from the
keypad data register. Notice that the queue works as a buffer that is capable of storing multiple key
values, allowing the program to perform longer computations before reading each key value. Figure 9.3
illustrates what happens when the keypad key ‘9’ is pressed. First, the key ‘9’ is pressed 1 . Then, the
keypad controller registers this information on the data and the status registers 2 . Finally, the CPU
executes a routine that pushes the data register value on the queue’s tail 3 .
0x09
RV32I
CPU
bus
Data Reg.
(0x00000050)
Keypad Controller
1 2 3
4 5 6
7 8
9
* 0 #
0x01
Status Reg.
(0x00000054)
Main Memory (0x10000000-0xFFFFFFF)
01 09 06 09
Keypad
queue
head tail
1
2
3
Figure 9.3: Storing the key value on the queue when the keypad key ‘9’ is pressed.
Copying the value from the keypad’s data register to the queue located at the main memory is
usually performed by the CPU, through the execution of a routine. In this context, whenever the keypad
is pressed, the CPU must execute this routine as soon as possible to prevent data overruns. There are
two main methods to direct the CPU attention to handle events caused by external hardware: Polling
and Hardware Interrupts.
1
Fixed-length queues can be efficiently implemented on memory using circular buffers.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
119
diff --git a/book/riscv-book-133.page b/book/riscv-book-133.page index f2465a3..ccc456c 100644 --- a/book/riscv-book-133.page +++ b/book/riscv-book-133.page @@ -1 +1 @@ -
9.2. EXTERNAL INTERRUPTS
9.1.1 Polling
Polling is a method in which the program is designed so that the CPU periodically checks
whether peripherals need attention. In this approach, the program has to be designed so that it
checks the peripherals that may need CPU attention from time to time. For example, the program may
contain a main loop that repeatedly checks the peripherals and perform some computation. Whenever
there is a peripheral that needs attention, the program invokes a routine to handle the peripheral.
Algorithm 3 illustrates a program that employs polling to handle peripherals. It is composed of a
main loop (the outer while loop) that checks peripherals for attention and perform some computation
alternatively.
Algorithm 3: Handling peripherals with polling.
1 while True do
/* Handle peripherals */
2 for p in P eripherals do
3 if needsAttention(p) then
4 handlePeripheral(p) ;
5 end
6 end
7 PerformSomeComputation();
8 end
Algorithm 4 illustrates a code that employs polling to check and handle the keypad periodically. In
this case, the keypadPressed() function checks whether the keypad READY bit is set, if so, then it returns
true and the program invokes the getKey() and the pushKeyOnQueue() routines to read the contents
of the data register and push it to the queue’s tail. The Compute() routine represents the work that is
done by the program in the meantime.
Algorithm 4: Handling the keypad with polling.
1 while True do
2 if keypadPressed() then
3 k getKey() ;
4 pushKeyOnQueue(k) ;
5 end
6 Compute() ;
7 end
Notice that the amount of work performed by the Compute() routine affects the frequency in which
the keypad is checked. On the one hand, the longer the Compute() routine takes to execute, the higher
is the chance of occurring data overrun. On the other hand, breaking the computation so that each call
to Compute() executes quickly (e.g., performing just a small fraction of the computation every time it
is invoked) may cause a large overhead (checking peripherals may take a long time) and may make the
program hard to design and implement. As a consequence, polling is usually not the best approach to
check for and handle peripherals events.
9.2 External interrupts
Hardware Interrupts is a mechanism that allows hardware to inform the CPU they require
attention. External Interrupts are interrupts caused by external (non-CPU) hardware,
such as peripherals, to inform the CPU they require attention. In this approach, the peripheral
sends an interrupt signal to the CPU, and, once the CPU receives this signal, it:
1. saves the context
2
of the current program;
2
The context is defined by the program values, which are stored at CPU registers and the main memory.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
120
+
9.2. EXTERNAL INTERRUPTS
9.1.1 Polling
Polling is a method in which the program is designed so that the CPU periodically checks
whether peripherals need attention. In this approach, the program has to be designed so that it
checks the peripherals that may need CPU attention from time to time. For example, the program may
contain a main loop that repeatedly checks the peripherals and perform some computation. Whenever
there is a peripheral that needs attention, the program invokes a routine to handle the peripheral.
Algorithm 3 illustrates a program that employs polling to handle peripherals. It is composed of a
main loop (the outer while loop) that checks peripherals for attention and perform some computation
alternatively.
Algorithm 3: Handling peripherals with polling.
1 while True do
/* Handle peripherals */
2 for p in P eripherals do
3 if needsAttention(p) then
4 handlePeripheral(p) ;
5 end
6 end
7 PerformSomeComputation();
8 end
Algorithm 4 illustrates a code that employs polling to check and handle the keypad periodically. In
this case, the keypadPressed() function checks whether the keypad READY bit is set, if so, then it returns
true and the program invokes the getKey() and the pushKeyOnQueue() routines to read the contents
of the data register and push it to the queue’s tail. The Compute() routine represents the work that is
done by the program in the meantime.
Algorithm 4: Handling the keypad with polling.
1 while True do
2 if keypadPressed() then
3 k getKey() ;
4 pushKeyOnQueue(k) ;
5 end
6 Compute() ;
7 end
Notice that the amount of work performed by the Compute() routine affects the frequency in which
the keypad is checked. On the one hand, the longer the Compute() routine takes to execute, the higher
is the chance of occurring data overrun. On the other hand, breaking the computation so that each call
to Compute() executes quickly (e.g., performing just a small fraction of the computation every time it
is invoked) may cause a large overhead (checking peripherals may take a long time) and may make the
program hard to design and implement. As a consequence, polling is usually not the best approach to
check for and handle peripherals events.
9.2 External interrupts
Hardware Interrupts is a mechanism that allows hardware to inform the CPU they require
attention. External Interrupts are interrupts caused by external (non-CPU) hardware,
such as peripherals, to inform the CPU they require attention. In this approach, the peripheral
sends an interrupt signal to the CPU, and, once the CPU receives this signal, it:
1. saves the context
2
of the current program;
2
The context is defined by the program values, which are stored at CPU registers and the main memory.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
120
diff --git a/book/riscv-book-134.page b/book/riscv-book-134.page index 55d6375..3685a80 100644 --- a/book/riscv-book-134.page +++ b/book/riscv-book-134.page @@ -1 +1 @@ -
9.2. EXTERNAL INTERRUPTS
2. invokes a routine to handle the hardware interrupt;
3. restores the context of the saved program and continues executing.
To illustrate this concept, let us consider the computing system depicted in Figure 9.4.
0x06
Data Reg.
(0x00000050)
Keypad Controller
1 2 3
4 5 6
7 8
9
* 0 #
0x00
Status Reg.
(0x00000054)
Main Memory (0x10000000-0xFFFFFFF)
01 09 06
Keypad
queue
head tail
RV32I
CPU
bus
CPU
Interrupt
pin
Figure 9.4: RV32I-based computing system with a keypad connected to the CPU interrupt pin.
This system is very similar to the one presented in Figures 9.1, 9.2, and 9.3. The main difference is
that the CPU contains an interrupt pin and the keypad controller is connected to the CPU interrupt pin
(bold arrow). The interrupt pin is an input pin that informs the CPU whether or not there
is an external interrupt. In this context, whenever a key is pressed, the keypad controller sends a
signal to the CPU through the interrupt pin. The CPU hardware (i) constantly monitors the interrupt
pin and, in case it receives an interrupt signal, it interrupts the current execution flow to execute an
interrupt service routine. The interrupt service routine
3
, or ISR, is a software routine that
handles the interrupt. There are several ways of implementing ISRs, however, in general, they usually
save the context of the executing program (e.g., the contents of the CPU registers) on main memory,
interact with the peripheral that sent the interrupt signal, and, finally, restore the saved context so that
the CPU continues executing the program that was interrupted.
9.2.1 Detecting external interrupts
Algorithm 5 illustrates how the CPU instruction execution cycle presented at Section 1.2 may be adapted
to detect external interrupts. In this example, before fetching an instruction for execution, it verifies if
the interrupt pin is set, i.e., if the CPU received an interrupt signal, and if interrupts are enabled, i.e.,
if the interrupts enabled is set. If both conditions are met, it saves the contents of the program counter
(PC) into the SAVED PC register, sets the PC register with the address of the interrupt service routine
(ISR ADDRESS), and disables interrupts by clearing the interrupts enabled register. As a result, the
next instruction that will be fetched for execution is the first instruction of the interrupt service routine.
3
The interrupt service routine is also known as interrupt handler.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
121
+
9.2. EXTERNAL INTERRUPTS
2. invokes a routine to handle the hardware interrupt;
3. restores the context of the saved program and continues executing.
To illustrate this concept, let us consider the computing system depicted in Figure 9.4.
0x06
Data Reg.
(0x00000050)
Keypad Controller
1 2 3
4 5 6
7 8
9
* 0 #
0x00
Status Reg.
(0x00000054)
Main Memory (0x10000000-0xFFFFFFF)
01 09 06
Keypad
queue
head tail
RV32I
CPU
bus
CPU
Interrupt
pin
Figure 9.4: RV32I-based computing system with a keypad connected to the CPU interrupt pin.
This system is very similar to the one presented in Figures 9.1, 9.2, and 9.3. The main difference is
that the CPU contains an interrupt pin and the keypad controller is connected to the CPU interrupt pin
(bold arrow). The interrupt pin is an input pin that informs the CPU whether or not there
is an external interrupt. In this context, whenever a key is pressed, the keypad controller sends a
signal to the CPU through the interrupt pin. The CPU hardware (i) constantly monitors the interrupt
pin and, in case it receives an interrupt signal, it interrupts the current execution flow to execute an
interrupt service routine. The interrupt service routine
3
, or ISR, is a software routine that
handles the interrupt. There are several ways of implementing ISRs, however, in general, they usually
save the context of the executing program (e.g., the contents of the CPU registers) on main memory,
interact with the peripheral that sent the interrupt signal, and, finally, restore the saved context so that
the CPU continues executing the program that was interrupted.
9.2.1 Detecting external interrupts
Algorithm 5 illustrates how the CPU instruction execution cycle presented at Section 1.2 may be adapted
to detect external interrupts. In this example, before fetching an instruction for execution, it verifies if
the interrupt pin is set, i.e., if the CPU received an interrupt signal, and if interrupts are enabled, i.e.,
if the interrupts enabled is set. If both conditions are met, it saves the contents of the program counter
(PC) into the SAVED PC register, sets the PC register with the address of the interrupt service routine
(ISR ADDRESS), and disables interrupts by clearing the interrupts enabled register. As a result, the
next instruction that will be fetched for execution is the first instruction of the interrupt service routine.
3
The interrupt service routine is also known as interrupt handler.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
121
diff --git a/book/riscv-book-135.page b/book/riscv-book-135.page index 8e00670..8e2b7de 100644 --- a/book/riscv-book-135.page +++ b/book/riscv-book-135.page @@ -1 +1 @@ -
9.2. EXTERNAL INTERRUPTS
Algorithm 5: Adapting the CPU instructions execution cycle to handle interrupts.
1 while True do
/* Check for interrupts */
2 if (interrupt pin = ‘1’) and (interrupts enabled = ‘1’) then
/* Invoke the ISR */
3 SAVED PC PC ;
4 PC ISR ADDRESS;
5 interrupts enabled ‘0’;
6 end
/* Fetch instruction and update PC */
7 IR MainMemory[PC] ;
8 PC PC+4;
9 ExecuteInstruction(IR);
10 end
Notice that the pseudo-code in Algorithm 5 disables interruptions whenever it invokes an interrupt
service routine. This is performed so the interrupt service routine has a chance to save all the important
context (including the contents of the SAVED PC) before the CPU redirects the execution flow to handle
a new interrupt. Moreover, in some systems, the interrupt service routine is responsible for interacting
with the peripheral so it stops signaling the interrupt pin. In these cases, the CPU must ignore the
interrupt pin until the peripheral stops signaling the interrupt pin. Once it is safe to handle new
interrupts, the interrupt service routine may set the interrupts enabled register so the CPU may
handle new interrupts.
NOTE: CPUs usually disable interrupts on power-up to allow the boot software to configure
the hardware and register the proper ISRs before the system tries to handle interruptions.
9.2.2 Invoking the proper interrupt service routine
A computing system may contain several peripherals that may interrupt the CPU. Also, each peripheral
usually requires a specialized routine to handle its interrupts. For example, a keypad controller may
require a routine that adds the value from the data register into a queue on the main memory while a
pointing device (mouse) controller may need another action. As a consequence, whenever an interrupt
occurs, the system has to perform two tasks: (i) identify which peripheral interrupted the CPU, and (ii)
invoke the proper routine to handle the interrupt.
Depending on the system architecture, these two tasks may be performed by hardware, by software,
or by a combination of both. In fact, there are several ways of identifying which peripheral interrupted
the CPU and invoking the proper routine to handle the interrupt. To discuss the main trade-offs, we
will consider three distinct designs that we will call: SW-only, SW/HW, and HW-only.
SW-only design
In the SW-only design, the ISR is responsible for identifying which peripheral interrupted the CPU,
and invoking the proper routine to handle the interrupt. In this approach, upon an interrupt, the CPU
invokes a generic ISR that must perform both tasks. Since there is no hardware support to identify which
peripheral interrupted the CPU, the ISR may have to interact with all peripherals to find out which one
is requiring the CPU attention. Once the ISR finds out which peripheral interrupted the CPU, it can
invoke the proper interrupt service routine to handle the peripheral interrupt.
The main advantage of this approach is that it simplifies the CPU hardware design, which is usually
an important goal since hardware bugs are hard to find and do not allow easy patching once the CPU is
manufactured and sold. Nonetheless, in case there are several peripherals or peripherals are slow, the ISR
may take a long time trying to figure out which peripheral interrupted the CPU. This may affect overall
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
122
+
9.2. EXTERNAL INTERRUPTS
Algorithm 5: Adapting the CPU instructions execution cycle to handle interrupts.
1 while True do
/* Check for interrupts */
2 if (interrupt pin = ‘1’) and (interrupts enabled = ‘1’) then
/* Invoke the ISR */
3 SAVED PC PC ;
4 PC ISR ADDRESS;
5 interrupts enabled ‘0’;
6 end
/* Fetch instruction and update PC */
7 IR MainMemory[PC] ;
8 PC PC+4;
9 ExecuteInstruction(IR);
10 end
Notice that the pseudo-code in Algorithm 5 disables interruptions whenever it invokes an interrupt
service routine. This is performed so the interrupt service routine has a chance to save all the important
context (including the contents of the SAVED PC) before the CPU redirects the execution flow to handle
a new interrupt. Moreover, in some systems, the interrupt service routine is responsible for interacting
with the peripheral so it stops signaling the interrupt pin. In these cases, the CPU must ignore the
interrupt pin until the peripheral stops signaling the interrupt pin. Once it is safe to handle new
interrupts, the interrupt service routine may set the interrupts enabled register so the CPU may
handle new interrupts.
NOTE: CPUs usually disable interrupts on power-up to allow the boot software to configure
the hardware and register the proper ISRs before the system tries to handle interruptions.
9.2.2 Invoking the proper interrupt service routine
A computing system may contain several peripherals that may interrupt the CPU. Also, each peripheral
usually requires a specialized routine to handle its interrupts. For example, a keypad controller may
require a routine that adds the value from the data register into a queue on the main memory while a
pointing device (mouse) controller may need another action. As a consequence, whenever an interrupt
occurs, the system has to perform two tasks: (i) identify which peripheral interrupted the CPU, and (ii)
invoke the proper routine to handle the interrupt.
Depending on the system architecture, these two tasks may be performed by hardware, by software,
or by a combination of both. In fact, there are several ways of identifying which peripheral interrupted
the CPU and invoking the proper routine to handle the interrupt. To discuss the main trade-offs, we
will consider three distinct designs that we will call: SW-only, SW/HW, and HW-only.
SW-only design
In the SW-only design, the ISR is responsible for identifying which peripheral interrupted the CPU,
and invoking the proper routine to handle the interrupt. In this approach, upon an interrupt, the CPU
invokes a generic ISR that must perform both tasks. Since there is no hardware support to identify which
peripheral interrupted the CPU, the ISR may have to interact with all peripherals to find out which one
is requiring the CPU attention. Once the ISR finds out which peripheral interrupted the CPU, it can
invoke the proper interrupt service routine to handle the peripheral interrupt.
The main advantage of this approach is that it simplifies the CPU hardware design, which is usually
an important goal since hardware bugs are hard to find and do not allow easy patching once the CPU is
manufactured and sold. Nonetheless, in case there are several peripherals or peripherals are slow, the ISR
may take a long time trying to figure out which peripheral interrupted the CPU. This may affect overall
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
122
diff --git a/book/riscv-book-136.page b/book/riscv-book-136.page index 6621eed..d57a179 100644 --- a/book/riscv-book-136.page +++ b/book/riscv-book-136.page @@ -1 +1 @@ -
9.2. EXTERNAL INTERRUPTS
system performance and may even cause the system to lose data due to data overruns, as discussed in
previous sections.
SW/HW design
In the SW-HW design, the ISR is also responsible for performing both tasks; however, the hardware
provides some support to identify which peripheral interrupted the CPU. In this case, upon an interrupt,
the hardware sets a register
4
with a value that indicates which peripheral generated the interrupt.
Consequently, the ISR may simply read this register to find out which peripheral generated the interrupt.
Once the ISR finds out which peripheral interrupted the CPU, it can invoke the proper interrupt service
routine to handle the peripheral interrupt.
Both the SW-only and the SW/HW designs jump to a single generic ISR. This approach is known as
“direct mode” in RISV-V terminology. Algorithm 5 illustrates how this approach may be implemented
in hardware.
The CPU hardware design may not be as simple as in the SW-only approach; however, in this
approach, the ISR takes very little time (usually the time required to execute one or two instructions)
to figure out which peripheral send the interrupt signal.
HW-only design
In the HW-only design, the hardware is responsible for identifying which peripheral interrupted the CPU
and to invoke the proper ISR. In this case, each peripheral is associated with an interrupt identifier
5
and
the CPU must automatically map this identifier to its respective ISR. This is usually performed with a
table, often called interrupt vector table, that maps the interrupt identifier to the address of the ISR
6
.
To illustrate this concept, let us consider a system in which each peripheral is associated with a
unique interrupt identifier that may range from 0 to 15, and that the CPU automatically registers the
interrupt identifier on the INTERRUPT ID register whenever an interrupt signal is received. Also, there is
an array on main memory, called interrupt vector table, that contains in position i the address of the ISR
that must be invoked to handle interrupts from the peripheral that is associated with interrupt identifier
i. The system also contains a register called INT TABLE BASE that stores the interrupt vector table base
address. In this context, to invoke the proper ISR, the CPU may load the ISR address from the interrupt
vector table using the interrupt identifier. Algorithm 6 illustrates how a CPU may automatically load
the address of the proper ISR by accessing the interrupt vector table. The CPU multiplies the contents
of the INTERRUPT ID register by four because each entry in the interrupt vector table contains a 32-bit
(four-byte) address.
4
This register may be an internal CPU register or a register on an interrupt controller, which is a peripheral designed
to support external interrupt handling.
5
In some systems this identifier is called Interrupt Request, or IRQ.
6
Some designs map the interrupt identifier to the first instruction of the ISR, which is usually a jump to the routine.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
123
+
9.2. EXTERNAL INTERRUPTS
system performance and may even cause the system to lose data due to data overruns, as discussed in
previous sections.
SW/HW design
In the SW-HW design, the ISR is also responsible for performing both tasks; however, the hardware
provides some support to identify which peripheral interrupted the CPU. In this case, upon an interrupt,
the hardware sets a register
4
with a value that indicates which peripheral generated the interrupt.
Consequently, the ISR may simply read this register to find out which peripheral generated the interrupt.
Once the ISR finds out which peripheral interrupted the CPU, it can invoke the proper interrupt service
routine to handle the peripheral interrupt.
Both the SW-only and the SW/HW designs jump to a single generic ISR. This approach is known as
“direct mode” in RISV-V terminology. Algorithm 5 illustrates how this approach may be implemented
in hardware.
The CPU hardware design may not be as simple as in the SW-only approach; however, in this
approach, the ISR takes very little time (usually the time required to execute one or two instructions)
to figure out which peripheral send the interrupt signal.
HW-only design
In the HW-only design, the hardware is responsible for identifying which peripheral interrupted the CPU
and to invoke the proper ISR. In this case, each peripheral is associated with an interrupt identifier
5
and
the CPU must automatically map this identifier to its respective ISR. This is usually performed with a
table, often called interrupt vector table, that maps the interrupt identifier to the address of the ISR
6
.
To illustrate this concept, let us consider a system in which each peripheral is associated with a
unique interrupt identifier that may range from 0 to 15, and that the CPU automatically registers the
interrupt identifier on the INTERRUPT ID register whenever an interrupt signal is received. Also, there is
an array on main memory, called interrupt vector table, that contains in position i the address of the ISR
that must be invoked to handle interrupts from the peripheral that is associated with interrupt identifier
i. The system also contains a register called INT TABLE BASE that stores the interrupt vector table base
address. In this context, to invoke the proper ISR, the CPU may load the ISR address from the interrupt
vector table using the interrupt identifier. Algorithm 6 illustrates how a CPU may automatically load
the address of the proper ISR by accessing the interrupt vector table. The CPU multiplies the contents
of the INTERRUPT ID register by four because each entry in the interrupt vector table contains a 32-bit
(four-byte) address.
4
This register may be an internal CPU register or a register on an interrupt controller, which is a peripheral designed
to support external interrupt handling.
5
In some systems this identifier is called Interrupt Request, or IRQ.
6
Some designs map the interrupt identifier to the first instruction of the ISR, which is usually a jump to the routine.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
123
diff --git a/book/riscv-book-137.page b/book/riscv-book-137.page index 0988e67..c97743a 100644 --- a/book/riscv-book-137.page +++ b/book/riscv-book-137.page @@ -1 +1 @@ -
9.3. INTERRUPTS ON RV32I
Algorithm 6: Adapting the CPU instructions execution cycle to automatically invoke the
proper ISR.
1 while True do
/* Check for interrupts */
2 if (interrupt pin = ‘1’) and (interrupts enabled = ‘1’) then
/* Save the previous PC */
3 SAVED PC PC ;
/* Retrieve the ISR address from the interrupt vector table and set PC */
4 PC MainMemory[INT TABLE BASE + INTERRUPT ID × 4];
5 interrupts enabled ‘0’ ;
6 end
/* Fetch instruction and update PC */
7 IR MainMemory[PC] ;
8 PC PC+4;
9 ExecuteInstruction(IR);
10 end
On power-up, before enabling interrupts, the boot software must write the interrupt vector table on
main memory and set the INT TABLE BASE register with its base address.
This approach’s main advantage is the performance since the CPU directly invokes the proper ISR
upon an interrupt. However, the CPU hardware design usually becomes more complicated.
In some designs, instead of storing the ISR address, the interrupt vector table stores an instruction,
which is executed by the CPU upon an interrupt. In this case, each entry in the table stores a jump to
the respective ISR routine. This approach, discussed in the next section, is employed by the RISC-V
Instruction Set Architecture ().
9.3 Interrupts on RV32I
In this section, we will discuss external interrupts in the context of RISV-V CPUs. As we will discuss in
Section 10.1, the RISC-V ISA defines three privilege levels: User/Application, Supervisor, and Machine.
Also, it specifies that microprocessor may implement only a subset of these privilege levels. To simplify
the discussion, in this chapter we will focus on systems that implement only the Machine privilege levels,
which is usually the case of embedded systems. Chapter 10 will discuss other privilege levels and how
they affect the RISC-V interrupt handling mechanism.
9.3.1 Control and status registers
The RISC-V Control and Status Registers, or CSRs, are special registers that expose the
CPU status to the software and allow it to configure the CPU behavior. For example, on
the RV32I ISA, the mstatus CSR is a 32-bit register that contains several bits that expose the current
status of the CPU or control the CPU behavior.
The RISC-V ISA contains a set of special instructions to enable software to inspect and modify the
contents of CSRs [4]. The csrrw rd, csr, rs1 instruction atomically swaps values in the CSRs and
general-purpose registers (e.g., x1-x31). For example, csrrw a0, mscratch, a0 atomically swaps the
contents of register a0 and the mscratch CSR. The csrr rd, csr instruction copies the contents of the
csr CSR into the rd general-purpose register. For example, the csrr a0, mstatus copies the contents
of the mstatus CSR into a0. The csrw csr, rd instruction copies the contents of the rd general-purpose
register into the csr CSR. For example, the csrw mtvec, a1 copies the contents of register a1 into the
mtvec CSR.
The RV32I Control and Status Registers are 32-bit long and some of them may contain subfields
with different purposes. For example, the mstatus CSR, illustrated in Figure 9.5, contains more than
17 subfields (e.g., MIE, MPIE, etc.), each one with a specific purpose.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
124
+
9.3. INTERRUPTS ON RV32I
Algorithm 6: Adapting the CPU instructions execution cycle to automatically invoke the
proper ISR.
1 while True do
/* Check for interrupts */
2 if (interrupt pin = ‘1’) and (interrupts enabled = ‘1’) then
/* Save the previous PC */
3 SAVED PC PC ;
/* Retrieve the ISR address from the interrupt vector table and set PC */
4 PC MainMemory[INT TABLE BASE + INTERRUPT ID × 4];
5 interrupts enabled ‘0’ ;
6 end
/* Fetch instruction and update PC */
7 IR MainMemory[PC] ;
8 PC PC+4;
9 ExecuteInstruction(IR);
10 end
On power-up, before enabling interrupts, the boot software must write the interrupt vector table on
main memory and set the INT TABLE BASE register with its base address.
This approach’s main advantage is the performance since the CPU directly invokes the proper ISR
upon an interrupt. However, the CPU hardware design usually becomes more complicated.
In some designs, instead of storing the ISR address, the interrupt vector table stores an instruction,
which is executed by the CPU upon an interrupt. In this case, each entry in the table stores a jump to
the respective ISR routine. This approach, discussed in the next section, is employed by the RISC-V
Instruction Set Architecture ().
9.3 Interrupts on RV32I
In this section, we will discuss external interrupts in the context of RISV-V CPUs. As we will discuss in
Section 10.1, the RISC-V ISA defines three privilege levels: User/Application, Supervisor, and Machine.
Also, it specifies that microprocessor may implement only a subset of these privilege levels. To simplify
the discussion, in this chapter we will focus on systems that implement only the Machine privilege levels,
which is usually the case of embedded systems. Chapter 10 will discuss other privilege levels and how
they affect the RISC-V interrupt handling mechanism.
9.3.1 Control and status registers
The RISC-V Control and Status Registers, or CSRs, are special registers that expose the
CPU status to the software and allow it to configure the CPU behavior. For example, on
the RV32I ISA, the mstatus CSR is a 32-bit register that contains several bits that expose the current
status of the CPU or control the CPU behavior.
The RISC-V ISA contains a set of special instructions to enable software to inspect and modify the
contents of CSRs [4]. The csrrw rd, csr, rs1 instruction atomically swaps values in the CSRs and
general-purpose registers (e.g., x1-x31). For example, csrrw a0, mscratch, a0 atomically swaps the
contents of register a0 and the mscratch CSR. The csrr rd, csr instruction copies the contents of the
csr CSR into the rd general-purpose register. For example, the csrr a0, mstatus copies the contents
of the mstatus CSR into a0. The csrw csr, rd instruction copies the contents of the rd general-purpose
register into the csr CSR. For example, the csrw mtvec, a1 copies the contents of register a1 into the
mtvec CSR.
The RV32I Control and Status Registers are 32-bit long and some of them may contain subfields
with different purposes. For example, the mstatus CSR, illustrated in Figure 9.5, contains more than
17 subfields (e.g., MIE, MPIE, etc.), each one with a specific purpose.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
124
diff --git a/book/riscv-book-138.page b/book/riscv-book-138.page index 4405ccf..530abb9 100644 --- a/book/riscv-book-138.page +++ b/book/riscv-book-138.page @@ -1 +1 @@ -
9.3. INTERRUPTS ON RV32I
SIE UIEMIE WPRISPIE UPIEMPIE WPRIWPRI SPPMPP[1:0]FS[1:0]XS[1:0]
1 11 11 11 12 1222
1 03 25 47 68911 1013 1215 1416
SUM
MPRV
TVM MXRTSR TWWPRI
1 11 11 1
81
18 1720 1922 21233031
SD
Figure 9.5: The mstatus CSR and its subfields.
In our discussion, we will use the csr.FIELD notation to refer to the FIELD subfield of csr CSR. For
example, mstatus.MIE refers to the MIE subfield present on the mstatus CSR.
9.3.2 Interrupt related control and status registers
The following RV32I Control and Status Registers contain status or may control the behavior of the
interrupt handling mechanism on Machine level:
mstatus: The following mstatus subfields provide information or control the interrupt handling
mechanism.
mstatus.MIE (Machine Interrupt Enable): The machine interrupt enable subfield controls
whether or not the CPU will handle interrupts. If it contains zero, the CPU ignores all
interrupts. This bit is cleared upon reset and the boot software usually sets it with one once
peripherals and the interrupt handling mechanism are properly configured;
NOTE: There is also a CSR called Machine Interrupt Enable; however, it has a
different purpose and should not e confused with the mstatus.MIE subfield.
mstatus.MPIE (Machine Previous Interrupt Enable): Upon an interrupt, the CPU changes the
value of the mstatus.MIE subfield to ignore new interrupts until the interrupt service routine
enables it again. The previous value of the mstatus.MIE subfield is automatically saved by
the CPU on the mstatus.MPIE subfield;
mstatus.MPP: Upon an interrupt, the CPU may change the privilege mode. In this case, it
saves the previous current privilege mode on this subfield.
mcause (Machine Interrupt Cause): The machine interrupt cause CSR stores the interrupt cause,
i.e., a value that identifies why an interrupt was generated. It has two fields: mcause.EXCCODE (bits
0 to 30) and mcause.INTERRUPT (bit 31). The mcause.INTERRUPT subfield specifies whether the
interrupt is an actual interrupt (1) or an exception (0)
7
. The mcause.EXCCODE subfield specifies
the interrupt (or exception) identifier. On Machine mode, interrupts caused by peripherals are
classified as “Machine external interrupt” and the value registered on the mcause.INTERRUPT and
mcause.EXCCODE subfields are 0x1 and 0xB, respectively.
mtvec (Machine Trap Vector): The machine trap vector CSR stores information that allows the
CPU to identify the proper interrupt service routine address when an interrupt occurs. It has two
fields: mtvec.MODE (bits 0 to 1) and mtvec.BASE (bits 2 to 31). The mtvec.MODE specifies whether
the CPU is working in the direct (00) of vectored (01) mode. In the direct mode, upon an interrupt,
the CPU sets the PC with the contents of the mtvec.BASE subfield. In the vectored mode, upon
an interrupt, the CPU sets the PC with mtvec.BASE + (4 × mcause.EXCCODE).
7
In RISC-V terminology, exceptions are interrupts caused by the CPU. We will discuss these kind of interrupts on
Chapter 10.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
125
+
9.3. INTERRUPTS ON RV32I
SIE UIEMIE WPRISPIE UPIEMPIE WPRIWPRI SPPMPP[1:0]FS[1:0]XS[1:0]
1 11 11 11 12 1222
1 03 25 47 68911 1013 1215 1416
SUM
MPRV
TVM MXRTSR TWWPRI
1 11 11 1
81
18 1720 1922 21233031
SD
Figure 9.5: The mstatus CSR and its subfields.
In our discussion, we will use the csr.FIELD notation to refer to the FIELD subfield of csr CSR. For
example, mstatus.MIE refers to the MIE subfield present on the mstatus CSR.
9.3.2 Interrupt related control and status registers
The following RV32I Control and Status Registers contain status or may control the behavior of the
interrupt handling mechanism on Machine level:
mstatus: The following mstatus subfields provide information or control the interrupt handling
mechanism.
mstatus.MIE (Machine Interrupt Enable): The machine interrupt enable subfield controls
whether or not the CPU will handle interrupts. If it contains zero, the CPU ignores all
interrupts. This bit is cleared upon reset and the boot software usually sets it with one once
peripherals and the interrupt handling mechanism are properly configured;
NOTE: There is also a CSR called Machine Interrupt Enable; however, it has a
different purpose and should not e confused with the mstatus.MIE subfield.
mstatus.MPIE (Machine Previous Interrupt Enable): Upon an interrupt, the CPU changes the
value of the mstatus.MIE subfield to ignore new interrupts until the interrupt service routine
enables it again. The previous value of the mstatus.MIE subfield is automatically saved by
the CPU on the mstatus.MPIE subfield;
mstatus.MPP: Upon an interrupt, the CPU may change the privilege mode. In this case, it
saves the previous current privilege mode on this subfield.
mcause (Machine Interrupt Cause): The machine interrupt cause CSR stores the interrupt cause,
i.e., a value that identifies why an interrupt was generated. It has two fields: mcause.EXCCODE (bits
0 to 30) and mcause.INTERRUPT (bit 31). The mcause.INTERRUPT subfield specifies whether the
interrupt is an actual interrupt (1) or an exception (0)
7
. The mcause.EXCCODE subfield specifies
the interrupt (or exception) identifier. On Machine mode, interrupts caused by peripherals are
classified as “Machine external interrupt” and the value registered on the mcause.INTERRUPT and
mcause.EXCCODE subfields are 0x1 and 0xB, respectively.
mtvec (Machine Trap Vector): The machine trap vector CSR stores information that allows the
CPU to identify the proper interrupt service routine address when an interrupt occurs. It has two
fields: mtvec.MODE (bits 0 to 1) and mtvec.BASE (bits 2 to 31). The mtvec.MODE specifies whether
the CPU is working in the direct (00) of vectored (01) mode. In the direct mode, upon an interrupt,
the CPU sets the PC with the contents of the mtvec.BASE subfield. In the vectored mode, upon
an interrupt, the CPU sets the PC with mtvec.BASE + (4 × mcause.EXCCODE).
7
In RISC-V terminology, exceptions are interrupts caused by the CPU. We will discuss these kind of interrupts on
Chapter 10.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
125
diff --git a/book/riscv-book-139.page b/book/riscv-book-139.page index fcf4059..fef3681 100644 --- a/book/riscv-book-139.page +++ b/book/riscv-book-139.page @@ -1 +1 @@ -
9.3. INTERRUPTS ON RV32I
mie (Machine Interrupt Enable): There may be several sources of interrupts on RISC-V CPUs.
The machine interrupt enable CSR allows the system to configure which interrupts must be enabled
or disabled, i.e., which interrupts must be taken by the CPU and which must be ignored. The
following subfields control the interrupt handling mechanism on the Machine mode:
mie.MEIE: The Machine External Interrupt Enabled subfield (bit 11) controls whether the
CPU must accept or ignore external interrupts.
mie.MTIE: RISC-V CPUs contain an internal timer that may be configured to generate inter-
rupts. The Machine Timer Interrupt Enabled subfield (bit 7) controls whether the CPU must
accept or ignore interrupts from this timer.
mie.MSIE: The Machine Software Interrupt Enabled subfield (bit 3) controls whether the CPU
must accept or ignore software interrupts
8
on Machine mode.
NOTE: The mstatus.MIE subfield implements a global interrupt enable mechanism while
the mie CSR allows for a more fine-grained configuration. The CPU ignores all interrupts
if the mstatus.MIE subfield contains the value 0, even if the mie CSR is enabling interrupts.
mip (Machine Interrupt Pending): The machine interrupt pending CSR registers which interrupts
are pending, i.e., they have been signaled but not handled by the CPU yet. The following subfields
indicate the status of pending interrupts on the Machine mode:
mip.MEIP: The Machine External Interrupt Pending subfield (bit 11) indicates whether an
external interrupt is pending.
mip.MTIP: The Machine Timer Interrupt Pending subfield (bit 7) indicates whether a timer
interrupt is pending.
mip.MSIP: The Machine Software Interrupt Pending subfield (bit 3) indicates whether a soft-
ware interrupt is pending.
mepc (Machine Exception Program Counter): Upon an interrupt, the CPU saves the contents of
the PC register into the machine exception program counter CSR.
mscratch (Machine Scratch): The machine scratch CSR is a scratch register that is visible in
machine mode. Section 9.3.4 discusses how it can be used to support the implementation of
interrupt service routines.
9.3.3 Interrupt handling flow
As discussed in Section 9.2, to handle external interrupts, the system must save the context of the current
program, execute a routine to handle the hardware interrupt, and, finally, restore the saved context so
the CPU continues executing the previous program.
In RISC-V CPUs, a subset of these tasks is performed by the CPU itself while the remainder must
be performed by the interrupt service routine. For example, the program counter is saved by the CPU
itself while other general-purpose registers must be saved by the interrupt service routine. This section
discusses the actions that are performed automatically by the CPU while Section 9.3.4 discusses the
actions that must be performed by the interrupt service routine.
Algorithm 7 illustrates how a RV32I CPU handles external interrupts. First, it verifies if the CPU
must accept interrupts by checking the contents of the mstatus.MIE subfield (line 2). If it is set (‘1’),
then it checks for interrupts (lines 3-14), otherwise, it ignores interrupts and proceeds with the normal
instruction execution cycle (line 16). Assuming mstatus.MIE = ‘1’, in case there is an external interrupt
pending (mip.MEIP = ‘1’) and external interrupts are enabled (mie.MEIE = ‘1’) (line 3), then the CPU
8
Software interrupts is a special kind of interrupt generated by the CPU itself. These interrupts will be discussed on
Chapter 10.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
126
+
9.3. INTERRUPTS ON RV32I
mie (Machine Interrupt Enable): There may be several sources of interrupts on RISC-V CPUs.
The machine interrupt enable CSR allows the system to configure which interrupts must be enabled
or disabled, i.e., which interrupts must be taken by the CPU and which must be ignored. The
following subfields control the interrupt handling mechanism on the Machine mode:
mie.MEIE: The Machine External Interrupt Enabled subfield (bit 11) controls whether the
CPU must accept or ignore external interrupts.
mie.MTIE: RISC-V CPUs contain an internal timer that may be configured to generate inter-
rupts. The Machine Timer Interrupt Enabled subfield (bit 7) controls whether the CPU must
accept or ignore interrupts from this timer.
mie.MSIE: The Machine Software Interrupt Enabled subfield (bit 3) controls whether the CPU
must accept or ignore software interrupts
8
on Machine mode.
NOTE: The mstatus.MIE subfield implements a global interrupt enable mechanism while
the mie CSR allows for a more fine-grained configuration. The CPU ignores all interrupts
if the mstatus.MIE subfield contains the value 0, even if the mie CSR is enabling interrupts.
mip (Machine Interrupt Pending): The machine interrupt pending CSR registers which interrupts
are pending, i.e., they have been signaled but not handled by the CPU yet. The following subfields
indicate the status of pending interrupts on the Machine mode:
mip.MEIP: The Machine External Interrupt Pending subfield (bit 11) indicates whether an
external interrupt is pending.
mip.MTIP: The Machine Timer Interrupt Pending subfield (bit 7) indicates whether a timer
interrupt is pending.
mip.MSIP: The Machine Software Interrupt Pending subfield (bit 3) indicates whether a soft-
ware interrupt is pending.
mepc (Machine Exception Program Counter): Upon an interrupt, the CPU saves the contents of
the PC register into the machine exception program counter CSR.
mscratch (Machine Scratch): The machine scratch CSR is a scratch register that is visible in
machine mode. Section 9.3.4 discusses how it can be used to support the implementation of
interrupt service routines.
9.3.3 Interrupt handling flow
As discussed in Section 9.2, to handle external interrupts, the system must save the context of the current
program, execute a routine to handle the hardware interrupt, and, finally, restore the saved context so
the CPU continues executing the previous program.
In RISC-V CPUs, a subset of these tasks is performed by the CPU itself while the remainder must
be performed by the interrupt service routine. For example, the program counter is saved by the CPU
itself while other general-purpose registers must be saved by the interrupt service routine. This section
discusses the actions that are performed automatically by the CPU while Section 9.3.4 discusses the
actions that must be performed by the interrupt service routine.
Algorithm 7 illustrates how a RV32I CPU handles external interrupts. First, it verifies if the CPU
must accept interrupts by checking the contents of the mstatus.MIE subfield (line 2). If it is set (‘1’),
then it checks for interrupts (lines 3-14), otherwise, it ignores interrupts and proceeds with the normal
instruction execution cycle (line 16). Assuming mstatus.MIE = ‘1’, in case there is an external interrupt
pending (mip.MEIP = ‘1’) and external interrupts are enabled (mie.MEIE = ‘1’) (line 3), then the CPU
8
Software interrupts is a special kind of interrupt generated by the CPU itself. These interrupts will be discussed on
Chapter 10.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
126
diff --git a/book/riscv-book-14.page b/book/riscv-book-14.page index cf99e46..8fb6d47 100644 --- a/book/riscv-book-14.page +++ b/book/riscv-book-14.page @@ -1 +1 @@ -
Part I
Fundamental concepts
1
+
Part I
Fundamental concepts
1
diff --git a/book/riscv-book-140.page b/book/riscv-book-140.page index 0ca2e16..4fe8092 100644 --- a/book/riscv-book-140.page +++ b/book/riscv-book-140.page @@ -1 +1 @@ -
9.3. INTERRUPTS ON RV32I
handles the interrupt (lines 4-13). When handling an interrupt, the CPU first saves the value of the
mstatus.MIE subfield and clears it so that new interrupts are ignored
9
(lines 4 and 5). Then, the CPU
saves the contents of the PC into the mepc CSR (line 6), and sets the mcause CSR (lines 7 and 8).
Finally, it changes the PC register so it points to the first instruction of the interrupt service routine
(lines 9-13).
Algorithm 7: RV32I CPU external interrupt handling flow.
1 while True do
2 if mstatus.MIE = ‘1’ then
/* Check for external interrupts */
3 if (mip.MEIP = ‘1’) and (mie.MEIE = ‘1’) then
/* Save part of the context and ignore new interrupts */
4 mstatus.MPIE mstatus.MIE ;
5 mstatus.MIE ‘0’ ;
6 mepc PC ;
/* Sets the interrupt cause */
7 mcause.INTERRUPT ‘1’ ;
8 mcause.EXCCODE ‘0xB’ ;
/* Change PC to execute the ISR */
9 if mtvec.MODE = ’0’ then
/* Direct mode (0) */
10 PC mtvec.BASE ;
11 else
/* Vectored mode (1) */
12 PC mtvec.BASE + (4 × mcause.EXCCODE) ;
13 end
14 end
15 end
/* Fetch instruction and update PC */
16 IR MainMemory[PC] ;
17 PC PC+4;
18 ExecuteInstruction(IR);
19 end
9.3.4 Implementing an interrupt service routine
As indicated by Algorithm 7, the RISC-V CPU hardware already saves part of the current program con-
text before redirecting the execution flow to the interrupt service routine. Notice that the contents of the
mstatus.MIE subfield and the contents of the PC register were automatically saved on the mstatus.MPIE
subfield and the mepc CSR, respectively. The interrupt service routine is responsible for saving the
remaining of the context before handling the interrupt.
A program context is defined by the program values, which are stored at CPU registers and the main
memory. The interrupt service routine usually saves the registers’ values by copying them into the main
memory. Values that are already in the main memory, however, are not copied. They are preserved by
designing the interrupt service routine so that it does not touch the memory words that were being used
by the program that was executing.
Any register that may be changed by the interrupt service routine must be saved. In some cases,
only a subset of the context needs to be saved. In others, when executing sophisticated interrupt service
routines, for example, it may be necessary to save all registers.
There are several strategies that may be employed to save the registers’ contents in the main memory.
In our discussion, we will assume there is a dedicated stack for interrupt service routines. This stack,
9
New interrupts are ignored until the interrupt service routine sets this subfield again
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
127
+
9.3. INTERRUPTS ON RV32I
handles the interrupt (lines 4-13). When handling an interrupt, the CPU first saves the value of the
mstatus.MIE subfield and clears it so that new interrupts are ignored
9
(lines 4 and 5). Then, the CPU
saves the contents of the PC into the mepc CSR (line 6), and sets the mcause CSR (lines 7 and 8).
Finally, it changes the PC register so it points to the first instruction of the interrupt service routine
(lines 9-13).
Algorithm 7: RV32I CPU external interrupt handling flow.
1 while True do
2 if mstatus.MIE = ‘1’ then
/* Check for external interrupts */
3 if (mip.MEIP = ‘1’) and (mie.MEIE = ‘1’) then
/* Save part of the context and ignore new interrupts */
4 mstatus.MPIE mstatus.MIE ;
5 mstatus.MIE ‘0’ ;
6 mepc PC ;
/* Sets the interrupt cause */
7 mcause.INTERRUPT ‘1’ ;
8 mcause.EXCCODE ‘0xB’ ;
/* Change PC to execute the ISR */
9 if mtvec.MODE = ’0’ then
/* Direct mode (0) */
10 PC mtvec.BASE ;
11 else
/* Vectored mode (1) */
12 PC mtvec.BASE + (4 × mcause.EXCCODE) ;
13 end
14 end
15 end
/* Fetch instruction and update PC */
16 IR MainMemory[PC] ;
17 PC PC+4;
18 ExecuteInstruction(IR);
19 end
9.3.4 Implementing an interrupt service routine
As indicated by Algorithm 7, the RISC-V CPU hardware already saves part of the current program con-
text before redirecting the execution flow to the interrupt service routine. Notice that the contents of the
mstatus.MIE subfield and the contents of the PC register were automatically saved on the mstatus.MPIE
subfield and the mepc CSR, respectively. The interrupt service routine is responsible for saving the
remaining of the context before handling the interrupt.
A program context is defined by the program values, which are stored at CPU registers and the main
memory. The interrupt service routine usually saves the registers’ values by copying them into the main
memory. Values that are already in the main memory, however, are not copied. They are preserved by
designing the interrupt service routine so that it does not touch the memory words that were being used
by the program that was executing.
Any register that may be changed by the interrupt service routine must be saved. In some cases,
only a subset of the context needs to be saved. In others, when executing sophisticated interrupt service
routines, for example, it may be necessary to save all registers.
There are several strategies that may be employed to save the registers’ contents in the main memory.
In our discussion, we will assume there is a dedicated stack for interrupt service routines. This stack,
9
New interrupts are ignored until the interrupt service routine sets this subfield again
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
127
diff --git a/book/riscv-book-141.page b/book/riscv-book-141.page index 292f113..96c9f40 100644 --- a/book/riscv-book-141.page +++ b/book/riscv-book-141.page @@ -1 +1 @@ -
9.3. INTERRUPTS ON RV32I
called here ISR stack, is allocated on main memory on a set of addresses that does not collide with the
addresses used by other programs running on the system. In this way, whenever an interrupt occurs,
the interrupt service routine can safely save the context of the currently executing program into the ISR
stack.
To push values into the ISR stack, we must first make the SP register point to the top of the ISR
stack. In the RV32I ISA, this task can be performed with help from the mscratch CSR. To do so, we
first configure the system so that the mscratch CSR points to the top of the ISR stack on power-up.
Then, at the beginning/end of the interrupt service routine, we exchange the value of mscratch and SP
by executing the csrrw instruction. The following code illustrates this process. First (line 3), the ISR
swaps the sp and the mscratch registers’ contents so that the sp register points to the top of the ISR
stack and the mscratch points to the top of the previous program stack. Then, the ISR allocates space
on the ISR stack and saves all the necessary context (lines 4-7). After this, it identifies the interrupt
source by inspecting the mcause CSR and invokes the specialized ISR to handle the interrupt (lines 9-11).
Finally, the ISR restores the context by loading the registers’ values from the ISR stack, swapping the
mscratch and sp registers’ contents, and executing the mret instruction.
1 main_isr:
2 # Save the context
3 csrrw sp, mscratch, sp # exchange sp with mscratch
4 addi sp, sp, -64 # allocate space at the ISR stack
5 sw a0, 0(sp) # save a0
6 sw a1, 4(sp) # save a1
7 ...
8
9 # Handles the interrupt
10 csrr a1, mcause # read the interrupt cause and perform
11 ... # some action according to the cause.
12
13 # Restore the context
14 ...
15 lw a1, 4(sp) # restore a1
16 lw a0, 0(sp) # restore a0
17 addi sp, sp, 64 # deallocate space from the ISR stack
18 csrrw sp, mscratch, sp # exchange sp with mscratch
19 mret # return from the interrupt
The mret instruction is a special instruction that recovers the context that was automatically saved
by the CPU hardware. More specifically, it recovers the mstatus.MIE subfield contents by copying the
value from mstatus.MPIE and the PC register’s contents by copying the values from the mepc register
10
.
9.3.5 Setting up the interrupt handling mechanism
For the interrupt handling mechanism to work properly, a set of tasks must be performed. These tasks,
usually performed on the boot process, are discussed in the following sections.
Registering the interrupt service routine(s)
To register the interrupt service routine, the system must write the address of the ISR (direct mode)
or the base address of the interrupt vector table (vectored mode) on the mtvec CSR. Assuming the
10
In systems with multiple privilege modes (e.g., Machine and User modes), the mret instruction also recovers the
privilege mode.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
128
+
9.3. INTERRUPTS ON RV32I
called here ISR stack, is allocated on main memory on a set of addresses that does not collide with the
addresses used by other programs running on the system. In this way, whenever an interrupt occurs,
the interrupt service routine can safely save the context of the currently executing program into the ISR
stack.
To push values into the ISR stack, we must first make the SP register point to the top of the ISR
stack. In the RV32I ISA, this task can be performed with help from the mscratch CSR. To do so, we
first configure the system so that the mscratch CSR points to the top of the ISR stack on power-up.
Then, at the beginning/end of the interrupt service routine, we exchange the value of mscratch and SP
by executing the csrrw instruction. The following code illustrates this process. First (line 3), the ISR
swaps the sp and the mscratch registers’ contents so that the sp register points to the top of the ISR
stack and the mscratch points to the top of the previous program stack. Then, the ISR allocates space
on the ISR stack and saves all the necessary context (lines 4-7). After this, it identifies the interrupt
source by inspecting the mcause CSR and invokes the specialized ISR to handle the interrupt (lines 9-11).
Finally, the ISR restores the context by loading the registers’ values from the ISR stack, swapping the
mscratch and sp registers’ contents, and executing the mret instruction.
1 main_isr:
2 # Save the context
3 csrrw sp, mscratch, sp # exchange sp with mscratch
4 addi sp, sp, -64 # allocate space at the ISR stack
5 sw a0, 0(sp) # save a0
6 sw a1, 4(sp) # save a1
7 ...
8
9 # Handles the interrupt
10 csrr a1, mcause # read the interrupt cause and perform
11 ... # some action according to the cause.
12
13 # Restore the context
14 ...
15 lw a1, 4(sp) # restore a1
16 lw a0, 0(sp) # restore a0
17 addi sp, sp, 64 # deallocate space from the ISR stack
18 csrrw sp, mscratch, sp # exchange sp with mscratch
19 mret # return from the interrupt
The mret instruction is a special instruction that recovers the context that was automatically saved
by the CPU hardware. More specifically, it recovers the mstatus.MIE subfield contents by copying the
value from mstatus.MPIE and the PC register’s contents by copying the values from the mepc register
10
.
9.3.5 Setting up the interrupt handling mechanism
For the interrupt handling mechanism to work properly, a set of tasks must be performed. These tasks,
usually performed on the boot process, are discussed in the following sections.
Registering the interrupt service routine(s)
To register the interrupt service routine, the system must write the address of the ISR (direct mode)
or the base address of the interrupt vector table (vectored mode) on the mtvec CSR. Assuming the
10
In systems with multiple privilege modes (e.g., Machine and User modes), the mret instruction also recovers the
privilege mode.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
128
diff --git a/book/riscv-book-142.page b/book/riscv-book-142.page index a1f177e..0d20bb4 100644 --- a/book/riscv-book-142.page +++ b/book/riscv-book-142.page @@ -1 +1 @@ -
9.3. INTERRUPTS ON RV32I
main isr routine starts on an address that is a multiple of four
11
, the following code shows how to write
the address of the main isr routine on the mtvec CSR and configure it to work in direct mode. Since
the main isr starts on an address that is a multiple of four, the two least significant bits of the address
are zero, hence, by writing this value into the mtvec CSR we are configuring the mtvec.MODE subfield to
work on the direct mode.
1 la t0, main_isr # load the main_isr routine address into t0
2 csrw mtvec, t0 # copy t0 value into mtvec CSR
To configure the system to work with the vectored mode, the base address of the interrupt vector
table may be loaded into a register and the least significant bit set to one before writing the register’s
value into the mtvec CSR. The following code illustrates this process. In this case, the base address of
the interrupt vector table, represented by the ivt label, is first loaded into register t0. Then, its least
significant bit is set by the ori instruction and the final value written into the mtvec CSR using the
csrw instruction.
1 la t0, ivt # load the interrupt vector table address into t0
2 ori t0, t0, 0x1 # set the least significant bit (MODE = vectored)
3 csrw mtvec, t0 # copy t0 value into mtvec CSR
Setting-up the ISR stack
To set the ISR stack up, the system may allocate space on main memory and set the mscratch register
so it points to the top of the ISR stack. The following code illustrates this process. First, the code
allocates a 1024 byte array on the .bss section starting on an address that is a multiple of sixteen
12
.
Then, the initialization code, indicated by the start label, loads the top of the ISR stack address into
the t0 and copies its value into the mscratch CSR.
1 .section .bss
2 .align 4 # align to a multiple of 16
3 isr_stack:
4 .skip 1024
5 isr_stack_end:
6
7 .section .text
8 .align 2
9 start:
10 la t0, isr_stack_end
11 csrw mscratch, t0
Enabling interrupts
Once peripherals that generate interrupt signals are properly configured, and the interrupt service routine
and the ISR stack are set, the initialization code must enable the mie.MEIE and the mstatus.MIE subfields
to allow the CPU to handle external interrupts. The following code shows how this process can be
performed.
11
This is usually the case when programming for the RV32I ISA, since the architecture manual specifies that RV32I
instructions must be stored on addresses that are multiples of four.
12
The ilp32 ABI specifies that the stack pointer must always contain an address that is a multiple of 16.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
129
+
9.3. INTERRUPTS ON RV32I
main isr routine starts on an address that is a multiple of four
11
, the following code shows how to write
the address of the main isr routine on the mtvec CSR and configure it to work in direct mode. Since
the main isr starts on an address that is a multiple of four, the two least significant bits of the address
are zero, hence, by writing this value into the mtvec CSR we are configuring the mtvec.MODE subfield to
work on the direct mode.
1 la t0, main_isr # load the main_isr routine address into t0
2 csrw mtvec, t0 # copy t0 value into mtvec CSR
To configure the system to work with the vectored mode, the base address of the interrupt vector
table may be loaded into a register and the least significant bit set to one before writing the register’s
value into the mtvec CSR. The following code illustrates this process. In this case, the base address of
the interrupt vector table, represented by the ivt label, is first loaded into register t0. Then, its least
significant bit is set by the ori instruction and the final value written into the mtvec CSR using the
csrw instruction.
1 la t0, ivt # load the interrupt vector table address into t0
2 ori t0, t0, 0x1 # set the least significant bit (MODE = vectored)
3 csrw mtvec, t0 # copy t0 value into mtvec CSR
Setting-up the ISR stack
To set the ISR stack up, the system may allocate space on main memory and set the mscratch register
so it points to the top of the ISR stack. The following code illustrates this process. First, the code
allocates a 1024 byte array on the .bss section starting on an address that is a multiple of sixteen
12
.
Then, the initialization code, indicated by the start label, loads the top of the ISR stack address into
the t0 and copies its value into the mscratch CSR.
1 .section .bss
2 .align 4 # align to a multiple of 16
3 isr_stack:
4 .skip 1024
5 isr_stack_end:
6
7 .section .text
8 .align 2
9 start:
10 la t0, isr_stack_end
11 csrw mscratch, t0
Enabling interrupts
Once peripherals that generate interrupt signals are properly configured, and the interrupt service routine
and the ISR stack are set, the initialization code must enable the mie.MEIE and the mstatus.MIE subfields
to allow the CPU to handle external interrupts. The following code shows how this process can be
performed.
11
This is usually the case when programming for the RV32I ISA, since the architecture manual specifies that RV32I
instructions must be stored on addresses that are multiples of four.
12
The ilp32 ABI specifies that the stack pointer must always contain an address that is a multiple of 16.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
129
diff --git a/book/riscv-book-143.page b/book/riscv-book-143.page index 6682288..964e7ef 100644 --- a/book/riscv-book-143.page +++ b/book/riscv-book-143.page @@ -1 +1 @@ -
9.3. INTERRUPTS ON RV32I
1 # Enable external interrupts (mie.MEIE <= 1)
2 csrr t0, mie # read the mie register
3 li t2, 0x800 # set the MEIE field (bit 11)
4 or t1, t1, t2
5 csrw mie, t1 # update the mie register
6
7 # Enable global interrupts (mstatus.MIE <= 1)
8 csrr t0, mstatus # read the mstatus register
9 ori t0, t0, 0x8 # set MIE field (bit 3)
10 csrw mstatus, t0 # update the mstatus register
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
130
+
9.3. INTERRUPTS ON RV32I
1 # Enable external interrupts (mie.MEIE <= 1)
2 csrr t0, mie # read the mie register
3 li t2, 0x800 # set the MEIE field (bit 11)
4 or t1, t1, t2
5 csrw mie, t1 # update the mie register
6
7 # Enable global interrupts (mstatus.MIE <= 1)
8 csrr t0, mstatus # read the mstatus register
9 ori t0, t0, 0x8 # set MIE field (bit 3)
10 csrw mstatus, t0 # update the mstatus register
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
130
diff --git a/book/riscv-book-144.page b/book/riscv-book-144.page index 3c97aa3..dc1651b 100644 --- a/book/riscv-book-144.page +++ b/book/riscv-book-144.page @@ -1 +1 @@ -
Chapter 10
Software interrupts and exceptions
As discussed previously, many computer systems are organized so that the software is divided into user
and system software. The system software (e.g., the operating system kernel and device drivers) is the
software responsible for protecting and managing the whole system, including interacting with peripherals
to perform input and output operations and loading and scheduling user applications for execution. The
user software is usually limited to performing operations with data that is located on registers and the
main memory. Whenever the user software needs to perform a procedure that requires interacting with
other parts of the system, such as reading data from a file or showing information on the computer
display, it invokes the system software to perform the procedure on its behalf.
This chapter discusses the hardware mechanisms that protect the system from faulty or malicious
user programs and how to program these mechanisms.
10.1 Privilege levels
The Instruction Set Architecture defines the set of resources that the software can use to perform the
intended computation. For example, it defines the set of instructions, their behavior, and operands,
including the set of registers.
The privilege level defines which ISA resources (registers, instructions, etc.) are accessible by the
software. They can be used to restrict the software execution and protect the system from software that
attempts to perform operations not permitted. For example, the system can be configured to execute user
applications with restricted privilege levels to prevent them from directly interacting with peripherals
or accessing special microprocessor registers. The RISC-V Instruction Set Architecture defines three
privilege levels:
U: User/Application;
S: Supervisor; and
M: Machine
The Machine privilege level has the highest privileges, allowing full access to the hardware. The
Supervisor privilege level has the second-highest privileges, and the User/Application privilege level
has the least privileges.
A RISC-V hardware platform may implement a subset or all of these privilege levels. For example,
when implementing a hardware platform for a compact and straightforward embedded system, only the
Machine privilege level may be required. On the other hand, when implementing a hardware platform
for a system that relies on an operating system to manage applications (e.g., a computer desktop), it is
usually useful to include all three privilege levels to facilitate the operating system implementation.
131
+
Chapter 10
Software interrupts and exceptions
As discussed previously, many computer systems are organized so that the software is divided into user
and system software. The system software (e.g., the operating system kernel and device drivers) is the
software responsible for protecting and managing the whole system, including interacting with peripherals
to perform input and output operations and loading and scheduling user applications for execution. The
user software is usually limited to performing operations with data that is located on registers and the
main memory. Whenever the user software needs to perform a procedure that requires interacting with
other parts of the system, such as reading data from a file or showing information on the computer
display, it invokes the system software to perform the procedure on its behalf.
This chapter discusses the hardware mechanisms that protect the system from faulty or malicious
user programs and how to program these mechanisms.
10.1 Privilege levels
The Instruction Set Architecture defines the set of resources that the software can use to perform the
intended computation. For example, it defines the set of instructions, their behavior, and operands,
including the set of registers.
The privilege level defines which ISA resources (registers, instructions, etc.) are accessible by the
software. They can be used to restrict the software execution and protect the system from software that
attempts to perform operations not permitted. For example, the system can be configured to execute user
applications with restricted privilege levels to prevent them from directly interacting with peripherals
or accessing special microprocessor registers. The RISC-V Instruction Set Architecture defines three
privilege levels:
U: User/Application;
S: Supervisor; and
M: Machine
The Machine privilege level has the highest privileges, allowing full access to the hardware. The
Supervisor privilege level has the second-highest privileges, and the User/Application privilege level
has the least privileges.
A RISC-V hardware platform may implement a subset or all of these privilege levels. For example,
when implementing a hardware platform for a compact and straightforward embedded system, only the
Machine privilege level may be required. On the other hand, when implementing a hardware platform
for a system that relies on an operating system to manage applications (e.g., a computer desktop), it is
usually useful to include all three privilege levels to facilitate the operating system implementation.
131
diff --git a/book/riscv-book-145.page b/book/riscv-book-145.page index 3f03e47..d3f6300 100644 --- a/book/riscv-book-145.page +++ b/book/riscv-book-145.page @@ -1 +1 @@ -
10.2. PROTECTING THE SYSTEM
The RISC-V privilege mode defines the privilege level for the currently executing software. For
example, when the Machine privilege mode is active, the currently executing software has Machine
privilege levels and, hence, full access to the hardware.
The unprivileged mode is the privilege mode with the least privileges. In RISC-V, the unprivi-
leged mode is the User/Application privilege mode, also known as the user-mode or U-mode. The
unprivileged ISA is the sub-set of the Instruction Set Architecture accessible by the software running
on unprivileged mode.
To simplify the discussion, the remaining of this chapter will focus on RISC-V processors that have
only two privilege modes: User/Application and Machine mode.
10.2 Protecting the system
The User/Application mode limits the resources that can be accessed by the currently executing software;
hence, to protect the system from faulty or malicious user programs, the system software usually sets
the privilege mode to User/Application mode before executing (or returning control to) user code.
The following actions are usually taken to protect the system:
Configuring the system: on power on, the hardware automatically sets the privilege mode to
Machine mode and starts executing the boot code. The boot code loads the operating system soft-
ware into memory and invokes its initialization code in Machine mode, which allows the operating
system to configure the whole system.
Executing user code: once the system is set, the operating system may load user programs into
main memory and execute them. However, before transferring control to execute the user code, it
sets the privilege mode as User/Application mode.
Handling illegal operations: in case the user software tries to perform a privileged operation,
such as interacting with peripherals, the hardware stops executing the user code and invokes the
operating system so it can handle the illegal operation. The hardware transfer the control to the
operating system using the exception handling mechanism, as discussed in Section 10.3.
Invoking the operating system: if the user program needs to perform a sensitive procedure,
such as an output to a peripheral, it must invoke the operating system, which will perform the
procedure on the user-program behalf. When transferring control to the operating system, the
hardware must change the privilege mode to Supervisor or Machine mode so the operating system
may execute with proper privilege. To do so, ISAs usually include a mechanism, called software
interrupt, that allows code running on unprivileged mode to invoke the system code and change
the privilege mode at the same time. This mechanism is designed so that the user code may
not change the privilege mode and execute its own code. Once the operating system finishes
performing the procedure on behalf of the user program, it may change the privilege mode back to
the User/Application mode and return to the user program.
Handling external interrupts: upon an external interrupt, the hardware sets the privilege mode
as Machine mode, so the interrupt service routine has enough privilege to handle the interrupt.
Notice that the interrupt service routines belongs to the system software.
10.3 Exceptions
Exceptions are events generated by the CPU in response to exceptional conditions when
executing instructions. Trying to execute an illegal instruction
1
, for example, is a condition that
causes a RISC-V CPU to generate an exception.
1
An illegal instruction is an instruction that is not recognized by the CPU.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
132
+
10.2. PROTECTING THE SYSTEM
The RISC-V privilege mode defines the privilege level for the currently executing software. For
example, when the Machine privilege mode is active, the currently executing software has Machine
privilege levels and, hence, full access to the hardware.
The unprivileged mode is the privilege mode with the least privileges. In RISC-V, the unprivi-
leged mode is the User/Application privilege mode, also known as the user-mode or U-mode. The
unprivileged ISA is the sub-set of the Instruction Set Architecture accessible by the software running
on unprivileged mode.
To simplify the discussion, the remaining of this chapter will focus on RISC-V processors that have
only two privilege modes: User/Application and Machine mode.
10.2 Protecting the system
The User/Application mode limits the resources that can be accessed by the currently executing software;
hence, to protect the system from faulty or malicious user programs, the system software usually sets
the privilege mode to User/Application mode before executing (or returning control to) user code.
The following actions are usually taken to protect the system:
Configuring the system: on power on, the hardware automatically sets the privilege mode to
Machine mode and starts executing the boot code. The boot code loads the operating system soft-
ware into memory and invokes its initialization code in Machine mode, which allows the operating
system to configure the whole system.
Executing user code: once the system is set, the operating system may load user programs into
main memory and execute them. However, before transferring control to execute the user code, it
sets the privilege mode as User/Application mode.
Handling illegal operations: in case the user software tries to perform a privileged operation,
such as interacting with peripherals, the hardware stops executing the user code and invokes the
operating system so it can handle the illegal operation. The hardware transfer the control to the
operating system using the exception handling mechanism, as discussed in Section 10.3.
Invoking the operating system: if the user program needs to perform a sensitive procedure,
such as an output to a peripheral, it must invoke the operating system, which will perform the
procedure on the user-program behalf. When transferring control to the operating system, the
hardware must change the privilege mode to Supervisor or Machine mode so the operating system
may execute with proper privilege. To do so, ISAs usually include a mechanism, called software
interrupt, that allows code running on unprivileged mode to invoke the system code and change
the privilege mode at the same time. This mechanism is designed so that the user code may
not change the privilege mode and execute its own code. Once the operating system finishes
performing the procedure on behalf of the user program, it may change the privilege mode back to
the User/Application mode and return to the user program.
Handling external interrupts: upon an external interrupt, the hardware sets the privilege mode
as Machine mode, so the interrupt service routine has enough privilege to handle the interrupt.
Notice that the interrupt service routines belongs to the system software.
10.3 Exceptions
Exceptions are events generated by the CPU in response to exceptional conditions when
executing instructions. Trying to execute an illegal instruction
1
, for example, is a condition that
causes a RISC-V CPU to generate an exception.
1
An illegal instruction is an instruction that is not recognized by the CPU.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
132
diff --git a/book/riscv-book-146.page b/book/riscv-book-146.page index bee6f94..7fac6cd 100644 --- a/book/riscv-book-146.page +++ b/book/riscv-book-146.page @@ -1 +1 @@ -
10.4. SOFTWARE INTERRUPTS
Exceptions usually trigger an exception handling mechanism so that the exceptional condition may
be dealt with before the CPU may continue executing the program. This mechanism normally causes
the CPU to redirect the execution flow to a system routine that may:
1. save the current program context;
2. handle the exceptional condition; and
3. restore the context of the saved program to continue the execution
2
.
Notice that the exception handling flow is very similar to the one employed to handle hardware
interrupts. In fact, RISC-V CPUs use the same mechanism to handle both interrupts and exceptions,
i.e., it saves part of the current context (e.g., PC contents), sets the mcause CSR, and redirects the
execution flow to an interrupt service routine. As discussed in Section 9.3.4, the interrupt service routine
can distinguish between an interrupt and an exception by inspecting the mcause Control and Status
Register. More specifically, the mcause.INTERRUPT CSR field indicates whether the CPU is handling an
interrupt or an exception. Also, the mcause.EXCCODE CSR field indicates the source of the interrupt or
the exception. There may be several sources of exceptions and interrupts on RISC-V. Table 10.1 shows
the sources of interrupts and exceptions
3
and their respective codes on the mcause CSR.
The exception handling mechanism is usually employed to protect the system from illegal user code
operations. In this context, the hardware is configured by the system software to generate exceptions in
case the privilege mode is set as User/Application and the CPU tries to execute certain operations, such
as accessing addresses that are mapped to peripheral devices or accessing Control and Status Registers
that can only be accessed in Machine mode. Upon an exception, the interrupt service routine, which
belongs to the system software, may decide what to do with the user program.
NOTE: Exceptions occur as a result of executing an instruction; hence, they are synchronous
events. Interrupts may occur at any time, independently of the CPU execution cycle; therefore,
they are asynchronous events.
10.4 Software interrupts
Software interrupts are events generated by the CPU when it executes special instructions.
For example, in RISC-V, the environment call (ecall) and the breakpoint (break) instructions cause
the CPU to generate software interrupts upon execution. They are similar to exceptions in the sense
that they are synchronous events that occur due to executing an instruction. Nonetheless, exceptions
are only generated on exceptional conditions, while software interrupts are always generated when the
CPU executes these special instructions.
Software interrupts usually trigger a mechanism that changes the privilege mode and redirects the
execution to a routine designed to handle the interrupt. This mechanism allows user programs to invoke
a system software that requires a higher privilege level.
Most ISAs employ the same mechanism to handle interrupts, exceptions, and software interrupts,
i.e., they save part of the current context (e.g., PC contents), sets the cause (e.g., the mcause CSR), and
redirect the execution flow to an interrupt service routine.
10.5 Protecting RISC-V systems
The following sections discuss how to use the RISC-V privilege modes and the exception and software
interrupt handling mechanisms to protect the system from faulty or malicious user software.
2
Depending on the exception, the system may decide to terminate the program that was executing. In these cases, there
is no need to restore the program context.
3
Some of these exceptions and interrupts are only caused on system that implement the User/Application and the
Supervisor privilege modes.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
133
+
10.4. SOFTWARE INTERRUPTS
Exceptions usually trigger an exception handling mechanism so that the exceptional condition may
be dealt with before the CPU may continue executing the program. This mechanism normally causes
the CPU to redirect the execution flow to a system routine that may:
1. save the current program context;
2. handle the exceptional condition; and
3. restore the context of the saved program to continue the execution
2
.
Notice that the exception handling flow is very similar to the one employed to handle hardware
interrupts. In fact, RISC-V CPUs use the same mechanism to handle both interrupts and exceptions,
i.e., it saves part of the current context (e.g., PC contents), sets the mcause CSR, and redirects the
execution flow to an interrupt service routine. As discussed in Section 9.3.4, the interrupt service routine
can distinguish between an interrupt and an exception by inspecting the mcause Control and Status
Register. More specifically, the mcause.INTERRUPT CSR field indicates whether the CPU is handling an
interrupt or an exception. Also, the mcause.EXCCODE CSR field indicates the source of the interrupt or
the exception. There may be several sources of exceptions and interrupts on RISC-V. Table 10.1 shows
the sources of interrupts and exceptions
3
and their respective codes on the mcause CSR.
The exception handling mechanism is usually employed to protect the system from illegal user code
operations. In this context, the hardware is configured by the system software to generate exceptions in
case the privilege mode is set as User/Application and the CPU tries to execute certain operations, such
as accessing addresses that are mapped to peripheral devices or accessing Control and Status Registers
that can only be accessed in Machine mode. Upon an exception, the interrupt service routine, which
belongs to the system software, may decide what to do with the user program.
NOTE: Exceptions occur as a result of executing an instruction; hence, they are synchronous
events. Interrupts may occur at any time, independently of the CPU execution cycle; therefore,
they are asynchronous events.
10.4 Software interrupts
Software interrupts are events generated by the CPU when it executes special instructions.
For example, in RISC-V, the environment call (ecall) and the breakpoint (break) instructions cause
the CPU to generate software interrupts upon execution. They are similar to exceptions in the sense
that they are synchronous events that occur due to executing an instruction. Nonetheless, exceptions
are only generated on exceptional conditions, while software interrupts are always generated when the
CPU executes these special instructions.
Software interrupts usually trigger a mechanism that changes the privilege mode and redirects the
execution to a routine designed to handle the interrupt. This mechanism allows user programs to invoke
a system software that requires a higher privilege level.
Most ISAs employ the same mechanism to handle interrupts, exceptions, and software interrupts,
i.e., they save part of the current context (e.g., PC contents), sets the cause (e.g., the mcause CSR), and
redirect the execution flow to an interrupt service routine.
10.5 Protecting RISC-V systems
The following sections discuss how to use the RISC-V privilege modes and the exception and software
interrupt handling mechanisms to protect the system from faulty or malicious user software.
2
Depending on the exception, the system may decide to terminate the program that was executing. In these cases, there
is no need to restore the program context.
3
Some of these exceptions and interrupts are only caused on system that implement the User/Application and the
Supervisor privilege modes.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
133
diff --git a/book/riscv-book-147.page b/book/riscv-book-147.page index 804d43e..822fc51 100644 --- a/book/riscv-book-147.page +++ b/book/riscv-book-147.page @@ -1 +1 @@ -
10.5. PROTECTING RISC-V SYSTEMS
mcause fields
Cause
INTERRUPT EXCCODE
1 0 User software interrupt
1 1 Supervisor software interrupt
1 2 Reserved for future standard use
1 3 Machine software interrupt
1 4 User timer interrupt
1 5 Supervisor timer interrupt
1 6 Reserved for future standard use
1 7 Machine timer interrupt
1 8 User external interrupt
1 9 Supervisor external interrupt
1 10 Reserved for future standard use
1 11 Machine external interrupt
1 12-15 Reserved for future standard use
1 16 Reserved for platform use
0 0 Instruction address misaligned
0 1 Instruction access fault
0 2 Illegal instruction
0 3 Breakpoint
0 4 Load address misaligned
0 5 Load access fault
0 6 Store/AMO address misaligned
0 7 Store/AMO access fault
0 8 Environment call from U-mode
0 9 Environment call from S-mode
0 10 Reserved
0 11 Environment call from M-mode
0 12 Instruction page fault
0 13 Load page fault
0 14 Reserved for future standard use
0 15 Store/AMO page fault
0 16-23 Reserved for future standard use
0 24-31 Reserved for custom use
0 32-47 Reserved for future standard use
0 48-63 Reserved for custom use
0 64 Reserved for future standard use
Table 10.1: Sources of interrupts and exceptions and their codes on the mcause CSR.
10.5.1 Changing the privilege mode
RISC-V CPUs store the current privilege mode on an internal storage device that is not directly visible
to software. In other words, the software may not directly inspect or modify this storage device to
identify or manipulate the current privilege mode. The only way to inspect the current privilege mode is
by generating a software interrupt or exception, which copies the privilege mode code into the mstatus
Machine Previous Privilege field (mstatus.MPP). Also, the only way to set the current privilege mode is
to modify the contents of the mstatus Machine Previous Privilege field (mstatus.MPP) and execute the
mret instruction, which uses the value in the mstatus.MPP CSR field to set the current privilege mode.
The following code shows how the system software may change the privilege mode to User/Application
mode and simultaneously invoke a user program. First, it sets the mstatus.MPP CSR field with “00”, the
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
134
+
10.5. PROTECTING RISC-V SYSTEMS
mcause fields
Cause
INTERRUPT EXCCODE
1 0 User software interrupt
1 1 Supervisor software interrupt
1 2 Reserved for future standard use
1 3 Machine software interrupt
1 4 User timer interrupt
1 5 Supervisor timer interrupt
1 6 Reserved for future standard use
1 7 Machine timer interrupt
1 8 User external interrupt
1 9 Supervisor external interrupt
1 10 Reserved for future standard use
1 11 Machine external interrupt
1 12-15 Reserved for future standard use
1 16 Reserved for platform use
0 0 Instruction address misaligned
0 1 Instruction access fault
0 2 Illegal instruction
0 3 Breakpoint
0 4 Load address misaligned
0 5 Load access fault
0 6 Store/AMO address misaligned
0 7 Store/AMO access fault
0 8 Environment call from U-mode
0 9 Environment call from S-mode
0 10 Reserved
0 11 Environment call from M-mode
0 12 Instruction page fault
0 13 Load page fault
0 14 Reserved for future standard use
0 15 Store/AMO page fault
0 16-23 Reserved for future standard use
0 24-31 Reserved for custom use
0 32-47 Reserved for future standard use
0 48-63 Reserved for custom use
0 64 Reserved for future standard use
Table 10.1: Sources of interrupts and exceptions and their codes on the mcause CSR.
10.5.1 Changing the privilege mode
RISC-V CPUs store the current privilege mode on an internal storage device that is not directly visible
to software. In other words, the software may not directly inspect or modify this storage device to
identify or manipulate the current privilege mode. The only way to inspect the current privilege mode is
by generating a software interrupt or exception, which copies the privilege mode code into the mstatus
Machine Previous Privilege field (mstatus.MPP). Also, the only way to set the current privilege mode is
to modify the contents of the mstatus Machine Previous Privilege field (mstatus.MPP) and execute the
mret instruction, which uses the value in the mstatus.MPP CSR field to set the current privilege mode.
The following code shows how the system software may change the privilege mode to User/Application
mode and simultaneously invoke a user program. First, it sets the mstatus.MPP CSR field with “00”, the
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
134
diff --git a/book/riscv-book-148.page b/book/riscv-book-148.page index ed42df0..480ec87 100644 --- a/book/riscv-book-148.page +++ b/book/riscv-book-148.page @@ -1 +1 @@ -
10.5. PROTECTING RISC-V SYSTEMS
User/Application mode code. Then, it loads the user software entry point into the mepc CSR. Finally,
it executes the mret instruction, which changes the mode using the code in the mstatus.MPP CSR field
and changes the program counter using the value in the mepc CSR at the same time.
1 # Changing to User/Application mode
2 csrr t1, mstatus # update the mstatus.MPP
3 li t2, ~0x1800 # field (bits 11 and 12)
4 and t1, t1, t2 # with value 00 (U-mode)
5 csrw mstatus, t1
6
7 la t0, user_main # load the user software
8 csrw mepc, t0 # entry point into mepc
9
10 mret # PC <= MEPC; mode <= MPP;
10.5.2 Configuring the exception and software interrupt mechanisms
RISC-V CPUs use a similar mechanism to handle interrupts, exceptions, and software interrupts, i.e., it
saves part of the current context (e.g., the PC contents), sets the mcause and other CSRs, and redirects
the execution flow to an interrupt service routine. Consequently, configuring the exception and software
interrupt handling mechanisms is very similar to configuring the external interrupt handling mechanism,
as discussed in Section 9.3.5.
The system software configures the exception and software interrupt mechanisms by registering the
routines that will handle these events. This is performed in the same way that interrupt service routines
are registered to handle external interrupts. In the direct mode, a single routine is registered and this
routine is responsible for inspecting the mcause CSR to identify the event source and invoke the proper
routine. In the vectored mode, the external interrupt, exception, and software interrupt handling routines
must be registered on the interrupt vector table. Section 9.3.5 shows fragments of code that configure
the interrupt handling mechanism in direct and vectored modes.
On RISC-V, external interrupts must be enabled by setting the mstatus and the mie Control and
Status Registers. On the other hand, exceptions and software interrupts are always enabled and do not
need extra configuration.
10.5.3 Handling illegal operations
RISC-V CPUs generate exceptions whenever an instruction tries to execute an illegal operation, such as
executing an instruction that the CPU does not recognize
4
.
RISC-V systems that contain the Machine and the User/Application modes usually include a mem-
ory protection unit [5] that can be configured to generate exceptions whenever the CPU tries to read or
write data or fetch instructions for execution from specific addresses. The operating system may protect
the system by configuring this unit to generate exceptions whenever code executing in User/Applica-
tion mode tries to access protected addresses, such as addresses mapped to peripherals and memory
addresses that contain the operating system or other software. In these cases, if the CPU tries to
read/write data from/to a protected address, the memory protection unit generates a “Load access
fault”/“Store/AMO access fault” exception (mstatus.EXCCODE=5/7). Also, if the CPU tries to fetch an
instruction for execution from a protected address, the system generates an “Instruction access fault”
exception (mstatus.EXCCODE=1).
Whenever an exception is generated, the RISC-V CPU:
Saves the current program counter into the mepc CSR;
4
This operation generates an “Illegal instruction” exception, which is identified by value two on the mcause.EXCCODE
CSR field see Table 10.1.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
135
+
10.5. PROTECTING RISC-V SYSTEMS
User/Application mode code. Then, it loads the user software entry point into the mepc CSR. Finally,
it executes the mret instruction, which changes the mode using the code in the mstatus.MPP CSR field
and changes the program counter using the value in the mepc CSR at the same time.
1 # Changing to User/Application mode
2 csrr t1, mstatus # update the mstatus.MPP
3 li t2, ~0x1800 # field (bits 11 and 12)
4 and t1, t1, t2 # with value 00 (U-mode)
5 csrw mstatus, t1
6
7 la t0, user_main # load the user software
8 csrw mepc, t0 # entry point into mepc
9
10 mret # PC <= MEPC; mode <= MPP;
10.5.2 Configuring the exception and software interrupt mechanisms
RISC-V CPUs use a similar mechanism to handle interrupts, exceptions, and software interrupts, i.e., it
saves part of the current context (e.g., the PC contents), sets the mcause and other CSRs, and redirects
the execution flow to an interrupt service routine. Consequently, configuring the exception and software
interrupt handling mechanisms is very similar to configuring the external interrupt handling mechanism,
as discussed in Section 9.3.5.
The system software configures the exception and software interrupt mechanisms by registering the
routines that will handle these events. This is performed in the same way that interrupt service routines
are registered to handle external interrupts. In the direct mode, a single routine is registered and this
routine is responsible for inspecting the mcause CSR to identify the event source and invoke the proper
routine. In the vectored mode, the external interrupt, exception, and software interrupt handling routines
must be registered on the interrupt vector table. Section 9.3.5 shows fragments of code that configure
the interrupt handling mechanism in direct and vectored modes.
On RISC-V, external interrupts must be enabled by setting the mstatus and the mie Control and
Status Registers. On the other hand, exceptions and software interrupts are always enabled and do not
need extra configuration.
10.5.3 Handling illegal operations
RISC-V CPUs generate exceptions whenever an instruction tries to execute an illegal operation, such as
executing an instruction that the CPU does not recognize
4
.
RISC-V systems that contain the Machine and the User/Application modes usually include a mem-
ory protection unit [5] that can be configured to generate exceptions whenever the CPU tries to read or
write data or fetch instructions for execution from specific addresses. The operating system may protect
the system by configuring this unit to generate exceptions whenever code executing in User/Applica-
tion mode tries to access protected addresses, such as addresses mapped to peripherals and memory
addresses that contain the operating system or other software. In these cases, if the CPU tries to
read/write data from/to a protected address, the memory protection unit generates a “Load access
fault”/“Store/AMO access fault” exception (mstatus.EXCCODE=5/7). Also, if the CPU tries to fetch an
instruction for execution from a protected address, the system generates an “Instruction access fault”
exception (mstatus.EXCCODE=1).
Whenever an exception is generated, the RISC-V CPU:
Saves the current program counter into the mepc CSR;
4
This operation generates an “Illegal instruction” exception, which is identified by value two on the mcause.EXCCODE
CSR field see Table 10.1.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
135
diff --git a/book/riscv-book-149.page b/book/riscv-book-149.page index 4876ad2..988267a 100644 --- a/book/riscv-book-149.page +++ b/book/riscv-book-149.page @@ -1 +1 @@ -
10.5. PROTECTING RISC-V SYSTEMS
Sets the mcause CSR with the code that identifies the exception source;
Saves the current mode into the mstatus.MPP CSR field;
Changes the mode to Machine mode; and
Sets the program counter to redirect the execution to the exception handling routine.
Some exceptions may also set the Machine Trap Value (mtval) CSR with extra information about
the exception. For example, when a load or store access exception occurs, the mtval CSR is set with the
faulting virtual address.
Depending on the exception, it may make sense to fix the problem that caused the exception and
return the execution to the software that caused the exception to continue its execution. Page faults are
examples of exceptions that can be handled by the system, so the software that caused the exception
may continue its execution. In these cases, handling the exception is usually similar to handling an
external interrupt, i.e. the exception handling routine must save the context, handle the exception, and,
finally, recover the context so the software running on the CPU may continue its execution. In cases
where illegal operations generate exceptions, and there is no known way to recover from the problem,
the operating system may kill the offending process, i.e., the process that tried to execute the illegal
operation.
10.5.4 Handling system calls
As discussed in Section 5.7.4, in RISC-V, the user code may invoke the operating system, i.e., perform a
system call, by executing the environment call (ecall) instruction. This instruction generates a software
interrupt, which invokes the interrupt and exception handling mechanism. In case an ecall instruction
is executed on the User/Application mode, the hardware sets the mcause.INTERRUPT CSR field with zero
and the mcause.EXCCODE CSR field with eight. Hence, if the interrupt/exception handling mechanism is
configured in direct mode, the main interrupt service routine may identify a call to the operating system
by comparing the value at the mcause register with eight.
Whenever an exception or a software interrupt occurs, the system records the program counter
contents on mepc CSR. After handling an exception, for example, a page fault, the system may return
the execution to the same instruction that caused the exception, so it may try to perform its operation
again. Nonetheless, on software interrupts, the system must not return the execution to the same
instruction; otherwise, it would invoke the operating system again. In this case, the system must return
to the subsequent instruction. To do so, the software interrupt handling routine must adjust the value
in mepc to point to the next instruction before executing the mret instruction.
The following code shows how to adjust the mepc CSR to point to the next instruction before executing
the mret instruction.
1 # Adjusting MEPC so mret returns to the instruction
2 # placed after the ecall instruction that
3 # generated the software interrupt
4 csrr a1, mepc # load mepc into a1
5 addi a1, a1, 4 # add 4 to a1
6 csrw mepc, a1 # write the new address to mepc
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
136
+
10.5. PROTECTING RISC-V SYSTEMS
Sets the mcause CSR with the code that identifies the exception source;
Saves the current mode into the mstatus.MPP CSR field;
Changes the mode to Machine mode; and
Sets the program counter to redirect the execution to the exception handling routine.
Some exceptions may also set the Machine Trap Value (mtval) CSR with extra information about
the exception. For example, when a load or store access exception occurs, the mtval CSR is set with the
faulting virtual address.
Depending on the exception, it may make sense to fix the problem that caused the exception and
return the execution to the software that caused the exception to continue its execution. Page faults are
examples of exceptions that can be handled by the system, so the software that caused the exception
may continue its execution. In these cases, handling the exception is usually similar to handling an
external interrupt, i.e. the exception handling routine must save the context, handle the exception, and,
finally, recover the context so the software running on the CPU may continue its execution. In cases
where illegal operations generate exceptions, and there is no known way to recover from the problem,
the operating system may kill the offending process, i.e., the process that tried to execute the illegal
operation.
10.5.4 Handling system calls
As discussed in Section 5.7.4, in RISC-V, the user code may invoke the operating system, i.e., perform a
system call, by executing the environment call (ecall) instruction. This instruction generates a software
interrupt, which invokes the interrupt and exception handling mechanism. In case an ecall instruction
is executed on the User/Application mode, the hardware sets the mcause.INTERRUPT CSR field with zero
and the mcause.EXCCODE CSR field with eight. Hence, if the interrupt/exception handling mechanism is
configured in direct mode, the main interrupt service routine may identify a call to the operating system
by comparing the value at the mcause register with eight.
Whenever an exception or a software interrupt occurs, the system records the program counter
contents on mepc CSR. After handling an exception, for example, a page fault, the system may return
the execution to the same instruction that caused the exception, so it may try to perform its operation
again. Nonetheless, on software interrupts, the system must not return the execution to the same
instruction; otherwise, it would invoke the operating system again. In this case, the system must return
to the subsequent instruction. To do so, the software interrupt handling routine must adjust the value
in mepc to point to the next instruction before executing the mret instruction.
The following code shows how to adjust the mepc CSR to point to the next instruction before executing
the mret instruction.
1 # Adjusting MEPC so mret returns to the instruction
2 # placed after the ecall instruction that
3 # generated the software interrupt
4 csrr a1, mepc # load mepc into a1
5 addi a1, a1, 4 # add 4 to a1
6 csrw mepc, a1 # write the new address to mepc
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
136
diff --git a/book/riscv-book-15.page b/book/riscv-book-15.page index 23e059f..09e37c8 100644 --- a/book/riscv-book-15.page +++ b/book/riscv-book-15.page @@ -1 +1 @@ -
Chapter 1
Execution of programs: a 10,000 ft
overview
There are several ways of encoding a computer program. Some programs, for example, are encoded using
abstract instruction sets and are executed by emulators or virtual machines, which are other programs
designed to interpret and execute the abstract instruction set. Bash scripts, Java byte-code programs,
and Python scripts are common examples of programs that are encoded using abstract instruction sets
and require an emulator or a virtual machine to support their execution.
A native program is a program encoded using instructions that can be directly executed
by the computer hardware, without help from an emulator or a virtual machine. In this
book, we focus our discussion on native programs. Hence, from now on, whenever we use the term
“program”, unless stated otherwise, we are referring to native programs.
Native program instructions usually perform simple operations, such as adding or comparing two
numbers, nonetheless, by executing multiple instructions, a computer is capable of solving complex
problems.
Most modern computers are built using digital electronic circuitry. These machines usually represent
information using voltage levels that are mapped to two states, HIGH and LOW, or “1” (one) and “0”
(zero). Hence, the basic unit of information on modern computers is a binary digit, i.e., “1” or “0”.
Consequently, information and instructions are encoded as sequences of binary digits, or bits.
1.1 Main components of computers
Computers are usually composed of the following main components:
Main memory: The main memory is used to store the instructions and data of programs that
are being executed. The main memory is usually volatile, hence, if the computer is turned off, its
contents are lost.
Central Processing Unit: the Central Processing Unit, or CPU, is the component responsible
for executing the computer programs. The CPU retrieves programs’ instructions from the main
memory for execution. Also, when executing instructions, the CPU often reads/writes data from/to
the main memory.
Persistent storage: Since the main memory is volatile, there is usually a persistent storage device
to preserve the programs and data when the power is shut down. Hard disk drives (HDDs), solid
state drives (SSDs), and flash drives are example of persistent storage devices.
Peripherals: Peripherals are input/output, or I/O, devices that are connected to the computer.
Examples of peripheral devices include video cards (also known as graphics cards), USB controllers,
network cards, etc.
2
+
Chapter 1
Execution of programs: a 10,000 ft
overview
There are several ways of encoding a computer program. Some programs, for example, are encoded using
abstract instruction sets and are executed by emulators or virtual machines, which are other programs
designed to interpret and execute the abstract instruction set. Bash scripts, Java byte-code programs,
and Python scripts are common examples of programs that are encoded using abstract instruction sets
and require an emulator or a virtual machine to support their execution.
A native program is a program encoded using instructions that can be directly executed
by the computer hardware, without help from an emulator or a virtual machine. In this
book, we focus our discussion on native programs. Hence, from now on, whenever we use the term
“program”, unless stated otherwise, we are referring to native programs.
Native program instructions usually perform simple operations, such as adding or comparing two
numbers, nonetheless, by executing multiple instructions, a computer is capable of solving complex
problems.
Most modern computers are built using digital electronic circuitry. These machines usually represent
information using voltage levels that are mapped to two states, HIGH and LOW, or “1” (one) and “0”
(zero). Hence, the basic unit of information on modern computers is a binary digit, i.e., “1” or “0”.
Consequently, information and instructions are encoded as sequences of binary digits, or bits.
1.1 Main components of computers
Computers are usually composed of the following main components:
Main memory: The main memory is used to store the instructions and data of programs that
are being executed. The main memory is usually volatile, hence, if the computer is turned off, its
contents are lost.
Central Processing Unit: the Central Processing Unit, or CPU, is the component responsible
for executing the computer programs. The CPU retrieves programs’ instructions from the main
memory for execution. Also, when executing instructions, the CPU often reads/writes data from/to
the main memory.
Persistent storage: Since the main memory is volatile, there is usually a persistent storage device
to preserve the programs and data when the power is shut down. Hard disk drives (HDDs), solid
state drives (SSDs), and flash drives are example of persistent storage devices.
Peripherals: Peripherals are input/output, or I/O, devices that are connected to the computer.
Examples of peripheral devices include video cards (also known as graphics cards), USB controllers,
network cards, etc.
2
diff --git a/book/riscv-book-150.page b/book/riscv-book-150.page index 8d35dbb..b4b2b4f 100644 --- a/book/riscv-book-150.page +++ b/book/riscv-book-150.page @@ -1 +1 @@ -
Bibliography
[1] Intel Corporation. Intel 64 and IA-32 Architectures Software Developer’s Manual. Volume 1: Basic
Architecture., September 2016.
[2] Intel Corporation. Intel 64 and IA-32 Architectures Software Developer’s Manual. Volume 2A: In-
struction Set Reference, A-L., September 2016.
[3] Intel Corporation. Intel 64 and IA-32 Architectures Software Developer’s Manual. Volume 2B: In-
struction Set Reference, M-U., September 2016.
[4] Andrew Waterman and Krste Asanovi´c. The RISC-V Instruction Set Manual. Volume i: Unprivileged
isa, version 20191213. Technical report, SiFive Inc., 2019.
[5] Andrew Waterman and Krste Asanovi´c. The RISC-V Instruction Set Manual. Volume II: Privileged
architecture, document version 20190608-priv-msu-ratified. Technical report, SiFive Inc., 2019.
137
+
Bibliography
[1] Intel Corporation. Intel 64 and IA-32 Architectures Software Developer’s Manual. Volume 1: Basic
Architecture., September 2016.
[2] Intel Corporation. Intel 64 and IA-32 Architectures Software Developer’s Manual. Volume 2A: In-
struction Set Reference, A-L., September 2016.
[3] Intel Corporation. Intel 64 and IA-32 Architectures Software Developer’s Manual. Volume 2B: In-
struction Set Reference, M-U., September 2016.
[4] Andrew Waterman and Krste Asanovi´c. The RISC-V Instruction Set Manual. Volume i: Unprivileged
isa, version 20191213. Technical report, SiFive Inc., 2019.
[5] Andrew Waterman and Krste Asanovi´c. The RISC-V Instruction Set Manual. Volume II: Privileged
architecture, document version 20190608-priv-msu-ratified. Technical report, SiFive Inc., 2019.
137
diff --git a/book/riscv-book-151.page b/book/riscv-book-151.page index c037fff..64ea196 100644 --- a/book/riscv-book-151.page +++ b/book/riscv-book-151.page @@ -1 +1 @@ -
Appendix A
RV32IM registers and assembly
instructions
RV32IM registers (prefix x) and their aliases
x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15
zero ra sp gp tp t0 t1 t2 s0 s1 a0 a1 a2 a3 a4 a5
x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 x31
a6 a7 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 t3 t4 t5 t6
Main control status registers
CSRs: mtvec mepc mcause mtval mstatus mscratch
Fields of mstatus: mie mpie mip
Logic, Shift, and Arithmetic instructions
and rd, rs1, rs2
Performs the bitwise “and” operation on rs1 and rs2 and stores the result on rd.
or rd, rs1, rs2
Performs the bitwise “or” operation on rs1 and rs2 and stores the result on rd.
xor rd, rs1, rs2
Performs the bitwise “xor” operation on rs1 and rs2 and stores the result on rd.
andi rd, rs1, imm
Performs the bitwise “and” operation on rs1 and imm and stores the result on rd.
ori rd, rs1, imm
Performs the bitwise “or” operation on rs1 and imm and stores the result on rd.
xori rd, rs1, imm
Performs the bitwise “xor” operation on rs1 and imm and stores the result on rd.
sll rd, rs1, rs2
Performs a logical left shift on the value at rs1 and stores the result on rd. The amount of left
shifts is indicated by the value on rs2.
srl rd, rs1, rs2
Performs a logical right shift on the value at rs1 and stores the result on rd. The amount of right
shifts is indicated by the value on rs2.
sra rd, rs1, rs2
Performs an arithmetic right shift on the value at rs1 and stores the result on rd. The amount of
right shifts is indicated by the value on rs2.
slli rd, rs1, imm
Performs a logical left shift on the value at rs1 and stores the result on rd. The amount of left
shifts is indicated by the immediate value imm.
srli rd, rs1, imm
Performs a logical right shift on the value at rs1 and stores the result on rd. The amount of left
shifts is indicated by the immediate value imm.
srai rd, rs1, imm
Performs an arithmetic right shift on the value at rs1 and stores the result on rd. The amount of
left shifts is indicated by the immediate value imm.
add rd, rs1, rs2
Adds the values in rs1 and rs2 and stores the result on rd.
sub rd, rs1, rs2
Subtracts the value in rs2 from the value in rs1 and stores the result on rd.
addi rd, rs1, imm
Adds the value in rs1 to the immediate value imm and stores the result on rd.
mul rd, rs1, rs2
Multiplies the values in rs1 and rs2 and stores the result on rd.
div{u} rd, rs1, rs2
Divides the value in rs1 by the value in rs2 and stores the result on rd. The U suffix is optional
and must be used to indicate that the values in rs1 and rs2 are unsigned.
rem{u} rd, rs1, rs2
Calculates the remainder of the division of the value in rs1 by the value in rs2 and stores the
result on rd. The U suffix is optional and must be used to indicate that the values in rs1 and rs2
are unsigned.
138
+
Appendix A
RV32IM registers and assembly
instructions
RV32IM registers (prefix x) and their aliases
x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15
zero ra sp gp tp t0 t1 t2 s0 s1 a0 a1 a2 a3 a4 a5
x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 x31
a6 a7 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 t3 t4 t5 t6
Main control status registers
CSRs: mtvec mepc mcause mtval mstatus mscratch
Fields of mstatus: mie mpie mip
Logic, Shift, and Arithmetic instructions
and rd, rs1, rs2
Performs the bitwise “and” operation on rs1 and rs2 and stores the result on rd.
or rd, rs1, rs2
Performs the bitwise “or” operation on rs1 and rs2 and stores the result on rd.
xor rd, rs1, rs2
Performs the bitwise “xor” operation on rs1 and rs2 and stores the result on rd.
andi rd, rs1, imm
Performs the bitwise “and” operation on rs1 and imm and stores the result on rd.
ori rd, rs1, imm
Performs the bitwise “or” operation on rs1 and imm and stores the result on rd.
xori rd, rs1, imm
Performs the bitwise “xor” operation on rs1 and imm and stores the result on rd.
sll rd, rs1, rs2
Performs a logical left shift on the value at rs1 and stores the result on rd. The amount of left
shifts is indicated by the value on rs2.
srl rd, rs1, rs2
Performs a logical right shift on the value at rs1 and stores the result on rd. The amount of right
shifts is indicated by the value on rs2.
sra rd, rs1, rs2
Performs an arithmetic right shift on the value at rs1 and stores the result on rd. The amount of
right shifts is indicated by the value on rs2.
slli rd, rs1, imm
Performs a logical left shift on the value at rs1 and stores the result on rd. The amount of left
shifts is indicated by the immediate value imm.
srli rd, rs1, imm
Performs a logical right shift on the value at rs1 and stores the result on rd. The amount of left
shifts is indicated by the immediate value imm.
srai rd, rs1, imm
Performs an arithmetic right shift on the value at rs1 and stores the result on rd. The amount of
left shifts is indicated by the immediate value imm.
add rd, rs1, rs2
Adds the values in rs1 and rs2 and stores the result on rd.
sub rd, rs1, rs2
Subtracts the value in rs2 from the value in rs1 and stores the result on rd.
addi rd, rs1, imm
Adds the value in rs1 to the immediate value imm and stores the result on rd.
mul rd, rs1, rs2
Multiplies the values in rs1 and rs2 and stores the result on rd.
div{u} rd, rs1, rs2
Divides the value in rs1 by the value in rs2 and stores the result on rd. The U suffix is optional
and must be used to indicate that the values in rs1 and rs2 are unsigned.
rem{u} rd, rs1, rs2
Calculates the remainder of the division of the value in rs1 by the value in rs2 and stores the
result on rd. The U suffix is optional and must be used to indicate that the values in rs1 and rs2
are unsigned.
138
diff --git a/book/riscv-book-152.page b/book/riscv-book-152.page index d74dbf0..8953945 100644 --- a/book/riscv-book-152.page +++ b/book/riscv-book-152.page @@ -1 +1 @@ -
Data movement instructions
mv rd, rs
Copies the value from register rs into register rd (pseudo-instruction).
li rd, imm
Loads the immediate value imm into register rd (pseudo-instruction).
la rd, rot
Loads the label address rot into register rd (pseudo-instruction).
lw rd, imm(rs1)
Loads a 32-bit signed or unsigned word from memory into register rd. The memory address is
calculated by adding the immediate value imm to the value in rs1.
lh rd, imm(rs1)
Loads a 16-bit signed halfword from memory into register rd. The memory address is calcu-
lated by adding the immediate value imm to the value in rs1.
lhu rd, imm(rs1)
Loads a 16-bit unsigned halfword from memory into register rd. The memory address is cal-
culated by adding the immediate value imm to the value in rs1.
lb rd, imm(rs1)
Loads a 8-bit signed byte from memory into register rd. The memory address is calculated by
adding the immediate value imm to the value in rs1.
lbu rd, imm(rs1)
Loads a 8-bit unsigned byte from memory into register rd. The memory address is calculated
by adding the immediate value imm to the value in rs1.
sw rs1, imm(rs2)
Stores the 32-bit value at register rs1 into memory. The memory address is calculated by
adding the immediate value imm to the value in rs2.
sh rs1, imm(rs2)
Stores the 16 least significant bits from register rs1 into memory. The memory address is
calculated by adding the immediate value imm to the value in rs2.
sb rs1, imm(rs2)
Stores the 8 least significant bits from register rs1 into memory. The memory address is
calculated by adding the immediate value imm to the value in rs2.
l{w|h|hu|b|bu} rd, lab
For each one of the lw, lh, lhu, lb, and lbu machine instructions there is a pseudo-instruction
that performs the same operation, but the memory address is calculated based on a label (lab)
(pseudo-instruction).
s{w|h|b} rd, lab
For each one of the sw, sh, and sb machine instructions there is a pseudo-instruction that
performs the same operation, but the memory address is calculated based on a label (lab)
(pseudo-instruction).
Conditional and Unconditional control-flow instructions
beq rs1, rs2, lab
Jumps to label lab if the value in rs1 is equal to the value in rs2.
bne rs1, rs2, lab
Jumps to label lab if the value in rs1 is different from the value in rs2.
beqz rs1, lab
Jumps to label lab if the value in rs1 is equal to zero (pseudo-instruction).
bnez rs1, lab
Jumps to label lab if the value in rs1 is not equal to zero (pseudo-instruction).
blt rs1, rs2, lab
Jumps to label lab if the signed value in rs1 is smaller than the signed value in rs2.
bltu rs1, rs2, lab
Jumps to label lab if the unsigned value in rs1 is smaller than the unsigned value in rs2.
bge rs1, rs2, lab
Jumps to label lab if the signed value in rs1 is greater or equal to the signed value in rs2.
bgeu rs1, rs2, lab
Jumps to label lab if the unsigned value in rs1 is greater or equal to the unsigned value in
rs2.
j lab
Jumps to address indicated by symbol sym (pseudo-instruction).
jr rs1
Jumps to the address stored on register rs1 (pseudo-instruction).
jal lab
Stores the return address (PC+4) on the return register (ra), then jumps to label lab (pseudo-
instruction).
jal rd, lab
Stores the return address (PC+4) on register rd, then jumps to label lab.
jarl rd, rs1, imm
Stores the return address (PC+4) on register rd, then jumps to the address calculated by
adding the immediate value imm to the value on register rs1.
ret
Jumps to the address stored on the return register (ra) (pseudo-instruction).
ecall
Generates a software interruption. Used to perform system calls.
mret
Returns from an interrupt handler.
Control and Status Registers Read and Write instructions
csrr rd, csr
Copies the value from the control and status register csr into register rd (pseudo-instruction).
csrw csr, rs
Copies the value from register rs into the control and status register csr (pseudo-instruction).
csrrw rd, csr, rs1
Copies the value from the control and status register csr into register rd and the value from the
rs1 register to the control and status register csr. If rd=rs1, the instruction performs an atomic
swap between registers csr and rs1..
csrc csr, rs
Clears control and status register (csr) bits using the contents of the rs register as a bit mask.
(pseudo-instruction).
csrs csr, rs
Sets control and status register (csr) bits using the contents of the rs register as a bit mask.
(pseudo-instruction).
Conditional set instructions
slt rd, rs1, rs2
Sets rd with 1 if the signed value in rs1 is less than the signed value in rs2, otherwise, sets it with
0.
slti rd, rs1, imm
Sets rd with 1 if the signed value in rs1 is less than the sign-extended immediate value imm,
otherwise, sets it with 0.
sltu rd, rs1, rs2
Sets rd with 1 if the unsigned value in rs1 is less than the unsigned value in rs2, otherwise, sets
it with 0.
sltui rd, rs1, imm
Sets rd with 1 if the unsigned value in rs1 is less than the unsigned immediate value imm, otherwise,
sets it with 0.
seqz rd, rs1
Sets rd with 1 if the value in rs1 is equal to zero, otherwise, sets it with 0 (pseudo-instruction).
snez rd, rs1
Sets rd with 1 if the value in rs1 is not equal to zero, otherwise, sets it with 0 (pseudo-instruction).
sltz rd, rs1
Sets rd with 1 if the signed value in rs1 is less than zero, otherwise, sets it with 0 (pseudo-
instruction).
sgtz rd, rs1
Sets rd with 1 if the signed value in rs1 is greater than zero, otherwise, sets it with 0 (pseudo-
instruction).
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
139
+
Data movement instructions
mv rd, rs
Copies the value from register rs into register rd (pseudo-instruction).
li rd, imm
Loads the immediate value imm into register rd (pseudo-instruction).
la rd, rot
Loads the label address rot into register rd (pseudo-instruction).
lw rd, imm(rs1)
Loads a 32-bit signed or unsigned word from memory into register rd. The memory address is
calculated by adding the immediate value imm to the value in rs1.
lh rd, imm(rs1)
Loads a 16-bit signed halfword from memory into register rd. The memory address is calcu-
lated by adding the immediate value imm to the value in rs1.
lhu rd, imm(rs1)
Loads a 16-bit unsigned halfword from memory into register rd. The memory address is cal-
culated by adding the immediate value imm to the value in rs1.
lb rd, imm(rs1)
Loads a 8-bit signed byte from memory into register rd. The memory address is calculated by
adding the immediate value imm to the value in rs1.
lbu rd, imm(rs1)
Loads a 8-bit unsigned byte from memory into register rd. The memory address is calculated
by adding the immediate value imm to the value in rs1.
sw rs1, imm(rs2)
Stores the 32-bit value at register rs1 into memory. The memory address is calculated by
adding the immediate value imm to the value in rs2.
sh rs1, imm(rs2)
Stores the 16 least significant bits from register rs1 into memory. The memory address is
calculated by adding the immediate value imm to the value in rs2.
sb rs1, imm(rs2)
Stores the 8 least significant bits from register rs1 into memory. The memory address is
calculated by adding the immediate value imm to the value in rs2.
l{w|h|hu|b|bu} rd, lab
For each one of the lw, lh, lhu, lb, and lbu machine instructions there is a pseudo-instruction
that performs the same operation, but the memory address is calculated based on a label (lab)
(pseudo-instruction).
s{w|h|b} rd, lab
For each one of the sw, sh, and sb machine instructions there is a pseudo-instruction that
performs the same operation, but the memory address is calculated based on a label (lab)
(pseudo-instruction).
Conditional and Unconditional control-flow instructions
beq rs1, rs2, lab
Jumps to label lab if the value in rs1 is equal to the value in rs2.
bne rs1, rs2, lab
Jumps to label lab if the value in rs1 is different from the value in rs2.
beqz rs1, lab
Jumps to label lab if the value in rs1 is equal to zero (pseudo-instruction).
bnez rs1, lab
Jumps to label lab if the value in rs1 is not equal to zero (pseudo-instruction).
blt rs1, rs2, lab
Jumps to label lab if the signed value in rs1 is smaller than the signed value in rs2.
bltu rs1, rs2, lab
Jumps to label lab if the unsigned value in rs1 is smaller than the unsigned value in rs2.
bge rs1, rs2, lab
Jumps to label lab if the signed value in rs1 is greater or equal to the signed value in rs2.
bgeu rs1, rs2, lab
Jumps to label lab if the unsigned value in rs1 is greater or equal to the unsigned value in
rs2.
j lab
Jumps to address indicated by symbol sym (pseudo-instruction).
jr rs1
Jumps to the address stored on register rs1 (pseudo-instruction).
jal lab
Stores the return address (PC+4) on the return register (ra), then jumps to label lab (pseudo-
instruction).
jal rd, lab
Stores the return address (PC+4) on register rd, then jumps to label lab.
jarl rd, rs1, imm
Stores the return address (PC+4) on register rd, then jumps to the address calculated by
adding the immediate value imm to the value on register rs1.
ret
Jumps to the address stored on the return register (ra) (pseudo-instruction).
ecall
Generates a software interruption. Used to perform system calls.
mret
Returns from an interrupt handler.
Control and Status Registers Read and Write instructions
csrr rd, csr
Copies the value from the control and status register csr into register rd (pseudo-instruction).
csrw csr, rs
Copies the value from register rs into the control and status register csr (pseudo-instruction).
csrrw rd, csr, rs1
Copies the value from the control and status register csr into register rd and the value from the
rs1 register to the control and status register csr. If rd=rs1, the instruction performs an atomic
swap between registers csr and rs1..
csrc csr, rs
Clears control and status register (csr) bits using the contents of the rs register as a bit mask.
(pseudo-instruction).
csrs csr, rs
Sets control and status register (csr) bits using the contents of the rs register as a bit mask.
(pseudo-instruction).
Conditional set instructions
slt rd, rs1, rs2
Sets rd with 1 if the signed value in rs1 is less than the signed value in rs2, otherwise, sets it with
0.
slti rd, rs1, imm
Sets rd with 1 if the signed value in rs1 is less than the sign-extended immediate value imm,
otherwise, sets it with 0.
sltu rd, rs1, rs2
Sets rd with 1 if the unsigned value in rs1 is less than the unsigned value in rs2, otherwise, sets
it with 0.
sltui rd, rs1, imm
Sets rd with 1 if the unsigned value in rs1 is less than the unsigned immediate value imm, otherwise,
sets it with 0.
seqz rd, rs1
Sets rd with 1 if the value in rs1 is equal to zero, otherwise, sets it with 0 (pseudo-instruction).
snez rd, rs1
Sets rd with 1 if the value in rs1 is not equal to zero, otherwise, sets it with 0 (pseudo-instruction).
sltz rd, rs1
Sets rd with 1 if the signed value in rs1 is less than zero, otherwise, sets it with 0 (pseudo-
instruction).
sgtz rd, rs1
Sets rd with 1 if the signed value in rs1 is greater than zero, otherwise, sets it with 0 (pseudo-
instruction).
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
139
diff --git a/book/riscv-book-153.page b/book/riscv-book-153.page index b09cdad..b180d25 100644 --- a/book/riscv-book-153.page +++ b/book/riscv-book-153.page @@ -1 +1 @@ -
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
140
+
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
140
diff --git a/book/riscv-book-16.page b/book/riscv-book-16.page index 5bd674c..33db768 100644 --- a/book/riscv-book-16.page +++ b/book/riscv-book-16.page @@ -1 +1 @@ -
1.1. MAIN COMPONENTS OF COMPUTERS
Bus: The bus is a communication system that transfers information between the computer com-
ponents. This system is usually composed of wires that are responsible for transmitting the infor-
mation and associated circuitries, which orchestrate the communication.
Figure 1.1 illustrates a computer system in which the CPU, the main memory, a persistent storage
device (HDD), and two I/O devices are connected through a system bus.
bus
CPU
Main
Memory
Output
device
Input
device
HDD
Figure 1.1: Computer system components connected through a system bus.
1.1.1 The main memory
The computer main memory is a storage device used to store the program instructions and data, and it
is composed of a set of memory words. Each memory word is capable of storing a set of bits (usually
eight bits) and is identified by a unique number, known as the memory word address. A byte addressable
memory is a memory in which each memory word (a.k.a. memory location) stores a single byte and is
associated with a unique address. Figure 1.2 illustrates the organization of a byte addressable memory.
Notice that the memory word identified by address 5 (or simply “memory word 5”) contains the value
11111111
2
while memory word 0 contains the value 00110110
2
.
0
00110110
1
00000000
2
00001000
3
10000000
4
11110000
5
11111111
6
00001111
7
11100001
...
...
Memory
locations
1 byte
Addresses
Figure 1.2: Organization of a byte addressable memory with its contents represented as a sequence of
bits.
1.1.2 The CPU
The Central Processing Unit is the component responsible for executing the computer programs. There
are several ways of implementing and organizing a CPU, however, to understand how programs are
executed, it suffices to know that the CPU contains:
Registers: a CPU register is a small memory device located inside the CPU. The CPU usually
contains a small set of registers. RISC-V processors, for example, contain thirty-one 32-bit regis-
ters
1
that can be used by programs to store information inside the CPU. Computers often contain
1
A 32-bit register is a register that is capable of storing 32 bits, i.e., values composed of 32 bits.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
3
+
1.1. MAIN COMPONENTS OF COMPUTERS
Bus: The bus is a communication system that transfers information between the computer com-
ponents. This system is usually composed of wires that are responsible for transmitting the infor-
mation and associated circuitries, which orchestrate the communication.
Figure 1.1 illustrates a computer system in which the CPU, the main memory, a persistent storage
device (HDD), and two I/O devices are connected through a system bus.
bus
CPU
Main
Memory
Output
device
Input
device
HDD
Figure 1.1: Computer system components connected through a system bus.
1.1.1 The main memory
The computer main memory is a storage device used to store the program instructions and data, and it
is composed of a set of memory words. Each memory word is capable of storing a set of bits (usually
eight bits) and is identified by a unique number, known as the memory word address. A byte addressable
memory is a memory in which each memory word (a.k.a. memory location) stores a single byte and is
associated with a unique address. Figure 1.2 illustrates the organization of a byte addressable memory.
Notice that the memory word identified by address 5 (or simply “memory word 5”) contains the value
11111111
2
while memory word 0 contains the value 00110110
2
.
0
00110110
1
00000000
2
00001000
3
10000000
4
11110000
5
11111111
6
00001111
7
11100001
...
...
Memory
locations
1 byte
Addresses
Figure 1.2: Organization of a byte addressable memory with its contents represented as a sequence of
bits.
1.1.2 The CPU
The Central Processing Unit is the component responsible for executing the computer programs. There
are several ways of implementing and organizing a CPU, however, to understand how programs are
executed, it suffices to know that the CPU contains:
Registers: a CPU register is a small memory device located inside the CPU. The CPU usually
contains a small set of registers. RISC-V processors, for example, contain thirty-one 32-bit regis-
ters
1
that can be used by programs to store information inside the CPU. Computers often contain
1
A 32-bit register is a register that is capable of storing 32 bits, i.e., values composed of 32 bits.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
3
diff --git a/book/riscv-book-17.page b/book/riscv-book-17.page index c730685..d6231f1 100644 --- a/book/riscv-book-17.page +++ b/book/riscv-book-17.page @@ -1 +1 @@ -
1.2. EXECUTING PROGRAM INSTRUCTIONS
instructions that copy values from the main memory into CPU registers, known as “load” instruc-
tions, and instructions that copy values from the CPU registers into the main memory, known as
“store” instructions.
A datapath: the CPU datapath is responsible for performing operations, such as arithmetic and
logic operations, on data. The datapath usually performs the operation using data from the CPU
registers and store the results on CPU registers.
A control unit: the control unit is the unit responsible for orchestrating the computer operation.
It is capable of controlling the datapath and other components, such as the main memory, by
sending commands through the bus. For example, it may send a sequence of commands to the
datapath and to the main memory to orchestrate the execution of a program instruction.
Accessing data on registers is much faster than accessing data on the main memory. Hence, programs
tend to copy data from memory and keep them on CPU registers to enable faster processing. Once the
data is no longer needed, it may be discarded or saved back on the main memory to free CPU registers.
The Instruction Set Architecture, or ISA, defines the computer instructions set, including, but not
limited to, the behavior of the instructions, their encoding, and resources that may be accessed by the
instructions, such as CPU registers. A program that was generated for a given ISA can be executed by
any computer that implements a compatible ISA.
ISAs tend to evolve over time, however, ISA designers try to keep newer ISA versions compatible
with previous ones so that legacy code, i.e., code generated for previous versions of the ISA, can still be
executed by newer CPUs. For example, a program that was generated for the 80386 ISA can be executed
by any processor that implements this or any other compatible ISAs, such as the 80486 ISA.
1.2 Executing program instructions
As discussed previously, modern computers usually store the program that is being executed on main
memory, including its instructions and data. The CPU retrieves programs’ instructions from the main
memory for execution. Also, when executing instructions, the CPU may read (write) data from (to) the
main memory. To illustrate this process we will consider a CPU that implements the RV32I ISA.
The RV32I ISA specifies that instructions are encoded using 32 bits. Hence, assuming the system
has a byte addressable memory
2
, each instruction occupies four memory words. Also, it specifies that
instructions are executed sequentially
3
, in the same order they appear in the main memory.
Let us consider a small program generated for the RV32I ISA that is composed of three instructions
and is stored in main memory starting at address 8000. Since each instruction occupies four bytes (i.e.,
32 bits) and instructions are stored consecutively on main memory, the first instruction is located at
addresses 8000, 8001, 8002, and 8003, the second one on addresses 8004, 8005, 8006, and 8007, and the
third one on addresses 8008, 8009, 8010, and 8011. Figure 1.3 illustrates the instructions stored on the
main memory.
The CPU usually contains a register to keep track of the next instruction that needs to be executed.
This register, called Program Counter, or PC, on the RV32 ISA, stores the starting address of the
sequence of memory words that store the next instruction to be executed. For example, before executing
the first instruction of the code illustrated at Figure 1.3, the PC contains the value 8000. Once the
instruction stored at address 8000 is fetched, the value of the PC is updated by adding four to its
contents so that the next instruction (at address 8004) can be fetched for execution once the current
instruction is completed. Algorithm 1 illustrates the execution cycle performed by a simple RV32I CPU.
First, the CPU uses the address in the PC to fetch an instruction (a sequence of four memory words,
i.e., 32 bits) from main memory and store it on an internal register called IR. Then, it updates the PC
so it points to the next instruction in memory. Finally, it executes the instruction that was fetched from
2
This is usually the case in modern computers.
3
As discussed in Section 5.7, control-flow instructions may change the normal execution flow.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
4
+
1.2. EXECUTING PROGRAM INSTRUCTIONS
instructions that copy values from the main memory into CPU registers, known as “load” instruc-
tions, and instructions that copy values from the CPU registers into the main memory, known as
“store” instructions.
A datapath: the CPU datapath is responsible for performing operations, such as arithmetic and
logic operations, on data. The datapath usually performs the operation using data from the CPU
registers and store the results on CPU registers.
A control unit: the control unit is the unit responsible for orchestrating the computer operation.
It is capable of controlling the datapath and other components, such as the main memory, by
sending commands through the bus. For example, it may send a sequence of commands to the
datapath and to the main memory to orchestrate the execution of a program instruction.
Accessing data on registers is much faster than accessing data on the main memory. Hence, programs
tend to copy data from memory and keep them on CPU registers to enable faster processing. Once the
data is no longer needed, it may be discarded or saved back on the main memory to free CPU registers.
The Instruction Set Architecture, or ISA, defines the computer instructions set, including, but not
limited to, the behavior of the instructions, their encoding, and resources that may be accessed by the
instructions, such as CPU registers. A program that was generated for a given ISA can be executed by
any computer that implements a compatible ISA.
ISAs tend to evolve over time, however, ISA designers try to keep newer ISA versions compatible
with previous ones so that legacy code, i.e., code generated for previous versions of the ISA, can still be
executed by newer CPUs. For example, a program that was generated for the 80386 ISA can be executed
by any processor that implements this or any other compatible ISAs, such as the 80486 ISA.
1.2 Executing program instructions
As discussed previously, modern computers usually store the program that is being executed on main
memory, including its instructions and data. The CPU retrieves programs’ instructions from the main
memory for execution. Also, when executing instructions, the CPU may read (write) data from (to) the
main memory. To illustrate this process we will consider a CPU that implements the RV32I ISA.
The RV32I ISA specifies that instructions are encoded using 32 bits. Hence, assuming the system
has a byte addressable memory
2
, each instruction occupies four memory words. Also, it specifies that
instructions are executed sequentially
3
, in the same order they appear in the main memory.
Let us consider a small program generated for the RV32I ISA that is composed of three instructions
and is stored in main memory starting at address 8000. Since each instruction occupies four bytes (i.e.,
32 bits) and instructions are stored consecutively on main memory, the first instruction is located at
addresses 8000, 8001, 8002, and 8003, the second one on addresses 8004, 8005, 8006, and 8007, and the
third one on addresses 8008, 8009, 8010, and 8011. Figure 1.3 illustrates the instructions stored on the
main memory.
The CPU usually contains a register to keep track of the next instruction that needs to be executed.
This register, called Program Counter, or PC, on the RV32 ISA, stores the starting address of the
sequence of memory words that store the next instruction to be executed. For example, before executing
the first instruction of the code illustrated at Figure 1.3, the PC contains the value 8000. Once the
instruction stored at address 8000 is fetched, the value of the PC is updated by adding four to its
contents so that the next instruction (at address 8004) can be fetched for execution once the current
instruction is completed. Algorithm 1 illustrates the execution cycle performed by a simple RV32I CPU.
First, the CPU uses the address in the PC to fetch an instruction (a sequence of four memory words,
i.e., 32 bits) from main memory and store it on an internal register called IR. Then, it updates the PC
so it points to the next instruction in memory. Finally, it executes the instruction that was fetched from
2
This is usually the case in modern computers.
3
As discussed in Section 5.7, control-flow instructions may change the normal execution flow.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
4
diff --git a/book/riscv-book-18.page b/book/riscv-book-18.page index c576184..8164411 100644 --- a/book/riscv-book-18.page +++ b/book/riscv-book-18.page @@ -1 +1 @@ -
1.3. THE BOOT PROCESS
Memory
words
Address
...
...
00010011
2
8000
00000101
2
8001
00010101
2
8002
00000000
2
8003
10010011
2
8004
10000101
2
8005
11110101
2
8006
11111111
2
8007
11100011
2
8008
00001100
2
8009
10110101
2
8010
11111110
2
8011
...
...
loop:
addi a0, a0, 1
addi a1, a1, -1
beq a0, a1, loop
Assembly language (RV32I)
Figure 1.3: Three RV32I instructions stored on a byte addressable memory starting at address 8000.
memory. Notice that when executing the instruction, the CPU may also access the main memory to
retrieve or store data.
Algorithm 1: RV32I instructions execution cycle.
1 while True do
/* Fetch instruction and update PC */
2 IR MainMemory[PC];
3 PC PC+4;
4 ExecuteInstruction(IR);
5 end
To execute a program, the operating system essentially loads the program into the main memory
(e.g., from a persistent storage device) and sets the PC so it points to the program entry point.
1.3 The boot process
Since the main memory is volatile, whenever a computer is powered on, it contains garbage. As a
consequence, at this point, the CPU may not retrieve instructions from the main memory. In this
context, on power on, the PC is automatically set so that the CPU starts by retrieving instructions
from a small non-volatile memory device, which stores a small program that performs the boot process
4
.
This program sets up the basic computer components, checks the boot configuration (also stored on a
non-volatile memory), and, based on its settings, loads into main memory the operating system boot
loader from a persistent storage device (e.g., the hard disk drive).
Once the operating system boot loader is loaded into memory, the CPU starts executing its code,
which, in turn, finishes setting up the computer and loading the primary operating system modules into
4
In old personal computer systems this program is known as the Basic Input/Output System, or BIOS. More modern
computers use the Unified Extensible Firmware Interface, or UEFI, standard.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
5
+
1.3. THE BOOT PROCESS
Memory
words
Address
...
...
00010011
2
8000
00000101
2
8001
00010101
2
8002
00000000
2
8003
10010011
2
8004
10000101
2
8005
11110101
2
8006
11111111
2
8007
11100011
2
8008
00001100
2
8009
10110101
2
8010
11111110
2
8011
...
...
loop:
addi a0, a0, 1
addi a1, a1, -1
beq a0, a1, loop
Assembly language (RV32I)
Figure 1.3: Three RV32I instructions stored on a byte addressable memory starting at address 8000.
memory. Notice that when executing the instruction, the CPU may also access the main memory to
retrieve or store data.
Algorithm 1: RV32I instructions execution cycle.
1 while True do
/* Fetch instruction and update PC */
2 IR MainMemory[PC];
3 PC PC+4;
4 ExecuteInstruction(IR);
5 end
To execute a program, the operating system essentially loads the program into the main memory
(e.g., from a persistent storage device) and sets the PC so it points to the program entry point.
1.3 The boot process
Since the main memory is volatile, whenever a computer is powered on, it contains garbage. As a
consequence, at this point, the CPU may not retrieve instructions from the main memory. In this
context, on power on, the PC is automatically set so that the CPU starts by retrieving instructions
from a small non-volatile memory device, which stores a small program that performs the boot process
4
.
This program sets up the basic computer components, checks the boot configuration (also stored on a
non-volatile memory), and, based on its settings, loads into main memory the operating system boot
loader from a persistent storage device (e.g., the hard disk drive).
Once the operating system boot loader is loaded into memory, the CPU starts executing its code,
which, in turn, finishes setting up the computer and loading the primary operating system modules into
4
In old personal computer systems this program is known as the Basic Input/Output System, or BIOS. More modern
computers use the Unified Extensible Firmware Interface, or UEFI, standard.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
5
diff --git a/book/riscv-book-19.page b/book/riscv-book-19.page index 3497af6..3162ac5 100644 --- a/book/riscv-book-19.page +++ b/book/riscv-book-19.page @@ -1 +1 @@ -
1.3. THE BOOT PROCESS
the main memory. Once the boot process finishes, a copy of the primary operating system modules is
located in the main memory, and the system is ready to execute other programs, such as users’ programs.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
6
+
1.3. THE BOOT PROCESS
the main memory. Once the boot process finishes, a copy of the primary operating system modules is
located in the main memory, and the system is ready to execute other programs, such as users’ programs.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
6
diff --git a/book/riscv-book-2.page b/book/riscv-book-2.page index 490a316..890a664 100644 --- a/book/riscv-book-2.page +++ b/book/riscv-book-2.page @@ -1 +1 @@ -
An Introduction to Assembly Programming
with RISC-V
+
An Introduction to Assembly Programming
with RISC-V
diff --git a/book/riscv-book-20.page b/book/riscv-book-20.page index f99fb13..5579d10 100644 --- a/book/riscv-book-20.page +++ b/book/riscv-book-20.page @@ -1 +1 @@ -
Chapter 2
Data representation on modern
computers
This chapter discusses how information is represented on computers. First, Section 2.1 introduces the
concepts of numeral systems and the positional notation. Then, sections 2.2 and 2.3 discuss how numbers
and text are represented on computers, respectively. Next, Section 2.4 shows how data is organized in
memory. Finally, Section 2.5 discusses how instructions are encoded.
2.1 Numeral systems and the positional notation
A numeral system is a system used for expressing numbers. The numeral system defines a set
of symbols and rules for using them to represent a given set of numbers (e.g., the natural numbers). For
example, the “unary numeral system”, is a numeral system in which every natural number is represented
by a corresponding number of symbols. In this system, assuming the base symbol is the character,
natural numbers one, two, and five would be represented as , ⋆⋆, and , respectively.
The “decimal numeral system” is the most common numeral system used by humans to represent
integer and non-integer numbers. Let:
D
10
be the set of symbols used in the decimal numeral system, i.e., D
10
= {“0”, “1”, “2”, “3”,
“4”, “5”, “6”, “7”, “8”, “9”}; and
d
i
be a digit on a number represented in the decimal numeral system, i.e., d
i
D
10
;
number
10
be a number represented in the decimal numeral system;
any natural number may be represented on the decimal numeral system by an ordered sequence of
m digits, as illustrated by Equation 2.1. The superscript annotation indicates the digit position. Notice
that the rightmost digit is associated with position 0 and the leftmost digit is associated with position
m 1.
number
10
= d
m1
d
m2
· · · d
1
d
0
10
(2.1)
For example, the number one thousand nine hundred and sixty nine is represented by the sequence
1969. In this case, m = 4, d
3
= “1”, d
2
= “9”, d
1
= “6”, and d
0
= “9”
Let:
symbol value(d
i
) be the value of the symbol used in digit d
i
; and
symbol value(“0”) = zero, symbol value(“1”) = one, ..., symbol value(“9”) = nine;
7
+
Chapter 2
Data representation on modern
computers
This chapter discusses how information is represented on computers. First, Section 2.1 introduces the
concepts of numeral systems and the positional notation. Then, sections 2.2 and 2.3 discuss how numbers
and text are represented on computers, respectively. Next, Section 2.4 shows how data is organized in
memory. Finally, Section 2.5 discusses how instructions are encoded.
2.1 Numeral systems and the positional notation
A numeral system is a system used for expressing numbers. The numeral system defines a set
of symbols and rules for using them to represent a given set of numbers (e.g., the natural numbers). For
example, the “unary numeral system”, is a numeral system in which every natural number is represented
by a corresponding number of symbols. In this system, assuming the base symbol is the character,
natural numbers one, two, and five would be represented as , ⋆⋆, and , respectively.
The “decimal numeral system” is the most common numeral system used by humans to represent
integer and non-integer numbers. Let:
D
10
be the set of symbols used in the decimal numeral system, i.e., D
10
= {“0”, “1”, “2”, “3”,
“4”, “5”, “6”, “7”, “8”, “9”}; and
d
i
be a digit on a number represented in the decimal numeral system, i.e., d
i
D
10
;
number
10
be a number represented in the decimal numeral system;
any natural number may be represented on the decimal numeral system by an ordered sequence of
m digits, as illustrated by Equation 2.1. The superscript annotation indicates the digit position. Notice
that the rightmost digit is associated with position 0 and the leftmost digit is associated with position
m 1.
number
10
= d
m1
d
m2
· · · d
1
d
0
10
(2.1)
For example, the number one thousand nine hundred and sixty nine is represented by the sequence
1969. In this case, m = 4, d
3
= “1”, d
2
= “9”, d
1
= “6”, and d
0
= “9”
Let:
symbol value(d
i
) be the value of the symbol used in digit d
i
; and
symbol value(“0”) = zero, symbol value(“1”) = one, ..., symbol value(“9”) = nine;
7
diff --git a/book/riscv-book-21.page b/book/riscv-book-21.page index 2295779..66b7686 100644 --- a/book/riscv-book-21.page +++ b/book/riscv-book-21.page @@ -1 +1 @@ -
2.1. NUMERAL SYSTEMS AND THE POSITIONAL NOTATION
The value of a number with m digits in the decimal numeral system is computed by Equation 2.2.
value(number
10
) =
i<m
X
i=0
symbol value(d
i
) × 10
i
| {z }
digit value
(2.2)
Notice that the value of each digit d
i
, i.e., the contribution of each digit d
i
to the number value,
depends on the symbol used and its position (index i) on the sequence. For example, the number 1969
has four digits: d
3
= 1, d
2
= 9, d
1
= 6, d
0
= 9. The value of digit d
2
is nine hundred while the value of
digit d
0
is nine.
A positional numeral system is a numeral system in which the value of a digit d
i
depends
on the value of the symbol used on the digit and also on the position of the digit on the
sequence of digits. The decimal numeral system is a positional numeral system. The unary and the
Roman numeral systems, on the other hand, are common examples of non-positional numeral systems.
The base, or radix, of a numeral system is the number of different symbols a digit may
assume to represent the numbers. The base of the “unary numeral system” is one while the base
of the “decimal system” is ten.
The decimal, binary, octal and hexadecimal numeral systems are positional numeral
systems that are frequently used when programming computers. The only difference between
these numeral systems is the base. While the base of the decimal numeral system is ten, the base of the
binary, the octal, and the hexadecimal numeral systems are two, eight, and sixteen, respectively.
Let:
base be the base, or radix, of the positional numeral system;
D
base
be the set of symbols used in the positional numeral system (e.g., D
2
= {“0”, “1”}); and
d
i
base
be the i
th
digit on a number represented in the positional numeral system, i.e., d
i
base
D
base
;
number
base
be a number represented in the numeral system;
any natural number may be represented on the decimal/binary/octal/hexadecimal positional numeral
system by an ordered sequence of m digits, as illustrated by Equation 2.3.
number
base
= d
m1
base
d
m2
base
· · · d
1
base
d
0
base
(2.3)
Let:
symbol value(d
i
base
) be the value of the symbol used in digit d
i
base
; and
symbol value(“0”) = zero, symbol value(“1”) = one, and so on;
The value of a natural number with m digits in any of these positional numeral systems is defined
by Equation 2.4.
value(number
base
) =
i<m
X
i=0
symbol value(d
i
base
) × base
i
| {z }
digit value
(2.4)
For example, the value of any natural number represented on the binary numeral system (base = 2)
is defined by Equation 2.5
value(number
2
) =
i<m
X
i=0
symbol value(d
i
2
) × 2
i
| {z }
digit value
(2.5)
Notice that the value of the sequence “11” is three on the binary numeral system (1 × 2
1
+ 1 × 2
0
)
while it is eleven on the decimal numeral system (1 × 10
1
+ 1 × 10
0
) and seventeen on the hexadecimal
numeral system (1 × 16
1
+ 1 × 16
0
).
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
8
+
2.1. NUMERAL SYSTEMS AND THE POSITIONAL NOTATION
The value of a number with m digits in the decimal numeral system is computed by Equation 2.2.
value(number
10
) =
i<m
X
i=0
symbol value(d
i
) × 10
i
| {z }
digit value
(2.2)
Notice that the value of each digit d
i
, i.e., the contribution of each digit d
i
to the number value,
depends on the symbol used and its position (index i) on the sequence. For example, the number 1969
has four digits: d
3
= 1, d
2
= 9, d
1
= 6, d
0
= 9. The value of digit d
2
is nine hundred while the value of
digit d
0
is nine.
A positional numeral system is a numeral system in which the value of a digit d
i
depends
on the value of the symbol used on the digit and also on the position of the digit on the
sequence of digits. The decimal numeral system is a positional numeral system. The unary and the
Roman numeral systems, on the other hand, are common examples of non-positional numeral systems.
The base, or radix, of a numeral system is the number of different symbols a digit may
assume to represent the numbers. The base of the “unary numeral system” is one while the base
of the “decimal system” is ten.
The decimal, binary, octal and hexadecimal numeral systems are positional numeral
systems that are frequently used when programming computers. The only difference between
these numeral systems is the base. While the base of the decimal numeral system is ten, the base of the
binary, the octal, and the hexadecimal numeral systems are two, eight, and sixteen, respectively.
Let:
base be the base, or radix, of the positional numeral system;
D
base
be the set of symbols used in the positional numeral system (e.g., D
2
= {“0”, “1”}); and
d
i
base
be the i
th
digit on a number represented in the positional numeral system, i.e., d
i
base
D
base
;
number
base
be a number represented in the numeral system;
any natural number may be represented on the decimal/binary/octal/hexadecimal positional numeral
system by an ordered sequence of m digits, as illustrated by Equation 2.3.
number
base
= d
m1
base
d
m2
base
· · · d
1
base
d
0
base
(2.3)
Let:
symbol value(d
i
base
) be the value of the symbol used in digit d
i
base
; and
symbol value(“0”) = zero, symbol value(“1”) = one, and so on;
The value of a natural number with m digits in any of these positional numeral systems is defined
by Equation 2.4.
value(number
base
) =
i<m
X
i=0
symbol value(d
i
base
) × base
i
| {z }
digit value
(2.4)
For example, the value of any natural number represented on the binary numeral system (base = 2)
is defined by Equation 2.5
value(number
2
) =
i<m
X
i=0
symbol value(d
i
2
) × 2
i
| {z }
digit value
(2.5)
Notice that the value of the sequence “11” is three on the binary numeral system (1 × 2
1
+ 1 × 2
0
)
while it is eleven on the decimal numeral system (1 × 10
1
+ 1 × 10
0
) and seventeen on the hexadecimal
numeral system (1 × 16
1
+ 1 × 16
0
).
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
8
diff --git a/book/riscv-book-22.page b/book/riscv-book-22.page index 681bd60..cea6037 100644 --- a/book/riscv-book-22.page +++ b/book/riscv-book-22.page @@ -1 +1 @@ -
2.1. NUMERAL SYSTEMS AND THE POSITIONAL NOTATION
When working with multiple numeral systems it is often necessary to annotate the numbers so that
it is possible to identify the numeral system being used, and hence, its value. A common notation is
to append a subscribed suffix to the number indicating the base of the positional numeral system. For
example, the value of number 11
10
is eleven while the value of number 11
2
is three
1
.
Appending a subscribed suffix to the number is not a natural way of annotating numbers in computer
programs. In these cases, a common approach is to append a prefix that indicates the base. For
example, in “C”, the programmer may use the prefix 0b”/“0”/“0x to indicate that the number is in
the binary/octal/hexadecimal base, i.e., base 2/8/16. In “C”, numbers that lack a prefix belong to the
decimal numeral system.
The binary and octal numeral systems use a subset of the symbols used on the decimal numeral
system to represent the numbers. The hexadecimal numeral system, on the other hand, requires more
than ten symbols, hence, new symbols are needed. In this case, the first letters of the alphabet are used
to complement the set of symbols. Table 2.1 shows the symbols used in each one of these positional
numeral systems and their corresponding values.
Symbol symbol value
Used in base
2 8 10 16
“0” zero
“1” one
“2” two
“3” three
“4” four
“5” five
“6” six
“7” seven
“8” eight
“9” nine
“A” ten
“B” eleven
“C” twelve
“D” thirteen
“E” fourteen
“F” fifteen
Table 2.1: Set of symbols used in binary, octal, decimal, and hexadecimal numeral systems and their
respective values.
Table 2.2 shows how values zero to twenty are represented in the hexadecimal, decimal, octal, and
binary numeral systems.
2.1.1 Converting numbers between bases
Converting numbers between positional numeral systems is a common task in several contexts, specially
when programming or debugging a computer system. Since humans usually prefer to think using the
decimal numeral system, they usually convert numbers from other positional numeral systems to the
decimal numeral system to reason about their values. Also, in some situations, it may be necessary to
convert values to the binary, octal, or the hexadecimal numeral systems.
Equation 2.4 shows how to compute the value of numbers represented on any positional numeral
system.
To represent a value V in a positional numeral system, one must find a sequence of digits d
m1
base
d
m2
base
· · · d
1
base
d
0
base
so that Equation 2.4 holds. In other words, let v(d
i
b
) be the value of the symbol used on the i
th
digit
2
of
1
Notice that, accordingly to Equation 2.4, value(11
2
) = 1 × 2
1
+ 1 × 2
0
= three.
2
We will use the notation v(d
i
b
) instead of symbol value(d
i
b
) to keep equations short.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
9
+
2.1. NUMERAL SYSTEMS AND THE POSITIONAL NOTATION
When working with multiple numeral systems it is often necessary to annotate the numbers so that
it is possible to identify the numeral system being used, and hence, its value. A common notation is
to append a subscribed suffix to the number indicating the base of the positional numeral system. For
example, the value of number 11
10
is eleven while the value of number 11
2
is three
1
.
Appending a subscribed suffix to the number is not a natural way of annotating numbers in computer
programs. In these cases, a common approach is to append a prefix that indicates the base. For
example, in “C”, the programmer may use the prefix 0b”/“0”/“0x to indicate that the number is in
the binary/octal/hexadecimal base, i.e., base 2/8/16. In “C”, numbers that lack a prefix belong to the
decimal numeral system.
The binary and octal numeral systems use a subset of the symbols used on the decimal numeral
system to represent the numbers. The hexadecimal numeral system, on the other hand, requires more
than ten symbols, hence, new symbols are needed. In this case, the first letters of the alphabet are used
to complement the set of symbols. Table 2.1 shows the symbols used in each one of these positional
numeral systems and their corresponding values.
Symbol symbol value
Used in base
2 8 10 16
“0” zero
“1” one
“2” two
“3” three
“4” four
“5” five
“6” six
“7” seven
“8” eight
“9” nine
“A” ten
“B” eleven
“C” twelve
“D” thirteen
“E” fourteen
“F” fifteen
Table 2.1: Set of symbols used in binary, octal, decimal, and hexadecimal numeral systems and their
respective values.
Table 2.2 shows how values zero to twenty are represented in the hexadecimal, decimal, octal, and
binary numeral systems.
2.1.1 Converting numbers between bases
Converting numbers between positional numeral systems is a common task in several contexts, specially
when programming or debugging a computer system. Since humans usually prefer to think using the
decimal numeral system, they usually convert numbers from other positional numeral systems to the
decimal numeral system to reason about their values. Also, in some situations, it may be necessary to
convert values to the binary, octal, or the hexadecimal numeral systems.
Equation 2.4 shows how to compute the value of numbers represented on any positional numeral
system.
To represent a value V in a positional numeral system, one must find a sequence of digits d
m1
base
d
m2
base
· · · d
1
base
d
0
base
so that Equation 2.4 holds. In other words, let v(d
i
b
) be the value of the symbol used on the i
th
digit
2
of
1
Notice that, accordingly to Equation 2.4, value(11
2
) = 1 × 2
1
+ 1 × 2
0
= three.
2
We will use the notation v(d
i
b
) instead of symbol value(d
i
b
) to keep equations short.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
9
diff --git a/book/riscv-book-23.page b/book/riscv-book-23.page index 7abcc97..0f388a3 100644 --- a/book/riscv-book-23.page +++ b/book/riscv-book-23.page @@ -1 +1 @@ -
2.1. NUMERAL SYSTEMS AND THE POSITIONAL NOTATION
Value
Numeral system
Hexadecimal Decimal Octal Binary
zero 0
16
0
10
0
8
0
2
one 1
16
1
10
1
8
1
2
two 2
16
2
10
2
8
10
2
three 3
16
3
10
3
8
11
2
four 4
16
4
10
4
8
100
2
five 5
16
5
10
5
8
101
2
six 6
16
6
10
6
8
110
2
seven 7
16
7
10
7
8
111
2
eight 8
16
8
10
10
8
1000
2
nine 9
16
9
10
11
8
1001
2
ten A
16
10
10
12
8
1010
2
eleven B
16
11
10
13
8
1011
2
twelve C
16
12
10
14
8
1100
2
thirteen D
16
13
10
15
8
1101
2
fourteen E
16
14
10
16
8
1110
2
fifteen F
16
15
10
17
8
1111
2
sixteen 10
16
16
10
20
8
10000
2
seventeen 11
16
17
10
21
8
10001
2
eighteen 12
16
18
10
22
8
10010
2
nineteen 13
16
19
10
23
8
10011
2
twenty 14
16
20
10
24
8
10100
2
Table 2.2: Values zero to twenty represented in the hexadecimal, decimal, octal, and binary numeral
systems.
a number represented in base b, one must find a sequence of digits d
m1
base
d
m2
base
· · · d
1
base
d
0
base
so that:
V = v(d
m1
b
) × b
m1
+ · · · + v(d
1
b
) × b
1
+ v(d
0
b
) × b
0
(2.6)
The previous equation may be rewritten as:
V = b × (v(d
m1
b
) × b
m2
+ · · · + v(d
1
b
) × b
0
| {z }
V
) + v(d
0
b
) (2.7)
Notice that v(d
0
b
) and V
are equivalent to the remainder and the quotient of the division of V by b.
Hence, to find out the symbol value of digit d
0
b
(i.e., v(d
0
b
)) it suffices to compute the remainder of the
division of V by b.
Using the same reasoning, the symbol value of digit d
1
b
may be computed by dividing V
by b. Notice
that the remainder of the division of V
by b is equal to v(d
1
b
).
Let symbol from value(v, b) be a function that returns the symbol used to represent value v on
base b (e.g., symbol from value(eleven, 16) = B”), Algorithm 2 shows an algorithm to compute the
sequence of digits d
m1
b
d
m2
b
· · · d
1
b
d
0
b
that represent value V on base b.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
10
+
2.1. NUMERAL SYSTEMS AND THE POSITIONAL NOTATION
Value
Numeral system
Hexadecimal Decimal Octal Binary
zero 0
16
0
10
0
8
0
2
one 1
16
1
10
1
8
1
2
two 2
16
2
10
2
8
10
2
three 3
16
3
10
3
8
11
2
four 4
16
4
10
4
8
100
2
five 5
16
5
10
5
8
101
2
six 6
16
6
10
6
8
110
2
seven 7
16
7
10
7
8
111
2
eight 8
16
8
10
10
8
1000
2
nine 9
16
9
10
11
8
1001
2
ten A
16
10
10
12
8
1010
2
eleven B
16
11
10
13
8
1011
2
twelve C
16
12
10
14
8
1100
2
thirteen D
16
13
10
15
8
1101
2
fourteen E
16
14
10
16
8
1110
2
fifteen F
16
15
10
17
8
1111
2
sixteen 10
16
16
10
20
8
10000
2
seventeen 11
16
17
10
21
8
10001
2
eighteen 12
16
18
10
22
8
10010
2
nineteen 13
16
19
10
23
8
10011
2
twenty 14
16
20
10
24
8
10100
2
Table 2.2: Values zero to twenty represented in the hexadecimal, decimal, octal, and binary numeral
systems.
a number represented in base b, one must find a sequence of digits d
m1
base
d
m2
base
· · · d
1
base
d
0
base
so that:
V = v(d
m1
b
) × b
m1
+ · · · + v(d
1
b
) × b
1
+ v(d
0
b
) × b
0
(2.6)
The previous equation may be rewritten as:
V = b × (v(d
m1
b
) × b
m2
+ · · · + v(d
1
b
) × b
0
| {z }
V
) + v(d
0
b
) (2.7)
Notice that v(d
0
b
) and V
are equivalent to the remainder and the quotient of the division of V by b.
Hence, to find out the symbol value of digit d
0
b
(i.e., v(d
0
b
)) it suffices to compute the remainder of the
division of V by b.
Using the same reasoning, the symbol value of digit d
1
b
may be computed by dividing V
by b. Notice
that the remainder of the division of V
by b is equal to v(d
1
b
).
Let symbol from value(v, b) be a function that returns the symbol used to represent value v on
base b (e.g., symbol from value(eleven, 16) = B”), Algorithm 2 shows an algorithm to compute the
sequence of digits d
m1
b
d
m2
b
· · · d
1
b
d
0
b
that represent value V on base b.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
10
diff --git a/book/riscv-book-24.page b/book/riscv-book-24.page index 5726259..9241f3a 100644 --- a/book/riscv-book-24.page +++ b/book/riscv-book-24.page @@ -1 +1 @@ -
2.1. NUMERAL SYSTEMS AND THE POSITIONAL NOTATION
Algorithm 2: Algorithm to compute the sequence of digits d
m1
b
d
m2
b
· · · d
1
b
d
0
b
that represent
value V on base b.
input : Value V and base b.
output: Sequence of digits d
m1
b
d
m2
b
· · · d
1
b
d
0
b
.
1 i 0 ;
2 tmp V ;
3 while tmp ̸= 0 do
4 rem tmp mod b ;
5 d
i
b
symbol f rom value(rem, b) ;
6 tmp tmp / b ;
7 i i + 1 ;
8 end
To illustrate the use of Algorithm 2 lets compute the sequence of digits d
m1
2
d
m2
2
· · · d
1
2
d
0
2
that
represent value twenty six on base 2. First, we divide twenty six by two. The remainder of this division
is zero and the quotient is thirteen, hence, v(d
0
2
) = zero and d
0
2
= “0”. This process is illustrated in
Figure 2.1 (a). To compute v(d
1
2
) we now divide thirteen (i.e., the quotient of the last division) by
two. The remainder of this division is one and the quotient is six, hence, v(d
1
2
) = one and d
1
2
= “1”.
This partial result is illustrated in Figure 2.1 (b). To compute v(d
2
2
) we now divide six (the previous
quotient) by two. The remainder of this division is zero and the quotient is three, hence, v(d
2
2
) = zero
and d
2
2
= “0”. Now, we divide three by two. The remainder of this division is one and the quotient is
one, hence, v(d
3
2
) = one and d
3
2
= “1”. Again, we divide the last quotient (one) by two. The remainder of
this division is one and the quotient is zero, hence, v(d
4
2
) = one and d
4
2
= “1”. Since the last quotient is
zero, the process is complete. As a result, the sequence 11010
2
represents value twenty six on the binary
numeral system. Figure 2.1 (c) shows all the quotients and remainders computed during the execution
of Algorithm 2.
26
13
2
- 26
0
6
2
- 12
1
26
13
2
- 26
0
quotient
remainder
26
13
2
- 26
0
6
2
- 12
1
3
2
- 6
0
1
2
- 2
1
0
2
- 0
1
v(d
0
2
) =
v(d
1
2
) =
v(d
0
2
) =
v(d
1
2
) =
v(d
2
2
) =
v(d
3
2
) =
v(d
4
2
) =
(a) (b) (c)
Figure 2.1: Example of applying Algorithm 2 to compute the sequence of digits d
m1
2
d
m2
2
· · · d
1
2
d
0
2
that
represent value twenty six on base 2. (a) First iteration of the algorithm. (b) Values of v(d
0
2
) and v(d
1
2
)
computed after two iterations. (c) Final result: 11010
2
= twenty six.
Figure 2.2 shows an example of applying Algorithm 2 to compute the sequence of digits d
m1
16
d
m2
16
· · · d
1
16
d
0
16
that represent value twenty six on base 16.
To convert a number from a positional numeral system with base A to a number on a
positional numeral system with base B, one may use Equation 2.4 to compute the value of
the number in base A and Algorithm 2 to compute the sequence of digits d
m1
B
d
m2
B
· · · d
1
B
d
0
B
that represent the computed value on base B.
Representing numbers in the hexadecimal numeral system is more compact than representing numbers
in the binary numeral system. For example, the representation of number one thousand in hexadecimal
(3E8
16
) requires only three digits while in binary (1111101000
2
) it requires ten digits. Also, since both
bases are power of two, converting between these bases can be done by replacing subsets of consecutive
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
11
+
2.1. NUMERAL SYSTEMS AND THE POSITIONAL NOTATION
Algorithm 2: Algorithm to compute the sequence of digits d
m1
b
d
m2
b
· · · d
1
b
d
0
b
that represent
value V on base b.
input : Value V and base b.
output: Sequence of digits d
m1
b
d
m2
b
· · · d
1
b
d
0
b
.
1 i 0 ;
2 tmp V ;
3 while tmp = 0 do
4 rem tmp mod b ;
5 d
i
b
symbol f rom value(rem, b) ;
6 tmp tmp / b ;
7 i i + 1 ;
8 end
To illustrate the use of Algorithm 2 lets compute the sequence of digits d
m1
2
d
m2
2
· · · d
1
2
d
0
2
that
represent value twenty six on base 2. First, we divide twenty six by two. The remainder of this division
is zero and the quotient is thirteen, hence, v(d
0
2
) = zero and d
0
2
= “0”. This process is illustrated in
Figure 2.1 (a). To compute v(d
1
2
) we now divide thirteen (i.e., the quotient of the last division) by
two. The remainder of this division is one and the quotient is six, hence, v(d
1
2
) = one and d
1
2
= “1”.
This partial result is illustrated in Figure 2.1 (b). To compute v(d
2
2
) we now divide six (the previous
quotient) by two. The remainder of this division is zero and the quotient is three, hence, v(d
2
2
) = zero
and d
2
2
= “0”. Now, we divide three by two. The remainder of this division is one and the quotient is
one, hence, v(d
3
2
) = one and d
3
2
= “1”. Again, we divide the last quotient (one) by two. The remainder of
this division is one and the quotient is zero, hence, v(d
4
2
) = one and d
4
2
= “1”. Since the last quotient is
zero, the process is complete. As a result, the sequence 11010
2
represents value twenty six on the binary
numeral system. Figure 2.1 (c) shows all the quotients and remainders computed during the execution
of Algorithm 2.
26
13
2
- 26
0
6
2
- 12
1
26
13
2
- 26
0
quotient
remainder
26
13
2
- 26
0
6
2
- 12
1
3
2
- 6
0
1
2
- 2
1
0
2
- 0
1
v(d
0
2
) =
v(d
1
2
) =
v(d
0
2
) =
v(d
1
2
) =
v(d
2
2
) =
v(d
3
2
) =
v(d
4
2
) =
(a) (b) (c)
Figure 2.1: Example of applying Algorithm 2 to compute the sequence of digits d
m1
2
d
m2
2
· · · d
1
2
d
0
2
that
represent value twenty six on base 2. (a) First iteration of the algorithm. (b) Values of v(d
0
2
) and v(d
1
2
)
computed after two iterations. (c) Final result: 11010
2
= twenty six.
Figure 2.2 shows an example of applying Algorithm 2 to compute the sequence of digits d
m1
16
d
m2
16
· · · d
1
16
d
0
16
that represent value twenty six on base 16.
To convert a number from a positional numeral system with base A to a number on a
positional numeral system with base B, one may use Equation 2.4 to compute the value of
the number in base A and Algorithm 2 to compute the sequence of digits d
m1
B
d
m2
B
· · · d
1
B
d
0
B
that represent the computed value on base B.
Representing numbers in the hexadecimal numeral system is more compact than representing numbers
in the binary numeral system. For example, the representation of number one thousand in hexadecimal
(3E8
16
) requires only three digits while in binary (1111101000
2
) it requires ten digits. Also, since both
bases are power of two, converting between these bases can be done by replacing subsets of consecutive
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
11
diff --git a/book/riscv-book-25.page b/book/riscv-book-25.page index 7751f44..acc7385 100644 --- a/book/riscv-book-25.page +++ b/book/riscv-book-25.page @@ -1 +1 @@ -
2.2. REPRESENTING NUMBERS ON COMPUTERS
26
1
16
- 16
10
0
16
- 0
1
26
1
16
- 16
10
quotient
remainder
v(d
0
16
) =
v(d
1
16
) =
(a) (b) (c)
v(d
0
16
) = 10 => d
0
16
= "A"
v(d
1
16
) = 1 => d
1
16
= "1"
1A
16
= twenty six
Figure 2.2: Example of applying Algorithm 2 to compute the sequence of digits d
m1
16
d
m2
16
· · · d
1
16
d
0
16
that represent value twenty six on base 16. (a) First iteration of the algorithm. (b) Values of v(d
0
16
) and
v(d
1
16
) computed after two iterations. (c) Final result: 1A
16
= twenty six.
four bits by single hexadecimal digits, and vice versa. For example, Equation 2.8 illustrates how number
3E8
16
can be converted to binary and Equation 2.9 shows how number 10110101110101
2
can be converted
to hexadecimal.
3
|{z}
0011
2
E
|{z}
1110
2
8
|{z}
1000
2
16
= 001111101000
2
= 1111101000
2
(2.8)
10
|{z}
2
16
1101
|{z}
D
16
0111
|{z}
7
16
0101
|{z}
5
16
2
= 2D75
16
(2.9)
2.2 Representing numbers on computers
A binary digit, or bit, is a digit in the binary numeral system, i.e., a digit that may assume one of two
values, “0” (zero) or “1” (one).
Most modern computers are built using digital electronic circuitry. These machines usually represent
information using voltage levels that are mapped to two states, HIGH and LOW, or “1” (one) and “0”
(zero). Hence, the basic unit of information on modern computers is a bit. Consequently, numbers on
computers are represented by a sequence of binary digits, or bits.
2.2.1 Unsigned numbers
On computers, unsigned numbers are represented using the binary positional numeral system with m
bits. In other words, unsigned numbers are represented by a sequence of m binary digits (or bits) d
m1
2
d
m2
2
· · · d
1
2
d
0
2
and the value of the number is defined by Equation 2.5.
Unsigned numbers are a subset of the natural numbers (N). The natural numbers set has infinite
numbers (zero to infinite), however, the set of unsigned numbers that can be represented on computers
depends on the amount of bits being used to represent the number. For example, if only 8 bits are being
used to represent the number, then, only 256 numbers can be represented. In this case, the smallest
number is zero (00000000
2
) and the largest one is 255 (11111111
2
). The unsigned numbers’ representation
can represent natural numbers in the range [0 . . (2
m
1)] with a sequence of m bits.
Typically, programming language types are mapped by the compiler to a native type, i.e., a type
known by the computer architecture. For example, on a 32-bit computer, the “C” unsigned integer
type is mapped by the compiler to a “32-bit word”. In other words, on a 32-bit computer, an unsigned
integer can represent numbers from zero to 2
32
1. In this context, zero is represented by:
000000000 000000000 000000000 000000000
2
(2.10)
while 2
32
1 is represented by
11111111 11111111 11111111 11111111
2
(2.11)
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
12
+
2.2. REPRESENTING NUMBERS ON COMPUTERS
26
1
16
- 16
10
0
16
- 0
1
26
1
16
- 16
10
quotient
remainder
v(d
0
16
) =
v(d
1
16
) =
(a) (b) (c)
v(d
0
16
) = 10 => d
0
16
= "A"
v(d
1
16
) = 1 => d
1
16
= "1"
1A
16
= twenty six
Figure 2.2: Example of applying Algorithm 2 to compute the sequence of digits d
m1
16
d
m2
16
· · · d
1
16
d
0
16
that represent value twenty six on base 16. (a) First iteration of the algorithm. (b) Values of v(d
0
16
) and
v(d
1
16
) computed after two iterations. (c) Final result: 1A
16
= twenty six.
four bits by single hexadecimal digits, and vice versa. For example, Equation 2.8 illustrates how number
3E8
16
can be converted to binary and Equation 2.9 shows how number 10110101110101
2
can be converted
to hexadecimal.
3
|{z}
0011
2
E
|{z}
1110
2
8
|{z}
1000
2
16
= 001111101000
2
= 1111101000
2
(2.8)
10
|{z}
2
16
1101
|{z}
D
16
0111
|{z}
7
16
0101
|{z}
5
16
2
= 2D75
16
(2.9)
2.2 Representing numbers on computers
A binary digit, or bit, is a digit in the binary numeral system, i.e., a digit that may assume one of two
values, “0” (zero) or “1” (one).
Most modern computers are built using digital electronic circuitry. These machines usually represent
information using voltage levels that are mapped to two states, HIGH and LOW, or “1” (one) and “0”
(zero). Hence, the basic unit of information on modern computers is a bit. Consequently, numbers on
computers are represented by a sequence of binary digits, or bits.
2.2.1 Unsigned numbers
On computers, unsigned numbers are represented using the binary positional numeral system with m
bits. In other words, unsigned numbers are represented by a sequence of m binary digits (or bits) d
m1
2
d
m2
2
· · · d
1
2
d
0
2
and the value of the number is defined by Equation 2.5.
Unsigned numbers are a subset of the natural numbers (N). The natural numbers set has infinite
numbers (zero to infinite), however, the set of unsigned numbers that can be represented on computers
depends on the amount of bits being used to represent the number. For example, if only 8 bits are being
used to represent the number, then, only 256 numbers can be represented. In this case, the smallest
number is zero (00000000
2
) and the largest one is 255 (11111111
2
). The unsigned numbers’ representation
can represent natural numbers in the range [0 . . (2
m
1)] with a sequence of m bits.
Typically, programming language types are mapped by the compiler to a native type, i.e., a type
known by the computer architecture. For example, on a 32-bit computer, the “C” unsigned integer
type is mapped by the compiler to a “32-bit word”. In other words, on a 32-bit computer, an unsigned
integer can represent numbers from zero to 2
32
1. In this context, zero is represented by:
000000000 000000000 000000000 000000000
2
(2.10)
while 2
32
1 is represented by
11111111 11111111 11111111 11111111
2
(2.11)
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
12
diff --git a/book/riscv-book-26.page b/book/riscv-book-26.page index c664433..fbb2efe 100644 --- a/book/riscv-book-26.page +++ b/book/riscv-book-26.page @@ -1 +1 @@ -
2.2. REPRESENTING NUMBERS ON COMPUTERS
To illustrate this concept, Table 2.3 shows the list of unsigned numbers that can be represented with
three-bit words.
Three-bit word
Value in the
unsigned representation
000 0
10
001 1
10
010 2
10
011 3
10
100 4
10
101 5
10
110 6
10
111 7
10
Table 2.3: Unsigned numbers that can be represented with three-bit words.
2.2.2 Signed numbers
On computers, signed numbers are a subset of the integer numbers (I). The set of signed numbers
usually include negative and non-negative numbers. While the integer numbers set is infinite, the set
of signed numbers that can be represented on computers depends on the amount of bits being used
to represent the number and on the signed number representation. The most common signed number
representation is the “two’s complement”. The next sections presents the “signal and magnitude”, the
“one’s complement”, and the “two’s complement” representation.
Signal and magnitude
The “signal and magnitude” is a number representation that can be used to represent signed numbers. In
this representation, signed numbers are represented as a sequence of m bits so that bit d
m1
2
represents
the signal of the number and the remaining bits, i.e., bits d
m2
2
to d
0
2
, represent the magnitude. The
magnitude value can be computed using Equation 2.5. In this context, in case bit d
m1
2
is “1”, then the
number is negative, otherwise, it is non-negative. Table 2.4 show the values of three-bit words on the
unsigned and signal and magnitude representations.
Three-bit word
Value
unsigned
signal and
magnitude
000 0
10
0
10
001 1
10
1
10
010 2
10
2
10
011 3
10
3
10
100 4
10
0
10
101 5
10
1
10
110 6
10
2
10
111 7
10
3
10
Table 2.4: Values of three-bit words on the unsigned and signal and magnitude representations.
The “signal and magnitude” representation can represent numbers in the range [(2
m1
1) . . (2
m1
1)] with a sequence of m bits.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
13
+
2.2. REPRESENTING NUMBERS ON COMPUTERS
To illustrate this concept, Table 2.3 shows the list of unsigned numbers that can be represented with
three-bit words.
Three-bit word
Value in the
unsigned representation
000 0
10
001 1
10
010 2
10
011 3
10
100 4
10
101 5
10
110 6
10
111 7
10
Table 2.3: Unsigned numbers that can be represented with three-bit words.
2.2.2 Signed numbers
On computers, signed numbers are a subset of the integer numbers (I). The set of signed numbers
usually include negative and non-negative numbers. While the integer numbers set is infinite, the set
of signed numbers that can be represented on computers depends on the amount of bits being used
to represent the number and on the signed number representation. The most common signed number
representation is the “two’s complement”. The next sections presents the “signal and magnitude”, the
“one’s complement”, and the “two’s complement” representation.
Signal and magnitude
The “signal and magnitude” is a number representation that can be used to represent signed numbers. In
this representation, signed numbers are represented as a sequence of m bits so that bit d
m1
2
represents
the signal of the number and the remaining bits, i.e., bits d
m2
2
to d
0
2
, represent the magnitude. The
magnitude value can be computed using Equation 2.5. In this context, in case bit d
m1
2
is “1”, then the
number is negative, otherwise, it is non-negative. Table 2.4 show the values of three-bit words on the
unsigned and signal and magnitude representations.
Three-bit word
Value
unsigned
signal and
magnitude
000 0
10
0
10
001 1
10
1
10
010 2
10
2
10
011 3
10
3
10
100 4
10
0
10
101 5
10
1
10
110 6
10
2
10
111 7
10
3
10
Table 2.4: Values of three-bit words on the unsigned and signal and magnitude representations.
The “signal and magnitude” representation can represent numbers in the range [(2
m1
1) . . (2
m1
1)] with a sequence of m bits.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
13
diff --git a/book/riscv-book-27.page b/book/riscv-book-27.page index 1ca0e94..bd005f6 100644 --- a/book/riscv-book-27.page +++ b/book/riscv-book-27.page @@ -1 +1 @@ -
2.2. REPRESENTING NUMBERS ON COMPUTERS
One’s complement
The “one’s complement” representation is a number representation that can be used to represent signed
numbers. In this representation, signed numbers are represented as a sequence of m bits so that bit
d
m1
2
represents the signal of the number. If bit d
m1
2
is “1”, then the number is negative, otherwise, it
is non-negative.
The magnitude of a non-negative number represented in one’s complement (i.e., a number in which
d
m1
2
= “0”) is computed in the same way the value of unsigned numbers are computed, i.e., using
Equation 2.5. For example, the three-bit number “010” is a non-negative number in one’s complement
representation and its magnitude is two, since 0 × 2
2
+ 1 × 2
1
+ 0 × 2
0
= two.
The magnitude of a negative number represented in one’s complement (i.e., a number in which
d
m1
2
= “1”) is computed by first “complementing” (inverting) all bits and then using Equation 2.5. For
example, the three-bit number “110” is a negative number in one’s complement representation and its
magnitude is one, since the value of its complement (“001”) is one (0 × 2
2
+ 0 × 2
1
+ 1 × 2
0
= one).
Table 2.5 shows the values of three-bit words on the unsigned, signal and magnitude, and one’s
complement representations. Similar to the signal and magnitude representation, there are two repre-
sentations for value zero on the one’s complement representation.
Three-bit word
Value
unsigned
signal and one’s two’s
magnitude complement complement
000 0
10
0
10
0
10
0
10
001 1
10
1
10
1
10
1
10
010 2
10
2
10
2
10
2
10
011 3
10
3
10
3
10
3
10
100 4
10
0
10
3
10
4
10
101 5
10
1
10
2
10
3
10
110 6
10
2
10
1
10
2
10
111 7
10
3
10
0
10
1
10
Table 2.5: Values of three-bit words on the unsigned, signal and magnitude, one’s complement and two’s
complement representations.
The “one’s complement” representation can represent numbers in the range
[(2
m1
1) . . (2
m1
1)] with a sequence of m bits.
Two’s complement
The “two’s complement” representation is also a number representation that can be used to represent
signed numbers. Also, in this representation, signed numbers are represented as a sequence of m bits
so that bit d
m1
2
represents the signal of the number. If bit d
m1
2
is “1”, then the number is negative,
otherwise, it is non-negative.
The magnitude of a non-negative number represented in two’s complement (i.e., a number in which
d
m1
2
= “0”) is computed in the same way the value of unsigned numbers are computed, i.e., using
Equation 2.5. For example, the three-bit number “010” is a non-negative number in two’s complement
representation and its magnitude is two, since 0 × 2
2
+ 1 × 2
1
+ 0 × 2
0
= two.
The magnitude of a negative number represented in two’s complement (i.e., a number in which
d
m1
2
= “1”) is computed by first “complementing” (inverting) all bits, then adding one, and, finally,
using Equation 2.5. For example, the three-bit number “110” is a negative number in two’s complement
representation and its magnitude is two, since the value of its complement (“001”) plus one is two.
Table 2.5 shows the values of three-bit words on the unsigned, signal and magnitude, one’s comple-
ment, and two’s complement representations. Notice that there is only one representation for value zero
on the two’s complement representation.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
14
+
2.2. REPRESENTING NUMBERS ON COMPUTERS
One’s complement
The “one’s complement” representation is a number representation that can be used to represent signed
numbers. In this representation, signed numbers are represented as a sequence of m bits so that bit
d
m1
2
represents the signal of the number. If bit d
m1
2
is “1”, then the number is negative, otherwise, it
is non-negative.
The magnitude of a non-negative number represented in one’s complement (i.e., a number in which
d
m1
2
= “0”) is computed in the same way the value of unsigned numbers are computed, i.e., using
Equation 2.5. For example, the three-bit number “010” is a non-negative number in one’s complement
representation and its magnitude is two, since 0 × 2
2
+ 1 × 2
1
+ 0 × 2
0
= two.
The magnitude of a negative number represented in one’s complement (i.e., a number in which
d
m1
2
= “1”) is computed by first “complementing” (inverting) all bits and then using Equation 2.5. For
example, the three-bit number “110” is a negative number in one’s complement representation and its
magnitude is one, since the value of its complement (“001”) is one (0 × 2
2
+ 0 × 2
1
+ 1 × 2
0
= one).
Table 2.5 shows the values of three-bit words on the unsigned, signal and magnitude, and one’s
complement representations. Similar to the signal and magnitude representation, there are two repre-
sentations for value zero on the one’s complement representation.
Three-bit word
Value
unsigned
signal and one’s two’s
magnitude complement complement
000 0
10
0
10
0
10
0
10
001 1
10
1
10
1
10
1
10
010 2
10
2
10
2
10
2
10
011 3
10
3
10
3
10
3
10
100 4
10
0
10
3
10
4
10
101 5
10
1
10
2
10
3
10
110 6
10
2
10
1
10
2
10
111 7
10
3
10
0
10
1
10
Table 2.5: Values of three-bit words on the unsigned, signal and magnitude, one’s complement and two’s
complement representations.
The “one’s complement” representation can represent numbers in the range
[(2
m1
1) . . (2
m1
1)] with a sequence of m bits.
Two’s complement
The “two’s complement” representation is also a number representation that can be used to represent
signed numbers. Also, in this representation, signed numbers are represented as a sequence of m bits
so that bit d
m1
2
represents the signal of the number. If bit d
m1
2
is “1”, then the number is negative,
otherwise, it is non-negative.
The magnitude of a non-negative number represented in two’s complement (i.e., a number in which
d
m1
2
= “0”) is computed in the same way the value of unsigned numbers are computed, i.e., using
Equation 2.5. For example, the three-bit number “010” is a non-negative number in two’s complement
representation and its magnitude is two, since 0 × 2
2
+ 1 × 2
1
+ 0 × 2
0
= two.
The magnitude of a negative number represented in two’s complement (i.e., a number in which
d
m1
2
= “1”) is computed by first “complementing” (inverting) all bits, then adding one, and, finally,
using Equation 2.5. For example, the three-bit number “110” is a negative number in two’s complement
representation and its magnitude is two, since the value of its complement (“001”) plus one is two.
Table 2.5 shows the values of three-bit words on the unsigned, signal and magnitude, one’s comple-
ment, and two’s complement representations. Notice that there is only one representation for value zero
on the two’s complement representation.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
14
diff --git a/book/riscv-book-28.page b/book/riscv-book-28.page index 5b89fed..6c5461f 100644 --- a/book/riscv-book-28.page +++ b/book/riscv-book-28.page @@ -1 +1 @@ -
2.2. REPRESENTING NUMBERS ON COMPUTERS
Another interesting characteristic of the two’s complement representation is that the addition, sub-
traction, and multiplication of two m-bit numbers in this representation are identical to the addition,
subtraction, and multiplication operations of two m-bit numbers in the unsigned binary representation
3
.
As a consequence, the same hardware may be used to perform these operations both on unsigned numbers
and signed numbers represented in “two’s complement”. Figure 2.3 shows an example in which two num-
bers are added and the same sequence of bits is produced both in the unsigned numbers representation
and the two’s complement representation.
Sequence Unsigned Two’s complement
of bits representation representation
010
2
2
10
2
10
+100
2
+4
10
+4
10
110
2
6
10
2
10
Figure 2.3: The addition of two numbers produces the same sequence of bits both in the unsigned
numbers representation and the two’s complement representation.
The two’s complement representation can represent numbers in the range
[(2
m1
) . . (2
m1
1)] with a sequence of m bits.
NOTE: The two’s complement is the most common method to represent signed integer numbers
on modern computers.
2.2.3 Binary arithmetic and overflow
Arithmetic on unsigned binary numbers is similar to arithmetic on unsigned decimal numbers. When
adding two unsigned binary numbers
4
, digits are added one by one, from the least significant one (d
0
2
)
to the most significant one (d
m1
2
), i.e., from the rightmost digit to the leftmost digit. In some cases,
the addition of two digits produces a value that cannot be represented by a single digit. In these cases,
a carry out is produced and its value must be added to the next most significant digit. In the binary
representation, this situation occurs when the result is greater than one.
Figure 2.4 (a) illustrates the addition of two three-bit unsigned binary numbers. First, the two least
significant (rightmost) digits are added together. Since the result (two=10
2
) cannot be represented by
a single binary digit, the least significant digit of the result, i.e., zero, is placed in the current position
and a carry is produced and placed on top of the next digit (the dashed arrow illustrates this process).
Then, the second least significant digits (1 and 1) must be added. In this case, since there is a carry
from the previous digit addition, the carry is also added to both digits. The result of this addition is
three (11), hence, another carry is produced and placed on top of the most significant digit. Again,
the least significant digit of the result, i.e., one, is placed in the current position. Finally, the most
significant digits are added together with their carry and the result is one. Figure 2.4 (b) illustrates the
same addition using a simplified (cleaner) representation.
Subtraction of unsigned binary numbers is also performed in a similar way decimal numbers are
subtracted. When subtracting two unsigned binary numbers, digits are subtracted one by one, from
the least significant one (d
0
2
) to the most significant one (d
m1
2
), i.e., from the rightmost digit to the
leftmost digit. In some cases, the subtraction is not possible because the first operand is smaller than
the second one. In these cases, “some value” is borrowed from the left digit and this borrowed value
must be accounted for when performing the subtraction on the left digit.
3
This is only true if the output is represented using the same number of bits as the inputs (i.e., m bits) and if any
overflow beyond these bits are discarded. This is usually the case in modern computers.
4
As discussed in previous section, adding (subtracting) two m-bit unsigned binary numbers produces the same sequence
of m-bits as adding (subtracting) two m-bit signed numbers on the two’s complement representation. Hence, the same
approach used for unsigned binary numbers may be used to perform addition and subtraction operations on signed numbers
using the two’s complement representation.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
15
+
2.2. REPRESENTING NUMBERS ON COMPUTERS
Another interesting characteristic of the two’s complement representation is that the addition, sub-
traction, and multiplication of two m-bit numbers in this representation are identical to the addition,
subtraction, and multiplication operations of two m-bit numbers in the unsigned binary representation
3
.
As a consequence, the same hardware may be used to perform these operations both on unsigned numbers
and signed numbers represented in “two’s complement”. Figure 2.3 shows an example in which two num-
bers are added and the same sequence of bits is produced both in the unsigned numbers representation
and the two’s complement representation.
Sequence Unsigned Two’s complement
of bits representation representation
010
2
2
10
2
10
+100
2
+4
10
+4
10
110
2
6
10
2
10
Figure 2.3: The addition of two numbers produces the same sequence of bits both in the unsigned
numbers representation and the two’s complement representation.
The two’s complement representation can represent numbers in the range
[(2
m1
) . . (2
m1
1)] with a sequence of m bits.
NOTE: The two’s complement is the most common method to represent signed integer numbers
on modern computers.
2.2.3 Binary arithmetic and overflow
Arithmetic on unsigned binary numbers is similar to arithmetic on unsigned decimal numbers. When
adding two unsigned binary numbers
4
, digits are added one by one, from the least significant one (d
0
2
)
to the most significant one (d
m1
2
), i.e., from the rightmost digit to the leftmost digit. In some cases,
the addition of two digits produces a value that cannot be represented by a single digit. In these cases,
a carry out is produced and its value must be added to the next most significant digit. In the binary
representation, this situation occurs when the result is greater than one.
Figure 2.4 (a) illustrates the addition of two three-bit unsigned binary numbers. First, the two least
significant (rightmost) digits are added together. Since the result (two=10
2
) cannot be represented by
a single binary digit, the least significant digit of the result, i.e., zero, is placed in the current position
and a carry is produced and placed on top of the next digit (the dashed arrow illustrates this process).
Then, the second least significant digits (1 and 1) must be added. In this case, since there is a carry
from the previous digit addition, the carry is also added to both digits. The result of this addition is
three (11), hence, another carry is produced and placed on top of the most significant digit. Again,
the least significant digit of the result, i.e., one, is placed in the current position. Finally, the most
significant digits are added together with their carry and the result is one. Figure 2.4 (b) illustrates the
same addition using a simplified (cleaner) representation.
Subtraction of unsigned binary numbers is also performed in a similar way decimal numbers are
subtracted. When subtracting two unsigned binary numbers, digits are subtracted one by one, from
the least significant one (d
0
2
) to the most significant one (d
m1
2
), i.e., from the rightmost digit to the
leftmost digit. In some cases, the subtraction is not possible because the first operand is smaller than
the second one. In these cases, “some value” is borrowed from the left digit and this borrowed value
must be accounted for when performing the subtraction on the left digit.
3
This is only true if the output is represented using the same number of bits as the inputs (i.e., m bits) and if any
overflow beyond these bits are discarded. This is usually the case in modern computers.
4
As discussed in previous section, adding (subtracting) two m-bit unsigned binary numbers produces the same sequence
of m-bits as adding (subtracting) two m-bit signed numbers on the two’s complement representation. Hence, the same
approach used for unsigned binary numbers may be used to perform addition and subtraction operations on signed numbers
using the two’s complement representation.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
15
diff --git a/book/riscv-book-29.page b/book/riscv-book-29.page index 6388a6d..0610fda 100644 --- a/book/riscv-book-29.page +++ b/book/riscv-book-29.page @@ -1 +1 @@ -
2.2. REPRESENTING NUMBERS ON COMPUTERS
Figure 2.4: Adding two three-bit binary numbers. (a) Dashed arrows indicate where the carry out comes
from. (b) Simplified representation (without arrows).
Figure 2.5 illustrates the subtraction of two three-bit unsigned binary numbers. Figure 2.5 (b) shows
the first step, in which the least significant digits are subtracted. Since “1” cannot be subtracted from
“0”, some value must be borrowed from the left column. The “*” character indicates that value had to
be borrowed from the left column. The result in this column is “1”, since “10” (two) minus “1” (one) is
“1”. Figure 2.5 (c) illustrates the operation on the second least significant digit. Since the right column
borrowed from this column, the first operand is now “0”. Again, since “1” cannot be subtracted from
“0”, some value must be borrowed from the left column. The result in this column is “1”, since “10”
(two) minus “1” (one) is “1”. Figure 2.5 (d) shows the subtraction of the most significant digits (zero
minus zero) and the final result. Figure 2.5 (e) shows a simplified representation of the subtraction.
1
0
1
1
- 0
1
(a)
(3
10
)
(6
10
)
1
1
10
1
10
- 0
1
*
(b)
(3
10
)
(6
10
)
1
1
10
1
1
10
- 0
10
**
(c)
(3
10
)
(6
10
)
1
1
10
1
1
10
0
- 0
10
**
(d)
(3
10
)
(3
10
)
(6
10
)
1
1
0
1
1
1
0
- 0
1
**
(e)
(3
10
)
(3
10
)
(6
10
)
Figure 2.5: Subtraction of two three-bit binary numbers. (a) The digits of both numbers are aligned
on columns. (b) First, the least significant digits are subtracted - the “*” character indicates that some
value was borrowed from the left column. (c) The second least significant digits are subtracted - again,
the “*” character indicates that some value was borrowed from the left column. (d) Finally, the most
significant digits are subtracted producing digit “0”. (e) Simplified representation of the subtraction.
2.2.4 Integer overflow
An integer overflow occurs when the result of an arithmetic operation on two integer m-bit binary
numbers is outside the range that can be represented by an m-bit binary number. Figure 2.6 shows an
example in which the addition of two three-bit unsigned binary numbers causes an integer overflow. In
this case, adding one to seven should result in eight, however, the value eight cannot be represented
using only three bits on the unsigned binary representation.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
16
+
2.2. REPRESENTING NUMBERS ON COMPUTERS
10
1
1
11
1
1
1
+ 0
0
11
0
1
1
1
1
1
1
+ 0
0
11
(a) (b)
(6
10
)
(3
10
)
(3
10
)
Carry digits
(6
10
)
(3
10
)
(3
10
)
Carry digits
Figure 2.4: Adding two three-bit binary numbers. (a) Dashed arrows indicate where the carry out comes
from. (b) Simplified representation (without arrows).
Figure 2.5 illustrates the subtraction of two three-bit unsigned binary numbers. Figure 2.5 (b) shows
the first step, in which the least significant digits are subtracted. Since “1” cannot be subtracted from
“0”, some value must be borrowed from the left column. The “*” character indicates that value had to
be borrowed from the left column. The result in this column is “1”, since “10” (two) minus “1” (one) is
“1”. Figure 2.5 (c) illustrates the operation on the second least significant digit. Since the right column
borrowed from this column, the first operand is now “0”. Again, since “1” cannot be subtracted from
“0”, some value must be borrowed from the left column. The result in this column is “1”, since “10”
(two) minus “1” (one) is “1”. Figure 2.5 (d) shows the subtraction of the most significant digits (zero
minus zero) and the final result. Figure 2.5 (e) shows a simplified representation of the subtraction.
1
0
1
1
- 0
1
(a)
(3
10
)
(6
10
)
1
1
10
1
10
- 0
1
*
(b)
(3
10
)
(6
10
)
1
1
10
1
1
10
- 0
10
**
(c)
(3
10
)
(6
10
)
1
1
10
1
1
10
0
- 0
10
**
(d)
(3
10
)
(3
10
)
(6
10
)
1
1
0
1
1
1
0
- 0
1
**
(e)
(3
10
)
(3
10
)
(6
10
)
Figure 2.5: Subtraction of two three-bit binary numbers. (a) The digits of both numbers are aligned
on columns. (b) First, the least significant digits are subtracted - the “*” character indicates that some
value was borrowed from the left column. (c) The second least significant digits are subtracted - again,
the “*” character indicates that some value was borrowed from the left column. (d) Finally, the most
significant digits are subtracted producing digit “0”. (e) Simplified representation of the subtraction.
2.2.4 Integer overflow
An integer overflow occurs when the result of an arithmetic operation on two integer m-bit binary
numbers is outside the range that can be represented by an m-bit binary number. Figure 2.6 shows an
example in which the addition of two three-bit unsigned binary numbers causes an integer overflow. In
this case, adding one to seven should result in eight, however, the value eight cannot be represented
using only three bits on the unsigned binary representation.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
16
diff --git a/book/riscv-book-3.page b/book/riscv-book-3.page index 7c3ab55..ebbe2b1 100644 --- a/book/riscv-book-3.page +++ b/book/riscv-book-3.page @@ -1 +1 @@ -
Copyright © 2023 Edson Borin
All rights reserved. This book or any portion thereof may not be reproduced or used in any
manner whatsoever without the express written permission of the author except for the use of
brief quotation in a book review.
ISBN:978-65-00-15811-3
First edition 2021
Edson Borin
Institute of Computing - University of Campinas
Av. Albert Einstein, 1251
Cidade Universit´aria Zeferino Vaz
Bar˜ao Geraldo - Campinas - SP - Brasil
www.ic.unicamp.br/
~
edson
13083-852
An updated version of this book and other material may be available at: riscv-programming.
org
+
Copyright © 2023 Edson Borin
All rights reserved. This book or any portion thereof may not be reproduced or used in any
manner whatsoever without the express written permission of the author except for the use of
brief quotation in a book review.
ISBN:978-65-00-15811-3
First edition 2021
Edson Borin
Institute of Computing - University of Campinas
Av. Albert Einstein, 1251
Cidade Universit´aria Zeferino Vaz
Bar˜ao Geraldo - Campinas - SP - Brasil
www.ic.unicamp.br/
~
edson
13083-852
An updated version of this book and other material may be available at: riscv-programming.
org
diff --git a/book/riscv-book-30.page b/book/riscv-book-30.page index 5eb342e..b810078 100644 --- a/book/riscv-book-30.page +++ b/book/riscv-book-30.page @@ -1 +1 @@ -
2.3. REPRESENTING TEXT
1 1 1 carry digits
0 0 1 (1
10
)
+ 1 1 1 (7
10
)
0 0 0 (0
10
)
Figure 2.6: Example of an integer overflow on the unsigned binary representation. The result of one plus
seven cannot be represented by a three-bit unsigned binary number.
Even though the operation illustrated on Figure 2.6 characterizes an integer overflow on the unsigned
binary representation, it does not characterize an integer overflow on the signed (two’s complement)
binary representation. In this case, the operation is adding one (001) to minus one
5
(111) and the
expected result, i.e., zero, can be represented by a three-bit unsigned binary number.
Figure 2.7 shows an example in which the addition of two three-bit signed binary numbers using the
two’s complement method causes an integer overflow. In this case, however, there was no integer overflow
on the unsigned binary number representation. Notice that the result of the operation is as expected,
i.e., four (100), on the unsigned binary representation.
1 1 carry digits
0 1 1 (3
10
)
+ 0 0 1 (1
10
)
1 0 0 (4
10
)
Figure 2.7: Example of an integer overflow on the signed binary representation. The result of three plus
one cannot be represented by a three-bit signed binary number using the two’s complement representa-
tion.
2.3 Representing text
A character is the basic unit of information when representing text on computers and usually corresponds
to a letter (e.g., “a”), a decimal digit (e.g., “2”), a punctuation mark (e.g., “.” or “?”), white spaces, or
even a control information
6
.
The character encoding standard defines how characters are represented on computers.
For example, the American Standard Code for Information Interchange, or ASCII, defines that
characters are represented by seven-bit numbers. Table 2.6 shows a subset of the characters encoded by
the American Standard Code for Information Interchange. Notice that the letter “a” is encoded as the
number 97
10
(110001
2
) while digit “2” is encoded as the number 50
10
(0110010
2
).
The ASCII character encoding standard was designed in the 1960s and, even though it included most
symbols used on the English language, it lacked several important symbols required by other languages,
such letters with accents (e.g., “´a”, “¸c”, ...). In this context, several other character encoding standards
were introduced, including an extension to the ASCII standard, the “Extended ASCII”, or EASCII.
Accordingly to Google
7
, in 2008 the UTF-8 character encoding standard became the most common
encoding for HTML files. As of 2020, a survey performed by the W3Techs web site
8
indicated that more
than 95.5% of the world wide web websites are encoded with the UTF-8 character encoding standard.
The “Unicode (or Universal Coded Character Set) Transformation Format - 8-bit”, or UTF-8 for
short, is a variable-width character encoding standard. In this standard, each character may be repre-
sented by one, two, three, or four bytes, i.e., one, two, three, or four 8-bit numbers. Common characters,
5
Notice that the three-bit sequence 111 represents the value minus one on the two’s complement representation.
6
Control characters are not intended to represent printable information. A line feed, carrier return and backspace are
examples of control characters on computers.
7
https://googleblog.blogspot.com/2008/05/moving-to-unicode-51.html
8
https://w3techs.com/technologies/overview/character_encoding
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
17
+
2.3. REPRESENTING TEXT
1 1 1 carry digits
0 0 1 (1
10
)
+ 1 1 1 (7
10
)
0 0 0 (0
10
)
Figure 2.6: Example of an integer overflow on the unsigned binary representation. The result of one plus
seven cannot be represented by a three-bit unsigned binary number.
Even though the operation illustrated on Figure 2.6 characterizes an integer overflow on the unsigned
binary representation, it does not characterize an integer overflow on the signed (two’s complement)
binary representation. In this case, the operation is adding one (001) to minus one
5
(111) and the
expected result, i.e., zero, can be represented by a three-bit unsigned binary number.
Figure 2.7 shows an example in which the addition of two three-bit signed binary numbers using the
two’s complement method causes an integer overflow. In this case, however, there was no integer overflow
on the unsigned binary number representation. Notice that the result of the operation is as expected,
i.e., four (100), on the unsigned binary representation.
1 1 carry digits
0 1 1 (3
10
)
+ 0 0 1 (1
10
)
1 0 0 (4
10
)
Figure 2.7: Example of an integer overflow on the signed binary representation. The result of three plus
one cannot be represented by a three-bit signed binary number using the two’s complement representa-
tion.
2.3 Representing text
A character is the basic unit of information when representing text on computers and usually corresponds
to a letter (e.g., “a”), a decimal digit (e.g., “2”), a punctuation mark (e.g., “.” or “?”), white spaces, or
even a control information
6
.
The character encoding standard defines how characters are represented on computers.
For example, the American Standard Code for Information Interchange, or ASCII, defines that
characters are represented by seven-bit numbers. Table 2.6 shows a subset of the characters encoded by
the American Standard Code for Information Interchange. Notice that the letter “a” is encoded as the
number 97
10
(110001
2
) while digit “2” is encoded as the number 50
10
(0110010
2
).
The ASCII character encoding standard was designed in the 1960s and, even though it included most
symbols used on the English language, it lacked several important symbols required by other languages,
such letters with accents (e.g., “´a”, “¸c”, ...). In this context, several other character encoding standards
were introduced, including an extension to the ASCII standard, the “Extended ASCII”, or EASCII.
Accordingly to Google
7
, in 2008 the UTF-8 character encoding standard became the most common
encoding for HTML files. As of 2020, a survey performed by the W3Techs web site
8
indicated that more
than 95.5% of the world wide web websites are encoded with the UTF-8 character encoding standard.
The “Unicode (or Universal Coded Character Set) Transformation Format - 8-bit”, or UTF-8 for
short, is a variable-width character encoding standard. In this standard, each character may be repre-
sented by one, two, three, or four bytes, i.e., one, two, three, or four 8-bit numbers. Common characters,
5
Notice that the three-bit sequence 111 represents the value minus one on the two’s complement representation.
6
Control characters are not intended to represent printable information. A line feed, carrier return and backspace are
examples of control characters on computers.
7
https://googleblog.blogspot.com/2008/05/moving-to-unicode-51.html
8
https://w3techs.com/technologies/overview/character_encoding
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
17
diff --git a/book/riscv-book-31.page b/book/riscv-book-31.page index 2356604..bebb860 100644 --- a/book/riscv-book-31.page +++ b/book/riscv-book-31.page @@ -1 +1 @@ -
2.4. ORGANIZING DATA ON THE MEMORY
Binary Hex. Dec. Char.
...
0100001
2
21
16
33
10
!
0100010
2
22
16
34
10
...
0101100
2
2C
16
44
10
,
0101101
2
2D
16
45
10
-
0101110
2
2E
16
46
10
.
0101111
2
2F
16
47
10
/
0110000
2
30
16
48
10
0
0110001
2
31
16
49
10
1
0110010
2
32
16
50
10
2
...
0111000
2
38
16
56
10
8
0111001
2
39
16
57
10
9
...
Binary Hex. Dec. Char.
1000001
2
41
16
65
10
A
1000010
2
42
16
66
10
B
...
1011001
2
59
16
89
10
Y
1011010
2
5A
16
90
10
Z
...
1100001
2
61
16
97
10
a
1100010
2
62
16
98
10
b
...
1111001
2
79
16
121
10
y
1111010
2
7A
16
122
10
z
...
1111100
2
7C
16
124
10
|
1111101
2
7D
16
125
10
}
1111110
2
7E
16
126
10
˜
Table 2.6: Subset of the characters encoded by the ASCII character encoding standard. Hex. and Dec.
columns show the encoding value in hexadecimal and decimal representation while the Char. column
shows the symbol encoded by the character.
such as letters “a”, “b”, and “c”, are represented by a single byte, while more exotic ones are represented
using multiple bytes. The euro currency sign (¤), for example, is encoded using three bytes: 11100010
2
,
10000010
2
, and 10101100
2
.
The UTF-8 standard was designed to be backward compatible with the ASCII standard. Hence,
ASCII characters are represented on the UTF-8 standard using a single byte with the same value. For
example, letter “a” is represented by value ninety seven in both standards. In this way, a software
designed to work with the UTF-8 standard can naturally open and handle ASCII encoded files.
Texts are represented in computers as sequences of characters on memory. For example,
the word “Yes” is represented by a sequence of three characters (“Y”, “e”, and “s”) stored on consecutive
memory positions. In case the ASCII character encoding standard is being used, the three consecutive
memory positions will contain values 121
10
, 101
10
, and 115
10
, respectively. Figure 2.8 illustrates how
the word “ma¸a”
9
is represented in three different character encoding standards: the UTF-8, the ISO-
LATIN-1 and the Mac OS Roman. Each square represents a byte and the values inside the squares are
in hexadecimal. Notice that the UTF-8 standard requires two bytes to represent letter “¸c” and two bytes
to represent letter “˜a”.
61 E7 E3
M a ç ã
ISO-LATIN-1
4D 61 8D 8B
M a ç ã
Mac OS Roman
4D 61 C3 A7
M a
ç ã
UTF-8
4D C3 A3
Figure 2.8: Word “ma¸a” represented in three different character encoding standards: the UTF-8, the
ISO-LATIN-1 and the Mac OS Roman.
2.4 Organizing data on the memory
This section discusses how information is organized on the computer main memory. The discussion
focus on byte addressable memories, which is the most common type of main memory used on modern
9
“Ma¸a” is the word for apple in Portuguese.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
18
+
2.4. ORGANIZING DATA ON THE MEMORY
Binary Hex. Dec. Char.
...
0100001
2
21
16
33
10
!
0100010
2
22
16
34
10
...
0101100
2
2C
16
44
10
,
0101101
2
2D
16
45
10
-
0101110
2
2E
16
46
10
.
0101111
2
2F
16
47
10
/
0110000
2
30
16
48
10
0
0110001
2
31
16
49
10
1
0110010
2
32
16
50
10
2
...
0111000
2
38
16
56
10
8
0111001
2
39
16
57
10
9
...
Binary Hex. Dec. Char.
1000001
2
41
16
65
10
A
1000010
2
42
16
66
10
B
...
1011001
2
59
16
89
10
Y
1011010
2
5A
16
90
10
Z
...
1100001
2
61
16
97
10
a
1100010
2
62
16
98
10
b
...
1111001
2
79
16
121
10
y
1111010
2
7A
16
122
10
z
...
1111100
2
7C
16
124
10
|
1111101
2
7D
16
125
10
}
1111110
2
7E
16
126
10
˜
Table 2.6: Subset of the characters encoded by the ASCII character encoding standard. Hex. and Dec.
columns show the encoding value in hexadecimal and decimal representation while the Char. column
shows the symbol encoded by the character.
such as letters “a”, “b”, and “c”, are represented by a single byte, while more exotic ones are represented
using multiple bytes. The euro currency sign (¤), for example, is encoded using three bytes: 11100010
2
,
10000010
2
, and 10101100
2
.
The UTF-8 standard was designed to be backward compatible with the ASCII standard. Hence,
ASCII characters are represented on the UTF-8 standard using a single byte with the same value. For
example, letter “a” is represented by value ninety seven in both standards. In this way, a software
designed to work with the UTF-8 standard can naturally open and handle ASCII encoded files.
Texts are represented in computers as sequences of characters on memory. For example,
the word “Yes” is represented by a sequence of three characters (“Y”, “e”, and “s”) stored on consecutive
memory positions. In case the ASCII character encoding standard is being used, the three consecutive
memory positions will contain values 121
10
, 101
10
, and 115
10
, respectively. Figure 2.8 illustrates how
the word “ma¸a”
9
is represented in three different character encoding standards: the UTF-8, the ISO-
LATIN-1 and the Mac OS Roman. Each square represents a byte and the values inside the squares are
in hexadecimal. Notice that the UTF-8 standard requires two bytes to represent letter “¸c” and two bytes
to represent letter “˜a”.
Figure 2.8: Word “ma¸a” represented in three different character encoding standards: the UTF-8, the
ISO-LATIN-1 and the Mac OS Roman.
2.4 Organizing data on the memory
This section discusses how information is organized on the computer main memory. The discussion
focus on byte addressable memories, which is the most common type of main memory used on modern
9
“Ma¸a” is the word for apple in Portuguese.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
18
diff --git a/book/riscv-book-32.page b/book/riscv-book-32.page index 9436399..7b27027 100644 --- a/book/riscv-book-32.page +++ b/book/riscv-book-32.page @@ -1 +1 @@ -
2.4. ORGANIZING DATA ON THE MEMORY
computers.
2.4.1 Texts on the main memory
As discussed in Section 2.3, texts are represented in computers as sequences of characters on memory.
The sequence is stored on consecutive memory words, i.e., memory words with consecutive addresses.
ASCII characters are encoded using seven bits, however, when stored on a byte addressable memory,
each character is usually stored in a single memory word, i.e., they occupy eight bits
10
. Consequently, a
five character text (e.g., “hello”) encoded with the ASCII standard is stored on five consecutive memory
words.
UTF-8 characters are encoded using one, two, three, or four bytes, hence, when stored on a byte
addressable memory, each character may require one, two, three, or four memory words. As illustrated
by Figure 2.8, the UTF-8 character encoding standard requires six bytes to represent the word “ma¸a”.
Consequently, it requires six memory words to represent this word on a byte addressable memory.
In programming languages, the term “string” is often used to denote a sequence of characters. A
NULL terminated string is a sequence of characters terminated by the character NULL, which is rep-
resented by value zero on most character encoding standards. A “C” string, i.e., a string on the “C”
programming language, is a NULL terminated string. Hence, in “C”, the string “yes” takes four memory
words, three to store the letters “y”, “e”, and “s”, and another one to store the NULL character. The
following program shows two different ways of declaring and initializing a string in a “C” program. The
first approach (line 2), uses a sequence of symbols between quotes while the second one (line 3) uses an
sequence of hexadecimal values using the array notation.
1 #include<stdio.h>
2 char name1[] = "John";
3 char name2[] = {0x4a, 0x6f, 0x68, 0x6e, 0x00};
4 int main()
5 {
6 printf("Name 1: \"%s\"\n", name1);
7 printf("Name 2: \"%s\"\n", name2);
8 printf("Size of name 1 = %d\n", sizeof(name1));
9 printf("Size of name 2 = %d\n", sizeof(name2));
10 return 0;
11 }
Both strings (name1 and name2) in previous code require five memory words to be stored on memory
11
.
In fact, since the hexadecimal values used in line 3 are the values for the “J”, “o”, “h”, and “n” letters
on the ASCII and UTF-8 encoding standards, both string are identical. The following listing shows the
output of the previous program.
Name 1: "John"
Name 2: "John"
Size of name 1 = 5
Size of name 2 = 5
2.4.2 Numbers on the main memory
As discussed in Section 2.2, numbers on computers are represented by a sequence of m bits. In case m
is greater than the memory word size, then, the sequence of m bits must be split and stored on multiple
consecutive memory words. For example, a 32-bit number is split in four 8-bit parts and stored on four
consecutive memory words on a byte addressable memory.
10
In this case, the eighth bit is always set as zero.
11
Notice that the string “John” is terminated by a NULL character in “C”.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
19
+
2.4. ORGANIZING DATA ON THE MEMORY
computers.
2.4.1 Texts on the main memory
As discussed in Section 2.3, texts are represented in computers as sequences of characters on memory.
The sequence is stored on consecutive memory words, i.e., memory words with consecutive addresses.
ASCII characters are encoded using seven bits, however, when stored on a byte addressable memory,
each character is usually stored in a single memory word, i.e., they occupy eight bits
10
. Consequently, a
five character text (e.g., “hello”) encoded with the ASCII standard is stored on five consecutive memory
words.
UTF-8 characters are encoded using one, two, three, or four bytes, hence, when stored on a byte
addressable memory, each character may require one, two, three, or four memory words. As illustrated
by Figure 2.8, the UTF-8 character encoding standard requires six bytes to represent the word “ma¸a”.
Consequently, it requires six memory words to represent this word on a byte addressable memory.
In programming languages, the term “string” is often used to denote a sequence of characters. A
NULL terminated string is a sequence of characters terminated by the character NULL, which is rep-
resented by value zero on most character encoding standards. A “C” string, i.e., a string on the “C”
programming language, is a NULL terminated string. Hence, in “C”, the string “yes” takes four memory
words, three to store the letters “y”, “e”, and “s”, and another one to store the NULL character. The
following program shows two different ways of declaring and initializing a string in a “C” program. The
first approach (line 2), uses a sequence of symbols between quotes while the second one (line 3) uses an
sequence of hexadecimal values using the array notation.
1 #include<stdio.h>
2 char name1[] = "John";
3 char name2[] = {0x4a, 0x6f, 0x68, 0x6e, 0x00};
4 int main()
5 {
6 printf("Name 1: \"%s\"\n", name1);
7 printf("Name 2: \"%s\"\n", name2);
8 printf("Size of name 1 = %d\n", sizeof(name1));
9 printf("Size of name 2 = %d\n", sizeof(name2));
10 return 0;
11 }
Both strings (name1 and name2) in previous code require five memory words to be stored on memory
11
.
In fact, since the hexadecimal values used in line 3 are the values for the “J”, “o”, “h”, and “n” letters
on the ASCII and UTF-8 encoding standards, both string are identical. The following listing shows the
output of the previous program.
Name 1: "John"
Name 2: "John"
Size of name 1 = 5
Size of name 2 = 5
2.4.2 Numbers on the main memory
As discussed in Section 2.2, numbers on computers are represented by a sequence of m bits. In case m
is greater than the memory word size, then, the sequence of m bits must be split and stored on multiple
consecutive memory words. For example, a 32-bit number is split in four 8-bit parts and stored on four
consecutive memory words on a byte addressable memory.
10
In this case, the eighth bit is always set as zero.
11
Notice that the string “John” is terminated by a NULL character in “C”.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
19
diff --git a/book/riscv-book-33.page b/book/riscv-book-33.page index 333ce2d..4ba5a1c 100644 --- a/book/riscv-book-33.page +++ b/book/riscv-book-33.page @@ -1 +1 @@ -
2.4. ORGANIZING DATA ON THE MEMORY
The endianness format refers to the order in which the bytes are stored on a computing system
memory. There are two common formats: little-endian and big-endian. The little-endian format places
the least significant byte (LSB) on the memory position associated with the lowest address while the
big-endian format places the least significant byte on the memory position associated with the highest
address. Figure 2.9 illustrates how the 32-bit number 00000000 00000000 00000100 00000001
2
(1025
10
)
can be stored on a byte addressable memory starting on address 000 in both formats. Notice that in the
little-endian format (Figure 2.9 (a)), the least significant byte (00000001
2
) is stored in address 000 while
in the big-endian format (Figure 2.9 (b)), the least significant byte (00000001
2
) is stored in address 003.
Address Contents
000 00000001
2
LSB
001 00000100
2
002 00000000
2
003 00000000
2
(a) little-endian
Address Contents
000 00000000
2
001 00000000
2
002 00000100
2
003 00000001
2
LSB
(b) big-endian
Figure 2.9: 32-bit number 00000000 00000000 00000100 00000001
2
(1025
10
) stored on four consecutive
memory words using the (a) little-endian and the (b) big-endian endianness formats.
2.4.3 Arrays on the main memory
In programming languages, an array is a systematic arrangement of similar objects in which each object
is identified by an index. A one-dimensional array, a.k.a. a vector, is an array in which the objects, or
the array elements, are identified by a one-dimensional index. The following “C” code shows a vector (V)
that contains four int elements and a function that prints the first and the last element of the vector.
Notice that the first element is associated with index zero while the last one is associated with index
two
12
.
1 int V[] = {9, 8, 1};
2 void print_V()
3 {
4 printf("First element = %d\n", V[0]);
5 printf("Last element = %d\n", V[2]);
6 }
Vector elements are usually organized in a linear fashion on the memory. Hence, when translating
the previous code into machine language, all elements (int values) of vector V are placed in consecutive
memory positions - starting with the first element, i.e., V[0]. The base address of an array is the
address of the first memory word that is being used to store the array elements. Assuming
the base address of vector V is 000, then the first element (V[0]) is stored starting at memory address
000. Also, assuming each element requires four memory words
13
, the second element is stored starting
at memory address 004 and the third one starting at memory address 008. Figure 2.10 illustrates the
contents of vector V placed on memory starting at address 000. Notice that, in this example, each element
is a 32-bit number that is stored on four consecutive memory words using the little-endian format.
The previous example showed an array of int elements. Nonetheless, in “C”, the programmer may
also create arrays of other types. For example, one may create an array of char, in which each element
occupies only one byte, an array of double, in which each element occupies 8 bytes, or even an array of
a new type defined with the struct operator, in which each element may occupy several bytes.
12
This is a property of the “C” programming language. Other languages, such as Pascal, associate the first element with
index one.
13
The “C” int type is used to represent integer numbers and is usually mapped to 32-bit signed numbers.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
20
+
2.4. ORGANIZING DATA ON THE MEMORY
The endianness format refers to the order in which the bytes are stored on a computing system
memory. There are two common formats: little-endian and big-endian. The little-endian format places
the least significant byte (LSB) on the memory position associated with the lowest address while the
big-endian format places the least significant byte on the memory position associated with the highest
address. Figure 2.9 illustrates how the 32-bit number 00000000 00000000 00000100 00000001
2
(1025
10
)
can be stored on a byte addressable memory starting on address 000 in both formats. Notice that in the
little-endian format (Figure 2.9 (a)), the least significant byte (00000001
2
) is stored in address 000 while
in the big-endian format (Figure 2.9 (b)), the least significant byte (00000001
2
) is stored in address 003.
Address Contents
000 00000001
2
LSB
001 00000100
2
002 00000000
2
003 00000000
2
(a) little-endian
Address Contents
000 00000000
2
001 00000000
2
002 00000100
2
003 00000001
2
LSB
(b) big-endian
Figure 2.9: 32-bit number 00000000 00000000 00000100 00000001
2
(1025
10
) stored on four consecutive
memory words using the (a) little-endian and the (b) big-endian endianness formats.
2.4.3 Arrays on the main memory
In programming languages, an array is a systematic arrangement of similar objects in which each object
is identified by an index. A one-dimensional array, a.k.a. a vector, is an array in which the objects, or
the array elements, are identified by a one-dimensional index. The following “C” code shows a vector (V)
that contains four int elements and a function that prints the first and the last element of the vector.
Notice that the first element is associated with index zero while the last one is associated with index
two
12
.
1 int V[] = {9, 8, 1};
2 void print_V()
3 {
4 printf("First element = %d\n", V[0]);
5 printf("Last element = %d\n", V[2]);
6 }
Vector elements are usually organized in a linear fashion on the memory. Hence, when translating
the previous code into machine language, all elements (int values) of vector V are placed in consecutive
memory positions - starting with the first element, i.e., V[0]. The base address of an array is the
address of the first memory word that is being used to store the array elements. Assuming
the base address of vector V is 000, then the first element (V[0]) is stored starting at memory address
000. Also, assuming each element requires four memory words
13
, the second element is stored starting
at memory address 004 and the third one starting at memory address 008. Figure 2.10 illustrates the
contents of vector V placed on memory starting at address 000. Notice that, in this example, each element
is a 32-bit number that is stored on four consecutive memory words using the little-endian format.
The previous example showed an array of int elements. Nonetheless, in “C”, the programmer may
also create arrays of other types. For example, one may create an array of char, in which each element
occupies only one byte, an array of double, in which each element occupies 8 bytes, or even an array of
a new type defined with the struct operator, in which each element may occupy several bytes.
12
This is a property of the “C” programming language. Other languages, such as Pascal, associate the first element with
index one.
13
The “C” int type is used to represent integer numbers and is usually mapped to 32-bit signed numbers.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
20
diff --git a/book/riscv-book-34.page b/book/riscv-book-34.page index 64f76eb..7698cb4 100644 --- a/book/riscv-book-34.page +++ b/book/riscv-book-34.page @@ -1 +1 @@ -
2.4. ORGANIZING DATA ON THE MEMORY
Address Contents
000
00001001
2
001
00000000
2
002
00000000
2
003
00000000
2
004
00001000
2
005
00000000
2
006
00000000
2
007
00000000
2
008
00000001
2
009
00000000
2
010
00000000
2
011
00000000
2
v[0] = 9
10
v[1] = 8
10
v[2] = 1
10
Figure 2.10: Elements of vector V stored on memory starting at address 000.
Let:
V
addr
be the base address of a vector V ;
elem
size
be the size of each element of V in bytes; and
V [i] be the i
th
element of the vector.
In “C”, and other programming languages, each element V [i] occupies elem
size
memory words of a
byte addressable memory and is placed at the main memory starting at address &V [i], which is defined
by Equation 2.12.
&V [i] = V
addr
+ i × elemn
size
(2.12)
A multi-dimensional array is an array in which each element is identified by a multi-dimensional
index. The following “C” code shows a two-dimensional array (M) that contains six int elements and a
function that prints two elements of the array. In this example, each element is associated with a unique
two-dimensional index [x][y] so that x [0 . . 1] and y [0 . . 2].
1 int M[][] = { {7, 9, 11},
2 {2, 8, 1} };
3 void print_M()
4 {
5 printf("Element M[0][0] = %d\n", M[0][0]);
6 printf("Element M[1][2] = %d\n", M[1][2]);
7 }
Two-dimensional arrays are commonly used to represent matrices. In this context, the first part of
the index ([x]) is often used to identify the row and the second part ([y]) is used to identify the column.
Hence, the element located at the first row and last column in previous example is identified by index
M[0][2].
The way two-dimensional arrays are organized on memory depends on the programming language.
In “C”, elements are grouped by row and each row is placed on memory consecutively. Hence, in the
previous example, the elements of the first row, i.e., M[0][0]=7, M[0][1]=9, and M[0][2]=11, are placed
first on memory. Then, the elements of the second row, i.e., M[1][0]=2, M[1][1]=8, and M[1][2]=1, are
placed after the elements of the first row. This way of organizing two-dimensional arrays on memory is
known as row-major order.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
21
+
2.4. ORGANIZING DATA ON THE MEMORY
Address Contents
000
00001001
2
001
00000000
2
002
00000000
2
003
00000000
2
004
00001000
2
005
00000000
2
006
00000000
2
007
00000000
2
008
00000001
2
009
00000000
2
010
00000000
2
011
00000000
2
v[0] = 9
10
v[1] = 8
10
v[2] = 1
10
Figure 2.10: Elements of vector V stored on memory starting at address 000.
Let:
V
addr
be the base address of a vector V ;
elem
size
be the size of each element of V in bytes; and
V [i] be the i
th
element of the vector.
In “C”, and other programming languages, each element V [i] occupies elem
size
memory words of a
byte addressable memory and is placed at the main memory starting at address &V [i], which is defined
by Equation 2.12.
&V [i] = V
addr
+ i × elemn
size
(2.12)
A multi-dimensional array is an array in which each element is identified by a multi-dimensional
index. The following “C” code shows a two-dimensional array (M) that contains six int elements and a
function that prints two elements of the array. In this example, each element is associated with a unique
two-dimensional index [x][y] so that x [0 . . 1] and y [0 . . 2].
1 int M[][] = { {7, 9, 11},
2 {2, 8, 1} };
3 void print_M()
4 {
5 printf("Element M[0][0] = %d\n", M[0][0]);
6 printf("Element M[1][2] = %d\n", M[1][2]);
7 }
Two-dimensional arrays are commonly used to represent matrices. In this context, the first part of
the index ([x]) is often used to identify the row and the second part ([y]) is used to identify the column.
Hence, the element located at the first row and last column in previous example is identified by index
M[0][2].
The way two-dimensional arrays are organized on memory depends on the programming language.
In “C”, elements are grouped by row and each row is placed on memory consecutively. Hence, in the
previous example, the elements of the first row, i.e., M[0][0]=7, M[0][1]=9, and M[0][2]=11, are placed
first on memory. Then, the elements of the second row, i.e., M[1][0]=2, M[1][1]=8, and M[1][2]=1, are
placed after the elements of the first row. This way of organizing two-dimensional arrays on memory is
known as row-major order.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
21
diff --git a/book/riscv-book-35.page b/book/riscv-book-35.page index c62fddb..6aeb53c 100644 --- a/book/riscv-book-35.page +++ b/book/riscv-book-35.page @@ -1 +1 @@ -
2.4. ORGANIZING DATA ON THE MEMORY
Let:
A be a M × N two-dimensional array in “C”, i.e., an array in which the x [0 . . M 1] and
y [0 . . N 1].
A
addr
be the base address of array A;
elem
size
be the size of each element of A in bytes;
A[x][y] be the array element associated with index [x][y];
In “C”, each element A[x][y] occupies elem
size
memory words of a byte addressable memory and is
placed at the main memory starting at address &A[x][y], which can be computed using Equation 2.13.
&A[x][y] = A
addr
+ x × elem
size
× N
| {z }
offset 1
+ y × elem
size
| {z }
offset 2
. (2.13)
Notice that Equation 2.13 adds to the base address (A
addr
) two offsets: offset 1 and offset 2. The
first offset is the amount of space in bytes required to store all elements that belong to previous rows,
i.e., rows that must be placed before row x. The second offset is the amount of space in bytes required
to store all elements that belong to the same row but must be placed before element A[x][y], i.e., the
elements that has a column index less than y.
NOTE: The row-major order is used in the following programming languages: “C”, “C++”,
“Objective-C”, “PL/I”, “Pascal”, and other.
Some programming languages, such as “Fortran”, “MATLAB”, “GNU Octave”, “R”, “Julia”,
and other, organize two-dimensional arrays on memory using the column-major order. In this
case, elements of a two-dimensional array are organized in memory column by column, i.e., the
elements of the first column are placed first then the elements of the second column are placed
after the elements of the first one and so on.
2.4.4 Structs on the main memory
In “C”, structs are data types defined by the user in which data items of different types may be grouped
and combined in a single data type. The following “C” code shows an example in which an int, an
one-dimensional array with 255 char elements and a short data item are combined in a struct named
user id to form a new data type. Notice that each data item inside the struct is identified by a name,
the first one by id, the second one by name, and the third one by level. These items are also known as
the “fields” of the struct data type.
1 struct user_id {
2 int id;
3 char name[256];
4 short level;
5 };
6
7 struct user_id manager;
8
9 void print_manager()
10 {
11 printf("Manager id = %d\n", manager.id);
12 printf("Manager name = %s\n", manager.name);
13 printf("Manager level = %d\n", manager.level);
14 }
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
22
+
2.4. ORGANIZING DATA ON THE MEMORY
Let:
A be a M × N two-dimensional array in “C”, i.e., an array in which the x [0 . . M 1] and
y [0 . . N 1].
A
addr
be the base address of array A;
elem
size
be the size of each element of A in bytes;
A[x][y] be the array element associated with index [x][y];
In “C”, each element A[x][y] occupies elem
size
memory words of a byte addressable memory and is
placed at the main memory starting at address &A[x][y], which can be computed using Equation 2.13.
&A[x][y] = A
addr
+ x × elem
size
× N
| {z }
offset 1
+ y × elem
size
| {z }
offset 2
. (2.13)
Notice that Equation 2.13 adds to the base address (A
addr
) two offsets: offset 1 and offset 2. The
first offset is the amount of space in bytes required to store all elements that belong to previous rows,
i.e., rows that must be placed before row x. The second offset is the amount of space in bytes required
to store all elements that belong to the same row but must be placed before element A[x][y], i.e., the
elements that has a column index less than y.
NOTE: The row-major order is used in the following programming languages: “C”, “C++”,
“Objective-C”, “PL/I”, “Pascal”, and other.
Some programming languages, such as “Fortran”, “MATLAB”, “GNU Octave”, “R”, “Julia”,
and other, organize two-dimensional arrays on memory using the column-major order. In this
case, elements of a two-dimensional array are organized in memory column by column, i.e., the
elements of the first column are placed first then the elements of the second column are placed
after the elements of the first one and so on.
2.4.4 Structs on the main memory
In “C”, structs are data types defined by the user in which data items of different types may be grouped
and combined in a single data type. The following “C” code shows an example in which an int, an
one-dimensional array with 255 char elements and a short data item are combined in a struct named
user id to form a new data type. Notice that each data item inside the struct is identified by a name,
the first one by id, the second one by name, and the third one by level. These items are also known as
the “fields” of the struct data type.
1 struct user_id {
2 int id;
3 char name[256];
4 short level;
5 };
6
7 struct user_id manager;
8
9 void print_manager()
10 {
11 printf("Manager id = %d\n", manager.id);
12 printf("Manager name = %s\n", manager.name);
13 printf("Manager level = %d\n", manager.level);
14 }
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
22
diff --git a/book/riscv-book-36.page b/book/riscv-book-36.page index 4556b92..6ea7320 100644 --- a/book/riscv-book-36.page +++ b/book/riscv-book-36.page @@ -1 +1 @@ -
2.5. ENCODING INSTRUCTIONS
Assuming each int/char/short item requires four/one/two bytes to be stored on memory, the struct
data type defined in the previous example requires 262 bytes to be stored on memory: four bytes to store
the id field, 256 bytes to store the name field and two bytes to store the level field.
All fields of a single struct item are stored sequentially on memory in the same order they appear
on the declaration. Hence, in the previous example, the field id is placed first, then field name is placed
next and, finally, field level is placed last.
The base address of an struct is the address of the first memory word that is being used
to store the fields of the struct. Assuming the base address of variable manager in previous example
is 000, the field id is placed on addresses 000 to 003, field name is placed on addresses 004 to 259, and
field level is placed on addresses 260 and 261. Figure 2.11 illustrates the contents of variable manager
placed on memory starting at address 000.
Address Contents
000
00000001
2
001
00000000
2
002
00000000
2
003
00000000
2
004
01001010
2
005
01101111
2
...
...
259
00000000
2
260
00000111
2
261
00000000
2
id
name[0]
level
name[1]
name[255]
Figure 2.11: Elements of variable manager stored on memory starting at address 000.
2.5 Encoding instructions
Computer instructions are usually encoded as a sequence of bits. The number of bits required to encode
each instruction varies accordingly to the computer architecture. For example, at one hand, the RISC-V
instruction set architecture defines that all RV32I instructions are encoded using a sequence of 32 bits.
On the other hand, instructions that belong to the x86 instruction set architecture family are encoded
with a varying number of bits. Figure 2.12 illustrates how two different instructions, that belong to two
different instruction set architectures, are encoded.
10001001 11100101
2
Opcode
(mov)
mov %esp, %ebp
op1
(%esp)
(%ebp)
op2
Mod
00000000000000001000000110110011
2
funct7
(add)
add x3, x1, x0
(x0)
rs2
rd
(x3)
rs1
(x1)
(add)
funct3
(add)
opcode
(a)
(b)
Figure 2.12: Encoding of two different instructions: (a) instruction mov, which belongs to the x86 instruc-
tion set architecture, and (b) instruction add, which belongs to the RISC-V instruction set architecture.
The 16 bits of the x86 instruction illustrated on Figure 2.12 (a) are organized in four fields: opcode,
mod, op1 and op2. The opcode, or operation code, field contains a value that is used by the computer
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
23
+
2.5. ENCODING INSTRUCTIONS
Assuming each int/char/short item requires four/one/two bytes to be stored on memory, the struct
data type defined in the previous example requires 262 bytes to be stored on memory: four bytes to store
the id field, 256 bytes to store the name field and two bytes to store the level field.
All fields of a single struct item are stored sequentially on memory in the same order they appear
on the declaration. Hence, in the previous example, the field id is placed first, then field name is placed
next and, finally, field level is placed last.
The base address of an struct is the address of the first memory word that is being used
to store the fields of the struct. Assuming the base address of variable manager in previous example
is 000, the field id is placed on addresses 000 to 003, field name is placed on addresses 004 to 259, and
field level is placed on addresses 260 and 261. Figure 2.11 illustrates the contents of variable manager
placed on memory starting at address 000.
Address Contents
000
00000001
2
001
00000000
2
002
00000000
2
003
00000000
2
004
01001010
2
005
01101111
2
...
...
259
00000000
2
260
00000111
2
261
00000000
2
id
name[0]
level
name[1]
name[255]
Figure 2.11: Elements of variable manager stored on memory starting at address 000.
2.5 Encoding instructions
Computer instructions are usually encoded as a sequence of bits. The number of bits required to encode
each instruction varies accordingly to the computer architecture. For example, at one hand, the RISC-V
instruction set architecture defines that all RV32I instructions are encoded using a sequence of 32 bits.
On the other hand, instructions that belong to the x86 instruction set architecture family are encoded
with a varying number of bits. Figure 2.12 illustrates how two different instructions, that belong to two
different instruction set architectures, are encoded.
10001001 11100101
2
Opcode
(mov)
mov %esp, %ebp
op1
(%esp)
(%ebp)
op2
Mod
00000000000000001000000110110011
2
funct7
(add)
add x3, x1, x0
(x0)
rs2
rd
(x3)
rs1
(x1)
(add)
funct3
(add)
opcode
(a)
(b)
Figure 2.12: Encoding of two different instructions: (a) instruction mov, which belongs to the x86 instruc-
tion set architecture, and (b) instruction add, which belongs to the RISC-V instruction set architecture.
The 16 bits of the x86 instruction illustrated on Figure 2.12 (a) are organized in four fields: opcode,
mod, op1 and op2. The opcode, or operation code, field contains a value that is used by the computer
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
23
diff --git a/book/riscv-book-37.page b/book/riscv-book-37.page index 3da0ef5..432dfc9 100644 --- a/book/riscv-book-37.page +++ b/book/riscv-book-37.page @@ -1 +1 @@ -
2.5. ENCODING INSTRUCTIONS
to identify the instruction. In this case, the value 10001001
2
indicates that this is a mov instruction. The
other fields, mod, op1 and op2, are the instruction parameters. In this case, they specify that the mov
operation must be performed between registers %esp and %ebp, which are indicated by values 100
2
and
101
2
on fields op1 and op2.
The 32 bits of the RISC-V instruction illustrated on Figure 2.12 (b) are organized in six fields: funct7,
rs2, rs1, funct3, rd, and opcode. The funct7, funct3, and opcode fields contains values that is used by
the computer to identify the instruction and, hence, the operation that must be performed. In this case,
these values indicate that this is an add instruction. The other fields, rs2, rs1, and rd, are the instruction
parameters. These parameters specify that the add operation must be performed using the values stored
in registers x1 and x0 and the result stored in register x3, which are identified by values 0001
2
, 0000
2
,
and 0011
2
on fields rs1, rs2, and rd, respectively.
Most modern computers store the code, i.e., the program instructions, on the same memory they
store the data - the main memory. Also, modern computer instructions are encoded using multiples of 8
bits so that they fit the size of multiple memory words on a byte addressable memory. Figure 2.13 shows
an example of how a program written in x86 assembly language is mapped to machine language and
stored on a byte addressable memory. Notice that, the first instruction, push $ebp, is encoded using one
byte while the third one, imul $113, 12(%ebp), %eax, is encoded using four bytes. Also, notice that
instructions are placed sequentially on memory, in the same order they appear on the original assembly
program.
Contents Address
01010101
2
000
10001001
2
001
11100101
2
002
01101011
2
003
01000101
2
004
00001100
2
005
01110001
2
006
00000011
2
007
01000101
2
008
00001000
2
009
00001111
2
010
10101111
2
011
01000101
2
012
00010000
2
013
01011101
2
014
11000011
2
015
func_1:
push %ebp
mov %esp, %ebp
imul $113, 12(%ebp), %eax
add 8(%ebp), %eax
imul 16(%ebp), %eax
pop %ebp
ret
Assembly language (x86)
Machine language (x86)
stored on memory
Figure 2.13: Mapping x86 assembly instructions to machine instructions on memory.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
24
+
2.5. ENCODING INSTRUCTIONS
to identify the instruction. In this case, the value 10001001
2
indicates that this is a mov instruction. The
other fields, mod, op1 and op2, are the instruction parameters. In this case, they specify that the mov
operation must be performed between registers %esp and %ebp, which are indicated by values 100
2
and
101
2
on fields op1 and op2.
The 32 bits of the RISC-V instruction illustrated on Figure 2.12 (b) are organized in six fields: funct7,
rs2, rs1, funct3, rd, and opcode. The funct7, funct3, and opcode fields contains values that is used by
the computer to identify the instruction and, hence, the operation that must be performed. In this case,
these values indicate that this is an add instruction. The other fields, rs2, rs1, and rd, are the instruction
parameters. These parameters specify that the add operation must be performed using the values stored
in registers x1 and x0 and the result stored in register x3, which are identified by values 0001
2
, 0000
2
,
and 0011
2
on fields rs1, rs2, and rd, respectively.
Most modern computers store the code, i.e., the program instructions, on the same memory they
store the data - the main memory. Also, modern computer instructions are encoded using multiples of 8
bits so that they fit the size of multiple memory words on a byte addressable memory. Figure 2.13 shows
an example of how a program written in x86 assembly language is mapped to machine language and
stored on a byte addressable memory. Notice that, the first instruction, push $ebp, is encoded using one
byte while the third one, imul $113, 12(%ebp), %eax, is encoded using four bytes. Also, notice that
instructions are placed sequentially on memory, in the same order they appear on the original assembly
program.
Contents Address
01010101
2
000
10001001
2
001
11100101
2
002
01101011
2
003
01000101
2
004
00001100
2
005
01110001
2
006
00000011
2
007
01000101
2
008
00001000
2
009
00001111
2
010
10101111
2
011
01000101
2
012
00010000
2
013
01011101
2
014
11000011
2
015
func_1:
push %ebp
mov %esp, %ebp
imul $113, 12(%ebp), %eax
add 8(%ebp), %eax
imul 16(%ebp), %eax
pop %ebp
ret
Assembly language (x86)
Machine language (x86)
stored on memory
Figure 2.13: Mapping x86 assembly instructions to machine instructions on memory.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
24
diff --git a/book/riscv-book-38.page b/book/riscv-book-38.page index d975128..4574cba 100644 --- a/book/riscv-book-38.page +++ b/book/riscv-book-38.page @@ -1 +1 @@ -
Chapter 3
Assembly, object, and executable
files
This chapter presents the main concepts and elements of assembly, object, and executable files.
3.1 Generating native programs
In this section, we discuss how a program written in a high-level language, such as C, is translated into
a native program.
As discussed in Chapter 1, a native program is a program encoded using instructions that
can be directly executed by the computer hardware, without help from an emulator or
a virtual machine. These programs are usually automatically translated from programs written in
high-level languages, such as C, by tools like compilers, assemblers, and linkers.
A program written in a high-level language, such as C, is encoded as a plain text file. High-level
languages are designed to be agnostic of ISA and they are composed of several abstract elements, such
as variables, repetition, or loop statements, conditional statements, routines, etc. The following code
shows an example of a program written using the C language, which is a high-level language.
1 int main()
2 {
3 int r = func (10)
4 return r+1;
5 }
A compiler is a tool that translates a program from one language to another. Usually,
programming language compilers are employed to translate programs written in high-level languages into
lower-level languages. For example, a C compiler is employed to translate a program written in C lan-
guage into assembly language. The GNU project C and C++ compiler
1
, or gcc, is a compiler that is capa-
ble of translating programs written in C and C++ languages into assembly programs, i.e., a program writ-
ten in assembly language. The following command line illustrates how the riscv64-unknown-elf-gcc
tool, a GNU project C and C++ compiler that produces code for RISC-V based computers, can be
invoked to produce a RV32I assembly program from a C program. In this example, the C program is
stored on the main.c file and the RV32I assembly program will be stored on the main.s file.
$ riscv64-unknown-elf-gcc -mabi=ilp32 -march=rv32i -S main.c -o main.s
1
https://gcc.gnu.org/
25
+
Chapter 3
Assembly, object, and executable
files
This chapter presents the main concepts and elements of assembly, object, and executable files.
3.1 Generating native programs
In this section, we discuss how a program written in a high-level language, such as C, is translated into
a native program.
As discussed in Chapter 1, a native program is a program encoded using instructions that
can be directly executed by the computer hardware, without help from an emulator or
a virtual machine. These programs are usually automatically translated from programs written in
high-level languages, such as C, by tools like compilers, assemblers, and linkers.
A program written in a high-level language, such as C, is encoded as a plain text file. High-level
languages are designed to be agnostic of ISA and they are composed of several abstract elements, such
as variables, repetition, or loop statements, conditional statements, routines, etc. The following code
shows an example of a program written using the C language, which is a high-level language.
1 int main()
2 {
3 int r = func (10)
4 return r+1;
5 }
A compiler is a tool that translates a program from one language to another. Usually,
programming language compilers are employed to translate programs written in high-level languages into
lower-level languages. For example, a C compiler is employed to translate a program written in C lan-
guage into assembly language. The GNU project C and C++ compiler
1
, or gcc, is a compiler that is capa-
ble of translating programs written in C and C++ languages into assembly programs, i.e., a program writ-
ten in assembly language. The following command line illustrates how the riscv64-unknown-elf-gcc
tool, a GNU project C and C++ compiler that produces code for RISC-V based computers, can be
invoked to produce a RV32I assembly program from a C program. In this example, the C program is
stored on the main.c file and the RV32I assembly program will be stored on the main.s file.
$ riscv64-unknown-elf-gcc -mabi=ilp32 -march=rv32i -S main.c -o main.s
1
https://gcc.gnu.org/
25
diff --git a/book/riscv-book-39.page b/book/riscv-book-39.page index 1138803..bac7faf 100644 --- a/book/riscv-book-39.page +++ b/book/riscv-book-39.page @@ -1 +1 @@ -
3.1. GENERATING NATIVE PROGRAMS
An assembly program is also a program encoded as a plain text file. The following code shows an
example of a program written using the RV32I assembly language. This program has the same semantics
as the previous C program.
1 .text
2 .align 2
3 main:
4 addi sp,sp,-16
5 li a0,10
6 sw ra,12(sp)
7 jal func
8 lw ra,12(sp)
9 addi a0,a0,1
10 addi sp,sp,16
11 ret
Different from high-level languages, assembly language is very close to the ISA. For example, the
previous assembly program contains references to instructions (e.g., addi, li, ...) and registers (e.g., sp,
ra, a0) that belong to the RV32I ISA. Lines 4 to 11 of the previous code contain assembly instructions,
which are converted by the assembler into RV32I machine instructions. As a consequence, they are ISA
dependent, i.e., an assembly program generated for one ISA is usually not compatible with other ISAs.
Machine language is a low-level language that can be directly processed by a computer’s
central processing unit (CPU). An assembler is a tool that translates a program in assembly
language into a program in machine language. For example, it converts assembly instructions
(encoded as sequences of ASCII characters) into machine instructions (encoded as sequences of bits
accordingly to the ISA). Each assembly language is associated with a given ISA.
The “GNU Assembler”
2
tool, or as, is an assembler that is capable of translating programs written in
several assembly languages into machine language for their respective ISAs. In this book we will use the
as tool to translate RV32IM assembly programs to machine language programs. The following command
line illustrates how the riscv64-unknown-elf-as tool, a version of the GNU Assembler that generates
code for RISC-V ISAs, can be invoked to assemble a RV32I assembly program. In this example, the
RV32I assembly program is stored on the main.s file and the result, a file that contains code in machine
language, will be stored on the main.o file.
$ riscv64-unknown-elf-as -mabi=ilp32 -march=rv32i main.s -o main.o
Assemblers usually produce object files that are encoded in binary and contains code in machine
language. The object file also contains other information, such as the list of symbols (e.g., global
variables and functions) defined in the file. There are several known file formats used to encode
object files. The Executable and Linking Format, or ELF, is frequently used on Linux-based
systems while the Portable Executable format, or PE, is used on Windows-based systems. The
riscv64-unknown-elf-as tool, used in the previous example, produces an ELF-based object file.
Even though the object file produced by the assembler contains code in machine language, it is usually
incomplete in the sense that it may still need to be relocated (more on relocation later) or linked with
other object files to compose the whole program. For example, the code in an object file may need to be
linked with the C library so that the program can invoke the printf function. As a consequence, the
object file produced by the assembler is not an executable file.
A linker is a tool that “links” together one or more object files and produces an exe-
cutable file. The executable file is similar to an object file in the sense that it is encoded in binary and
contains code in machine language. Nonetheless, it contains all the required elements (e.g., libraries) for
execution.
2
https://www.gnu.org/software/binutils/
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
26
+
3.1. GENERATING NATIVE PROGRAMS
An assembly program is also a program encoded as a plain text file. The following code shows an
example of a program written using the RV32I assembly language. This program has the same semantics
as the previous C program.
1 .text
2 .align 2
3 main:
4 addi sp,sp,-16
5 li a0,10
6 sw ra,12(sp)
7 jal func
8 lw ra,12(sp)
9 addi a0,a0,1
10 addi sp,sp,16
11 ret
Different from high-level languages, assembly language is very close to the ISA. For example, the
previous assembly program contains references to instructions (e.g., addi, li, ...) and registers (e.g., sp,
ra, a0) that belong to the RV32I ISA. Lines 4 to 11 of the previous code contain assembly instructions,
which are converted by the assembler into RV32I machine instructions. As a consequence, they are ISA
dependent, i.e., an assembly program generated for one ISA is usually not compatible with other ISAs.
Machine language is a low-level language that can be directly processed by a computer’s
central processing unit (CPU). An assembler is a tool that translates a program in assembly
language into a program in machine language. For example, it converts assembly instructions
(encoded as sequences of ASCII characters) into machine instructions (encoded as sequences of bits
accordingly to the ISA). Each assembly language is associated with a given ISA.
The “GNU Assembler”
2
tool, or as, is an assembler that is capable of translating programs written in
several assembly languages into machine language for their respective ISAs. In this book we will use the
as tool to translate RV32IM assembly programs to machine language programs. The following command
line illustrates how the riscv64-unknown-elf-as tool, a version of the GNU Assembler that generates
code for RISC-V ISAs, can be invoked to assemble a RV32I assembly program. In this example, the
RV32I assembly program is stored on the main.s file and the result, a file that contains code in machine
language, will be stored on the main.o file.
$ riscv64-unknown-elf-as -mabi=ilp32 -march=rv32i main.s -o main.o
Assemblers usually produce object files that are encoded in binary and contains code in machine
language. The object file also contains other information, such as the list of symbols (e.g., global
variables and functions) defined in the file. There are several known file formats used to encode
object files. The Executable and Linking Format, or ELF, is frequently used on Linux-based
systems while the Portable Executable format, or PE, is used on Windows-based systems. The
riscv64-unknown-elf-as tool, used in the previous example, produces an ELF-based object file.
Even though the object file produced by the assembler contains code in machine language, it is usually
incomplete in the sense that it may still need to be relocated (more on relocation later) or linked with
other object files to compose the whole program. For example, the code in an object file may need to be
linked with the C library so that the program can invoke the printf function. As a consequence, the
object file produced by the assembler is not an executable file.
A linker is a tool that “links” together one or more object files and produces an exe-
cutable file. The executable file is similar to an object file in the sense that it is encoded in binary and
contains code in machine language. Nonetheless, it contains all the required elements (e.g., libraries) for
execution.
2
https://www.gnu.org/software/binutils/
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
26
diff --git a/book/riscv-book-4.page b/book/riscv-book-4.page index f8c23e4..385bf89 100644 --- a/book/riscv-book-4.page +++ b/book/riscv-book-4.page @@ -1 +1 @@ -
Foreword
This book focuses on teaching the art of programming in assembly language, using the RISC-V ISA as
the guiding example. Towards this goal, the text spans, at an introductory level, the organization of
computing systems, describes the mechanics of how programs are created and introduces basic program-
ming concepts including both user level and system programming. The ability to read and write code in
low-level assembly language is a powerful skill to be able to create high performance programs, and to
access features of the machine that are not easily accessible from high-level languages such as C, Java or
Python, for example to control peripheral devices.
The book introduces the organization of computing systems, and the mechanics of creating programs
and converting them to machine-readable format suitable for execution. It also teaches the components
of a program, or how a programmer communicates her intent to the system via directives, data allocation
primitives and finally the ISA instructions, and their use. Basic programming concepts of control flow,
loops as well as the runtime stack are introduced.
Next the book describes the organization of code sequences into routines and subroutines, to compose
a program. The text also addresses issues related to system programming, including notions of peripheral
control and interrupts.
This text, and ancillary teaching materials, has been used in introductory classes at the University
of Campinas, Brazil (UNICAMP) and has undergone refinement and improvement for several editions.
Mauricio Breternitz
Principal Investigator & Invited Associate Professor
ISTAR ISCTE Laboratory
ISCTE Instituto Universitario de Lisboa
Lisbon, Portugal
i
+
Foreword
This book focuses on teaching the art of programming in assembly language, using the RISC-V ISA as
the guiding example. Towards this goal, the text spans, at an introductory level, the organization of
computing systems, describes the mechanics of how programs are created and introduces basic program-
ming concepts including both user level and system programming. The ability to read and write code in
low-level assembly language is a powerful skill to be able to create high performance programs, and to
access features of the machine that are not easily accessible from high-level languages such as C, Java or
Python, for example to control peripheral devices.
The book introduces the organization of computing systems, and the mechanics of creating programs
and converting them to machine-readable format suitable for execution. It also teaches the components
of a program, or how a programmer communicates her intent to the system via directives, data allocation
primitives and finally the ISA instructions, and their use. Basic programming concepts of control flow,
loops as well as the runtime stack are introduced.
Next the book describes the organization of code sequences into routines and subroutines, to compose
a program. The text also addresses issues related to system programming, including notions of peripheral
control and interrupts.
This text, and ancillary teaching materials, has been used in introductory classes at the University
of Campinas, Brazil (UNICAMP) and has undergone refinement and improvement for several editions.
Mauricio Breternitz
Principal Investigator & Invited Associate Professor
ISTAR ISCTE Laboratory
ISCTE Instituto Universitario de Lisboa
Lisbon, Portugal
i
diff --git a/book/riscv-book-40.page b/book/riscv-book-40.page index 659c215..0c4e0f7 100644 --- a/book/riscv-book-40.page +++ b/book/riscv-book-40.page @@ -1 +1 @@ -
3.1. GENERATING NATIVE PROGRAMS
Assembler (e.g., as) Assembler (e.g., as)
Compiler (e.g., gcc)
01010101
10001001
Machine language program
(object file - binary)
Compiler (e.g., gcc)
func:
li a1, 113
mul a0, a0, a1
ret
Assembly language program
(text file)
int func(int a)
{
return a*113;
}
High-level language program
(C, C++, Java, Pascal, ...)
(text file)
int main()
{
return func (10);
}
main:
li a0, 10
jal func
ret
01010101
10001001
Machine language program
(executable file - binary)
Linker (e.g., ld)
01010101
10001001
Figure 3.1: Native code generation flow.
The following command line illustrates how the riscv64-unknown-elf-ld tool, a version of the GNU
Linker
3
tool that links object files generated for RISC-V ISAs, can be invoked to link two object files
together: the main.o and mylib.o object files. In this example, the linker will produce an executable
file named main.x.
$ riscv64-unknown-elf-ld -m elf32lriscv main.o mylib.o -o main.x
Figure 3.1 illustrates the code generation process used to produce a native program executable file
from a C program organized in two files. First, the two C program files are translated into assembly
programs by the compiler. Then, the assembly programs are assembled by the assembler, which produces
object files. Finally, the linker links the object files together producing an executable file.
Assuming the high-level language program files are named main.c and func.c, the following sequence
of commands produce a RV32I executable file named main.x.
$ riscv64-unknown-elf-gcc -mabi=ilp32 -march=rv32i -S main.c -o main.s
$ riscv64-unknown-elf-as -mabi=ilp32 -march=rv32i main.s -o main.o
$ riscv64-unknown-elf-gcc -mabi=ilp32 -march=rv32i -S func.c -o func.s
$ riscv64-unknown-elf-as -mabi=ilp32 -march=rv32i func.s -o func.o
$ riscv64-unknown-elf-ld -m elf32lriscv main.o func.o -o main.x
3.1.1 Inspecting the contents of object and executable files
Object and executable files are encoded as binary files, hence, it is not easy to look at their contents
directly. To inspect their contents, developers usually rely on programs that decode and translate their
information to a human-readable representation, usually a textual format. There are several tools that
can be used to inspect the contents of object and executable files. The objdump, nm, and readelf tools
3
https://www.gnu.org/software/binutils/
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
27
+
3.1. GENERATING NATIVE PROGRAMS
Assembler (e.g., as) Assembler (e.g., as)
Compiler (e.g., gcc)
01010101
10001001
Machine language program
(object file - binary)
Compiler (e.g., gcc)
func:
li a1, 113
mul a0, a0, a1
ret
Assembly language program
(text file)
int func(int a)
{
return a*113;
}
High-level language program
(C, C++, Java, Pascal, ...)
(text file)
int main()
{
return func (10);
}
main:
li a0, 10
jal func
ret
01010101
10001001
Machine language program
(executable file - binary)
Linker (e.g., ld)
01010101
10001001
Figure 3.1: Native code generation flow.
The following command line illustrates how the riscv64-unknown-elf-ld tool, a version of the GNU
Linker
3
tool that links object files generated for RISC-V ISAs, can be invoked to link two object files
together: the main.o and mylib.o object files. In this example, the linker will produce an executable
file named main.x.
$ riscv64-unknown-elf-ld -m elf32lriscv main.o mylib.o -o main.x
Figure 3.1 illustrates the code generation process used to produce a native program executable file
from a C program organized in two files. First, the two C program files are translated into assembly
programs by the compiler. Then, the assembly programs are assembled by the assembler, which produces
object files. Finally, the linker links the object files together producing an executable file.
Assuming the high-level language program files are named main.c and func.c, the following sequence
of commands produce a RV32I executable file named main.x.
$ riscv64-unknown-elf-gcc -mabi=ilp32 -march=rv32i -S main.c -o main.s
$ riscv64-unknown-elf-as -mabi=ilp32 -march=rv32i main.s -o main.o
$ riscv64-unknown-elf-gcc -mabi=ilp32 -march=rv32i -S func.c -o func.s
$ riscv64-unknown-elf-as -mabi=ilp32 -march=rv32i func.s -o func.o
$ riscv64-unknown-elf-ld -m elf32lriscv main.o func.o -o main.x
3.1.1 Inspecting the contents of object and executable files
Object and executable files are encoded as binary files, hence, it is not easy to look at their contents
directly. To inspect their contents, developers usually rely on programs that decode and translate their
information to a human-readable representation, usually a textual format. There are several tools that
can be used to inspect the contents of object and executable files. The objdump, nm, and readelf tools
3
https://www.gnu.org/software/binutils/
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
27
diff --git a/book/riscv-book-41.page b/book/riscv-book-41.page index 0e271df..7b59721 100644 --- a/book/riscv-book-41.page +++ b/book/riscv-book-41.page @@ -1 +1 @@ -
3.2. LABELS, SYMBOLS, REFERENCES, AND RELOCATION
are examples of tools that can be used to inspect the contents of object and executable files on Linux-
based systems. The following sections show several examples of how these tools can be used to inspect
the contents of object and executable files.
3.2 Labels, symbols, references, and relocation
3.2.1 Labels and symbols
Labels are “markers” that represent program locations. They are usually defined by a name
ended with the suffix “:” and can be inserted into an assembly program to “mark” a program position
so that it can be referred to by assembly instructions or other assembly commands, such as directives.
The following code shows an assembly program that contains two labels: x:, defined in line 1, and
sum10:, defined in line 4. The x: label identifies a program location that contains a variable, which is
allocated and initialized by the directive .word 10 (line 2). The sum10: label identifies the program
location that contains the first instruction of the sum10 routine, in other words, it defines the routine
entry point. Also, in this example, the x: label is used in instruction lw (line 5) to refer to variable x.
1 x:
2 .word 10
3
4 sum10:
5 lw a0, x
6 addi a0, a0, 10
7 ret
Global variables and program routines are program elements that are stored on the computer main
memory. Each variable and each routine occupies a sequence of memory words and are identified by the
address of the first memory word they occupy. At one hand, to read the contents of a global variable,
or execute a routine, it suffices to have their addresses, i.e., the address of the first memory word they
occupy
4
. On the other hand, the addresses assigned to variables and routines are only final on the
executable file, after the linker links together the multiple object files into a single file. Hence, assembly
programs require a mechanism to refer to global variables and routines. This is accomplished by using
labels, as illustrated in the previous example. In this context, before allocating space for each global
variable or producing the code for each routine, the programmer (or the compiler) defines a label that
will be used to identify the variable or the routine.
Program symbols are “names” that are associated with numerical values and the “symbol
table” is a data structure that maps each program symbol to its value. Labels are automatically
converted into program symbols by the assembler and associated with a numerical value that represents
its position in the program, which is a memory address. The assembler adds all symbols to the program’s
“symbol table”, which is also stored on the object file.
We can inspect the contents of the object file by using tools that decode the information on the object
file and shows them on a human-readable format, i.e., a textual format. The GNU nm tool, for example,
can be used to inspect the “symbol table” of an object file. Assuming the previous code was encoded into
an object file named sum10.o, we can inspect its symbol table by executing the riscv64-unknown-elf-nm
tool as follows.
$ riscv64-unknown-elf-nm sum10.o
00000004 t .L0
00000004 t sum10
00000000 t x
4
To execute a routine it suffices to set the PC with the address of the first instruction of the routine - this is usually
done by executing a “jump” instruction, which sets the PC with a given value.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
28
+
3.2. LABELS, SYMBOLS, REFERENCES, AND RELOCATION
are examples of tools that can be used to inspect the contents of object and executable files on Linux-
based systems. The following sections show several examples of how these tools can be used to inspect
the contents of object and executable files.
3.2 Labels, symbols, references, and relocation
3.2.1 Labels and symbols
Labels are “markers” that represent program locations. They are usually defined by a name
ended with the suffix “:” and can be inserted into an assembly program to “mark” a program position
so that it can be referred to by assembly instructions or other assembly commands, such as directives.
The following code shows an assembly program that contains two labels: x:, defined in line 1, and
sum10:, defined in line 4. The x: label identifies a program location that contains a variable, which is
allocated and initialized by the directive .word 10 (line 2). The sum10: label identifies the program
location that contains the first instruction of the sum10 routine, in other words, it defines the routine
entry point. Also, in this example, the x: label is used in instruction lw (line 5) to refer to variable x.
1 x:
2 .word 10
3
4 sum10:
5 lw a0, x
6 addi a0, a0, 10
7 ret
Global variables and program routines are program elements that are stored on the computer main
memory. Each variable and each routine occupies a sequence of memory words and are identified by the
address of the first memory word they occupy. At one hand, to read the contents of a global variable,
or execute a routine, it suffices to have their addresses, i.e., the address of the first memory word they
occupy
4
. On the other hand, the addresses assigned to variables and routines are only final on the
executable file, after the linker links together the multiple object files into a single file. Hence, assembly
programs require a mechanism to refer to global variables and routines. This is accomplished by using
labels, as illustrated in the previous example. In this context, before allocating space for each global
variable or producing the code for each routine, the programmer (or the compiler) defines a label that
will be used to identify the variable or the routine.
Program symbols are “names” that are associated with numerical values and the “symbol
table” is a data structure that maps each program symbol to its value. Labels are automatically
converted into program symbols by the assembler and associated with a numerical value that represents
its position in the program, which is a memory address. The assembler adds all symbols to the program’s
“symbol table”, which is also stored on the object file.
We can inspect the contents of the object file by using tools that decode the information on the object
file and shows them on a human-readable format, i.e., a textual format. The GNU nm tool, for example,
can be used to inspect the “symbol table” of an object file. Assuming the previous code was encoded into
an object file named sum10.o, we can inspect its symbol table by executing the riscv64-unknown-elf-nm
tool as follows.
$ riscv64-unknown-elf-nm sum10.o
00000004 t .L0
00000004 t sum10
00000000 t x
4
To execute a routine it suffices to set the PC with the address of the first instruction of the routine - this is usually
done by executing a “jump” instruction, which sets the PC with a given value.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
28
diff --git a/book/riscv-book-42.page b/book/riscv-book-42.page index 812178a..60c065d 100644 --- a/book/riscv-book-42.page +++ b/book/riscv-book-42.page @@ -1 +1 @@ -
3.2. LABELS, SYMBOLS, REFERENCES, AND RELOCATION
Notice that, in this case, the symbol table contains three symbols: .L0
5
, sum10, and x, which are
associated with values 00000004, 00000004, and 00000000, respectively.
The programmer may also explicitly define symbols by using the .set directive. The following code
shows a fragment of assembly code that employs the .set directive to define a symbol named answer
and assign value 42 to it.
1 .set answer, 42
2 get_answer:
3 li a0, answer
4 ret
Assuming the previous code is stored on a program file named get answer.s, we can assemble it and
inspect the object file symbol table by executing the following commands:
$ riscv64-unknown-elf-as -march=rv32im get_answer.s -o get_answer.o
$ riscv64-unknown-elf-nm get_answer.o
0000002a a answer
00000000 t get_answer
Notice that the symbol table contains two symbols: answer and get answer. The answer symbol is
an absolute symbol, i.e., its value is not changed during the linking process this is indicated by the
letter ‘a’ on the output. The get answer symbol is a symbol that represents a location on the .text
section and may have its value (which is an address) changed during the relocation process. The next
sections discuss the relocation process and the program sections’ concept.
3.2.2 References to labels and relocation
Each reference to a label must be replaced by an address during the assembling and linking processes.
For example, in the previous code, the reference to label x:, in instruction lw (line 5), is replaced by
address 0, i.e., the address of the variable represented by label x, when assembling the program.
To illustrate this concept, let us consider the following RV32I assembly program, which contains four
instructions and two labels. The first label (trunk42 - line 1) identifies the entry point of a function while
the second one (done - line 5) identifies a program location that is the target of a branch instruction
6
,
which is displayed in line 3.
1 trunk42:
2 li t1, 42
3 bge t1, a0, done
4 mv a0, t1
5 done:
6 ret
When assembling this program, the assembler translates each assembly instruction (e.g., li, bge, ...)
to a machine instruction, i.e., an instruction encoded with 32 bits. As a result, the program occupies a
total of 16 memory words, four for each instruction. Also, the assembler maps the first instruction to
address 0, the second one to address 4, and so on. In this context, the trunk42 label, which marks the
beginning of the program, is associated with address 0 and the done label, which marks the position in
5
The .L0 symbol was automatically introduced by the assembler when translating the lw a0, x assembly instruction.
This is a special instruction, called pseudo-instruction, that will be discussed latter on Section 5.4.
6
A branch instruction is an instruction that changes the execution flow under certain conditions - In this example,
the bge t1, a0, done (branch greater equal) instruction jumps to the position identified by the done label if the value in
register t1 is greater or equal to the value in register a0.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
29
+
3.2. LABELS, SYMBOLS, REFERENCES, AND RELOCATION
Notice that, in this case, the symbol table contains three symbols: .L0
5
, sum10, and x, which are
associated with values 00000004, 00000004, and 00000000, respectively.
The programmer may also explicitly define symbols by using the .set directive. The following code
shows a fragment of assembly code that employs the .set directive to define a symbol named answer
and assign value 42 to it.
1 .set answer, 42
2 get_answer:
3 li a0, answer
4 ret
Assuming the previous code is stored on a program file named get answer.s, we can assemble it and
inspect the object file symbol table by executing the following commands:
$ riscv64-unknown-elf-as -march=rv32im get_answer.s -o get_answer.o
$ riscv64-unknown-elf-nm get_answer.o
0000002a a answer
00000000 t get_answer
Notice that the symbol table contains two symbols: answer and get answer. The answer symbol is
an absolute symbol, i.e., its value is not changed during the linking process this is indicated by the
letter ‘a’ on the output. The get answer symbol is a symbol that represents a location on the .text
section and may have its value (which is an address) changed during the relocation process. The next
sections discuss the relocation process and the program sections’ concept.
3.2.2 References to labels and relocation
Each reference to a label must be replaced by an address during the assembling and linking processes.
For example, in the previous code, the reference to label x:, in instruction lw (line 5), is replaced by
address 0, i.e., the address of the variable represented by label x, when assembling the program.
To illustrate this concept, let us consider the following RV32I assembly program, which contains four
instructions and two labels. The first label (trunk42 - line 1) identifies the entry point of a function while
the second one (done - line 5) identifies a program location that is the target of a branch instruction
6
,
which is displayed in line 3.
1 trunk42:
2 li t1, 42
3 bge t1, a0, done
4 mv a0, t1
5 done:
6 ret
When assembling this program, the assembler translates each assembly instruction (e.g., li, bge, ...)
to a machine instruction, i.e., an instruction encoded with 32 bits. As a result, the program occupies a
total of 16 memory words, four for each instruction. Also, the assembler maps the first instruction to
address 0, the second one to address 4, and so on. In this context, the trunk42 label, which marks the
beginning of the program, is associated with address 0 and the done label, which marks the position in
5
The .L0 symbol was automatically introduced by the assembler when translating the lw a0, x assembly instruction.
This is a special instruction, called pseudo-instruction, that will be discussed latter on Section 5.4.
6
A branch instruction is an instruction that changes the execution flow under certain conditions - In this example,
the bge t1, a0, done (branch greater equal) instruction jumps to the position identified by the done label if the value in
register t1 is greater or equal to the value in register a0.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
29
diff --git a/book/riscv-book-43.page b/book/riscv-book-43.page index 75740b9..11f74b0 100644 --- a/book/riscv-book-43.page +++ b/book/riscv-book-43.page @@ -1 +1 @@ -
3.2. LABELS, SYMBOLS, REFERENCES, AND RELOCATION
which instruction ret is located, is associated with address c
7
. Since the bge instruction has a reference
to label done, the assembler encodes the address associated with the done label (address c) in the fields
of this instruction.
The GNU objdump tool can be used to inspect several parts of the object file. The following example
shows how to use the riscv64-unknown-elf-objdump
8
tool to decode the data and instructions on the
trunk.o file so that we can inspect its contents.
$ riscv64-unknown-elf-objdump -D trunk.o
trunk.o: file format elf32-littleriscv
Disassembly of section .text:
00000000 <trunk42>:
0: 02a00313 li t1,42
4: 00a35463 bge t1,a0,c <done>
8: 00030513 mv a0,t1
0000000c <done>:
c: 00008067 ret
...
Notice that, for each instruction, it shows its address, its encoding in hexadecimal, and a text that
resembles assembly code
9
. The bge t1, a0, done instruction, for example, is mapped to address 4 and
encoded with the 32-bit value 00a35463. The objdump tool indicates that it refers to the label done,
which is mapped to address c (bge t1,a0,c <done>). Also, notice that the labels (and their addresses)
are displayed on their respective program position.
In the previous example, the trunk42 function starts at address 0, however, when linking this object
file (trunk.o) with others, the linker may need to move the code (assign new addresses) so that they
do not occupy the same addresses. In this process, the addresses associated with labels may change and
each reference to a label must also be fixed to reflect the new addresses.
Relocation is the process in which the code and data are assigned new memory addresses.
As discussed previously, during the relocation process, the linker needs to adjust the code and data to
reflect the new addresses. More specifically, the addresses associated with labels on the symbol table and
the references to labels must be adjusted. The relocation table is a data structure that contains
information that describes how the program instructions and data need to be modified to
reflect the addresses reassignment. Each object file contains a relocation table and the linker uses
their information to adjust the code when performing the relocation process.
The following example shows how to use the riscv64-unknown-elf-objdump tool to inspect the
contents of the relocation table on the trunk.o file. Notice that, in this case, the object file contains
one relocation record, which indicates that the instruction on address 4, a RISC-V branch instruction,
contains a reference to label done. The linker uses this information to adjust the branch instruction
when the done label is assigned a new address.
7
Notice that this disassembler displays addresses using the hexadecimal representation.
8
The -D option instructs the riscv64-unknown-elf-objdump tool to disassemble the contents of the object file.
9
Even though the syntax is similar, the code showed by the objdump tool is not assembly code.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
30
+
3.2. LABELS, SYMBOLS, REFERENCES, AND RELOCATION
which instruction ret is located, is associated with address c
7
. Since the bge instruction has a reference
to label done, the assembler encodes the address associated with the done label (address c) in the fields
of this instruction.
The GNU objdump tool can be used to inspect several parts of the object file. The following example
shows how to use the riscv64-unknown-elf-objdump
8
tool to decode the data and instructions on the
trunk.o file so that we can inspect its contents.
$ riscv64-unknown-elf-objdump -D trunk.o
trunk.o: file format elf32-littleriscv
Disassembly of section .text:
00000000 <trunk42>:
0: 02a00313 li t1,42
4: 00a35463 bge t1,a0,c <done>
8: 00030513 mv a0,t1
0000000c <done>:
c: 00008067 ret
...
Notice that, for each instruction, it shows its address, its encoding in hexadecimal, and a text that
resembles assembly code
9
. The bge t1, a0, done instruction, for example, is mapped to address 4 and
encoded with the 32-bit value 00a35463. The objdump tool indicates that it refers to the label done,
which is mapped to address c (bge t1,a0,c <done>). Also, notice that the labels (and their addresses)
are displayed on their respective program position.
In the previous example, the trunk42 function starts at address 0, however, when linking this object
file (trunk.o) with others, the linker may need to move the code (assign new addresses) so that they
do not occupy the same addresses. In this process, the addresses associated with labels may change and
each reference to a label must also be fixed to reflect the new addresses.
Relocation is the process in which the code and data are assigned new memory addresses.
As discussed previously, during the relocation process, the linker needs to adjust the code and data to
reflect the new addresses. More specifically, the addresses associated with labels on the symbol table and
the references to labels must be adjusted. The relocation table is a data structure that contains
information that describes how the program instructions and data need to be modified to
reflect the addresses reassignment. Each object file contains a relocation table and the linker uses
their information to adjust the code when performing the relocation process.
The following example shows how to use the riscv64-unknown-elf-objdump tool to inspect the
contents of the relocation table on the trunk.o file. Notice that, in this case, the object file contains
one relocation record, which indicates that the instruction on address 4, a RISC-V branch instruction,
contains a reference to label done. The linker uses this information to adjust the branch instruction
when the done label is assigned a new address.
7
Notice that this disassembler displays addresses using the hexadecimal representation.
8
The -D option instructs the riscv64-unknown-elf-objdump tool to disassemble the contents of the object file.
9
Even though the syntax is similar, the code showed by the objdump tool is not assembly code.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
30
diff --git a/book/riscv-book-44.page b/book/riscv-book-44.page index 5b2a996..423abf6 100644 --- a/book/riscv-book-44.page +++ b/book/riscv-book-44.page @@ -1 +1 @@ -
3.2. LABELS, SYMBOLS, REFERENCES, AND RELOCATION
$ riscv64-unknown-elf-objdump -r trunk.o
trunk.o: file format elf32-littleriscv
RELOCATION RECORDS FOR [.text]:
OFFSET TYPE VALUE
00000004 R_RISCV_BRANCH done
The following example shows what happens to the previous program once it is linked. First, we
produce the trunk.x file by invoking the linker. Then, we inspect the contents of the trunk.x file by
using the riscv64-unknown-elf-objdump tool.
$ riscv64-unknown-elf-ld -m elf32lriscv trunk.o -o trunk.x
$ riscv64-unknown-elf-objdump -D trunk.x
trunk.x: file format elf32-littleriscv
Disassembly of section .text:
00010054 <trunk42>:
10054: 02a00313 li t1,42
10058: 00a35463 bge t1,a0,10060 <done>
1005c: 00030513 mv a0,t1
00010060 <done>:
10060: 00008067 ret
...
Notice that the code on the trunk.x program was relocated, i.e., assigned new addresses. In this
example, the code of the trunk42 routine starts at address 10054 and the bge instruction jumps to
address 10060 in case the value in register t1 is greater or equal to the value in register a0.
3.2.3 Undefined references
As discussed in previous sections, assembly code relies on labels to refer to program locations. In some
cases, an assembly code may refer to a label that is not defined in the same file. This is common when
invoking a routine that is implemented on another file or when accessing a global variable that is declared
on another file. The following example shows an assembly code that refers to a label that is not defined
on the same file, called main.s. The exit label is used on instruction jal (line 5), however, it is not
defined in this file
10
.
1 # Contents of the main.s file
2 start:
3 li a0, 10
4 li a1, 20
5 jal exit
The assembler assembles this program and register the exit label on the symbol table as an undefined
symbol. The riscv64-unknown-elf-nm tool identifies the undefined symbols by placing the ‘U’ character
before the symbol name. Assuming the previous code was assembled into the main.o object file, we can
inspect the contents of its symbol table as follows:
10
The jal instruction is used to invoke routines. In this case, it is invoking the exit routine. This instruction will be
further discussed in Section 5.7.3.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
31
+
3.2. LABELS, SYMBOLS, REFERENCES, AND RELOCATION
$ riscv64-unknown-elf-objdump -r trunk.o
trunk.o: file format elf32-littleriscv
RELOCATION RECORDS FOR [.text]:
OFFSET TYPE VALUE
00000004 R_RISCV_BRANCH done
The following example shows what happens to the previous program once it is linked. First, we
produce the trunk.x file by invoking the linker. Then, we inspect the contents of the trunk.x file by
using the riscv64-unknown-elf-objdump tool.
$ riscv64-unknown-elf-ld -m elf32lriscv trunk.o -o trunk.x
$ riscv64-unknown-elf-objdump -D trunk.x
trunk.x: file format elf32-littleriscv
Disassembly of section .text:
00010054 <trunk42>:
10054: 02a00313 li t1,42
10058: 00a35463 bge t1,a0,10060 <done>
1005c: 00030513 mv a0,t1
00010060 <done>:
10060: 00008067 ret
...
Notice that the code on the trunk.x program was relocated, i.e., assigned new addresses. In this
example, the code of the trunk42 routine starts at address 10054 and the bge instruction jumps to
address 10060 in case the value in register t1 is greater or equal to the value in register a0.
3.2.3 Undefined references
As discussed in previous sections, assembly code relies on labels to refer to program locations. In some
cases, an assembly code may refer to a label that is not defined in the same file. This is common when
invoking a routine that is implemented on another file or when accessing a global variable that is declared
on another file. The following example shows an assembly code that refers to a label that is not defined
on the same file, called main.s. The exit label is used on instruction jal (line 5), however, it is not
defined in this file
10
.
1 # Contents of the main.s file
2 start:
3 li a0, 10
4 li a1, 20
5 jal exit
The assembler assembles this program and register the exit label on the symbol table as an undefined
symbol. The riscv64-unknown-elf-nm tool identifies the undefined symbols by placing the ‘U’ character
before the symbol name. Assuming the previous code was assembled into the main.o object file, we can
inspect the contents of its symbol table as follows:
10
The jal instruction is used to invoke routines. In this case, it is invoking the exit routine. This instruction will be
further discussed in Section 5.7.3.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
31
diff --git a/book/riscv-book-45.page b/book/riscv-book-45.page index dbffa80..12f8a51 100644 --- a/book/riscv-book-45.page +++ b/book/riscv-book-45.page @@ -1 +1 @@ -
3.2. LABELS, SYMBOLS, REFERENCES, AND RELOCATION
$ riscv64-unknown-elf-nm main.o
00000000 t start
U exit
The assembler also register the reference to this symbol on the relocation table. The disassembling
tool (riscv64-unknown-elf-objdump) shows that the main.o object file includes a relocation record for
the reference to the exit label on the jal instruction.
$ riscv64-unknown-elf-objdump -r main.o
main.o: file format elf32-littleriscv
RELOCATION RECORDS FOR [.text]:
OFFSET TYPE VALUE
00000008 R_RISCV_JAL exit
When linking the object files, the linker must resolve the undefined symbols, i.e., it must find the
symbol definition and adjust the symbol table and the code with the symbol value. In the previous
example, the linker will look for the exit symbol so that it can adjust the jal instruction to refer to
the correct address. In case it cannot find the definition of the symbol, it stops the linking process and
emits an error message. The following example illustrates this situation. In this case, we are trying to
link the main.o file without providing another object file that contains a definition of the exit label.
Notice that the linker emits the error message undefined reference to ‘exit’.
$ riscv64-unknown-elf-ld -m elf32lriscv main.o -o main.x
riscv64-unknown-elf-ld: warning: cannot find entry symbol start; ...
riscv64-unknown-elf-ld: main.o: in function ‘start’:
(.text+0x8): undefined reference to ‘exit’
3.2.4 Global vs local symbols
Symbols are classified as local or global symbols. Local symbols are only visible on the same file, i.e.,
the linker does not use them to resolve undefined references on other files. Global symbols, on the other
hand, are used by the linker to resolve undefined reference on other files.
By default, the assembler registers labels as local symbols. The .globl directive is an assembly
directive that instructs the assembler to register a label as a global symbol. The following example
shows an assembly program in which the .globl directive is used to instruct the assembler to register
the exit label as a global symbol on the symbol table.
1 # Contents of the exit.s file
2 .globl exit
3 exit:
4 li a0, 0
5 li a7, 93
6 ecall
Assuming the code that invokes the exit function is located on the main.s file and the exit function
is located on the exit.s file, the following sequence of commands shows how to assemble both files and
link them together.
$ riscv64-unknown-elf-as -march=rv32im main.s -o main.o
$ riscv64-unknown-elf-as -march=rv32im exit.s -o exit.o
$ riscv64-unknown-elf-ld -m elf32lriscv main.o exit.o -o main.x
riscv64-unknown-elf-ld: warning: cannot find entry symbol start; ...
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
32
+
3.2. LABELS, SYMBOLS, REFERENCES, AND RELOCATION
$ riscv64-unknown-elf-nm main.o
00000000 t start
U exit
The assembler also register the reference to this symbol on the relocation table. The disassembling
tool (riscv64-unknown-elf-objdump) shows that the main.o object file includes a relocation record for
the reference to the exit label on the jal instruction.
$ riscv64-unknown-elf-objdump -r main.o
main.o: file format elf32-littleriscv
RELOCATION RECORDS FOR [.text]:
OFFSET TYPE VALUE
00000008 R_RISCV_JAL exit
When linking the object files, the linker must resolve the undefined symbols, i.e., it must find the
symbol definition and adjust the symbol table and the code with the symbol value. In the previous
example, the linker will look for the exit symbol so that it can adjust the jal instruction to refer to
the correct address. In case it cannot find the definition of the symbol, it stops the linking process and
emits an error message. The following example illustrates this situation. In this case, we are trying to
link the main.o file without providing another object file that contains a definition of the exit label.
Notice that the linker emits the error message undefined reference to ‘exit’.
$ riscv64-unknown-elf-ld -m elf32lriscv main.o -o main.x
riscv64-unknown-elf-ld: warning: cannot find entry symbol start; ...
riscv64-unknown-elf-ld: main.o: in function ‘start’:
(.text+0x8): undefined reference to ‘exit’
3.2.4 Global vs local symbols
Symbols are classified as local or global symbols. Local symbols are only visible on the same file, i.e.,
the linker does not use them to resolve undefined references on other files. Global symbols, on the other
hand, are used by the linker to resolve undefined reference on other files.
By default, the assembler registers labels as local symbols. The .globl directive is an assembly
directive that instructs the assembler to register a label as a global symbol. The following example
shows an assembly program in which the .globl directive is used to instruct the assembler to register
the exit label as a global symbol on the symbol table.
1 # Contents of the exit.s file
2 .globl exit
3 exit:
4 li a0, 0
5 li a7, 93
6 ecall
Assuming the code that invokes the exit function is located on the main.s file and the exit function
is located on the exit.s file, the following sequence of commands shows how to assemble both files and
link them together.
$ riscv64-unknown-elf-as -march=rv32im main.s -o main.o
$ riscv64-unknown-elf-as -march=rv32im exit.s -o exit.o
$ riscv64-unknown-elf-ld -m elf32lriscv main.o exit.o -o main.x
riscv64-unknown-elf-ld: warning: cannot find entry symbol start; ...
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
32
diff --git a/book/riscv-book-46.page b/book/riscv-book-46.page index a9b7f4f..a3ace44 100644 --- a/book/riscv-book-46.page +++ b/book/riscv-book-46.page @@ -1 +1 @@ -
3.2. LABELS, SYMBOLS, REFERENCES, AND RELOCATION
Notice that the linker is not producing the undefined reference to ‘exit’ anymore. It is worth
noting that, in case the exit label is not registered as a global label, the linker will not use it to resolve
the undefined symbol and the linking process will fail.
3.2.5 The program entry point
Every program has an entry point, i.e., the point from which the CPU must start executing the program.
The entry point is defined by an address, which is the address of the first instruction that must be
executed.
The executable file has a header that contains much information about the program and one of the
header fields stores the entry point address. In this context, once the operating system loads the program
into the main memory, it sets the PC with the entry point address so the program starts executing.
The linker is responsible for setting the entry point field on the executable file. To do so, it looks for a
symbol named start. If it finds it, it sets the entry point field with the start symbol value. Otherwise,
it sets the entry point to a default value, usually the address of the first instruction of the program.
To select the program entry point, the programmer (or the compiler) may define the label start
right before the first instruction that must be executed. In the previous example we intentionally
used the start label on the main.s assembly program to mark the program entry point. Nonetheless,
as indicated by the warning message (warning: cannot find entry symbol start; defaulting to
...010054), the linker was not able to find the entry symbol. It happened because the start label must
be registered as a global symbol for the linker to recognize it as the entry point. The following code
shows how the main.s file can be adjusted to register the start label as a global symbol.
1 # Contents of the main.s file
2 .globl start
3 start:
4 li a0, 10
5 li a1, 20
6 jal exit
Once the start label is registered as a global symbol, the linker uses its address to set the entry
point information. The following sequence of commands assemble the main.s and the exit.s assembly
programs and link them together into the main.x executable file. In this case, there were no error nor
warning messages because we used the .globl directive to set both the exit and the start labels as
global symbols, allowing the linker to resolve the exit reference and set the program entry point.
$ riscv64-unknown-elf-as -march=rv32im main.s -o main.o
$ riscv64-unknown-elf-as -march=rv32im exit.s -o exit.o
$ riscv64-unknown-elf-ld -m elf32lriscv exit.o main.o -o main.x
In this example, we passed the exit.o object file before the main.o file. Because of this, the linker
places the contents of the exit.o file before the contents of the main.o file on the main.x file. This can
be observed by listing the contents of the main.x file with the riscv64-unknown-elf-objdump tool, as
follows:
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
33
+
3.2. LABELS, SYMBOLS, REFERENCES, AND RELOCATION
Notice that the linker is not producing the undefined reference to ‘exit’ anymore. It is worth
noting that, in case the exit label is not registered as a global label, the linker will not use it to resolve
the undefined symbol and the linking process will fail.
3.2.5 The program entry point
Every program has an entry point, i.e., the point from which the CPU must start executing the program.
The entry point is defined by an address, which is the address of the first instruction that must be
executed.
The executable file has a header that contains much information about the program and one of the
header fields stores the entry point address. In this context, once the operating system loads the program
into the main memory, it sets the PC with the entry point address so the program starts executing.
The linker is responsible for setting the entry point field on the executable file. To do so, it looks for a
symbol named start. If it finds it, it sets the entry point field with the start symbol value. Otherwise,
it sets the entry point to a default value, usually the address of the first instruction of the program.
To select the program entry point, the programmer (or the compiler) may define the label start
right before the first instruction that must be executed. In the previous example we intentionally
used the start label on the main.s assembly program to mark the program entry point. Nonetheless,
as indicated by the warning message (warning: cannot find entry symbol start; defaulting to
...010054), the linker was not able to find the entry symbol. It happened because the start label must
be registered as a global symbol for the linker to recognize it as the entry point. The following code
shows how the main.s file can be adjusted to register the start label as a global symbol.
1 # Contents of the main.s file
2 .globl start
3 start:
4 li a0, 10
5 li a1, 20
6 jal exit
Once the start label is registered as a global symbol, the linker uses its address to set the entry
point information. The following sequence of commands assemble the main.s and the exit.s assembly
programs and link them together into the main.x executable file. In this case, there were no error nor
warning messages because we used the .globl directive to set both the exit and the start labels as
global symbols, allowing the linker to resolve the exit reference and set the program entry point.
$ riscv64-unknown-elf-as -march=rv32im main.s -o main.o
$ riscv64-unknown-elf-as -march=rv32im exit.s -o exit.o
$ riscv64-unknown-elf-ld -m elf32lriscv exit.o main.o -o main.x
In this example, we passed the exit.o object file before the main.o file. Because of this, the linker
places the contents of the exit.o file before the contents of the main.o file on the main.x file. This can
be observed by listing the contents of the main.x file with the riscv64-unknown-elf-objdump tool, as
follows:
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
33
diff --git a/book/riscv-book-47.page b/book/riscv-book-47.page index 410b295..9aea2de 100644 --- a/book/riscv-book-47.page +++ b/book/riscv-book-47.page @@ -1 +1 @@ -
3.3. PROGRAM SECTIONS
$ riscv64-unknown-elf-objdump -D main.x
main.x: file format elf32-littleriscv
Disassembly of section .text:
00010054 <exit>:
10054: 00000513 li a0,0
10058: 05d00893 li a7,93
1005c: 00000073 ecall
00010060 <start>:
10060: 00a00513 li a0,10
10064: 01400593 li a1,20
10068: fedff0ef jal ra,10054 <exit>
...
Even though the linker placed the exit function first, the code associated with the start label will
be executed first because the entry point field contains the address associated with the start label.
The GNU readelf tool can be used to display information about ELF files. The following command
shows how the riscv64-unknown-elf-readelf tool can be used to inspect the header of the main.x
executable file. Notice that the entry point address field was set to 0x10060, i.e., the address of the
start label.
$ riscv64-unknown-elf-readelf -h main.x
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2’s complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: RISC-V
Version: 0x1
Entry point address: 0x10060
Start of program headers: 52 (bytes into file)
Start of section headers: 476 (bytes into file)
Flags: 0x0
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 1
Size of section headers: 40 (bytes)
Number of section headers: 6
Section header string table index: 5
3.3 Program sections
Executable and object files, and assembly programs are usually organized in sections. A section may
contain data or instructions, and the contents of each section are mapped to a set of consecutive main
memory addresses. The following sections are often present on executable files generated for Linux-based
systems:
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
34
+
3.3. PROGRAM SECTIONS
$ riscv64-unknown-elf-objdump -D main.x
main.x: file format elf32-littleriscv
Disassembly of section .text:
00010054 <exit>:
10054: 00000513 li a0,0
10058: 05d00893 li a7,93
1005c: 00000073 ecall
00010060 <start>:
10060: 00a00513 li a0,10
10064: 01400593 li a1,20
10068: fedff0ef jal ra,10054 <exit>
...
Even though the linker placed the exit function first, the code associated with the start label will
be executed first because the entry point field contains the address associated with the start label.
The GNU readelf tool can be used to display information about ELF files. The following command
shows how the riscv64-unknown-elf-readelf tool can be used to inspect the header of the main.x
executable file. Notice that the entry point address field was set to 0x10060, i.e., the address of the
start label.
$ riscv64-unknown-elf-readelf -h main.x
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2’s complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: RISC-V
Version: 0x1
Entry point address: 0x10060
Start of program headers: 52 (bytes into file)
Start of section headers: 476 (bytes into file)
Flags: 0x0
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 1
Size of section headers: 40 (bytes)
Number of section headers: 6
Section header string table index: 5
3.3 Program sections
Executable and object files, and assembly programs are usually organized in sections. A section may
contain data or instructions, and the contents of each section are mapped to a set of consecutive main
memory addresses. The following sections are often present on executable files generated for Linux-based
systems:
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
34
diff --git a/book/riscv-book-48.page b/book/riscv-book-48.page index fb9671e..1b7781c 100644 --- a/book/riscv-book-48.page +++ b/book/riscv-book-48.page @@ -1 +1 @@ -
3.3. PROGRAM SECTIONS
.text: a section dedicated to store the program instructions;
.data: a section dedicated to store initialized global variables, i.e., the variables that need their
value to be initialized before the program starts executing;
.bss: a section dedicated to store uninitialized global variables;
.rodata: a section dedicated to store constants, i.e., values that are read by the program but not
modified during execution.
When linking multiple object files, the linker groups information from sections with the same name
and places them together into a single section on the executable file. For example, when linking multiple
object files, the contents of the .text sections from all object files are grouped together and placed
sequentially on the executable file on a single section that is also called .text. Figure 3.2 shows the
layout of an RV32I executable file that was generated by the riscv64-unknown-elf-ld tool, and is
encoded using the Executable and Linking Format. This file contains three sections: the .data, the
.rodata, and the .text sections. The contents of section .text are mapped to addresses 8000 to 8007,
while the contents of section .data are mapped to addresses 800d to 8011.
11010110
10010101
10011100
11101011
10101010
10011100
10010101
11010110
11010110
10010101
10011100
11101011
10101010
Addresses
Executable File (ELF)
.text
section
8007
8006
8005
8004
8003
8002
8001
8000
10010101
10011100
11101011
10101010
.rodata
section
800b
800a
8009
8008
.data
section
8011
8010
800f
800e
800d
11101011
...
10101010
ELF
header
11101011
...
10101010
Section
header
table
Figure 3.2: Layout of an executable file encoded using the ELF.
By default, the GNU assembler tool adds all the information to the .text section. To instruct
the assembler to add the assembled information into other sections, the programmer (or the compiler)
may use the .section secname directive. This directive instructs the assembler to place the following
assembled information into the section named secname. The following example illustrates how the
.section directive can be used to add instructions to the .text section and variables to the .data
section.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
35
+
3.3. PROGRAM SECTIONS
.text: a section dedicated to store the program instructions;
.data: a section dedicated to store initialized global variables, i.e., the variables that need their
value to be initialized before the program starts executing;
.bss: a section dedicated to store uninitialized global variables;
.rodata: a section dedicated to store constants, i.e., values that are read by the program but not
modified during execution.
When linking multiple object files, the linker groups information from sections with the same name
and places them together into a single section on the executable file. For example, when linking multiple
object files, the contents of the .text sections from all object files are grouped together and placed
sequentially on the executable file on a single section that is also called .text. Figure 3.2 shows the
layout of an RV32I executable file that was generated by the riscv64-unknown-elf-ld tool, and is
encoded using the Executable and Linking Format. This file contains three sections: the .data, the
.rodata, and the .text sections. The contents of section .text are mapped to addresses 8000 to 8007,
while the contents of section .data are mapped to addresses 800d to 8011.
11010110
10010101
10011100
11101011
10101010
10011100
10010101
11010110
11010110
10010101
10011100
11101011
10101010
Addresses
Executable File (ELF)
.text
section
8007
8006
8005
8004
8003
8002
8001
8000
10010101
10011100
11101011
10101010
.rodata
section
800b
800a
8009
8008
.data
section
8011
8010
800f
800e
800d
11101011
...
10101010
ELF
header
11101011
...
10101010
Section
header
table
Figure 3.2: Layout of an executable file encoded using the ELF.
By default, the GNU assembler tool adds all the information to the .text section. To instruct
the assembler to add the assembled information into other sections, the programmer (or the compiler)
may use the .section secname directive. This directive instructs the assembler to place the following
assembled information into the section named secname. The following example illustrates how the
.section directive can be used to add instructions to the .text section and variables to the .data
section.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
35
diff --git a/book/riscv-book-49.page b/book/riscv-book-49.page index f3851e0..29783a2 100644 --- a/book/riscv-book-49.page +++ b/book/riscv-book-49.page @@ -1 +1 @@ -
3.3. PROGRAM SECTIONS
1 .section .data
2 x: .word 10
3 .section .text
4 update_x:
5 la t1, x
6 sw a0, (t1)
7 ret
8 .section .data
9 y: .word 12
10 .section .text
11 update_y:
12 la t1, y
13 sw a0, (t1)
14 ret
The .section .data directive in the first line of the previous example is instructing the assembler
to add information to the .data section from this point on. The second line contains a label (x:) and
a .word directive, which are used together to declare and initialize a global variable named x. The
.section .text directive in the third line instructs the assembler to add the following information to
the .text section. As a consequence, the update x label (line 4) refers to a position on the .text
section and the next three instructions (lines 5-7) are added at the .text section. The .section .data
directive in line eight instructs the assembler to switch back to the .data section. Hence, the y variable,
created by combining the y: label with the .word directive, is added to the .data section, right after
the x variable. After this, .section .text directive in line 10 instructs the assembler to add the next
information to the .text section. Finally, the update y label (line 11) refers to a position in the .text
section and the remaining instructions (lines 12-14) are added to the .text section.
Assuming the previous code is stored on a file named prog.s, we may assemble the program and
inspect the contents of the object file using the following commands
11
:
$ riscv64-unknown-elf-as -march=rv32im prog.s -o prog.o
$ riscv64-unknown-elf-objdump -D prog.o
prog.o: file format elf32-littleriscv
Disassembly of section .text:
11
In this example, the la assembly instruction is a pseudo-instruction that is converted by the assembler into two machine
instructions: auipc and mv. These two instructions will be later updated by the linker so that they load the address of the
respective label into the target register, i.e., register t1.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
36
+
3.3. PROGRAM SECTIONS
1 .section .data
2 x: .word 10
3 .section .text
4 update_x:
5 la t1, x
6 sw a0, (t1)
7 ret
8 .section .data
9 y: .word 12
10 .section .text
11 update_y:
12 la t1, y
13 sw a0, (t1)
14 ret
The .section .data directive in the first line of the previous example is instructing the assembler
to add information to the .data section from this point on. The second line contains a label (x:) and
a .word directive, which are used together to declare and initialize a global variable named x. The
.section .text directive in the third line instructs the assembler to add the following information to
the .text section. As a consequence, the update x label (line 4) refers to a position on the .text
section and the next three instructions (lines 5-7) are added at the .text section. The .section .data
directive in line eight instructs the assembler to switch back to the .data section. Hence, the y variable,
created by combining the y: label with the .word directive, is added to the .data section, right after
the x variable. After this, .section .text directive in line 10 instructs the assembler to add the next
information to the .text section. Finally, the update y label (line 11) refers to a position in the .text
section and the remaining instructions (lines 12-14) are added to the .text section.
Assuming the previous code is stored on a file named prog.s, we may assemble the program and
inspect the contents of the object file using the following commands
11
:
$ riscv64-unknown-elf-as -march=rv32im prog.s -o prog.o
$ riscv64-unknown-elf-objdump -D prog.o
prog.o: file format elf32-littleriscv
Disassembly of section .text:
11
In this example, the la assembly instruction is a pseudo-instruction that is converted by the assembler into two machine
instructions: auipc and mv. These two instructions will be later updated by the linker so that they load the address of the
respective label into the target register, i.e., register t1.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
36
diff --git a/book/riscv-book-5.page b/book/riscv-book-5.page index 2fa27e4..5092339 100644 --- a/book/riscv-book-5.page +++ b/book/riscv-book-5.page @@ -1 +1 @@ -
Contents
Foreword i
Acronyms vii
Glossary viii
I Fundamental concepts 1
1 Execution of programs: a 10,000 ft overview 2
1.1 Main components of computers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.1.1 The main memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.1.2 The CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Executing program instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3 The boot process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2 Data representation on modern computers 7
2.1 Numeral systems and the positional notation . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.1.1 Converting numbers between bases . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2 Representing numbers on computers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2.1 Unsigned numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2.2 Signed numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2.3 Binary arithmetic and overflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.2.4 Integer overflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.3 Representing text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.4 Organizing data on the memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.4.1 Texts on the main memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.4.2 Numbers on the main memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.4.3 Arrays on the main memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.4.4 Structs on the main memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.5 Encoding instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3 Assembly, object, and executable files 25
3.1 Generating native programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.1.1 Inspecting the contents of object and executable files . . . . . . . . . . . . . . . . . 27
3.2 Labels, symbols, references, and relocation . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.2.1 Labels and symbols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.2.2 References to labels and relocation . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2.3 Undefined references . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.2.4 Global vs local symbols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.2.5 The program entry point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.3 Program sections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
ii
+
Contents
Foreword i
Acronyms vii
Glossary viii
I Fundamental concepts 1
1 Execution of programs: a 10,000 ft overview 2
1.1 Main components of computers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.1.1 The main memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.1.2 The CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Executing program instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3 The boot process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2 Data representation on modern computers 7
2.1 Numeral systems and the positional notation . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.1.1 Converting numbers between bases . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2 Representing numbers on computers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2.1 Unsigned numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2.2 Signed numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2.3 Binary arithmetic and overflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.2.4 Integer overflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.3 Representing text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.4 Organizing data on the memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.4.1 Texts on the main memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.4.2 Numbers on the main memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.4.3 Arrays on the main memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.4.4 Structs on the main memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.5 Encoding instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3 Assembly, object, and executable files 25
3.1 Generating native programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.1.1 Inspecting the contents of object and executable files . . . . . . . . . . . . . . . . . 27
3.2 Labels, symbols, references, and relocation . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.2.1 Labels and symbols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.2.2 References to labels and relocation . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2.3 Undefined references . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.2.4 Global vs local symbols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.2.5 The program entry point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.3 Program sections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
ii
diff --git a/book/riscv-book-50.page b/book/riscv-book-50.page index 13ac2df..524e66a 100644 --- a/book/riscv-book-50.page +++ b/book/riscv-book-50.page @@ -1 +1 @@ -
3.3. PROGRAM SECTIONS
00000000 <update_x>:
0: 00000317 auipc t1,0x0
4: 00030313 mv t1,t1
8: 00a32023 sw a0,0(t1) # 0 <update_x>
c: 00008067 ret
00000010 <update_y>:
10: 00000317 auipc t1,0x0
14: 00030313 mv t1,t1
18: 00a32023 sw a0,0(t1) # 10 <update_y>
1c: 00008067 ret
Disassembly of section .data:
00000000 <x>:
0: 000a c.slli zero,0x2
...
00000004 <y>:
4: 000c 0xc
...
Notice that the program routines, represented by the update x and update y labels, and the program
instructions are all located on the .text section while the global variables, represented by the x and
y labels, and the 32-bit values 000a and 000c, are located on the .data section. Also, notice that the
elements of each section are assigned addresses starting at zero. However, since instructions and data are
stored on the same memory, the main memory, we may not load the variables and the instruction into
the same memory addresses. The linker prevents this problem by relocating the instructions and data
so they are assigned non-conflicting addresses. The following commands show how to invoke the linker
to produce an executable file named prog.x and how to invoke the objdump tool to inspect its contents:
$ riscv64-unknown-elf-ld -m elf32lriscv prog.o -o prog.x
$ riscv64-unknown-elf-objdump -D prog.x
prog.x: file format elf32-littleriscv
Disassembly of section .text:
00010074 <update_x>:
10074: 00001317 auipc t1,0x1
10078: 01c30313 addi t1,t1,28 # 11090 <__DATA_BEGIN__>
1007c: 00a32023 sw a0,0(t1)
10080: 00008067 ret
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
37
+
3.3. PROGRAM SECTIONS
00000000 <update_x>:
0: 00000317 auipc t1,0x0
4: 00030313 mv t1,t1
8: 00a32023 sw a0,0(t1) # 0 <update_x>
c: 00008067 ret
00000010 <update_y>:
10: 00000317 auipc t1,0x0
14: 00030313 mv t1,t1
18: 00a32023 sw a0,0(t1) # 10 <update_y>
1c: 00008067 ret
Disassembly of section .data:
00000000 <x>:
0: 000a c.slli zero,0x2
...
00000004 <y>:
4: 000c 0xc
...
Notice that the program routines, represented by the update x and update y labels, and the program
instructions are all located on the .text section while the global variables, represented by the x and
y labels, and the 32-bit values 000a and 000c, are located on the .data section. Also, notice that the
elements of each section are assigned addresses starting at zero. However, since instructions and data are
stored on the same memory, the main memory, we may not load the variables and the instruction into
the same memory addresses. The linker prevents this problem by relocating the instructions and data
so they are assigned non-conflicting addresses. The following commands show how to invoke the linker
to produce an executable file named prog.x and how to invoke the objdump tool to inspect its contents:
$ riscv64-unknown-elf-ld -m elf32lriscv prog.o -o prog.x
$ riscv64-unknown-elf-objdump -D prog.x
prog.x: file format elf32-littleriscv
Disassembly of section .text:
00010074 <update_x>:
10074: 00001317 auipc t1,0x1
10078: 01c30313 addi t1,t1,28 # 11090 <__DATA_BEGIN__>
1007c: 00a32023 sw a0,0(t1)
10080: 00008067 ret
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
37
diff --git a/book/riscv-book-51.page b/book/riscv-book-51.page index 87d8de0..0b6d681 100644 --- a/book/riscv-book-51.page +++ b/book/riscv-book-51.page @@ -1 +1 @@ -
3.4. EXECUTABLE VS OBJECT FILES
00010084 <update_y>:
10084: 80418313 addi t1,gp,-2044 # 11094 <y>
10088: 00a32023 sw a0,0(t1)
1008c: 00008067 ret
Disassembly of section .data:
00011090 <__DATA_BEGIN__>:
11090: 000a c.slli zero, 0x2
...
00011094 <y>:
11094: 000c 0xc
...
Notice that the linker assigned addresses 10074 to 1008f to the contents of the .text section and
addresses 10090 to 10097
12
to the contents of the .data section.
NOTE: Some operating systems configure the hardware to prevent instructions from writing
to memory addresses assigned to the .text and .rodata sections. Hence, variables should not
be placed on these sections. Also, some operating systems configure the hardware to prevent
the CPU from executing instructions from memory addresses that are not assigned to the .text
section. Therefore, it is important to keep the program instructions on the .text section.
3.4 Executable vs object files
The Executable and Linking Format, or ELF, is used by several Linux-based operating systems to encode
both object and executable files. Even though object and executable files may contain machine code and
both can be encoded using the ELF, they differ in the following aspects:
Addresses on object files are not final and elements from different sections may be assigned the
same addresses, as discussed in Section 3.3. As a consequence, the elements of different sections
may not reside in the main memory at the same time;
Object files may contain one or more references to undefined symbols, which are expected to be
resolved by the linker;
Object files contain a relocation table so that instructions and data on object files can be relocated
on linking. Addresses on executable files are usually final;
Object files do not have an entry point;
12
Although the output of the objdump tool does not make it clear, the linker has assigned addresses 10090 to 10097 to
the contents of the .data section. Notice that variables x and y are words, which means each of them occupies 4 bytes.
Variable x occupies the memory bytes associated with addresses 10090, 10091, 10092, and 10093, while variable y occupies
the bytes associated with addresses 10094, 10095, 10096, and 10097.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
38
+
3.4. EXECUTABLE VS OBJECT FILES
00010084 <update_y>:
10084: 80418313 addi t1,gp,-2044 # 11094 <y>
10088: 00a32023 sw a0,0(t1)
1008c: 00008067 ret
Disassembly of section .data:
00011090 <__DATA_BEGIN__>:
11090: 000a c.slli zero, 0x2
...
00011094 <y>:
11094: 000c 0xc
...
Notice that the linker assigned addresses 10074 to 1008f to the contents of the .text section and
addresses 10090 to 10097
12
to the contents of the .data section.
NOTE: Some operating systems configure the hardware to prevent instructions from writing
to memory addresses assigned to the .text and .rodata sections. Hence, variables should not
be placed on these sections. Also, some operating systems configure the hardware to prevent
the CPU from executing instructions from memory addresses that are not assigned to the .text
section. Therefore, it is important to keep the program instructions on the .text section.
3.4 Executable vs object files
The Executable and Linking Format, or ELF, is used by several Linux-based operating systems to encode
both object and executable files. Even though object and executable files may contain machine code and
both can be encoded using the ELF, they differ in the following aspects:
Addresses on object files are not final and elements from different sections may be assigned the
same addresses, as discussed in Section 3.3. As a consequence, the elements of different sections
may not reside in the main memory at the same time;
Object files may contain one or more references to undefined symbols, which are expected to be
resolved by the linker;
Object files contain a relocation table so that instructions and data on object files can be relocated
on linking. Addresses on executable files are usually final;
Object files do not have an entry point;
12
Although the output of the objdump tool does not make it clear, the linker has assigned addresses 10090 to 10097 to
the contents of the .data section. Notice that variables x and y are words, which means each of them occupies 4 bytes.
Variable x occupies the memory bytes associated with addresses 10090, 10091, 10092, and 10093, while variable y occupies
the bytes associated with addresses 10094, 10095, 10096, and 10097.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
38
diff --git a/book/riscv-book-52.page b/book/riscv-book-52.page index a9de31d..36b3b38 100644 --- a/book/riscv-book-52.page +++ b/book/riscv-book-52.page @@ -1 +1 @@ -
Chapter 4
Assembly language
Assembly programs are encoded as plain text files and contain four main elements:
Comments: comments are textual notes that are often used to document information on the code,
however, they have no effect on the code generation and the assembler discards them;
Labels: as discussed in Section 3.2.1, labels are “markers” that represent program locations.
They are usually defined by a name ended with the suffix “:” and can be inserted into an assembly
program to “mark” a program position so that it can be referred to by assembly instructions or
other assembly commands, such as assembly directives;
Assembly instructions: Assembly instructions are instructions that are converted by the assem-
bler into machine instructions. They are usually encoded as a string that contains a mnemonic and
a sequence of parameters, known as operands. For example, the “addi a0, a1, 1” string contains
the addi mnemonic and three operands: a0, a1, and 1;
Assembly directives: Assembly directives are commands used to coordinate the assembling
process. They are interpreted by the assembler. For example, the .word 10 directive instructs the
assembler to assemble a 32-bit value (10) into the program. Assembly directives are usually encoded
as strings that contains the directive name, which have a dot (‘.’) prefix, and its arguments.
As discussed before, comments have no effect on the assembling process and are discarded by the as-
sembler. This is usually performed by a preprocessor, which removes all comments and extra white spaces.
Once comments and extra white spaces are discarded, the assembly program contains only three kinds
of elements: labels, assembly instructions and assembly directives. Assuming <label>, <instruction>,
and the <directive> represent valid labels, assembly instructions, and assembly directives, respectively,
the following regular expression can be used to summarize the syntax of the assembly language once its
comments and extra white spaces are removed.
PROGRAM -> LINES
LINES -> LINE [‘\n’ LINES]
LINE -> [<label>] [<instruction>] |
[<label>] [<directive>]
The first two rules of the previous regular expression indicate that an assembly program is composed
by one or more lines, which are delimited by the end of line character, i.e., \n’. The last rule implies
that:
a line may be empty. Notice that the <label>, the <instruction>, and the <directive> elements
are optional
1
;
1
Elements expressed between brackets on a regular expression are optional.
39
+
Chapter 4
Assembly language
Assembly programs are encoded as plain text files and contain four main elements:
Comments: comments are textual notes that are often used to document information on the code,
however, they have no effect on the code generation and the assembler discards them;
Labels: as discussed in Section 3.2.1, labels are “markers” that represent program locations.
They are usually defined by a name ended with the suffix “:” and can be inserted into an assembly
program to “mark” a program position so that it can be referred to by assembly instructions or
other assembly commands, such as assembly directives;
Assembly instructions: Assembly instructions are instructions that are converted by the assem-
bler into machine instructions. They are usually encoded as a string that contains a mnemonic and
a sequence of parameters, known as operands. For example, the addi a0, a1, 1 string contains
the addi mnemonic and three operands: a0, a1, and 1;
Assembly directives: Assembly directives are commands used to coordinate the assembling
process. They are interpreted by the assembler. For example, the .word 10 directive instructs the
assembler to assemble a 32-bit value (10) into the program. Assembly directives are usually encoded
as strings that contains the directive name, which have a dot (‘.’) prefix, and its arguments.
As discussed before, comments have no effect on the assembling process and are discarded by the as-
sembler. This is usually performed by a preprocessor, which removes all comments and extra white spaces.
Once comments and extra white spaces are discarded, the assembly program contains only three kinds
of elements: labels, assembly instructions and assembly directives. Assuming <label>, <instruction>,
and the <directive> represent valid labels, assembly instructions, and assembly directives, respectively,
the following regular expression can be used to summarize the syntax of the assembly language once its
comments and extra white spaces are removed.
PROGRAM -> LINES
LINES -> LINE [‘\n’ LINES]
LINE -> [<label>] [<instruction>] |
[<label>] [<directive>]
The first two rules of the previous regular expression indicate that an assembly program is composed
by one or more lines, which are delimited by the end of line character, i.e., \n’. The last rule implies
that:
a line may be empty. Notice that the <label>, the <instruction>, and the <directive> elements
are optional
1
;
1
Elements expressed between brackets on a regular expression are optional.
39
diff --git a/book/riscv-book-53.page b/book/riscv-book-53.page index b4fdb45..0bb3aae 100644 --- a/book/riscv-book-53.page +++ b/book/riscv-book-53.page @@ -1 +1 @@ -
a line may contain a single label;
a line may contain a label followed by an assembly instruction;
a line may contain a single assembly instruction;
a line may contain a label followed by an assembly directive;
a line may contain a single assembly directive;
The following RV32I assembly code contains examples of valid assembly lines:
1 x:
2
3 sum: addi a0, a1, 1
4 ret
5 .section .data
6 y: .word 10
The following RV32I assembly code contains examples of invalid assembly lines. The first line contains
two labels and the second one contains an instruction followed by a label (notice that the label has to
precede the instruction when both are located in the same line). The third line contains two instructions
and the fourth one contains two assembly directives, however, only one instruction or one directive is
allowed per line. The fifth line contains an assembly directive followed by a label, however, the label has
to precede the directive when both are located in the same line. The sixth line contains an instruction
and an assembly directive on the same line while the seventh line contains an invalid directive.
1 x: z:
2 addi a0, a1, 1 sum:
3 li a0, 2 li a1, 1
4 .word 10 .word 20
5 .word 10 y:
6 addi a0, a1, 1 .word 12
7 .sdfoiywer 1
The following RV32I assembly code is also invalid because all elements of a single instruction, i.e.,
its mnemonic and operands, must be expressed in the same line. This is also a requirement for assembly
directives.
1 addi
2 a0, a1, 1
The GNU assembler tool is actually a family of assemblers. It includes assemblers for several ISAs,
including the RV32I ISA. Even though the assembly language processed by each GNU assembler is
different (usually due to differences on the assembly instructions, which are designed to be similar to the
machine instructions on the ISA), most of them share the same syntax for comments and labels, and the
same syntax for most of the assembly directives. In this sense, once you learn one assembly language, it
should be easy to learn new assembly languages.
In this book we will focus on the RV32I assembly language interpreted by the GNU assembler tool.
The following sections discuss the syntax of comments, labels, assembly instructions, and assembly
directives on RV32I assembly programs for the GNU assembler tool.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
40
+
a line may contain a single label;
a line may contain a label followed by an assembly instruction;
a line may contain a single assembly instruction;
a line may contain a label followed by an assembly directive;
a line may contain a single assembly directive;
The following RV32I assembly code contains examples of valid assembly lines:
1 x:
2
3 sum: addi a0, a1, 1
4 ret
5 .section .data
6 y: .word 10
The following RV32I assembly code contains examples of invalid assembly lines. The first line contains
two labels and the second one contains an instruction followed by a label (notice that the label has to
precede the instruction when both are located in the same line). The third line contains two instructions
and the fourth one contains two assembly directives, however, only one instruction or one directive is
allowed per line. The fifth line contains an assembly directive followed by a label, however, the label has
to precede the directive when both are located in the same line. The sixth line contains an instruction
and an assembly directive on the same line while the seventh line contains an invalid directive.
1 x: z:
2 addi a0, a1, 1 sum:
3 li a0, 2 li a1, 1
4 .word 10 .word 20
5 .word 10 y:
6 addi a0, a1, 1 .word 12
7 .sdfoiywer 1
The following RV32I assembly code is also invalid because all elements of a single instruction, i.e.,
its mnemonic and operands, must be expressed in the same line. This is also a requirement for assembly
directives.
1 addi
2 a0, a1, 1
The GNU assembler tool is actually a family of assemblers. It includes assemblers for several ISAs,
including the RV32I ISA. Even though the assembly language processed by each GNU assembler is
different (usually due to differences on the assembly instructions, which are designed to be similar to the
machine instructions on the ISA), most of them share the same syntax for comments and labels, and the
same syntax for most of the assembly directives. In this sense, once you learn one assembly language, it
should be easy to learn new assembly languages.
In this book we will focus on the RV32I assembly language interpreted by the GNU assembler tool.
The following sections discuss the syntax of comments, labels, assembly instructions, and assembly
directives on RV32I assembly programs for the GNU assembler tool.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
40
diff --git a/book/riscv-book-54.page b/book/riscv-book-54.page index 8cc3578..af3c4ef 100644 --- a/book/riscv-book-54.page +++ b/book/riscv-book-54.page @@ -1 +1 @@ -
4.1. COMMENTS
4.1 Comments
RV32I assembly programs may contain line or multi-line comments. On GNU assemblers, line comments
are delimited by a line comment character, which is target specific, i.e., it depends on the target ISA.
The RV32I GNU assembler uses the # character as the line comment character. All characters located
between the first occurrence of the line comment character (e.g., #) on the line and the end of the same
line are considered part of the comment. The following assembly code shows examples of line comments.
1 x: .word 10 # this is a comment
2 foo: # my special function
3 addi a0, a1, 1 # add one to a1 and store on a0 #
4 # this is # another # comment ## #
As comments are discarded by the assembler preprocessor, the previous code is semantically equivalent
to the following code.
1 x: .word 10
2 foo:
3 addi a0, a1, 1
A multi-line comment is a comment that spans multiple lines. On GNU assemblers, they are delimited
by the pair /* and */.
1 sum1:
2 /* This
3 is
4 a
5 multi-line
6 comment.
7 */
8 addi a0, a1, 1
9 ret
The previous code is semantically equivalent to the following code:
1 sum1: addi a0, a1, 1
2 ret
4.2 Assembly instructions
Assembly instructions are instructions that are converted by the assembler into machine instructions.
They are usually encoded as a string that contains a mnemonic and a sequence of parameters, known as
operands. For example, the assembly instruction add x10, x11, x12”, which is encoded as plain text
using 17 bytes (one for each character), is converted by the assembler into its corresponding machine
instruction, which is encoded in four bytes as 0x00c58533”.
A pseudo-instruction is an assembly instruction that does not have a corresponding machine in-
struction on the ISA, but can be translated automatically by the assembler into one or more alternative
machine instructions to achieve the same effect. As an example, the no operation instruction, or nop”, is
a RV32I pseudo-instruction that is converted by the assembler into the addi x0, x0, 0 instruction
2
.
2
This instruction adds zero to zero and discards the results by storing it on register x0, which is hard-wired to zero.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
41
+
4.1. COMMENTS
4.1 Comments
RV32I assembly programs may contain line or multi-line comments. On GNU assemblers, line comments
are delimited by a line comment character, which is target specific, i.e., it depends on the target ISA.
The RV32I GNU assembler uses the # character as the line comment character. All characters located
between the first occurrence of the line comment character (e.g., #) on the line and the end of the same
line are considered part of the comment. The following assembly code shows examples of line comments.
1 x: .word 10 # this is a comment
2 foo: # my special function
3 addi a0, a1, 1 # add one to a1 and store on a0 #
4 # this is # another # comment ## #
As comments are discarded by the assembler preprocessor, the previous code is semantically equivalent
to the following code.
1 x: .word 10
2 foo:
3 addi a0, a1, 1
A multi-line comment is a comment that spans multiple lines. On GNU assemblers, they are delimited
by the pair /* and */.
1 sum1:
2 /* This
3 is
4 a
5 multi-line
6 comment.
7 */
8 addi a0, a1, 1
9 ret
The previous code is semantically equivalent to the following code:
1 sum1: addi a0, a1, 1
2 ret
4.2 Assembly instructions
Assembly instructions are instructions that are converted by the assembler into machine instructions.
They are usually encoded as a string that contains a mnemonic and a sequence of parameters, known as
operands. For example, the assembly instruction add x10, x11, x12”, which is encoded as plain text
using 17 bytes (one for each character), is converted by the assembler into its corresponding machine
instruction, which is encoded in four bytes as 0x00c58533”.
A pseudo-instruction is an assembly instruction that does not have a corresponding machine in-
struction on the ISA, but can be translated automatically by the assembler into one or more alternative
machine instructions to achieve the same effect. As an example, the no operation instruction, or nop”, is
a RV32I pseudo-instruction that is converted by the assembler into the addi x0, x0, 0 instruction
2
.
2
This instruction adds zero to zero and discards the results by storing it on register x0, which is hard-wired to zero.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
41
diff --git a/book/riscv-book-55.page b/book/riscv-book-55.page index 2c70693..87b1b6d 100644 --- a/book/riscv-book-55.page +++ b/book/riscv-book-55.page @@ -1 +1 @@ -
4.3. IMMEDIATE VALUES
Another example is the mv instruction, which copies the contents of one register into another. In this
case, the pseudo-instruction mv a5, a7”, which copies the contents of a7 into a5, is converted into the
instruction addi a5, a7, 0”, which adds zero to the value in a7 and stores the result on register a5.
Appendix A presents a list with most of the RV32I assembly instructions, and the chapters in Part II
discuss how these instructions can be used to implement program structures, including conditional sen-
tences, loops, and routines.
The operands of assembly instructions may contain:
A register name: a register name identifies one of the ISA registers. RV32I ISA registers are
numbered from 0 to 31 and are named x0, x1, ..., x31. RV32I registers may also be identified by
their aliases, for example, a0, t1, ra, etc. Appendix A presents a list of RV32I registers and their
respective aliases.
An immediate value: an immediate value is a numerical constant that is directly encoded into the
machine instruction as a sequence of bits.
A symbol name: symbol names identify symbols on the symbol table and are replaced by their
respective values during the assembling and linking processes. They may identify, for example,
symbols that were explicitly defined by the user or symbols created automatically by the assembler,
such as the symbols created for labels. Their value are also encoded into the machine instruction
as a sequence of bits.
4.3 Immediate values
Immediate values are represented on assembly language by a sequence of alphanumeric characters. Se-
quences started with the “0x” and the 0b” prefixes are interpreted as hexadecimal and binary numbers,
respectively. Octal numbers are represented by a sequence of numeric digits starting with digit 0”.
Sequences of numeric digits starting with digits 1 to 9 are interpreted as decimal numbers.
Alphanumeric characters represented between single quotation marks are converted to numeric values
using the ASCII table. For example, the ’a’ operand is converted into value ninety seven. The following
code shows examples of instructions that use immediate values as operands:
1 li a0, 10 # load value ten into register a0
2 li a1, 0xa # load value ten into register a1
3 li a2, 0b1010 # load value ten into register a2
4 li a3, 012 # load value ten into register a3
5 li a4, ’0’ # load value forty eight into register a4
6 li a5, ’a’ # load value ninety seven into register a5
To denote a negative integer, it suffices to add the - prefix. For example:
1 li a0, -12 # load value minus twelve into register a0
2 li a1, -0xc # load value minus twelve into register a1
3 li a2, -0b1100 # load value minus twelve into register a2
4 li a3, -014 # load value minus twelve into register a3
5 li a4, -’0’ # load value minus forty eight into register a4
6 li a5, -’a’ # load value minus ninety seven into register a5
4.4 Symbol names
Program symbols are “names” that are associated with numerical values and the “symbol table” is a
data structure that maps each program symbol to its value. Labels are automatically converted into
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
42
+
4.3. IMMEDIATE VALUES
Another example is the mv instruction, which copies the contents of one register into another. In this
case, the pseudo-instruction mv a5, a7”, which copies the contents of a7 into a5, is converted into the
instruction addi a5, a7, 0”, which adds zero to the value in a7 and stores the result on register a5.
Appendix A presents a list with most of the RV32I assembly instructions, and the chapters in Part II
discuss how these instructions can be used to implement program structures, including conditional sen-
tences, loops, and routines.
The operands of assembly instructions may contain:
A register name: a register name identifies one of the ISA registers. RV32I ISA registers are
numbered from 0 to 31 and are named x0, x1, ..., x31. RV32I registers may also be identified by
their aliases, for example, a0, t1, ra, etc. Appendix A presents a list of RV32I registers and their
respective aliases.
An immediate value: an immediate value is a numerical constant that is directly encoded into the
machine instruction as a sequence of bits.
A symbol name: symbol names identify symbols on the symbol table and are replaced by their
respective values during the assembling and linking processes. They may identify, for example,
symbols that were explicitly defined by the user or symbols created automatically by the assembler,
such as the symbols created for labels. Their value are also encoded into the machine instruction
as a sequence of bits.
4.3 Immediate values
Immediate values are represented on assembly language by a sequence of alphanumeric characters. Se-
quences started with the 0x and the 0b prefixes are interpreted as hexadecimal and binary numbers,
respectively. Octal numbers are represented by a sequence of numeric digits starting with digit 0”.
Sequences of numeric digits starting with digits 1 to 9 are interpreted as decimal numbers.
Alphanumeric characters represented between single quotation marks are converted to numeric values
using the ASCII table. For example, the ’a’ operand is converted into value ninety seven. The following
code shows examples of instructions that use immediate values as operands:
1 li a0, 10 # load value ten into register a0
2 li a1, 0xa # load value ten into register a1
3 li a2, 0b1010 # load value ten into register a2
4 li a3, 012 # load value ten into register a3
5 li a4, ’0’ # load value forty eight into register a4
6 li a5, ’a’ # load value ninety seven into register a5
To denote a negative integer, it suffices to add the - prefix. For example:
1 li a0, -12 # load value minus twelve into register a0
2 li a1, -0xc # load value minus twelve into register a1
3 li a2, -0b1100 # load value minus twelve into register a2
4 li a3, -014 # load value minus twelve into register a3
5 li a4, -’0’ # load value minus forty eight into register a4
6 li a5, -’a’ # load value minus ninety seven into register a5
4.4 Symbol names
Program symbols are “names” that are associated with numerical values and the “symbol table” is a
data structure that maps each program symbol to its value. Labels are automatically converted into
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
42
diff --git a/book/riscv-book-56.page b/book/riscv-book-56.page index 0f54b7d..b23836b 100644 --- a/book/riscv-book-56.page +++ b/book/riscv-book-56.page @@ -1 +1 @@ -
4.5. LABELS
symbols by the assembler. Also, the programmer, or the compiler, may explicitly create symbols by
using the .set directive.
Symbol names are defined by a sequence of alphanumeric characters and the underscore character
( ). However, the first character may not be a numeric character. The following names are examples of
valid symbol names: x, var1, z12345, x, , 1, 123, and a12b.
The following names are examples of invalid symbol names: 1, 1var, z@12345, x-y, -var, and a+b.
The following code shows examples of instructions that use symbol names as operands (lines 4 and
5). The .set directive (line 1) creates the max temp symbol and associates value 100 with it. The load
immediate instruction (line 4), loads the value of symbol max temp into register t1. The branch less
equal instruction (ble) jumps to the code position represented by symbol temp ok (which is defined
automatically by label temp ok:) if the value in register a0 is less or equal to the value in register t1.
1 .set max_temp, 100 # set the max_temp limit
2
3 check_temp: # check_temp routine
4 li t1, max_temp # load the max_temp limit into t1
5 ble a0, t1, temp_ok # if a0 <= max_temp, then ok
6 jal alarm # else, invoke the alarm routine
7 temp_ok:
8 ret # return from the routine
4.5 Labels
As discussed in Section 3.2.1, labels are “markers” that represent program locations. They can be referred
to by instructions and assembly directives and are translated to addresses during the assembling and
linking processes.
GNU assemblers usually accept two kinds of labels: symbolic and numeric labels. Symbolic labels are
stored as symbols in the symbol table and are often used to identify global variables and routines. They
are defined by an identifier followed by a colon (:). The identifier follows the same syntax of symbol
names, as defined in the previous section. The following code contains two symbolic labels: age: and
get age:.
1 age: .word 42
2
3 get_age:
4 la t1, age
5 lw a0, (t1)
6 ret
Numeric labels are defined by a single decimal digit followed by a colon (:). They are used for
local reference and are not included in the symbol table of executable files. Also, they can be redefined
repeatedly in the same assembly program.
References to numeric labels contain a suffix that indicates whether the reference is to a numeric label
positioned before (‘b suffix) or after (‘f suffix) the reference. The following code contains examples of
numeric labels and references to them. This code has one symbolic label (pow) and two numeric labels
(both named 1:). The first numeric label, located at line 7, marks the beginning of a sequence of
instructions that belongs to a loop. The jump instruction located at line 11 jumps back to this label
notice the reference 1b, which refers to the numeric label 1 positioned before the reference. The second
numeric label, located at line 12, marks the location of the instruction that is positioned after the loop,
i.e., the instruction that must be executed when the execution flow leaves the loop. The instruction at
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
43
+
4.5. LABELS
symbols by the assembler. Also, the programmer, or the compiler, may explicitly create symbols by
using the .set directive.
Symbol names are defined by a sequence of alphanumeric characters and the underscore character
( ). However, the first character may not be a numeric character. The following names are examples of
valid symbol names: x, var1, z12345, x, , 1, 123, and a12b.
The following names are examples of invalid symbol names: 1, 1var, z@12345, x-y, -var, and a+b.
The following code shows examples of instructions that use symbol names as operands (lines 4 and
5). The .set directive (line 1) creates the max temp symbol and associates value 100 with it. The load
immediate instruction (line 4), loads the value of symbol max temp into register t1. The branch less
equal instruction (ble) jumps to the code position represented by symbol temp ok (which is defined
automatically by label temp ok:) if the value in register a0 is less or equal to the value in register t1.
1 .set max_temp, 100 # set the max_temp limit
2
3 check_temp: # check_temp routine
4 li t1, max_temp # load the max_temp limit into t1
5 ble a0, t1, temp_ok # if a0 <= max_temp, then ok
6 jal alarm # else, invoke the alarm routine
7 temp_ok:
8 ret # return from the routine
4.5 Labels
As discussed in Section 3.2.1, labels are “markers” that represent program locations. They can be referred
to by instructions and assembly directives and are translated to addresses during the assembling and
linking processes.
GNU assemblers usually accept two kinds of labels: symbolic and numeric labels. Symbolic labels are
stored as symbols in the symbol table and are often used to identify global variables and routines. They
are defined by an identifier followed by a colon (:). The identifier follows the same syntax of symbol
names, as defined in the previous section. The following code contains two symbolic labels: age: and
get age:.
1 age: .word 42
2
3 get_age:
4 la t1, age
5 lw a0, (t1)
6 ret
Numeric labels are defined by a single decimal digit followed by a colon (:). They are used for
local reference and are not included in the symbol table of executable files. Also, they can be redefined
repeatedly in the same assembly program.
References to numeric labels contain a suffix that indicates whether the reference is to a numeric label
positioned before (‘b suffix) or after (‘f suffix) the reference. The following code contains examples of
numeric labels and references to them. This code has one symbolic label (pow) and two numeric labels
(both named 1:). The first numeric label, located at line 7, marks the beginning of a sequence of
instructions that belongs to a loop. The jump instruction located at line 11 jumps back to this label
notice the reference 1b, which refers to the numeric label 1 positioned before the reference. The second
numeric label, located at line 12, marks the location of the instruction that is positioned after the loop,
i.e., the instruction that must be executed when the execution flow leaves the loop. The instruction at
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
43
diff --git a/book/riscv-book-57.page b/book/riscv-book-57.page index 8192f23..d03a586 100644 --- a/book/riscv-book-57.page +++ b/book/riscv-book-57.page @@ -1 +1 @@ -
4.6. THE LOCATION COUNTER AND THE ASSEMBLING PROCESS
line 8 jumps to this numeric label when the value of register a1 is equal to zero notice the reference
1f, which refers to the numeric label 1 positioned after the reference.
1 # Pow function -- computes a^b
2 # Inputs: a0=a, a1=b
3 # Output: a0=a^b
4 pow:
5 mv a2, a0 # save a0 in a2
6 li a0, 1 # set a0 to 1
7 1:
8 beqz a1, 1f # if a1 = 0 then done
9 mul a0, a0, a2 # else, multiply
10 addi a1, a1, -1 # decrement the counter
11 j 1b # repeat
12 1:
13 ret # return
4.6 The location counter and the assembling process
The location counter is an internal assembler counter that keeps track of addresses when
a program is being assembled. More specifically, it keeps the address of the next available memory
position. Each section has its own location counter, and the active location counter is the location
counter of the active section.
To discuss how the location counter is used and updated throughout the assembling process, we will
assemble the following assembly program step by step:
1 sum42:
2 addi a0, a0, 42
3 ret
Upon start, the GNU assembler clears the contents of the sections and the symbol table, initializes
all location counters with zero, and selects the .text section as the active section. Figure 4.1 illustrates
the status of the internal assembler structures upon start.
Once the internal structures are initialized, the assembler reads the input assembly file sequentially,
line by line, processing the labels, assembly instructions, and assembly directives one by one, in the order
they appear.
The first element in our assembly program is a label named sum42:”. When processing a label, the
assembler registers it as a symbol at the symbol table and associates it with an address that represents the
current program location. The current location is indicated by the active location counter. Figure 4.2
illustrates how the symbol table is updated when the sum42: label is processed by the assembler.
Notice that the assembler register the name sum42 into the symbol table
1 and associates it with
address zero 2 , i.e., the address of the active location counter.
The next element in our assembly program is the addi a0, a0, 42 assembly instruction. In this
case, the assembler 1 translates it into a machine instruction, 2 adds it to the active section in the
address indicated by the active location counter, and 3 updates the active location counter so it points to
the next available address. In this case, the active location counter is incremented by four units because
the RV32I instruction that was added to the active section requires four memory words. Figure 4.3
illustrates this process.
The last element in our assembly program is also an assembly instruction. Again, the assembler 1
translates it into a machine instruction, 2 adds it to the active section in the address indicated by the
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
44
+
4.6. THE LOCATION COUNTER AND THE ASSEMBLING PROCESS
line 8 jumps to this numeric label when the value of register a1 is equal to zero notice the reference
1f, which refers to the numeric label 1 positioned after the reference.
1 # Pow function -- computes a^b
2 # Inputs: a0=a, a1=b
3 # Output: a0=a^b
4 pow:
5 mv a2, a0 # save a0 in a2
6 li a0, 1 # set a0 to 1
7 1:
8 beqz a1, 1f # if a1 = 0 then done
9 mul a0, a0, a2 # else, multiply
10 addi a1, a1, -1 # decrement the counter
11 j 1b # repeat
12 1:
13 ret # return
4.6 The location counter and the assembling process
The location counter is an internal assembler counter that keeps track of addresses when
a program is being assembled. More specifically, it keeps the address of the next available memory
position. Each section has its own location counter, and the active location counter is the location
counter of the active section.
To discuss how the location counter is used and updated throughout the assembling process, we will
assemble the following assembly program step by step:
1 sum42:
2 addi a0, a0, 42
3 ret
Upon start, the GNU assembler clears the contents of the sections and the symbol table, initializes
all location counters with zero, and selects the .text section as the active section. Figure 4.1 illustrates
the status of the internal assembler structures upon start.
Once the internal structures are initialized, the assembler reads the input assembly file sequentially,
line by line, processing the labels, assembly instructions, and assembly directives one by one, in the order
they appear.
The first element in our assembly program is a label named sum42:”. When processing a label, the
assembler registers it as a symbol at the symbol table and associates it with an address that represents the
current program location. The current location is indicated by the active location counter. Figure 4.2
illustrates how the symbol table is updated when the sum42: label is processed by the assembler.
Notice that the assembler register the name sum42 into the symbol table
1 and associates it with
address zero 2 , i.e., the address of the active location counter.
The next element in our assembly program is the addi a0, a0, 42 assembly instruction. In this
case, the assembler 1 translates it into a machine instruction, 2 adds it to the active section in the
address indicated by the active location counter, and 3 updates the active location counter so it points to
the next available address. In this case, the active location counter is incremented by four units because
the RV32I instruction that was added to the active section requires four memory words. Figure 4.3
illustrates this process.
The last element in our assembly program is also an assembly instruction. Again, the assembler 1
translates it into a machine instruction, 2 adds it to the active section in the address indicated by the
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
44
diff --git a/book/riscv-book-58.page b/book/riscv-book-58.page index b25262d..3124a7b 100644 --- a/book/riscv-book-58.page +++ b/book/riscv-book-58.page @@ -1 +1 @@ -
4.7. ASSEMBLY DIRECTIVES
Contents Address
000
001
002
003
004
005
006
007
...
Location
counter:
000
.text section
Symbol table
sum42:
addi a0, a0, 42
ret
Input file
Location
counter:
000
.data section
...
Active section
Contents Address
000
001
002
003
004
005
006
007
...
Figure 4.1: Assembler internal structures upon start. The sections’ contents and the symbol table are
cleared, the location counters are initialized with zero, and the .text section is set as the active section.
Contents Address
000
001
002
003
004
005
006
007
...
Location
counter:
000
.text section
Symbol table
sum42 000
sum42:
addi a0, a0, 42
ret
Input file
1
2
Location
counter:
000
.data section
...
Active section
Contents Address
000
001
002
003
004
005
006
007
...
Figure 4.2: Example of a label being processed by the assembler.
active location counter, and 3 updates the active location counter so it points to the next available
address. This process is illustrated in Figure 4.4.
Once all elements from the input file are processed, the assembler stores the section contents, the
symbol table, and other relevant information (such as the relocation records) on the object file.
4.7 Assembly directives
Assembly directives are commands used to control the assembler. For example, the .section .data
directive instructs the assembler to turn the .data section into the active section, and the .word 10
directive instructs the assembler to assemble a 32-bit value (10) and add it to the active section.
Assembly directives are usually encoded as a string that contains the directive name and its argu-
ments. On GNU assemblers, directive names contain a dot (‘.’) prefix. The next sections discuss some
of the most common directives used to implement assembly programs.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
45
+
4.7. ASSEMBLY DIRECTIVES
Contents Address
000
001
002
003
004
005
006
007
...
Location
counter:
000
.text section
Symbol table
sum42:
addi a0, a0, 42
ret
Input file
Location
counter:
000
.data section
...
Active section
Contents Address
000
001
002
003
004
005
006
007
...
Figure 4.1: Assembler internal structures upon start. The sections’ contents and the symbol table are
cleared, the location counters are initialized with zero, and the .text section is set as the active section.
Contents Address
000
001
002
003
004
005
006
007
...
Location
counter:
000
.text section
Symbol table
sum42 000
sum42:
addi a0, a0, 42
ret
Input file
1
2
Location
counter:
000
.data section
...
Active section
Contents Address
000
001
002
003
004
005
006
007
...
Figure 4.2: Example of a label being processed by the assembler.
active location counter, and 3 updates the active location counter so it points to the next available
address. This process is illustrated in Figure 4.4.
Once all elements from the input file are processed, the assembler stores the section contents, the
symbol table, and other relevant information (such as the relocation records) on the object file.
4.7 Assembly directives
Assembly directives are commands used to control the assembler. For example, the .section .data
directive instructs the assembler to turn the .data section into the active section, and the .word 10
directive instructs the assembler to assemble a 32-bit value (10) and add it to the active section.
Assembly directives are usually encoded as a string that contains the directive name and its argu-
ments. On GNU assemblers, directive names contain a dot (‘.’) prefix. The next sections discuss some
of the most common directives used to implement assembly programs.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
45
diff --git a/book/riscv-book-59.page b/book/riscv-book-59.page index 4e4f67d..d4c370a 100644 --- a/book/riscv-book-59.page +++ b/book/riscv-book-59.page @@ -1 +1 @@ -
4.7. ASSEMBLY DIRECTIVES
0x02a50513
Machine instruction
Contents Address
00010011
2
000
00000101
2
001
10100101
2
002
00000010
2
003
004
005
006
007
...
Location
counter:
000
004
.text section
Symbol table
sum42 000
sum42:
addi a0, a0, 42
ret
Input file
1
2
3
Location
counter:
000
.data section
...
Active section
Contents Address
000
001
002
003
004
005
006
007
...
Figure 4.3: Example of an assembly instruction being processed by the assembler.
0x00008067
Machine instruction
Contents Address
00010011
2
000
00000101
2
001
10100101
2
002
00000010
2
003
01100111
2
004
10000000
2
005
00000000
2
006
00000000
2
007
...
Location
counter:
004
008
.text section
Symbol table
sum42 000
sum42:
addi a0, a0, 42
ret
Input file
1
2
3
Location
counter:
000
.data section
...
Active section
Contents Address
000
001
002
003
004
005
006
007
...
Figure 4.4: Processing the last assembly instruction.
4.7.1 Adding values to the program
Table 4.1 contains a list of assembly directives that can be used to add values to a program.
All directives on Table 4.1 add values to the active section. The .byte, .half, .word, and .dword
directives add one or more values to the active section. Their arguments may be expressed as immediate
values, as discussed in Section 4.3, symbols, which are replaced by their value during the assembling and
linking processes, or by arithmetic expressions that combine both. The following code shows examples
of valid arguments for these directives. The .byte in the first line adds four 8-bit values to the active
section (10, 12, 65, and 10). The .word directive in the second line adds a 32-bit value associated with
symbol x to the active section. Notice that value associated with symbol x is the address assigned to
label x:. The .word directive in the third line also adds a 32-bit value to the active section, however,
in this case, the value is computed by adding four to the value associated with symbol y, which is the
address assigned to label y:.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
46
+
4.7. ASSEMBLY DIRECTIVES
0x02a50513
Machine instruction
Contents Address
00010011
2
000
00000101
2
001
10100101
2
002
00000010
2
003
004
005
006
007
...
Location
counter:
000
004
.text section
Symbol table
sum42 000
sum42:
addi a0, a0, 42
ret
Input file
1
2
3
Location
counter:
000
.data section
...
Active section
Contents Address
000
001
002
003
004
005
006
007
...
Figure 4.3: Example of an assembly instruction being processed by the assembler.
0x00008067
Machine instruction
Contents Address
00010011
2
000
00000101
2
001
10100101
2
002
00000010
2
003
01100111
2
004
10000000
2
005
00000000
2
006
00000000
2
007
...
Location
counter:
004
008
.text section
Symbol table
sum42 000
sum42:
addi a0, a0, 42
ret
Input file
1
2
3
Location
counter:
000
.data section
...
Active section
Contents Address
000
001
002
003
004
005
006
007
...
Figure 4.4: Processing the last assembly instruction.
4.7.1 Adding values to the program
Table 4.1 contains a list of assembly directives that can be used to add values to a program.
All directives on Table 4.1 add values to the active section. The .byte, .half, .word, and .dword
directives add one or more values to the active section. Their arguments may be expressed as immediate
values, as discussed in Section 4.3, symbols, which are replaced by their value during the assembling and
linking processes, or by arithmetic expressions that combine both. The following code shows examples
of valid arguments for these directives. The .byte in the first line adds four 8-bit values to the active
section (10, 12, 65, and 10). The .word directive in the second line adds a 32-bit value associated with
symbol x to the active section. Notice that value associated with symbol x is the address assigned to
label x:. The .word directive in the third line also adds a 32-bit value to the active section, however,
in this case, the value is computed by adding four to the value associated with symbol y, which is the
address assigned to label y:.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
46
diff --git a/book/riscv-book-6.page b/book/riscv-book-6.page index f3ef0d0..b9b23fc 100644 --- a/book/riscv-book-6.page +++ b/book/riscv-book-6.page @@ -1 +1 @@ -
3.4 Executable vs object files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4 Assembly language 39
4.1 Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.2 Assembly instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.3 Immediate values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.4 Symbol names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.5 Labels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.6 The location counter and the assembling process . . . . . . . . . . . . . . . . . . . . . . . 44
4.7 Assembly directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.7.1 Adding values to the program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.7.2 The .section directive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.7.3 Allocating variables on the .bss section . . . . . . . . . . . . . . . . . . . . . . . . 50
4.7.4 The .set and .equ directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.7.5 The .globl directive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.7.6 The .align directive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
II User-level programming 54
5 The RV32I ISA 56
5.1 Datatypes and memory organization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
5.2 RV32I registers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
5.3 Load/Store architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
5.4 Pseudo-instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
5.5 Logic, shift, and arithmetic instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
5.5.1 Instructions syntax and operands . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
5.5.2 Dealing with large immediate values . . . . . . . . . . . . . . . . . . . . . . . . . . 60
5.5.3 Logic instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.5.4 Shift instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
5.5.5 Arithmetic instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.6 Data movement instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
5.6.1 Load instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
5.6.2 Store instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
5.6.3 Data movement pseudo-instructions . . . . . . . . . . . . . . . . . . . . . . . . . . 71
5.7 Control-flow instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
5.7.1 Conditional control-flow instructions . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.7.2 Direct vs indirect control-flow instructions . . . . . . . . . . . . . . . . . . . . . . 75
5.7.3 Unconditional control-flow instructions . . . . . . . . . . . . . . . . . . . . . . . . . 75
5.7.4 System calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.8 Conditional set instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.9 Detecting overflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
5.10 Arithmetic on multi-word variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
6 Controlling the execution flow 80
6.1 Conditional statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
6.1.1 if-then statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
6.1.2 Comparing signed vs unsigned variables . . . . . . . . . . . . . . . . . . . . . . . . 81
6.1.3 if-then-else statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
6.1.4 Handling non-trivial boolean expressions . . . . . . . . . . . . . . . . . . . . . . . . 82
6.1.5 Nested if statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
6.2 Repetition statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
6.2.1 while loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
+
3.4 Executable vs object files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4 Assembly language 39
4.1 Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.2 Assembly instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.3 Immediate values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.4 Symbol names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.5 Labels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.6 The location counter and the assembling process . . . . . . . . . . . . . . . . . . . . . . . 44
4.7 Assembly directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.7.1 Adding values to the program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.7.2 The .section directive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.7.3 Allocating variables on the .bss section . . . . . . . . . . . . . . . . . . . . . . . . 50
4.7.4 The .set and .equ directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.7.5 The .globl directive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.7.6 The .align directive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
II User-level programming 54
5 The RV32I ISA 56
5.1 Datatypes and memory organization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
5.2 RV32I registers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
5.3 Load/Store architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
5.4 Pseudo-instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
5.5 Logic, shift, and arithmetic instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
5.5.1 Instructions syntax and operands . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
5.5.2 Dealing with large immediate values . . . . . . . . . . . . . . . . . . . . . . . . . . 60
5.5.3 Logic instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.5.4 Shift instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
5.5.5 Arithmetic instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.6 Data movement instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
5.6.1 Load instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
5.6.2 Store instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
5.6.3 Data movement pseudo-instructions . . . . . . . . . . . . . . . . . . . . . . . . . . 71
5.7 Control-flow instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
5.7.1 Conditional control-flow instructions . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.7.2 Direct vs indirect control-flow instructions . . . . . . . . . . . . . . . . . . . . . . 75
5.7.3 Unconditional control-flow instructions . . . . . . . . . . . . . . . . . . . . . . . . . 75
5.7.4 System calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.8 Conditional set instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.9 Detecting overflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
5.10 Arithmetic on multi-word variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
6 Controlling the execution flow 80
6.1 Conditional statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
6.1.1 if-then statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
6.1.2 Comparing signed vs unsigned variables . . . . . . . . . . . . . . . . . . . . . . . . 81
6.1.3 if-then-else statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
6.1.4 Handling non-trivial boolean expressions . . . . . . . . . . . . . . . . . . . . . . . . 82
6.1.5 Nested if statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
6.2 Repetition statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
6.2.1 while loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
diff --git a/book/riscv-book-60.page b/book/riscv-book-60.page index 0201887..9b6c51d 100644 --- a/book/riscv-book-60.page +++ b/book/riscv-book-60.page @@ -1 +1 @@ -
4.7. ASSEMBLY DIRECTIVES
Directive Arguments Description
.byte expression [, expression]* Emit one or more 8-bit comma separated
words
.half expression [, expression]* Emit one or more 16-bit comma separated
words
.word expression [, expression]* Emit one or more 32-bit comma separated
words
.dword expression [, expression]* Emit one or more 64-bit comma separated
words
.string string Emit NULL terminated string
.asciz string Emit NULL terminated string (alias for
.string)
.ascii string Emit string without NULL character
Table 4.1: List of assembly directives that can be used to add values to a program.
1 x: .byte 10, 12, ’A’, 5+5
2 y: .word x
3 z: .word y+4
4 i: .word 0
5 j: .word 1
The .string, .asciz, and .ascii directives add strings to the active section. The string is encoded
as a sequence of bytes as discussed on Section 2.3. The .string and .asciz directives also adds, after the
string, an extra byte with value zero. They are useful to add NULL-terminated strings to the program
3
.
To illustrate the use of the previous directives, let us assemble the following program, which adds
values to the .data section:
1 .section .data
2 msg: .ascii "hello"
3 x: .word 10
As discussed in Section 4.6, the GNU assembler first clears the contents of the sections and the symbol
table, initializes all location counters with zero, and selects the .text section as the active section. Then,
it starts processing the input file. The first assembly element in the input file is the .section .data
directive, which instructs the assembler to activate the .data section. Figure 4.5 illustrates this process.
The next element in our assembly program is a label named msg:”. In this case, the assembler 1
registers the symbol named msg at the symbol table and 2 associates it with an address that represents
the current program location, which is indicated by the active location counter, i.e., the location counter
of the .data section. Figure 4.6 illustrates this process.
The next element in our assembly program is the .ascii "hello" directive, which instructs the
assembler to add a string to the active section. Assuming our input file is encoded using the ASCII
standard, the assembler 1 encodes the string as a sequence of bytes based on the ASCII standard,
2 add these bytes to the next available addresses on the active section, and 3 updates the location
counter. Figure 4.7 illustrates this process.
The next element in our assembly program is a label named “x:”. In this case, the assembler registers
the symbol named x at the symbol table and associates it the address that represents the current program
location, i.e., the address in the active location counter.
3
Strings declared in C programs are NULL-terminated strings.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
47
+
4.7. ASSEMBLY DIRECTIVES
Directive Arguments Description
.byte expression [, expression]* Emit one or more 8-bit comma separated
words
.half expression [, expression]* Emit one or more 16-bit comma separated
words
.word expression [, expression]* Emit one or more 32-bit comma separated
words
.dword expression [, expression]* Emit one or more 64-bit comma separated
words
.string string Emit NULL terminated string
.asciz string Emit NULL terminated string (alias for
.string)
.ascii string Emit string without NULL character
Table 4.1: List of assembly directives that can be used to add values to a program.
1 x: .byte 10, 12, ’A’, 5+5
2 y: .word x
3 z: .word y+4
4 i: .word 0
5 j: .word 1
The .string, .asciz, and .ascii directives add strings to the active section. The string is encoded
as a sequence of bytes as discussed on Section 2.3. The .string and .asciz directives also adds, after the
string, an extra byte with value zero. They are useful to add NULL-terminated strings to the program
3
.
To illustrate the use of the previous directives, let us assemble the following program, which adds
values to the .data section:
1 .section .data
2 msg: .ascii "hello"
3 x: .word 10
As discussed in Section 4.6, the GNU assembler first clears the contents of the sections and the symbol
table, initializes all location counters with zero, and selects the .text section as the active section. Then,
it starts processing the input file. The first assembly element in the input file is the .section .data
directive, which instructs the assembler to activate the .data section. Figure 4.5 illustrates this process.
The next element in our assembly program is a label named msg:”. In this case, the assembler 1
registers the symbol named msg at the symbol table and 2 associates it with an address that represents
the current program location, which is indicated by the active location counter, i.e., the location counter
of the .data section. Figure 4.6 illustrates this process.
The next element in our assembly program is the .ascii "hello" directive, which instructs the
assembler to add a string to the active section. Assuming our input file is encoded using the ASCII
standard, the assembler 1 encodes the string as a sequence of bytes based on the ASCII standard,
2 add these bytes to the next available addresses on the active section, and 3 updates the location
counter. Figure 4.7 illustrates this process.
The next element in our assembly program is a label named x:”. In this case, the assembler registers
the symbol named x at the symbol table and associates it the address that represents the current program
location, i.e., the address in the active location counter.
3
Strings declared in C programs are NULL-terminated strings.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
47
diff --git a/book/riscv-book-61.page b/book/riscv-book-61.page index 668e49f..cb9db26 100644 --- a/book/riscv-book-61.page +++ b/book/riscv-book-61.page @@ -1 +1 @@ -
4.7. ASSEMBLY DIRECTIVES
Symbol table
.section .data
msg: .ascii "hello"
x: .word 10
Input file
1
...
Active section
Location
counter:
000
.text section
Contents Address
000
001
002
003
004
005
006
007
...
Contents Address
000
001
002
003
004
005
006
007
...
Location
counter:
000
.data section
Figure 4.5: Processing the .section .data directive.
Symbol table
msg 000
.section .data
msg: .ascii "hello"
x: .word 10
Input file
1
...
Active section
Location
counter:
000
.text section
Contents Address
000
001
002
003
004
005
006
007
...
Contents Address
000
001
002
003
004
005
006
007
...
Location
counter:
000
.data section
2
Figure 4.6: Processing the msg: label.
68,65,6c,6c,6f
Symbol table
msg 000
.section .data
msg: .ascii "hello"
x: .word 10
Input file
...
Active section
Location
counter:
000
.text section
Contents Address
000
001
002
003
004
005
006
007
...
Contents Address
01101000
2
000
01100101
2
001
01101100
2
002
01101100
2
003
01101111
2
004
005
006
007
...
Location
counter:
000
005
.data section
ASCII encoded text
1
2
3
Figure 4.7: Processing the .ascii "hello" directive.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
48
+
4.7. ASSEMBLY DIRECTIVES
Symbol table
.section .data
msg: .ascii "hello"
x: .word 10
Input file
1
...
Active section
Location
counter:
000
.text section
Contents Address
000
001
002
003
004
005
006
007
...
Contents Address
000
001
002
003
004
005
006
007
...
Location
counter:
000
.data section
Figure 4.5: Processing the .section .data directive.
Symbol table
msg 000
.section .data
msg: .ascii "hello"
x: .word 10
Input file
1
...
Active section
Location
counter:
000
.text section
Contents Address
000
001
002
003
004
005
006
007
...
Contents Address
000
001
002
003
004
005
006
007
...
Location
counter:
000
.data section
2
Figure 4.6: Processing the msg: label.
68,65,6c,6c,6f
Symbol table
msg 000
.section .data
msg: .ascii "hello"
x: .word 10
Input file
...
Active section
Location
counter:
000
.text section
Contents Address
000
001
002
003
004
005
006
007
...
Contents Address
01101000
2
000
01100101
2
001
01101100
2
002
01101100
2
003
01101111
2
004
005
006
007
...
Location
counter:
000
005
.data section
ASCII encoded text
1
2
3
Figure 4.7: Processing the .ascii "hello" directive.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
48
diff --git a/book/riscv-book-62.page b/book/riscv-book-62.page index 5c0e12d..037cef7 100644 --- a/book/riscv-book-62.page +++ b/book/riscv-book-62.page @@ -1 +1 @@ -
4.7. ASSEMBLY DIRECTIVES
Finally, the last element in our assembly program is the .word 10 directive, which instructs the
assembler to add a 32-bit value to the active section. In this case, the assembler 1 encodes the 32-
bit value as a sequence of four bytes, 2 stores the bytes on the active section using the little-endian
convention
4
, and 3 updates the location counter. Figure 4.8 illustrates this process.
32 bit value (10
10
)
0x0000000a
Symbol table
msg 000
x 005
.section .data
msg: .ascii "hello"
x: .word 10
Input file
...
Active section
Location
counter:
000
.text section
Contents Address
000
001
002
003
004
005
006
007
...
Contents Address
01101000
2
000
01100101
2
001
01101100
2
002
01101100
2
003
01101111
2
004
00001010
2
005
00000000
2
006
00000000
2
007
00000000
2
...
Location
counter:
005
009
.data section
1
2
3
Figure 4.8: Processing the .word 10 directive.
4.7.2 The .section directive
As discussed in Section 3.3, assembly, object, and executable files are organized in sections. Also, by
default, the GNU assembler tool adds information to the .text section. To instruct the assembler to add
the assembled information into other sections, the programmer (or the compiler) may use the .section
secname directive. As discussed in Section 4.6, when assembling a program, the assembler encodes and
adds each assembly element to the active section. The .section secname changes the active section
to secname, hence, all the information processed by the assembler after this directive is added to the
secname section.
Program instructions are expected to be placed on the .text section, while constants, i.e., read-only
data, must be placed on the .rodata section. Also, initialized global variables must be placed on the
.data section, and uninitialized global variables should be placed on the .bss section.
The following assembly code shows how the .section directive can be used to add the program
instructions to the .text section and the program variables to the .data and .rodata sections.
1 .section .text
2 set_x:
3 la t1, x
4 sw a0, (t1)
5 ret
6 get_msg:
7 la a0, msg
8 ret
9 .section .data
10 x: .word 10
11 .section .rodata
12 msg: .string "Assembly rocks!"
4
The little-endian convention specifies that the least significant byte must be associated with the smallest address - see
Section 2.4.2 for more information on endianness.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
49
+
4.7. ASSEMBLY DIRECTIVES
Finally, the last element in our assembly program is the .word 10 directive, which instructs the
assembler to add a 32-bit value to the active section. In this case, the assembler 1 encodes the 32-
bit value as a sequence of four bytes, 2 stores the bytes on the active section using the little-endian
convention
4
, and 3 updates the location counter. Figure 4.8 illustrates this process.
32 bit value (10
10
)
0x0000000a
Symbol table
msg 000
x 005
.section .data
msg: .ascii "hello"
x: .word 10
Input file
...
Active section
Location
counter:
000
.text section
Contents Address
000
001
002
003
004
005
006
007
...
Contents Address
01101000
2
000
01100101
2
001
01101100
2
002
01101100
2
003
01101111
2
004
00001010
2
005
00000000
2
006
00000000
2
007
00000000
2
...
Location
counter:
005
009
.data section
1
2
3
Figure 4.8: Processing the .word 10 directive.
4.7.2 The .section directive
As discussed in Section 3.3, assembly, object, and executable files are organized in sections. Also, by
default, the GNU assembler tool adds information to the .text section. To instruct the assembler to add
the assembled information into other sections, the programmer (or the compiler) may use the .section
secname directive. As discussed in Section 4.6, when assembling a program, the assembler encodes and
adds each assembly element to the active section. The .section secname changes the active section
to secname, hence, all the information processed by the assembler after this directive is added to the
secname section.
Program instructions are expected to be placed on the .text section, while constants, i.e., read-only
data, must be placed on the .rodata section. Also, initialized global variables must be placed on the
.data section, and uninitialized global variables should be placed on the .bss section.
The following assembly code shows how the .section directive can be used to add the program
instructions to the .text section and the program variables to the .data and .rodata sections.
1 .section .text
2 set_x:
3 la t1, x
4 sw a0, (t1)
5 ret
6 get_msg:
7 la a0, msg
8 ret
9 .section .data
10 x: .word 10
11 .section .rodata
12 msg: .string "Assembly rocks!"
4
The little-endian convention specifies that the least significant byte must be associated with the smallest address - see
Section 2.4.2 for more information on endianness.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
49
diff --git a/book/riscv-book-63.page b/book/riscv-book-63.page index 0c6abc0..27bdf0a 100644 --- a/book/riscv-book-63.page +++ b/book/riscv-book-63.page @@ -1 +1 @@ -
4.7. ASSEMBLY DIRECTIVES
NOTE: The RV32I GNU assembler also contains the “.text”, “.data”, and “.bss” directives,
which are aliases to .section .text”, “.section .data”, and the .section .bss directives,
respectively.
4.7.3 Allocating variables on the .bss section
The .bss section is dedicated for storing uninitialized global variables. These variables need to be
allocated on memory, but they do not need to be initialized by the loader when a program is executed.
As a consequence, their initial value do not need to be stored on executable nor object files.
Since no information is stored on the .bss section in object and executable files, the GNU assembler
does not allow assembly programs to add data to the .bss section. To illustrate this situation, let us
consider the following code and assume it is stored on a file named data-on-bss.s:
1 .section .bss
2 x: .word 10
3 .section .text
4 set_x:
5 la t1, x
6 sw a0, (t1)
7 ret
This code is trying to use the .word 10 directive to add a 32-bit value to the .bss section. However,
when processing the .word 10 directive, the GNU assembler stops assembling the code and emits the
following error message:
$ riscv64-unknown-elf-as -march=rv32im data-on-bss.s -o data-on-bss.o
data-on-bss.s: Assembler messages:
data-on-bss.s:2: Error: attempt to store non-zero value in section
‘.bss’
To allocate variables on the .bss section it suffices to declare a label to identify the variable and
advance the .bss location counter by the amount of bytes the variable require, so further variables are
allocated on other address.
The .skip N directive is a directive that advances the location counter by N units and can be used
to allocate space for variables on the .bss section. The following code shows how the .skip directive
can be combined with labels to allocate space for three distinct variables: x, V, and y. In this example,
the program is allocating 4 bytes for variables x and y and 80 bytes for variable V. As a consequence,
labels x, V, and y will be associated with addresses 0x0, 0x4, and 0x54, respectively.
1 .section .bss
2 x: .skip 4
3 V: .skip 80
4 y: .skip 4
NOTE: Some systems initialize the memory words dedicated to the .bss section with zeros
when loading the program into the main memory for execution. Nonetheless, the programmer
should not assume variables on the .bss section will be initialized with zeros.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
50
+
4.7. ASSEMBLY DIRECTIVES
NOTE: The RV32I GNU assembler also contains the .text”, .data”, and .bss directives,
which are aliases to .section .text”, .section .data”, and the .section .bss directives,
respectively.
4.7.3 Allocating variables on the .bss section
The .bss section is dedicated for storing uninitialized global variables. These variables need to be
allocated on memory, but they do not need to be initialized by the loader when a program is executed.
As a consequence, their initial value do not need to be stored on executable nor object files.
Since no information is stored on the .bss section in object and executable files, the GNU assembler
does not allow assembly programs to add data to the .bss section. To illustrate this situation, let us
consider the following code and assume it is stored on a file named data-on-bss.s:
1 .section .bss
2 x: .word 10
3 .section .text
4 set_x:
5 la t1, x
6 sw a0, (t1)
7 ret
This code is trying to use the .word 10 directive to add a 32-bit value to the .bss section. However,
when processing the .word 10 directive, the GNU assembler stops assembling the code and emits the
following error message:
$ riscv64-unknown-elf-as -march=rv32im data-on-bss.s -o data-on-bss.o
data-on-bss.s: Assembler messages:
data-on-bss.s:2: Error: attempt to store non-zero value in section
‘.bss’
To allocate variables on the .bss section it suffices to declare a label to identify the variable and
advance the .bss location counter by the amount of bytes the variable require, so further variables are
allocated on other address.
The .skip N directive is a directive that advances the location counter by N units and can be used
to allocate space for variables on the .bss section. The following code shows how the .skip directive
can be combined with labels to allocate space for three distinct variables: x, V, and y. In this example,
the program is allocating 4 bytes for variables x and y and 80 bytes for variable V. As a consequence,
labels x, V, and y will be associated with addresses 0x0, 0x4, and 0x54, respectively.
1 .section .bss
2 x: .skip 4
3 V: .skip 80
4 y: .skip 4
NOTE: Some systems initialize the memory words dedicated to the .bss section with zeros
when loading the program into the main memory for execution. Nonetheless, the programmer
should not assume variables on the .bss section will be initialized with zeros.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
50
diff --git a/book/riscv-book-64.page b/book/riscv-book-64.page index 8155eb5..f91e01b 100644 --- a/book/riscv-book-64.page +++ b/book/riscv-book-64.page @@ -1 +1 @@ -
4.7. ASSEMBLY DIRECTIVES
4.7.4 The .set and .equ directives
The .set name, expression directive adds a symbol to the symbol table. It takes a name and an
expression as arguments, evaluates an expression to a value and store the name and the resulting value
into the symbol table. The following code shows how the .set directive can be used to associate values
to symbols and use them on the program. In this case, the program first defines the symbol named max -
value and associates it with value 42 (line 1). Then, it uses the max value symbol on the li instruction
(line 4).
1 .set max_value, 42
2
3 truncates_value_to_max:
4 li t1, max_value
5 ble a0, t1, ok
6 mv a0, t1
7 ok:
8 ret
The .equ directive performs the same task as the .set directive.
4.7.5 The .globl directive
As discussed in Section 3.2.4, program symbols can be classified as local or global symbols. By default,
symbols automatically created for labels or explicitly created by the program using the .set or .equ
directives are stored on the symbol table as local symbols. The .globl directive can be used to turn local
symbols into global ones. The following code shows an example in which the start and the max temp
symbols are converted into global symbols by the .globl directive.
1 .globl max_value
2 .globl start
3
4 .set max_value, 42
5
6 start:
7 li a0, max_value
8 jal process_temp
9 ret
4.7.6 The .align directive
Some Instruction Set Architectures require instructions or multi-byte data to be stored on addresses
that are multiple of a given number. For example, the RV32I ISA requires instructions to be stored on
addresses that are multiples of four.
The GNU assembler does not verify automatically whether or not RV32I instructions are assigned to
addresses that are multiple of four. The following code, for example, is assembled without errors by the
GNU assembler. In this case, the j next instruction is stored at addresses 0x0, 0x1, 0x2, and 0x3, the
8-bit value 0xa is stored at address 0x4, and the ret instruction is stored at addresses 0x5, 0x6, 0x7,
and 0x8.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
51
+
4.7. ASSEMBLY DIRECTIVES
4.7.4 The .set and .equ directives
The .set name, expression directive adds a symbol to the symbol table. It takes a name and an
expression as arguments, evaluates an expression to a value and store the name and the resulting value
into the symbol table. The following code shows how the .set directive can be used to associate values
to symbols and use them on the program. In this case, the program first defines the symbol named max -
value and associates it with value 42 (line 1). Then, it uses the max value symbol on the li instruction
(line 4).
1 .set max_value, 42
2
3 truncates_value_to_max:
4 li t1, max_value
5 ble a0, t1, ok
6 mv a0, t1
7 ok:
8 ret
The .equ directive performs the same task as the .set directive.
4.7.5 The .globl directive
As discussed in Section 3.2.4, program symbols can be classified as local or global symbols. By default,
symbols automatically created for labels or explicitly created by the program using the .set or .equ
directives are stored on the symbol table as local symbols. The .globl directive can be used to turn local
symbols into global ones. The following code shows an example in which the start and the max temp
symbols are converted into global symbols by the .globl directive.
1 .globl max_value
2 .globl start
3
4 .set max_value, 42
5
6 start:
7 li a0, max_value
8 jal process_temp
9 ret
4.7.6 The .align directive
Some Instruction Set Architectures require instructions or multi-byte data to be stored on addresses
that are multiple of a given number. For example, the RV32I ISA requires instructions to be stored on
addresses that are multiples of four.
The GNU assembler does not verify automatically whether or not RV32I instructions are assigned to
addresses that are multiple of four. The following code, for example, is assembled without errors by the
GNU assembler. In this case, the j next instruction is stored at addresses 0x0, 0x1, 0x2, and 0x3, the
8-bit value 0xa is stored at address 0x4, and the ret instruction is stored at addresses 0x5, 0x6, 0x7,
and 0x8.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
51
diff --git a/book/riscv-book-65.page b/book/riscv-book-65.page index 1f7faf0..6871f2f 100644 --- a/book/riscv-book-65.page +++ b/book/riscv-book-65.page @@ -1 +1 @@ -
4.7. ASSEMBLY DIRECTIVES
1 .text
2 foo:
3 j next
4 .byte 0xa
5 next:
6 ret
Even though the previous program was assembled by the assembler, a RV32I CPU will fail when trying
to execute the ret instruction because it requires all instructions to be stored starting at addresses that
are multiple of four.
The programmer (or the compiler) is responsible for keeping RV32I instructions aligned to 4-byte
boundaries, i.e., at addresses that are multiple of four. In the previous example, it could be done by
advancing the location counter by three units right after adding the 8-bit value to the program (line 4).
In this context, the following code would be executed correctly by a RV32I CPU.
1 .text
2 foo:
3 j next
4 .byte 0xa
5 .skip 3 # Advancing the location counter by 3 units.
6 # This is a very poor way of keeping the
7 # location counter aligned to a 4 byte boundary.
8 next:
9 ret
NOTE: Manually keeping track of the location counter, as in the previous example, is a cum-
bersome task and can lead to several problems. For example, trying to keep track and manually
advance the location counter to ensure RV32I instructions are aligned to 4-byte boundaries may
cause the assembler to generate invalid code without emitting warning nor error messages.
The proper way of ensuring the location counter is aligned is by using the .align N directive. The
.align N directive checks if the location counter is a multiple of 2
N
, if it is, it has no effect on the
program, otherwise, it advances the location counter to the next value that is a multiple of 2
N
.
The compiler usually inserts a .align 2 directive
5
before routine labels to ensure the routine in-
structions start on addresses that are multiple of four. The following code shows an assembly code that
uses the .align 2 directive to align the location counter before each routine.
1 .text
2 .align 2
3 func1:
4 addi a0, a0, 2
5 ret
6 .align 2
7 func2:
8 addi a0, a0, 42
9 ret
Notice that, if the location counter already contains a value that is a multiple of 2
N
, then the .align
N directive has no effect on the location counter. Hence, since the code in the previous example starts
5
The .align 2 directive aligns the location counter to a multiple of four (2
2
).
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
52
+
4.7. ASSEMBLY DIRECTIVES
1 .text
2 foo:
3 j next
4 .byte 0xa
5 next:
6 ret
Even though the previous program was assembled by the assembler, a RV32I CPU will fail when trying
to execute the ret instruction because it requires all instructions to be stored starting at addresses that
are multiple of four.
The programmer (or the compiler) is responsible for keeping RV32I instructions aligned to 4-byte
boundaries, i.e., at addresses that are multiple of four. In the previous example, it could be done by
advancing the location counter by three units right after adding the 8-bit value to the program (line 4).
In this context, the following code would be executed correctly by a RV32I CPU.
1 .text
2 foo:
3 j next
4 .byte 0xa
5 .skip 3 # Advancing the location counter by 3 units.
6 # This is a very poor way of keeping the
7 # location counter aligned to a 4 byte boundary.
8 next:
9 ret
NOTE: Manually keeping track of the location counter, as in the previous example, is a cum-
bersome task and can lead to several problems. For example, trying to keep track and manually
advance the location counter to ensure RV32I instructions are aligned to 4-byte boundaries may
cause the assembler to generate invalid code without emitting warning nor error messages.
The proper way of ensuring the location counter is aligned is by using the .align N directive. The
.align N directive checks if the location counter is a multiple of 2
N
, if it is, it has no effect on the
program, otherwise, it advances the location counter to the next value that is a multiple of 2
N
.
The compiler usually inserts a .align 2 directive
5
before routine labels to ensure the routine in-
structions start on addresses that are multiple of four. The following code shows an assembly code that
uses the .align 2 directive to align the location counter before each routine.
1 .text
2 .align 2
3 func1:
4 addi a0, a0, 2
5 ret
6 .align 2
7 func2:
8 addi a0, a0, 42
9 ret
Notice that, if the location counter already contains a value that is a multiple of 2
N
, then the .align
N directive has no effect on the location counter. Hence, since the code in the previous example starts
5
The .align 2 directive aligns the location counter to a multiple of four (2
2
).
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
52
diff --git a/book/riscv-book-66.page b/book/riscv-book-66.page index c74bbc6..2f02e12 100644 --- a/book/riscv-book-66.page +++ b/book/riscv-book-66.page @@ -1 +1 @@ -
4.7. ASSEMBLY DIRECTIVES
at address zero and each assembly element is an assembly instruction that occupies exactly four bytes,
the .align 2 has no effect on the program.
The RV32I ISA allows programs to load and store data on unaligned memory addresses, however,
for performance reasons, The RISC-V Instruction Set Manual [4] recommends 16-bit, 32-bit, and 64-bit
values to be stored on addresses that are multiple of two, four, and eight, respectively. The following
code shows who the .align N directive can be used to align multi-byte variables on the memory.
1 .data
2 .align 1
3 i: .half 1 # 16-bit variable initialized with value 1
4 .align 2
5 x: .word 9 # 32-bit variable initialized with value 9
6 .align 3
7 y: .dword 11 # 64-bit variable initialized with value 11
8 .bss
9 .align 3
10 z: .skip 8 # 64-bit variable (uninitialized)
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
53
+
4.7. ASSEMBLY DIRECTIVES
at address zero and each assembly element is an assembly instruction that occupies exactly four bytes,
the .align 2 has no effect on the program.
The RV32I ISA allows programs to load and store data on unaligned memory addresses, however,
for performance reasons, The RISC-V Instruction Set Manual [4] recommends 16-bit, 32-bit, and 64-bit
values to be stored on addresses that are multiple of two, four, and eight, respectively. The following
code shows who the .align N directive can be used to align multi-byte variables on the memory.
1 .data
2 .align 1
3 i: .half 1 # 16-bit variable initialized with value 1
4 .align 2
5 x: .word 9 # 32-bit variable initialized with value 9
6 .align 3
7 y: .dword 11 # 64-bit variable initialized with value 11
8 .bss
9 .align 3
10 z: .skip 8 # 64-bit variable (uninitialized)
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
53
diff --git a/book/riscv-book-67.page b/book/riscv-book-67.page index 4b24632..3100925 100644 --- a/book/riscv-book-67.page +++ b/book/riscv-book-67.page @@ -1 +1 @@ -
Part II
User-level programming
54
+
Part II
User-level programming
54
diff --git a/book/riscv-book-68.page b/book/riscv-book-68.page index 0fea5bc..9909e06 100644 --- a/book/riscv-book-68.page +++ b/book/riscv-book-68.page @@ -1 +1 @@ -
Many computer systems are organized so that the software is divided into user and system software.
The system software (e.g., the operating system kernel and device drivers) is responsible for protecting
and managing the whole system, including interacting with peripherals to perform input and output
operations and loading and scheduling user applications for execution. The user software is usually
limited to performing operations with data that is located on CPU registers and the main memory.
Whenever the user software needs to perform a procedure that requires interacting with other parts of
the system, such as reading data from a file or showing information on the computer display, it invokes
the system software to perform the procedure on behalf of the user software.
In this part of the book, we will focus on the implementation of user software, i.e., software that
performs operations with data that is located on CPU registers and the main memory. We will also
discuss how user software may invoke an operating system to perform other operations on its behalf,
such as input/output from/to peripherals.
Part III covers system-level programming, including interacting with peripherals and securing the
system against faulty or malicious user programs.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
55
+
Many computer systems are organized so that the software is divided into user and system software.
The system software (e.g., the operating system kernel and device drivers) is responsible for protecting
and managing the whole system, including interacting with peripherals to perform input and output
operations and loading and scheduling user applications for execution. The user software is usually
limited to performing operations with data that is located on CPU registers and the main memory.
Whenever the user software needs to perform a procedure that requires interacting with other parts of
the system, such as reading data from a file or showing information on the computer display, it invokes
the system software to perform the procedure on behalf of the user software.
In this part of the book, we will focus on the implementation of user software, i.e., software that
performs operations with data that is located on CPU registers and the main memory. We will also
discuss how user software may invoke an operating system to perform other operations on its behalf,
such as input/output from/to peripherals.
Part III covers system-level programming, including interacting with peripherals and securing the
system against faulty or malicious user programs.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
55
diff --git a/book/riscv-book-69.page b/book/riscv-book-69.page index 50225fd..6ff7795 100644 --- a/book/riscv-book-69.page +++ b/book/riscv-book-69.page @@ -1 +1 @@ -
Chapter 5
The RV32I ISA
RISC-V is a modular Instruction Set Architecture, allowing the design of a wide variety of micropro-
cessors. This flexibility allows industry players to design microprocessors for applications with different
requirements, including ultra-low-power and compact microprocessors for embedded devices and high-
performing microprocessors for powerful servers running on data centers.
To achieve this flexibility, the RV32I Instruction Set Architecture relies on four base Instruction Set
Architectures and several extensions that can be combined with the base Instruction Set Architectures to
implement specialized versions of the Instruction Set Architecture. Table 5.1 presents the base Instruction
Set Architectures and some of its extensions
1
.
Base ISAs
Name Description
RV32I 32-bit integer instruction set
RV32E 32-bit integer instruction set for embedded microprocessors
RV64I 64-bit integer instruction set
RV128I 128-bit integer instruction set
Extensions
Suffix Description
M Standard extension for integer multiplication and division
A Standard extension for atomic instructions
F Standard extension for single-precision Floating-Point
D Standard extension for double-precision Floating-Point
G Shorthand for the base and above extensions
Q Standard extension for quad-precision floating-point
L Standard extension for decimal floating-point
C Standard extension for compressed instructions
B Standard extension for bit manipulation
J Standard extension for dynamically translated languages
T Standard extension for transactional memory
P Standard extension for packed-SIMD instructions
V Standard extension for vector operations
N Standard extension for user-level interrupts
H Standard extension for hypervisor
Table 5.1: RISC-V base ISAs and extensions.
1
Some of these extensions are still under development. Refer to the official RISC-V consortium (https://riscv.org)
for up-to-date information on current base ISAs and extensions
56
+
Chapter 5
The RV32I ISA
RISC-V is a modular Instruction Set Architecture, allowing the design of a wide variety of micropro-
cessors. This flexibility allows industry players to design microprocessors for applications with different
requirements, including ultra-low-power and compact microprocessors for embedded devices and high-
performing microprocessors for powerful servers running on data centers.
To achieve this flexibility, the RV32I Instruction Set Architecture relies on four base Instruction Set
Architectures and several extensions that can be combined with the base Instruction Set Architectures to
implement specialized versions of the Instruction Set Architecture. Table 5.1 presents the base Instruction
Set Architectures and some of its extensions
1
.
Base ISAs
Name Description
RV32I 32-bit integer instruction set
RV32E 32-bit integer instruction set for embedded microprocessors
RV64I 64-bit integer instruction set
RV128I 128-bit integer instruction set
Extensions
Suffix Description
M Standard extension for integer multiplication and division
A Standard extension for atomic instructions
F Standard extension for single-precision Floating-Point
D Standard extension for double-precision Floating-Point
G Shorthand for the base and above extensions
Q Standard extension for quad-precision floating-point
L Standard extension for decimal floating-point
C Standard extension for compressed instructions
B Standard extension for bit manipulation
J Standard extension for dynamically translated languages
T Standard extension for transactional memory
P Standard extension for packed-SIMD instructions
V Standard extension for vector operations
N Standard extension for user-level interrupts
H Standard extension for hypervisor
Table 5.1: RISC-V base ISAs and extensions.
1
Some of these extensions are still under development. Refer to the official RISC-V consortium (https://riscv.org)
for up-to-date information on current base ISAs and extensions
56
diff --git a/book/riscv-book-7.page b/book/riscv-book-7.page index 969d857..7b472e1 100644 --- a/book/riscv-book-7.page +++ b/book/riscv-book-7.page @@ -1 +1 @@ -
6.2.2 do-while loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
6.2.3 for loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
6.2.4 Hoisting loop-invariant code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
6.3 Invoking and returning from routines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
6.3.1 Returning values from functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
6.4 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
6.4.1 Searching for the maximum value on an array . . . . . . . . . . . . . . . . . . . . . 88
7 Implementing routines 90
7.1 The program memory layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
7.2 The program stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
7.2.1 Types of stacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
7.3 The ABI and software composition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
7.4 Passing parameters to and returning values from routines . . . . . . . . . . . . . . . . . . 94
7.4.1 Passing parameters to routines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
7.4.2 Returning values from routines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
7.5 Value and reference parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
7.6 Global vs local variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
7.6.1 Allocating local variables on memory . . . . . . . . . . . . . . . . . . . . . . . . . . 99
7.7 Register usage policies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
7.7.1 Caller-saved vs callee-saved registers . . . . . . . . . . . . . . . . . . . . . . . . . . 103
7.7.2 Saving and restoring the return address . . . . . . . . . . . . . . . . . . . . . . . . 103
7.8 Stack frames and the frame pointer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
7.8.1 Stack frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
7.8.2 The frame pointer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
7.8.3 Keeping the stack pointer aligned . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
7.9 Implementing RISC-V ilp32 compatible routines . . . . . . . . . . . . . . . . . . . . . . . 106
7.10 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
7.10.1 Recursive routines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
7.10.2 The standard “C” library syscall routines . . . . . . . . . . . . . . . . . . . . . . . 108
III System-level programming 110
8 Accessing peripherals 111
8.1 Peripherals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
8.2 Interacting with peripherals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
8.2.1 Port-mapped I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
8.2.2 Memory-mapped I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
8.3 I/O operations on RISC-V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
8.4 Busy waiting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
9 External interrupts 118
9.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
9.1.1 Polling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
9.2 External interrupts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
9.2.1 Detecting external interrupts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
9.2.2 Invoking the proper interrupt service routine . . . . . . . . . . . . . . . . . . . . . 122
9.3 Interrupts on RV32I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
9.3.1 Control and status registers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
9.3.2 Interrupt related control and status registers . . . . . . . . . . . . . . . . . . . . . 125
9.3.3 Interrupt handling flow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
9.3.4 Implementing an interrupt service routine . . . . . . . . . . . . . . . . . . . . . . . 127
+
6.2.2 do-while loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
6.2.3 for loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
6.2.4 Hoisting loop-invariant code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
6.3 Invoking and returning from routines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
6.3.1 Returning values from functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
6.4 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
6.4.1 Searching for the maximum value on an array . . . . . . . . . . . . . . . . . . . . . 88
7 Implementing routines 90
7.1 The program memory layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
7.2 The program stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
7.2.1 Types of stacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
7.3 The ABI and software composition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
7.4 Passing parameters to and returning values from routines . . . . . . . . . . . . . . . . . . 94
7.4.1 Passing parameters to routines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
7.4.2 Returning values from routines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
7.5 Value and reference parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
7.6 Global vs local variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
7.6.1 Allocating local variables on memory . . . . . . . . . . . . . . . . . . . . . . . . . . 99
7.7 Register usage policies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
7.7.1 Caller-saved vs callee-saved registers . . . . . . . . . . . . . . . . . . . . . . . . . . 103
7.7.2 Saving and restoring the return address . . . . . . . . . . . . . . . . . . . . . . . . 103
7.8 Stack frames and the frame pointer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
7.8.1 Stack frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
7.8.2 The frame pointer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
7.8.3 Keeping the stack pointer aligned . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
7.9 Implementing RISC-V ilp32 compatible routines . . . . . . . . . . . . . . . . . . . . . . . 106
7.10 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
7.10.1 Recursive routines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
7.10.2 The standard “C” library syscall routines . . . . . . . . . . . . . . . . . . . . . . . 108
III System-level programming 110
8 Accessing peripherals 111
8.1 Peripherals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
8.2 Interacting with peripherals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
8.2.1 Port-mapped I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
8.2.2 Memory-mapped I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
8.3 I/O operations on RISC-V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
8.4 Busy waiting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
9 External interrupts 118
9.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
9.1.1 Polling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
9.2 External interrupts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
9.2.1 Detecting external interrupts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
9.2.2 Invoking the proper interrupt service routine . . . . . . . . . . . . . . . . . . . . . 122
9.3 Interrupts on RV32I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
9.3.1 Control and status registers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
9.3.2 Interrupt related control and status registers . . . . . . . . . . . . . . . . . . . . . 125
9.3.3 Interrupt handling flow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
9.3.4 Implementing an interrupt service routine . . . . . . . . . . . . . . . . . . . . . . . 127
diff --git a/book/riscv-book-70.page b/book/riscv-book-70.page index 5f79bad..71167bf 100644 --- a/book/riscv-book-70.page +++ b/book/riscv-book-70.page @@ -1 +1 @@ -
5.1. DATATYPES AND MEMORY ORGANIZATION
In this book, we will focus on the RV32IM ISA, which includes the RV32I base ISA and extension M,
which includes instructions for integer multiplication and division. The RV32IM ISA has the following
properties:
It supports 32-bit address spaces;
It contains thirty-three 32-bit registers;
It represents signed integer values in two’s-complement;
It contains the basic instructions, including integer computational instructions, integer loads, inte-
ger stores, and control-flow instructions; and
It also contains instructions to multiply and divide values held in the integer registers (M extension).
5.1 Datatypes and memory organization
ISA native datatypes are datatypes that can be naturally processed by the ISA. Table 5.2 shows the
RV32I native datatypes and their respective sizes in bytes.
RV32I native size
datatype name in bytes
byte 1
unsigned byte 1
halfword 2
unsigned halfword 2
word 4
unsigned word 4
Table 5.2: RV32I native datatypes
Similar to other modern ISAs, RISC-V is designed to work with byte addressable memories, i.e.,
memories in which each memory location stores a single byte and is associated with a unique address,
as illustrated in Figure 5.1.
0
00110110
1
00000000
2
00001000
3
10000000
4
11110000
5
11111111
6
00001111
7
11100001
...
...
Memory
locations
1 byte
Addresses
(a)
0
36
1
00
2
08
3
80
4
F0
5
FF
6
0F
7
E1
...
...
Memory
locations
1 byte
Addresses
(b)
Figure 5.1: Organization of a byte addressable memory with its contents represented in the binary (a)
and the hexadecimal (b) bases.
Datatypes larger than one byte are stored on multiple memory locations. Hence, when storing
a halfword (word) datatype value on memory, the CPU stores the two (four) bytes on two (four)
consecutive memory locations.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
57
+
5.1. DATATYPES AND MEMORY ORGANIZATION
In this book, we will focus on the RV32IM ISA, which includes the RV32I base ISA and extension M,
which includes instructions for integer multiplication and division. The RV32IM ISA has the following
properties:
It supports 32-bit address spaces;
It contains thirty-three 32-bit registers;
It represents signed integer values in two’s-complement;
It contains the basic instructions, including integer computational instructions, integer loads, inte-
ger stores, and control-flow instructions; and
It also contains instructions to multiply and divide values held in the integer registers (M extension).
5.1 Datatypes and memory organization
ISA native datatypes are datatypes that can be naturally processed by the ISA. Table 5.2 shows the
RV32I native datatypes and their respective sizes in bytes.
RV32I native size
datatype name in bytes
byte 1
unsigned byte 1
halfword 2
unsigned halfword 2
word 4
unsigned word 4
Table 5.2: RV32I native datatypes
Similar to other modern ISAs, RISC-V is designed to work with byte addressable memories, i.e.,
memories in which each memory location stores a single byte and is associated with a unique address,
as illustrated in Figure 5.1.
0
00110110
1
00000000
2
00001000
3
10000000
4
11110000
5
11111111
6
00001111
7
11100001
...
...
Memory
locations
1 byte
Addresses
(a)
0
36
1
00
2
08
3
80
4
F0
5
FF
6
0F
7
E1
...
...
Memory
locations
1 byte
Addresses
(b)
Figure 5.1: Organization of a byte addressable memory with its contents represented in the binary (a)
and the hexadecimal (b) bases.
Datatypes larger than one byte are stored on multiple memory locations. Hence, when storing
a halfword (word) datatype value on memory, the CPU stores the two (four) bytes on two (four)
consecutive memory locations.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
57
diff --git a/book/riscv-book-71.page b/book/riscv-book-71.page index adab1d9..1f05c45 100644 --- a/book/riscv-book-71.page +++ b/book/riscv-book-71.page @@ -1 +1 @@ -
5.2. RV32I REGISTERS
When translating a program written in “C” to RV32I assembly code, the C datatypes must be
converted into RISC-V native datatypes. Table 5.3 shows the mappings from C native datatypes to
RV32I native datatypes
2
. All pointers in C (e.g., int*, char*, and void*) represent memory addresses
and are mapped to the unsigned word datatype.
C RV32I native size
datatype datatype in bytes
bool byte 1
char byte 1
unsigned char unsigned byte 1
short halfword 2
unsigned short unsigned halfword 2
int word 4
unsigned int unsigned word 4
long word 4
unsigned long unsigned word 4
void* unsigned word 4
Table 5.3: Mapping C datatypes to RV32I native datatypes
5.2 RV32I registers
The RV32I unprivileged ISA contains thirty three 32-bit registers, also known as unprivileged registers.
Register x0 is a special register that is hard-wired to zero, i.e., it always returns the value zero when
read
3
. Register pc holds the program counter, i.e., the address of the next instruction to be executed.
Its contents are automatically updated every time an instruction is executed and may be updated by
special instructions, called control-flow instructions
4
.
The remaining registers (x1-x31) are general purpose registers and can be used interchangeably.
Nonetheless, as we will discuss later, it is usually important to follow a register usage standard. For
example, always using the same set of registers to pass parameters when invoking a function. To facilitate
the programming, these registers are given aliases, that can be used when writing assembly code. The
goal is to allow the programmer to use more meaningful register names when programming. For example,
writing a0, instead of x10, to refer to the register that is holding the first argument to a function. Table 5.4
shows the list of unprivileged registers, their aliases, and the descriptions of their aliases.
5.3 Load/Store architecture
A Load/Store architecture is an instruction set architecture that requires values to be loaded/stored
explicitly from/to memory before operating on them. In other words, to read/write a value from/to
memory, the software must execute a load/store instruction.
The RISC-V is a Load/Store architecture, hence, to perform operations (e.g., arithmetic operations)
on data stored on memory, it requires the data to be first retrieved from memory into a register by
executing a load instruction. As an example, let us consider the following assembly code, which loads a
value from memory, multiply it by two, and stores the result on memory.
2
This mapping is valid for the RISC-V ilp32 ABI, which is discussed in this book and further discussed in Chapter 7.
3
Values written to this register are discarded.
4
These instructions will be discussed on Section 5.7.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
58
+
5.2. RV32I REGISTERS
When translating a program written in “C” to RV32I assembly code, the C datatypes must be
converted into RISC-V native datatypes. Table 5.3 shows the mappings from C native datatypes to
RV32I native datatypes
2
. All pointers in C (e.g., int*, char*, and void*) represent memory addresses
and are mapped to the unsigned word datatype.
C RV32I native size
datatype datatype in bytes
bool byte 1
char byte 1
unsigned char unsigned byte 1
short halfword 2
unsigned short unsigned halfword 2
int word 4
unsigned int unsigned word 4
long word 4
unsigned long unsigned word 4
void* unsigned word 4
Table 5.3: Mapping C datatypes to RV32I native datatypes
5.2 RV32I registers
The RV32I unprivileged ISA contains thirty three 32-bit registers, also known as unprivileged registers.
Register x0 is a special register that is hard-wired to zero, i.e., it always returns the value zero when
read
3
. Register pc holds the program counter, i.e., the address of the next instruction to be executed.
Its contents are automatically updated every time an instruction is executed and may be updated by
special instructions, called control-flow instructions
4
.
The remaining registers (x1-x31) are general purpose registers and can be used interchangeably.
Nonetheless, as we will discuss later, it is usually important to follow a register usage standard. For
example, always using the same set of registers to pass parameters when invoking a function. To facilitate
the programming, these registers are given aliases, that can be used when writing assembly code. The
goal is to allow the programmer to use more meaningful register names when programming. For example,
writing a0, instead of x10, to refer to the register that is holding the first argument to a function. Table 5.4
shows the list of unprivileged registers, their aliases, and the descriptions of their aliases.
5.3 Load/Store architecture
A Load/Store architecture is an instruction set architecture that requires values to be loaded/stored
explicitly from/to memory before operating on them. In other words, to read/write a value from/to
memory, the software must execute a load/store instruction.
The RISC-V is a Load/Store architecture, hence, to perform operations (e.g., arithmetic operations)
on data stored on memory, it requires the data to be first retrieved from memory into a register by
executing a load instruction. As an example, let us consider the following assembly code, which loads a
value from memory, multiply it by two, and stores the result on memory.
2
This mapping is valid for the RISC-V ilp32 ABI, which is discussed in this book and further discussed in Chapter 7.
3
Values written to this register are discarded.
4
These instructions will be discussed on Section 5.7.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
58
diff --git a/book/riscv-book-72.page b/book/riscv-book-72.page index e256a68..53d5537 100644 --- a/book/riscv-book-72.page +++ b/book/riscv-book-72.page @@ -1 +1 @@ -
5.4. PSEUDO-INSTRUCTIONS
Register Alias Description
Caller- Callee-
save save
x0 zero Hard-wired zero
x1 ra Return address x
x2 sp Stack pointer x
x3 gp Global pointer
x4 tp Thread pointer
x5-x7 t0-t2 Temporaries 0 to 2 x
x8 s0/fp Saved register 0 / Frame pointer x
x9 s1 Saved register 1 x
x10-17 a0-a7 Function arguments 0 to 7 x
x18-27 s2-s11 Saved registers 2 to 11 x
x28-31 t3-t6 Temporaries 3 to 6 x
pc pc Program counter
Table 5.4: RV32I unprivileged registers
1 lw a5, 0(a0)
2 add a6, a5, a5
3 sw a6, 0(a0)
The first instruction, called load word and indicated by the mnemonic lw, is a load instruction. It
retrieves a word value from memory and stores it on register a5. The expression 0(a0) indicates the
address of the memory position that stores the value that must be loaded. In this case, the address is
the sum of the contents of register a0 and the constant 0. In other words, in case register a0 contains
the value 8000 when this load instruction is executed, the hardware will retrieve the data from memory
starting at address 8000.
The second instruction, indicated by the mnemonic add, adds two values and stores the result on a
register. In this case, it is adding the values from registers a5 and a5 and storing the result on register
a6. Notice that, since both source operands are the same, i.e., a5, the result is equivalent to multiplying
the contents of a5 by two.
Finally, the third instruction, called store word and indicated by the mnemonic sw, stores the value
from register a6 into memory. Again, the expression 0(a0) indicates the address of the memory position
that will receive the data.
5.4 Pseudo-instructions
When assembling an assembly program, the assembler converts each assembly instruction (encoded as
plain text) into its corresponding machine instruction (encoded as binary). For example, the assem-
bly instruction add x10, x11, x12 is converted into its corresponding machine instruction, which is
encoded in four bytes as 0x00c58533”.
A pseudo-instruction is an assembly instruction that does not have a corresponding machine in-
struction on the ISA, but can be translated automatically by the assembler into one or more alternative
machine instructions to achieve the same effect. As an example, the no operation instruction, or nop”, is
a RV32I pseudo-instruction that is converted by the assembler into the addi x0, x0, 0 instruction
5
.
Another example is the mv instruction, which copies the contents of one register into another. In this
case, the pseudo-instruction mv a5, a7”, which copies the contents of a7 into a5, is converted into the
instruction addi a5, a7, 0”, which adds zero to the value in a7 and stores the result on register a5.
It is worth noting that the disassembler may not be able to map the machine instruction(s) automat-
ically generated by the assembler back to the pseudo-instruction.
5
This instruction adds zero to zero and discards the results by storing it on register x0, which is hard-wired to zero.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
59
+
5.4. PSEUDO-INSTRUCTIONS
Register Alias Description
Caller- Callee-
save save
x0 zero Hard-wired zero
x1 ra Return address x
x2 sp Stack pointer x
x3 gp Global pointer
x4 tp Thread pointer
x5-x7 t0-t2 Temporaries 0 to 2 x
x8 s0/fp Saved register 0 / Frame pointer x
x9 s1 Saved register 1 x
x10-17 a0-a7 Function arguments 0 to 7 x
x18-27 s2-s11 Saved registers 2 to 11 x
x28-31 t3-t6 Temporaries 3 to 6 x
pc pc Program counter
Table 5.4: RV32I unprivileged registers
1 lw a5, 0(a0)
2 add a6, a5, a5
3 sw a6, 0(a0)
The first instruction, called load word and indicated by the mnemonic lw, is a load instruction. It
retrieves a word value from memory and stores it on register a5. The expression 0(a0) indicates the
address of the memory position that stores the value that must be loaded. In this case, the address is
the sum of the contents of register a0 and the constant 0. In other words, in case register a0 contains
the value 8000 when this load instruction is executed, the hardware will retrieve the data from memory
starting at address 8000.
The second instruction, indicated by the mnemonic add, adds two values and stores the result on a
register. In this case, it is adding the values from registers a5 and a5 and storing the result on register
a6. Notice that, since both source operands are the same, i.e., a5, the result is equivalent to multiplying
the contents of a5 by two.
Finally, the third instruction, called store word and indicated by the mnemonic sw, stores the value
from register a6 into memory. Again, the expression 0(a0) indicates the address of the memory position
that will receive the data.
5.4 Pseudo-instructions
When assembling an assembly program, the assembler converts each assembly instruction (encoded as
plain text) into its corresponding machine instruction (encoded as binary). For example, the assem-
bly instruction add x10, x11, x12 is converted into its corresponding machine instruction, which is
encoded in four bytes as 0x00c58533”.
A pseudo-instruction is an assembly instruction that does not have a corresponding machine in-
struction on the ISA, but can be translated automatically by the assembler into one or more alternative
machine instructions to achieve the same effect. As an example, the no operation instruction, or nop”, is
a RV32I pseudo-instruction that is converted by the assembler into the addi x0, x0, 0 instruction
5
.
Another example is the mv instruction, which copies the contents of one register into another. In this
case, the pseudo-instruction mv a5, a7”, which copies the contents of a7 into a5, is converted into the
instruction addi a5, a7, 0”, which adds zero to the value in a7 and stores the result on register a5.
It is worth noting that the disassembler may not be able to map the machine instruction(s) automat-
ically generated by the assembler back to the pseudo-instruction.
5
This instruction adds zero to zero and discards the results by storing it on register x0, which is hard-wired to zero.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
59
diff --git a/book/riscv-book-73.page b/book/riscv-book-73.page index c2bf0db..65cfcb7 100644 --- a/book/riscv-book-73.page +++ b/book/riscv-book-73.page @@ -1 +1 @@ -
5.5. LOGIC, SHIFT, AND ARITHMETIC INSTRUCTIONS
Since the focus of the book is on assembly programming, the remaining of this book will not differ-
entiate pseudo-instructions from real RV32I machine instructions. We refer the reader to the RISC-V
Instruction Set Manual [4] for a full list of real RV32I machine instructions and pseudo-instructions.
5.5 Logic, shift, and arithmetic instructions
Logic, shift, and arithmetic instructions are instructions that perform logic, shift, and arithmetic opera-
tions on data.
5.5.1 Instructions syntax and operands
All RV32I logic, shift, and arithmetic instructions operate on data indicated by the instruction operands.
These instructions contain three operands, a target one and two sources. The first operand indicates the
target register (rd), i.e., the register in which the result of the operation must be stored. The second
operand indicates a register (rs1) that contains the first source operand. The third operand indicates
the second source, which may be another register (rs2) or an immediate value
6
(imm). The syntax of
logic, shift and arithmetic instructions can be either:
MNM rd, rs1, rs2
or
MNM rd, rs1, imm
where MNM indicates the instruction mnemonic, rd indicates the target register, rs1 indicates the first
source operand and rs2 (or imm) indicates the second operand. The following assembly code shows
examples of logic, shift and arithmetic RV32I assembly instructions:
1 and a0, a2, a6 # a0 := a2 & a6
2 slli a1, a3, 2 # a1 := a3 << 2
3 sub a4, a5, a6 # a4 := a5 - a6
The first instruction performs a bitwise “and” operation using the values from a2 and a6 and stores
the result on a0. The second instruction shifts the value from a3 to the left twice and stores the result on
a1. In this case, the second source operand (2) is an immediate value (imm). Finally, the third instruction
subtracts the value at a6 from the value at a5 and stores the result on register a4.
Any general purpose register (x0-x31) may be used as rd, rs1, or rs2. However, it is worth noticing
that if x0 (zero) is indicated as a target operand (rd), then the result will be discarded. This happens
because x0 is hard-wired to zero.
5.5.2 Dealing with large immediate values
The immediate value is a constant encoded into the instruction itself. Besides this value, the instruction
must also encode other information, such as the opcode and the other operands. Since all RV32I instruc-
tions have exactly 32-bits, the amount of bits available to encode the immediate value is smaller than
32 bits. In fact, the RV32I arithmetic, logic and shift instructions can only encode immediate values
that can be represented as a 12-bit twos’-complement signed number. In other words, the immediate
values used as operands on these instructions must be greater or equal to -2048 (2
11
) and
less or equal to 2047 (2
11
1).
The following code shows a set of invalid assembly instructions:
6
An immediate value is a constant value encoded into the instruction itself.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
60
+
5.5. LOGIC, SHIFT, AND ARITHMETIC INSTRUCTIONS
Since the focus of the book is on assembly programming, the remaining of this book will not differ-
entiate pseudo-instructions from real RV32I machine instructions. We refer the reader to the RISC-V
Instruction Set Manual [4] for a full list of real RV32I machine instructions and pseudo-instructions.
5.5 Logic, shift, and arithmetic instructions
Logic, shift, and arithmetic instructions are instructions that perform logic, shift, and arithmetic opera-
tions on data.
5.5.1 Instructions syntax and operands
All RV32I logic, shift, and arithmetic instructions operate on data indicated by the instruction operands.
These instructions contain three operands, a target one and two sources. The first operand indicates the
target register (rd), i.e., the register in which the result of the operation must be stored. The second
operand indicates a register (rs1) that contains the first source operand. The third operand indicates
the second source, which may be another register (rs2) or an immediate value
6
(imm). The syntax of
logic, shift and arithmetic instructions can be either:
MNM rd, rs1, rs2
or
MNM rd, rs1, imm
where MNM indicates the instruction mnemonic, rd indicates the target register, rs1 indicates the first
source operand and rs2 (or imm) indicates the second operand. The following assembly code shows
examples of logic, shift and arithmetic RV32I assembly instructions:
1 and a0, a2, a6 # a0 := a2 & a6
2 slli a1, a3, 2 # a1 := a3 << 2
3 sub a4, a5, a6 # a4 := a5 - a6
The first instruction performs a bitwise “and” operation using the values from a2 and a6 and stores
the result on a0. The second instruction shifts the value from a3 to the left twice and stores the result on
a1. In this case, the second source operand (2) is an immediate value (imm). Finally, the third instruction
subtracts the value at a6 from the value at a5 and stores the result on register a4.
Any general purpose register (x0-x31) may be used as rd, rs1, or rs2. However, it is worth noticing
that if x0 (zero) is indicated as a target operand (rd), then the result will be discarded. This happens
because x0 is hard-wired to zero.
5.5.2 Dealing with large immediate values
The immediate value is a constant encoded into the instruction itself. Besides this value, the instruction
must also encode other information, such as the opcode and the other operands. Since all RV32I instruc-
tions have exactly 32-bits, the amount of bits available to encode the immediate value is smaller than
32 bits. In fact, the RV32I arithmetic, logic and shift instructions can only encode immediate values
that can be represented as a 12-bit twos’-complement signed number. In other words, the immediate
values used as operands on these instructions must be greater or equal to -2048 (2
11
) and
less or equal to 2047 (2
11
1).
The following code shows a set of invalid assembly instructions:
6
An immediate value is a constant value encoded into the instruction itself.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
60
diff --git a/book/riscv-book-74.page b/book/riscv-book-74.page index d507b5c..5ebcf09 100644 --- a/book/riscv-book-74.page +++ b/book/riscv-book-74.page @@ -1 +1 @@ -
5.5. LOGIC, SHIFT, AND ARITHMETIC INSTRUCTIONS
1 add a0, a5, 2048
2 add a0, a5, 10000
3 add a0, a5, -3000
They are invalid because the assembler cannot encode the immediate values into the instruction
(notice that they may not be encoded as 12-bit twos’-complement signed numbers). In this example,
the assembler will fail to assemble the code and potentially show an error message. The GNU assembler
(as) shows the following message when trying to assemble an assembly program with these instructions:
prog.s: Assembler messages:
prog.s:1: Error: illegal operands ‘add a0,a5,2048’
prog.s:2: Error: illegal operands ‘add a0,a5,10000’
prog.s:3: Error: illegal operands ‘add a0,a5,-3000’
To perform operations with immediate values less than -2048 or greater than 2047, the programmer
could employ multiple instructions to compose the value, store it into a register, and use an instruction
that reads the second source operand from a register. There are several ways of composing these values
using RV32I instructions. As an example, one could load a small constant (e.g., 1000) into a register,
shift its value to the left to multiply it by a power of two, and add another small constant to produce
the desired value. The following assembly code produces the value 4005 by loading the value 1000 into
a5, shifting it twice to the left
7
, and adding 5 to it.
1 add a5, x0, 1000
2 slli a5, a5, 2
3 add a5, a5, 5
In RISC-V, the recommended way of loading immediate values into registers is by using the
“load immediate” pseudo-instruction, or li. This pseudo-instruction is automatically converted
by the assembler to the best sequence of machine instructions to compose the desired value. The syntax
of the load immediate instruction is:
li rd, imm
where rd indicates the target register and imm is the desired immediate value.
5.5.3 Logic instructions
Table 5.5 shows the RV32I logic instructions. The and/or/xor instruction performs the bitwise “and”/“or”/“xor”
operation on values stored in registers rs1 and rs2 and stores the result on register rd. The andi/ori/xori
instruction performs the operation using the value stored in register rs1 and an immediate value.
The following assembly code shows examples of valid logic instructions:
1 and a0, a2, s2 # a0 := a2 & s2
2 or a1, a3, s2 # a1 := a3 | s2
3 xor a2, a2, a1 # a2 := a2 ^ a1
4 andi a0, a2, 3 # a0 := a2 & 3
5 ori a1, a3, 4 # a1 := a3 | 4
6 xori a2, a2, 1 # a2 := a2 ^ 1
The following code loads two immediate values into registers a1 and a2 and performs an “and”
operation. The result of this operation (0x0000AB00) is stored in register a0.
7
shifting a binary-encoded value N times to the left is equivalent to multiplying it by 2
N
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
61
+
5.5. LOGIC, SHIFT, AND ARITHMETIC INSTRUCTIONS
1 add a0, a5, 2048
2 add a0, a5, 10000
3 add a0, a5, -3000
They are invalid because the assembler cannot encode the immediate values into the instruction
(notice that they may not be encoded as 12-bit twos’-complement signed numbers). In this example,
the assembler will fail to assemble the code and potentially show an error message. The GNU assembler
(as) shows the following message when trying to assemble an assembly program with these instructions:
prog.s: Assembler messages:
prog.s:1: Error: illegal operands ‘add a0,a5,2048’
prog.s:2: Error: illegal operands ‘add a0,a5,10000’
prog.s:3: Error: illegal operands ‘add a0,a5,-3000’
To perform operations with immediate values less than -2048 or greater than 2047, the programmer
could employ multiple instructions to compose the value, store it into a register, and use an instruction
that reads the second source operand from a register. There are several ways of composing these values
using RV32I instructions. As an example, one could load a small constant (e.g., 1000) into a register,
shift its value to the left to multiply it by a power of two, and add another small constant to produce
the desired value. The following assembly code produces the value 4005 by loading the value 1000 into
a5, shifting it twice to the left
7
, and adding 5 to it.
1 add a5, x0, 1000
2 slli a5, a5, 2
3 add a5, a5, 5
In RISC-V, the recommended way of loading immediate values into registers is by using the
“load immediate” pseudo-instruction, or li. This pseudo-instruction is automatically converted
by the assembler to the best sequence of machine instructions to compose the desired value. The syntax
of the load immediate instruction is:
li rd, imm
where rd indicates the target register and imm is the desired immediate value.
5.5.3 Logic instructions
Table 5.5 shows the RV32I logic instructions. The and/or/xor instruction performs the bitwise “and”/“or”/“xor”
operation on values stored in registers rs1 and rs2 and stores the result on register rd. The andi/ori/xori
instruction performs the operation using the value stored in register rs1 and an immediate value.
The following assembly code shows examples of valid logic instructions:
1 and a0, a2, s2 # a0 := a2 & s2
2 or a1, a3, s2 # a1 := a3 | s2
3 xor a2, a2, a1 # a2 := a2 ^ a1
4 andi a0, a2, 3 # a0 := a2 & 3
5 ori a1, a3, 4 # a1 := a3 | 4
6 xori a2, a2, 1 # a2 := a2 ^ 1
The following code loads two immediate values into registers a1 and a2 and performs an “and”
operation. The result of this operation (0x0000AB00) is stored in register a0.
7
shifting a binary-encoded value N times to the left is equivalent to multiplying it by 2
N
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
61
diff --git a/book/riscv-book-75.page b/book/riscv-book-75.page index 620d0b3..76888f1 100644 --- a/book/riscv-book-75.page +++ b/book/riscv-book-75.page @@ -1 +1 @@ -
5.5. LOGIC, SHIFT, AND ARITHMETIC INSTRUCTIONS
Instruction Description
and rd, rs1, rs2
Performs the bitwise “and” operation on rs1 and rs2 and stores the result
on rd.
or rd, rs1, rs2
Performs the bitwise “or” operation on rs1 and rs2 and stores the result
on rd.
xor rd, rs1, rs2
Performs the bitwise “xor” operation on rs1 and rs2 and stores the result
on rd.
andi rd, rs1, imm
Performs the bitwise “and” operation on rs1 and imm and stores the result
on rd.
ori rd, rs1, imm
Performs the bitwise “or” operation on rs1 and imm and stores the result
on rd.
xori rd, rs1, imm
Performs the bitwise “xor” operation on rs1 and imm and stores the result
on rd.
Table 5.5: RV32I logic instructions
1 li a1, 0xFE01AB23 # a1 := 0xFE01AB23
2 li a2, 0x0000FF00 # a2 := 0x0000FF00
3 and a0, a1, a2 # a0 := a1 & a2
5.5.4 Shift instructions
Shift instructions are used to shift binary values left or right. These instructions may be used to pack
or unpack bits into words or to perform arithmetic multiply and divide operations. Table 5.6 shows the
RV32I shift instructions.
Instruction Description
sll rd, rs1, rs2
Performs a logical left shift on the value at rs1 and stores the result on
rd. The amount of left shifts is indicated by the value on rs2.
srl rd, rs1, rs2
Performs a logical right shift on the value at rs1 and stores the result on
rd. The amount of right shifts is indicated by the value on rs2.
sra rd, rs1, rs2
Performs an arithmetic right shift on the value at rs1 and stores the
result on rd. The amount of right shifts is indicated by the value on rs2.
slli rd, rs1, imm
Performs a logical left shift on the value at rs1 and stores the result on
rd. The amount of left shifts is indicated by the immediate value imm.
srli rd, rs1, imm
Performs a logical right shift on the value at rs1 and stores the result on
rd. The amount of left shifts is indicated by the immediate value imm.
srai rd, rs1, imm
Performs an arithmetic right shift on the value at rs1 and stores the
result on rd. The amount of left shifts is indicated by the immediate
value imm.
Table 5.6: RV32I shift instructions
The logical left shift instructions (sll or slli) perform a logical left shift on a value that is
stored on a register. The amount of shifts is indicated as an operand to the instruction and can be either
the value in a register or an immediate value. The following code shows examples of logical left shift
instructions. The first shift instruction (slli) shifts the value in a2 twice to the left and stores the result
in a0. The second one (sll) performs a similar operation, but the amount of shifts to the left is defined
by the value in a3.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
62
+
5.5. LOGIC, SHIFT, AND ARITHMETIC INSTRUCTIONS
Instruction Description
and rd, rs1, rs2
Performs the bitwise “and” operation on rs1 and rs2 and stores the result
on rd.
or rd, rs1, rs2
Performs the bitwise “or” operation on rs1 and rs2 and stores the result
on rd.
xor rd, rs1, rs2
Performs the bitwise “xor” operation on rs1 and rs2 and stores the result
on rd.
andi rd, rs1, imm
Performs the bitwise “and” operation on rs1 and imm and stores the result
on rd.
ori rd, rs1, imm
Performs the bitwise “or” operation on rs1 and imm and stores the result
on rd.
xori rd, rs1, imm
Performs the bitwise “xor” operation on rs1 and imm and stores the result
on rd.
Table 5.5: RV32I logic instructions
1 li a1, 0xFE01AB23 # a1 := 0xFE01AB23
2 li a2, 0x0000FF00 # a2 := 0x0000FF00
3 and a0, a1, a2 # a0 := a1 & a2
5.5.4 Shift instructions
Shift instructions are used to shift binary values left or right. These instructions may be used to pack
or unpack bits into words or to perform arithmetic multiply and divide operations. Table 5.6 shows the
RV32I shift instructions.
Instruction Description
sll rd, rs1, rs2
Performs a logical left shift on the value at rs1 and stores the result on
rd. The amount of left shifts is indicated by the value on rs2.
srl rd, rs1, rs2
Performs a logical right shift on the value at rs1 and stores the result on
rd. The amount of right shifts is indicated by the value on rs2.
sra rd, rs1, rs2
Performs an arithmetic right shift on the value at rs1 and stores the
result on rd. The amount of right shifts is indicated by the value on rs2.
slli rd, rs1, imm
Performs a logical left shift on the value at rs1 and stores the result on
rd. The amount of left shifts is indicated by the immediate value imm.
srli rd, rs1, imm
Performs a logical right shift on the value at rs1 and stores the result on
rd. The amount of left shifts is indicated by the immediate value imm.
srai rd, rs1, imm
Performs an arithmetic right shift on the value at rs1 and stores the
result on rd. The amount of left shifts is indicated by the immediate
value imm.
Table 5.6: RV32I shift instructions
The logical left shift instructions (sll or slli) perform a logical left shift on a value that is
stored on a register. The amount of shifts is indicated as an operand to the instruction and can be either
the value in a register or an immediate value. The following code shows examples of logical left shift
instructions. The first shift instruction (slli) shifts the value in a2 twice to the left and stores the result
in a0. The second one (sll) performs a similar operation, but the amount of shifts to the left is defined
by the value in a3.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
62
diff --git a/book/riscv-book-76.page b/book/riscv-book-76.page index f1f1128..6a3fce5 100644 --- a/book/riscv-book-76.page +++ b/book/riscv-book-76.page @@ -1 +1 @@ -
5.5. LOGIC, SHIFT, AND ARITHMETIC INSTRUCTIONS
1 li a2, 24 # a2 := 24
2 slli a0, a2, 2 # a0 := a2 << 2
3 sll a1, a2, a3 # a0 := a2 << a3
The first two instructions on the previous code load the immediate value 24 into register a2, shift
its contents twice to the left and stores the result on a0. The immediate value 24 is represented by the
binary number
1 00000000 00000000 00000000 00011000
The logical left shift operation shifts the bits to the left, discarding the leftmost bits and adding zeros
to the right. Hence, after shifting it twice to the left, the result will be the binary number
1 00000000 00000000 00000000 01100000
This binary number corresponds to the decimal value 96 and is equivalent to 24 ×4. In fact, logical left
shift operations may be used to multiply numbers by powers of two. In this context, shifting
a value N times to the left is equivalent to multiplying the value by 2
N
. The following assembly
code shows examples of logical left shift instructions being used to multiply the value in register a3 by
2, 4, and 8, respectively.
1 slli a0, a3, 1 # a0 := a3 * 2
2 slli a1, a3, 2 # a1 := a3 * 4
3 slli a2, a3, 3 # a2 := a3 * 8
Shift operations are easier to implement in hardware than the multiply operation and usually take
less time and/or energy to be executed. As a consequence, whenever possible, compilers try to generate
these instructions to perform multiplications.
The logical right shift instructions (srl or srli) performs a logical right shift on a value that is
stored on a register. Similar to the logical left shift instructions, the amount of shifts is indicated as an
operand to the instruction and can be either the value in a register or an immediate value. The following
code shows examples of logical right shift instructions. The first shift instruction (slri) shifts the value
in a5 twice to the right and stores the result in a0. The second one (sll) performs a similar operation,
but the amount of shifts to the right is defined by the value in a7.
1 li a5, 24 # a5 := 24
2 srli a0, a5, 2 # a0 := a5 >> 2
3 srl a1, a5, a7 # a1 := a5 >> a7
The first two instructions on the previous code load the immediate value 24 into register a5, shift its
contents twice to the right and stores the result on a0. The immediate value 24 is represented by the
binary number
1 00000000 00000000 00000000 00011000
The logical right shift operation shifts the bits to the right, discarding the rightmost bits and adding
zeros to the left. Hence, after shifting it twice to the right, the result will be the binary number
1 00000000 00000000 00000000 00000110
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
63
+
5.5. LOGIC, SHIFT, AND ARITHMETIC INSTRUCTIONS
1 li a2, 24 # a2 := 24
2 slli a0, a2, 2 # a0 := a2 << 2
3 sll a1, a2, a3 # a0 := a2 << a3
The first two instructions on the previous code load the immediate value 24 into register a2, shift
its contents twice to the left and stores the result on a0. The immediate value 24 is represented by the
binary number
1 00000000 00000000 00000000 00011000
The logical left shift operation shifts the bits to the left, discarding the leftmost bits and adding zeros
to the right. Hence, after shifting it twice to the left, the result will be the binary number
1 00000000 00000000 00000000 01100000
This binary number corresponds to the decimal value 96 and is equivalent to 24 ×4. In fact, logical left
shift operations may be used to multiply numbers by powers of two. In this context, shifting
a value N times to the left is equivalent to multiplying the value by 2
N
. The following assembly
code shows examples of logical left shift instructions being used to multiply the value in register a3 by
2, 4, and 8, respectively.
1 slli a0, a3, 1 # a0 := a3 * 2
2 slli a1, a3, 2 # a1 := a3 * 4
3 slli a2, a3, 3 # a2 := a3 * 8
Shift operations are easier to implement in hardware than the multiply operation and usually take
less time and/or energy to be executed. As a consequence, whenever possible, compilers try to generate
these instructions to perform multiplications.
The logical right shift instructions (srl or srli) performs a logical right shift on a value that is
stored on a register. Similar to the logical left shift instructions, the amount of shifts is indicated as an
operand to the instruction and can be either the value in a register or an immediate value. The following
code shows examples of logical right shift instructions. The first shift instruction (srli) shifts the value
in a5 twice to the right and stores the result in a0. The second one (srl) performs a similar operation,
but the amount of shifts to the right is defined by the value in a7.
1 li a5, 24 # a5 := 24
2 srli a0, a5, 2 # a0 := a5 >> 2
3 srl a1, a5, a7 # a1 := a5 >> a7
The first two instructions on the previous code load the immediate value 24 into register a5, shift its
contents twice to the right and stores the result on a0. The immediate value 24 is represented by the
binary number
1 00000000 00000000 00000000 00011000
The logical right shift operation shifts the bits to the right, discarding the rightmost bits and adding
zeros to the left. Hence, after shifting it twice to the right, the result will be the binary number
1 00000000 00000000 00000000 00000110
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
63
diff --git a/book/riscv-book-77.page b/book/riscv-book-77.page index 87b15a7..9e6f942 100644 --- a/book/riscv-book-77.page +++ b/book/riscv-book-77.page @@ -1 +1 @@ -
5.5. LOGIC, SHIFT, AND ARITHMETIC INSTRUCTIONS
This binary number corresponds to the decimal value 6 and is equivalent to 24/4. In fact, logical right
shift operations may be used to integer divide numbers by powers of two.
In the previous example, we verified that by performing a logical right shift operation twice on value
24 resulted in value 6, i.e., 24/4. Nonetheless, this is not valid for negative numbers. Let us take the
value 24 as an example. This value is represented by the following binary number in RISC-V
8
1 11111111 11111111 11111111 11101000
The logical right shift operation shifts the bits to the right, discarding the rightmost bits and adding
zeros to the left. Hence, after shifting it twice to the right, the result will be the binary number
1 00111111 11111111 11111111 11111010
Notice, however, that this number is not negative and does not correspond to the division of 24 by
four. In fact, it is a very large positive number (1 073 741 818).
In case we assume the unsigned representation, the previous binary number represents the value
4 294 967 272, instead of 24. In this case, the result of applying the logical right shift operation twice
would result in the division of this number by four, i.e., 1 073 741 818.
In summary, the logical right shift operation may only be used to divide unsigned numbers.
In this case, shifting an unsigned number N times to the right with a logical right shift
operation is equivalent to integer dividing the unsigned number by 2
N
.
The arithmetic right shift instructions (sra or srai) perform an arithmetic right shift on a value
that is stored on a register. Similar to the logical right shift instructions, the amount of shifts to the right
is indicated as an operand on the instruction and can be either the value in a register or an immediate
value. The following code shows examples of arithmetic right shift instructions. The first arithmetic
right shift instruction (srai) shifts the value in a5 twice to the right and stores the result in a0. The
second one (sra) performs a similar operation, but the amount of shifts to the right is defined by the
value in a7.
1 li a5, -24 # a5 := -24
2 srai a0, a5, 2 # a0 := a5 >> 2
3 sra a1, a5, a7 # a1 := a5 >> a7
The first two instructions on the previous code load the immediate value 24 into register a5, shift
its contents twice to the right and stores the result on a0. As discussed before, the immediate value 24
is represented by the binary number
1 11111111 11111111 11111111 11101000
The arithmetic right shift operation shifts the bits to the right, discarding the rightmost bits. Instead of
simply adding zeros to the left, it replicates the leftmost bit, i.e., if the leftmost bit is equal to 1, then
it inserts ones on the left. In case the leftmost bit is equal to 0, then it inserts zeros on the left. As a
result, after performing an arithmetic right shift twice on the previous value (i.e., 24), the result will
be the binary number
1 11111111 11111111 11111111 11111010
This binary number corresponds to the decimal value 6 and is equivalent to 24/4. In fact, arithmetic
right shift operations may be used to integer divide signed numbers by powers of two. Notice that this
8
The RV32I Instruction Set Architecture uses the two’s-complement representation for signed numbers.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
64
+
5.5. LOGIC, SHIFT, AND ARITHMETIC INSTRUCTIONS
This binary number corresponds to the decimal value 6 and is equivalent to 24/4. In fact, logical right
shift operations may be used to integer divide numbers by powers of two.
In the previous example, we verified that by performing a logical right shift operation twice on value
24 resulted in value 6, i.e., 24/4. Nonetheless, this is not valid for negative numbers. Let us take the
value 24 as an example. This value is represented by the following binary number in RISC-V
8
1 11111111 11111111 11111111 11101000
The logical right shift operation shifts the bits to the right, discarding the rightmost bits and adding
zeros to the left. Hence, after shifting it twice to the right, the result will be the binary number
1 00111111 11111111 11111111 11111010
Notice, however, that this number is not negative and does not correspond to the division of 24 by
four. In fact, it is a very large positive number (1 073 741 818).
In case we assume the unsigned representation, the previous binary number represents the value
4 294 967 272, instead of 24. In this case, the result of applying the logical right shift operation twice
would result in the division of this number by four, i.e., 1 073 741 818.
In summary, the logical right shift operation may only be used to divide unsigned numbers.
In this case, shifting an unsigned number N times to the right with a logical right shift
operation is equivalent to integer dividing the unsigned number by 2
N
.
The arithmetic right shift instructions (sra or srai) perform an arithmetic right shift on a value
that is stored on a register. Similar to the logical right shift instructions, the amount of shifts to the right
is indicated as an operand on the instruction and can be either the value in a register or an immediate
value. The following code shows examples of arithmetic right shift instructions. The first arithmetic
right shift instruction (srai) shifts the value in a5 twice to the right and stores the result in a0. The
second one (sra) performs a similar operation, but the amount of shifts to the right is defined by the
value in a7.
1 li a5, -24 # a5 := -24
2 srai a0, a5, 2 # a0 := a5 >> 2
3 sra a1, a5, a7 # a1 := a5 >> a7
The first two instructions on the previous code load the immediate value 24 into register a5, shift
its contents twice to the right and stores the result on a0. As discussed before, the immediate value 24
is represented by the binary number
1 11111111 11111111 11111111 11101000
The arithmetic right shift operation shifts the bits to the right, discarding the rightmost bits. Instead of
simply adding zeros to the left, it replicates the leftmost bit, i.e., if the leftmost bit is equal to 1, then
it inserts ones on the left. In case the leftmost bit is equal to 0, then it inserts zeros on the left. As a
result, after performing an arithmetic right shift twice on the previous value (i.e., 24), the result will
be the binary number
1 11111111 11111111 11111111 11111010
This binary number corresponds to the decimal value 6 and is equivalent to 24/4. In fact, arithmetic
right shift operations may be used to integer divide signed numbers by powers of two. Notice that this
8
The RV32I Instruction Set Architecture uses the two’s-complement representation for signed numbers.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
64
diff --git a/book/riscv-book-78.page b/book/riscv-book-78.page index 91fbf93..0f6f764 100644 --- a/book/riscv-book-78.page +++ b/book/riscv-book-78.page @@ -1 +1 @@ -
5.5. LOGIC, SHIFT, AND ARITHMETIC INSTRUCTIONS
instruction can also be used to integer divide positive signed numbers by powers of two. It works because
the leftmost bit of positive signed numbers is zero. Hence, the arithmetic right shift operation will push
zeros to the left when shifting the value.
In summary, the arithmetic right shift operation may only be used to integer divide signed
numbers. In this case, shifting a signed number N times to the right with an arithmetic right
shift operation is equivalent to integer dividing the signed number by 2
N
.
5.5.5 Arithmetic instructions
Table 5.7 shows the RV32I arithmetic instructions and instructions from the M extension (mul, div, and
rem).
Instruction Description
add rd, rs1, rs2
Adds the values in rs1 and rs2 and stores the result on rd.
sub rd, rs1, rs2
Subtracts the value in rs2 from the value in rs1 and stores the result
on rd.
addi rd, rs1, imm
Adds the value in rs1 to the immediate value imm and stores the result
on rd.
mul rd, rs1, rs2
Multiplies the values in rs1 and rs2 and stores the result on rd.
div{u} rd, rs1, rs2
Divides the value in rs1 by the value in rs2 and stores the result on
rd. The U suffix is optional and must be used to indicate that the
values in rs1 and rs2 are unsigned.
rem{u} rd, rs1, rs2
Calculates the remainder of the division of the value in rs1 by the
value in rs2 and stores the result on rd. The U suffix is optional and
must be used to indicate that the values in rs1 and rs2 are unsigned.
Table 5.7: RV32I arithmetic instructions
The add instructions (add and addi) add two numbers and store the result on a register (rd). In
both cases, the first number is retrieved from the register rs1. The add instruction retrieves the second
number from register rs2 while the addi one uses the immediate value imm.
The subtract instruction (sub) subtracts the value in rs2 from the value in rs1 and stores the
result on rd. The RV32I ISA does not contain a subi instruction, i.e., an instruction that subtracts an
immediate value from the contents of a register and stores the result on another register. Nonetheless, it
is worth noticing that a programmer can easily achieve this effect by adding a negative immediate value
using the addi instruction. The following code shows an example of an instruction that subtracts the
immediate value 10 from the contents of register a2 and stores the result on a0 using an addi instruction.
1 addi a0, a2, -10 # a0 := a2 - 10
The multiply instruction (mul) multiplies the values in rs1 and rs2 and stores the result on rd.
The divide instructions (div and divu) divide the value in rs1 by the value in rs2 and stores the
result on rd. Instruction div divides signed numbers while divu divides unsigned numbers.
The remainder instructions (rem and remu) compute the remainder of the division of the value in
rs1 by the value in rs2 and store the result on rd. Instruction rem computes the remainder for divisions
of signed numbers while remu computes the remainder for divisions of unsigned numbers.
The following assembly code shows examples of RV32IM arithmetic instructions:
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
65
+
5.5. LOGIC, SHIFT, AND ARITHMETIC INSTRUCTIONS
instruction can also be used to integer divide positive signed numbers by powers of two. It works because
the leftmost bit of positive signed numbers is zero. Hence, the arithmetic right shift operation will push
zeros to the left when shifting the value.
In summary, the arithmetic right shift operation may only be used to integer divide signed
numbers. In this case, shifting a signed number N times to the right with an arithmetic right
shift operation is equivalent to integer dividing the signed number by 2
N
.
5.5.5 Arithmetic instructions
Table 5.7 shows the RV32I arithmetic instructions and instructions from the M extension (mul, div, and
rem).
Instruction Description
add rd, rs1, rs2
Adds the values in rs1 and rs2 and stores the result on rd.
sub rd, rs1, rs2
Subtracts the value in rs2 from the value in rs1 and stores the result
on rd.
addi rd, rs1, imm
Adds the value in rs1 to the immediate value imm and stores the result
on rd.
mul rd, rs1, rs2
Multiplies the values in rs1 and rs2 and stores the result on rd.
div{u} rd, rs1, rs2
Divides the value in rs1 by the value in rs2 and stores the result on
rd. The U suffix is optional and must be used to indicate that the
values in rs1 and rs2 are unsigned.
rem{u} rd, rs1, rs2
Calculates the remainder of the division of the value in rs1 by the
value in rs2 and stores the result on rd. The U suffix is optional and
must be used to indicate that the values in rs1 and rs2 are unsigned.
Table 5.7: RV32I arithmetic instructions
The add instructions (add and addi) add two numbers and store the result on a register (rd). In
both cases, the first number is retrieved from the register rs1. The add instruction retrieves the second
number from register rs2 while the addi one uses the immediate value imm.
The subtract instruction (sub) subtracts the value in rs2 from the value in rs1 and stores the
result on rd. The RV32I ISA does not contain a subi instruction, i.e., an instruction that subtracts an
immediate value from the contents of a register and stores the result on another register. Nonetheless, it
is worth noticing that a programmer can easily achieve this effect by adding a negative immediate value
using the addi instruction. The following code shows an example of an instruction that subtracts the
immediate value 10 from the contents of register a2 and stores the result on a0 using an addi instruction.
1 addi a0, a2, -10 # a0 := a2 - 10
The multiply instruction (mul) multiplies the values in rs1 and rs2 and stores the result on rd.
The divide instructions (div and divu) divide the value in rs1 by the value in rs2 and stores the
result on rd. Instruction div divides signed numbers while divu divides unsigned numbers.
The remainder instructions (rem and remu) compute the remainder of the division of the value in
rs1 by the value in rs2 and store the result on rd. Instruction rem computes the remainder for divisions
of signed numbers while remu computes the remainder for divisions of unsigned numbers.
The following assembly code shows examples of RV32IM arithmetic instructions:
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
65
diff --git a/book/riscv-book-79.page b/book/riscv-book-79.page index f3c121e..aca3e7f 100644 --- a/book/riscv-book-79.page +++ b/book/riscv-book-79.page @@ -1 +1 @@ -
5.6. DATA MOVEMENT INSTRUCTIONS
1 add a0, a2, t2 # a0 := a2 + t2
2 addi a0, a2, 10 # a0 := a2 + 10
3 sub a1, t3, a0 # a1 := t3 - a0
4 mul a0, a1, a2 # a0 := a1 * a2
5 div a1, a3, a5 # a1 := a3 / a5
6 rem a1, a3, a5 # a1 := a3 % a5
7 remu a1, a3, a5 # a1 := a3 % a5
Did you know? In case you are programming for an RV32I ISA that lacks the M extension, i.e., it
does not contain the multiply and divide instructions, you may be able to combine arithmetic and shift
instructions to perform multiplications and divisions. The following assembly code shows an example of
how the slli and addi instructions may be used to multiply the value of a2 by 5 and by 10:
1 slli a0, a2, 2 # a0 := a2 * 4
2 add a0, a0, a2 # a0 := a0 + a2, i.e., a2 * 5
3 slli a1, a0, 1 # a1 := a0 * 2, i.e., a2 * 10
5.6 Data movement instructions
RV32I data movement instructions can be used to load data from memory into registers, store register
data into memory, copy data from one register to another, or load immediate values or label addresses
into registers. Table 5.8 shows the RV32I data movement instructions and Table 5.9 shows the RV32I
data movement pseudo-instructions.
Instruction Description
lw rd, imm(rs1)
Loads a 32-bit signed or unsigned word from memory into register rd.
The memory address is calculated by adding the immediate value imm to
the value in rs1.
lh rd, imm(rs1)
Loads a 16-bit signed halfword from memory into register rd. The mem-
ory address is calculated by adding the immediate value imm to the value
in rs1.
lhu rd, imm(rs1)
Loads a 16-bit unsigned halfword from memory into register rd. The
memory address is calculated by adding the immediate value imm to the
value in rs1.
lb rd, imm(rs1)
Loads a 8-bit signed byte from memory into register rd. The memory
address is calculated by adding the immediate value imm to the value in
rs1.
lbu rd, imm(rs1)
Loads a 8-bit unsigned byte from memory into register rd. The memory
address is calculated by adding the immediate value imm to the value in
rs1.
sw rs1, imm(rs2)
Stores the 32-bit value at register rs1 into memory. The memory address
is calculated by adding the immediate value imm to the value in rs2.
sh rs1, imm(rs2)
Stores the 16 least significant bits from register rs1 into memory. The
memory address is calculated by adding the immediate value imm to the
value in rs2.
sb rs1, imm(rs2)
Stores the 8 least significant bits from register rs1 into memory. The mem-
ory address is calculated by adding the immediate value imm to the value
in rs2.
Table 5.8: RV32I data movement instructions
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
66
+
5.6. DATA MOVEMENT INSTRUCTIONS
1 add a0, a2, t2 # a0 := a2 + t2
2 addi a0, a2, 10 # a0 := a2 + 10
3 sub a1, t3, a0 # a1 := t3 - a0
4 mul a0, a1, a2 # a0 := a1 * a2
5 div a1, a3, a5 # a1 := a3 / a5
6 rem a1, a3, a5 # a1 := a3 % a5
7 remu a1, a3, a5 # a1 := a3 % a5
Did you know? In case you are programming for an RV32I ISA that lacks the M extension, i.e., it
does not contain the multiply and divide instructions, you may be able to combine arithmetic and shift
instructions to perform multiplications and divisions. The following assembly code shows an example of
how the slli and addi instructions may be used to multiply the value of a2 by 5 and by 10:
1 slli a0, a2, 2 # a0 := a2 * 4
2 add a0, a0, a2 # a0 := a0 + a2, i.e., a2 * 5
3 slli a1, a0, 1 # a1 := a0 * 2, i.e., a2 * 10
5.6 Data movement instructions
RV32I data movement instructions can be used to load data from memory into registers, store register
data into memory, copy data from one register to another, or load immediate values or label addresses
into registers. Table 5.8 shows the RV32I data movement instructions and Table 5.9 shows the RV32I
data movement pseudo-instructions.
Instruction Description
lw rd, imm(rs1)
Loads a 32-bit signed or unsigned word from memory into register rd.
The memory address is calculated by adding the immediate value imm to
the value in rs1.
lh rd, imm(rs1)
Loads a 16-bit signed halfword from memory into register rd. The mem-
ory address is calculated by adding the immediate value imm to the value
in rs1.
lhu rd, imm(rs1)
Loads a 16-bit unsigned halfword from memory into register rd. The
memory address is calculated by adding the immediate value imm to the
value in rs1.
lb rd, imm(rs1)
Loads a 8-bit signed byte from memory into register rd. The memory
address is calculated by adding the immediate value imm to the value in
rs1.
lbu rd, imm(rs1)
Loads a 8-bit unsigned byte from memory into register rd. The memory
address is calculated by adding the immediate value imm to the value in
rs1.
sw rs1, imm(rs2)
Stores the 32-bit value at register rs1 into memory. The memory address
is calculated by adding the immediate value imm to the value in rs2.
sh rs1, imm(rs2)
Stores the 16 least significant bits from register rs1 into memory. The
memory address is calculated by adding the immediate value imm to the
value in rs2.
sb rs1, imm(rs2)
Stores the 8 least significant bits from register rs1 into memory. The mem-
ory address is calculated by adding the immediate value imm to the value
in rs2.
Table 5.8: RV32I data movement instructions
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
66
diff --git a/book/riscv-book-8.page b/book/riscv-book-8.page index 2e5163f..c7967f3 100644 --- a/book/riscv-book-8.page +++ b/book/riscv-book-8.page @@ -1 +1 @@ -
9.3.5 Setting up the interrupt handling mechanism . . . . . . . . . . . . . . . . . . . . . 128
10 Software interrupts and exceptions 131
10.1 Privilege levels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
10.2 Protecting the system . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
10.3 Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
10.4 Software interrupts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
10.5 Protecting RISC-V systems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
10.5.1 Changing the privilege mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
10.5.2 Configuring the exception and software interrupt mechanisms . . . . . . . . . . . . 135
10.5.3 Handling illegal operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
10.5.4 Handling system calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
A RV32IM registers and assembly instructions 138
+
9.3.5 Setting up the interrupt handling mechanism . . . . . . . . . . . . . . . . . . . . . 128
10 Software interrupts and exceptions 131
10.1 Privilege levels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
10.2 Protecting the system . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
10.3 Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
10.4 Software interrupts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
10.5 Protecting RISC-V systems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
10.5.1 Changing the privilege mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
10.5.2 Configuring the exception and software interrupt mechanisms . . . . . . . . . . . . 135
10.5.3 Handling illegal operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
10.5.4 Handling system calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
A RV32IM registers and assembly instructions 138
diff --git a/book/riscv-book-80.page b/book/riscv-book-80.page index 1792d81..e475b7d 100644 --- a/book/riscv-book-80.page +++ b/book/riscv-book-80.page @@ -1 +1 @@ -
5.6. DATA MOVEMENT INSTRUCTIONS
Instruction Description
mv rd, rs
Copies the value from register rs into register rd.
li rd, imm
Loads the immediate value imm into register rd.
la rd, rot
Loads the label address rot into register rd.
l{w|h|hu|b|bu} rd, lab
For each one of the lw, lh, lhu, lb, and lbu machine instructions
there is a pseudo-instruction that performs the same operation,
but the memory address is calculated based on a label (lab).
s{w|h|b} rd, lab
For each one of the sw, sh, and sb machine instructions there is
a pseudo-instruction that performs the same operation, but the
memory address is calculated based on a label (lab).
Table 5.9: RV32I data movement pseudo-instructions
5.6.1 Load instructions
All RV32I load instructions (lw, lh, lhu, lb, and lbu) load values from memory into a register. The
assembly syntax for these instructions is:
MNM rd, imm(rs1)
where MNM indicates the instruction mnemonic. The first operand (rd) indicates the target register, i.e.,
the one that will receive the value loaded from memory. The second (imm) and third (rs1) operands
indicate an immediate value and a register, respectively. The values of these two operands are added
together to calculate the memory address.
The load word instruction (lw) loads a 32-bit word from memory into a register. Since a word
datatype has four bytes, this instruction loads four bytes from four consecutive memory positions (starting
at the calculated address) and stores these four bytes into the target register. The RV32I ISA follows
the little-endian endianness format, hence, the byte loaded from the memory position associated with
the lowest address is loaded into the register’s least significant byte. Figure 5.2 illustrates a value being
loaded from memory into register a0. In this example, the data (a four-byte word) is being loaded from
four consecutive memory locations, starting at address 8000. The start address is calculated by adding
the immediate value (0 ) to the contents of register a2 (8000
10
).
0E 01 080A
8000
10
Registers
00 1F 4000
01 0E 0A08
Main Memory
8000 8001 8002 8003
Figure 5.2: Example of a word (0x0A0E0108) being loaded by a load word instruction
The load word instruction is usually employed to load int, unsigned int, long, unsigned long,
and pointers from memory
9
.
The load unsigned byte instruction (lbu) loads an 8-bit unsigned byte from memory into a
register. Since registers have 32 bits, or four bytes, the unsigned byte loaded from memory is stored
on the least significant register byte and the other three register bytes are set to zero. Figure 5.3
illustrates an unsigned byte value being loaded from memory into register a0. In this example, the
data (an unsigned byte) is being loaded from the memory location associated with address 8000, which
is calculated by adding the immediate value (0) to the contents of register a2 (8000
10
).
9
Section 5.1 discusses the mappings from C datatypes to the RV32I ISA native datatypes.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
67
+
5.6. DATA MOVEMENT INSTRUCTIONS
Instruction Description
mv rd, rs
Copies the value from register rs into register rd.
li rd, imm
Loads the immediate value imm into register rd.
la rd, rot
Loads the label address rot into register rd.
l{w|h|hu|b|bu} rd, lab
For each one of the lw, lh, lhu, lb, and lbu machine instructions
there is a pseudo-instruction that performs the same operation,
but the memory address is calculated based on a label (lab).
s{w|h|b} rd, lab
For each one of the sw, sh, and sb machine instructions there is
a pseudo-instruction that performs the same operation, but the
memory address is calculated based on a label (lab).
Table 5.9: RV32I data movement pseudo-instructions
5.6.1 Load instructions
All RV32I load instructions (lw, lh, lhu, lb, and lbu) load values from memory into a register. The
assembly syntax for these instructions is:
MNM rd, imm(rs1)
where MNM indicates the instruction mnemonic. The first operand (rd) indicates the target register, i.e.,
the one that will receive the value loaded from memory. The second (imm) and third (rs1) operands
indicate an immediate value and a register, respectively. The values of these two operands are added
together to calculate the memory address.
The load word instruction (lw) loads a 32-bit word from memory into a register. Since a word
datatype has four bytes, this instruction loads four bytes from four consecutive memory positions (starting
at the calculated address) and stores these four bytes into the target register. The RV32I ISA follows
the little-endian endianness format, hence, the byte loaded from the memory position associated with
the lowest address is loaded into the register’s least significant byte. Figure 5.2 illustrates a value being
loaded from memory into register a0. In this example, the data (a four-byte word) is being loaded from
four consecutive memory locations, starting at address 8000. The start address is calculated by adding
the immediate value (0 ) to the contents of register a2 (8000
10
).
0E 01 080A
8000
10
Registers
00 1F 4000
01 0E 0A08
Main Memory
8000 8001 8002 8003
Figure 5.2: Example of a word (0x0A0E0108) being loaded by a load word instruction
The load word instruction is usually employed to load int, unsigned int, long, unsigned long,
and pointers from memory
9
.
The load unsigned byte instruction (lbu) loads an 8-bit unsigned byte from memory into a
register. Since registers have 32 bits, or four bytes, the unsigned byte loaded from memory is stored
on the least significant register byte and the other three register bytes are set to zero. Figure 5.3
illustrates an unsigned byte value being loaded from memory into register a0. In this example, the
data (an unsigned byte) is being loaded from the memory location associated with address 8000, which
is calculated by adding the immediate value (0) to the contents of register a2 (8000
10
).
9
Section 5.1 discusses the mappings from C datatypes to the RV32I ISA native datatypes.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
67
diff --git a/book/riscv-book-81.page b/book/riscv-book-81.page index 7e27322..81612fe 100644 --- a/book/riscv-book-81.page +++ b/book/riscv-book-81.page @@ -1 +1 @@ -
5.6. DATA MOVEMENT INSTRUCTIONS
00 00 0800
8000
10
Registers
00 1F 4000
01 0E 0A08
Main Memory
8000 8001 8002 8003
Figure 5.3: Example of unsigned byte (0x08) being loaded by a load unsigned byte instruction
The load unsigned byte instruction is usually employed to load unsigned char datatype values from
memory.
The load byte instruction (lb) loads a 8-bit signed byte from memory into a register. Again, since
registers have 32 bits, the signed byte loaded from memory is stored on the least significant register
byte. In case the value is non-negative, the other three register bytes are set to zero. In case it is
negative, the bits of the other three register bytes are set to one. Figure 5.4 illustrates a non-negative
signed byte value (0x08 = 8
10
) being loaded from memory into register a0. In this example, the data,
a non-negative unsigned byte, is being loaded from the memory location associated with address 8000,
which is calculated by adding the immediate value (0) to the contents of register a2 (8000
10
). Notice
that the three most significant register bytes are set to zero.
00 00 0800
8000
10
Registers
00 1F 4000
01 0E 0A08
Main Memory
8000 8001 8002 8003
Figure 5.4: Example of a non-negative signed byte value (0x08 = 8
10
) being loaded by the load byte
instruction
Figure 5.5 illustrates a negative signed byte value (0xFE = 2
10
) being loaded from memory into
register a0. Again, the data is being loaded from the memory location associated with address 8000,
which is calculated by adding the immediate value (0) to the contents of register a2 (8000
10
). Notice,
however, that the bits of the three most significant register bytes are set to ones and the final value is
properly set to 0xFFFFFFFE, i.e., 2
10
.
FF FF FEFF
8000
10
Registers
00 1F 4000
01 0E 0AFE
8000 8001 8002 8003
Main Memory
Figure 5.5: Example of a negative signed byte value (0xFE = 2
10
) being loaded by the load byte
instruction
The load byte instruction is used to load char C datatype values from memory.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
68
+
5.6. DATA MOVEMENT INSTRUCTIONS
00 00 0800
8000
10
Registers
00 1F 4000
01 0E 0A08
Main Memory
8000 8001 8002 8003
Figure 5.3: Example of unsigned byte (0x08) being loaded by a load unsigned byte instruction
The load unsigned byte instruction is usually employed to load unsigned char datatype values from
memory.
The load byte instruction (lb) loads a 8-bit signed byte from memory into a register. Again, since
registers have 32 bits, the signed byte loaded from memory is stored on the least significant register
byte. In case the value is non-negative, the other three register bytes are set to zero. In case it is
negative, the bits of the other three register bytes are set to one. Figure 5.4 illustrates a non-negative
signed byte value (0x08 = 8
10
) being loaded from memory into register a0. In this example, the data,
a non-negative unsigned byte, is being loaded from the memory location associated with address 8000,
which is calculated by adding the immediate value (0) to the contents of register a2 (8000
10
). Notice
that the three most significant register bytes are set to zero.
00 00 0800
8000
10
Registers
00 1F 4000
01 0E 0A08
Main Memory
8000 8001 8002 8003
Figure 5.4: Example of a non-negative signed byte value (0x08 = 8
10
) being loaded by the load byte
instruction
Figure 5.5 illustrates a negative signed byte value (0xFE = 2
10
) being loaded from memory into
register a0. Again, the data is being loaded from the memory location associated with address 8000,
which is calculated by adding the immediate value (0) to the contents of register a2 (8000
10
). Notice,
however, that the bits of the three most significant register bytes are set to ones and the final value is
properly set to 0xFFFFFFFE, i.e., 2
10
.
FF FF FEFF
8000
10
Registers
00 1F 4000
01 0E 0AFE
8000 8001 8002 8003
Main Memory
Figure 5.5: Example of a negative signed byte value (0xFE = 2
10
) being loaded by the load byte
instruction
The load byte instruction is used to load char C datatype values from memory.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
68
diff --git a/book/riscv-book-82.page b/book/riscv-book-82.page index e96825a..ed3aa93 100644 --- a/book/riscv-book-82.page +++ b/book/riscv-book-82.page @@ -1 +1 @@ -
5.6. DATA MOVEMENT INSTRUCTIONS
The load unsigned halfword instruction (lhu) loads a 16-bit unsigned halfword from memory
into a register. Since an unsigned halfword datatype has two bytes, this instruction loads two bytes
from two consecutive memory positions (starting at the calculated address) and stores these two bytes
into the target register. Again, since the RV32I ISA follows the little-endian endianness format, the byte
loaded from the memory position associated with the lowest address is loaded into the register’s least
significant byte and the second byte loaded into the register’s second-least significant byte. The other
two register bytes are set to zero. Figure 5.6 illustrates an unsigned halfword value (0x0108) being
loaded from memory into register a0. In this example, the data, an unsigned halfword, is being loaded
from the memory locations starting at address 8000, which is calculated by adding the immediate value
(0) to the contents of register a2 (8000
10
). Notice that the two most-significant register bytes are set to
zero.
00 01 0200
8000
10
Registers
00 1F 4000
01 0E 0A02
8000 8001 8002 8003
Main Memory
Figure 5.6: Example of an unsigned halfword value (0x0108) being loaded by the load unsigned half-
word instruction
The load unsigned halfword instruction is used to load unsigned short C datatype values from
memory.
The load halfword instruction (lh) loads a 16-bit signed halfword from memory into a register.
Since a halfword datatype has two bytes, this instruction loads two bytes from two consecutive memory
positions (starting at the calculated address) and stores these two bytes into the target register. Again,
since the RV32I ISA follows the little-endian endianness format, the byte loaded from the memory
position associated with the lowest address is loaded into the register’s least significant byte and the
second byte loaded into the register’s second-least significant byte. In case the value is non-negative,
the bits of the other two bytes of the register are set to zeros, and in case it is negative, they are set to
ones. Figure 5.7 illustrates a non-negative halfword value (0x0102 = 258
10
) being loaded from memory
into register a0. In this example, the data, a non-negative halfword, is being loaded from the memory
location associated with address 8000, which is calculated by adding the immediate value (0) to the
contents of register a2 (8000
10
). Notice that the two most significant register bytes are properly set to
zero and the final result is 0x00000102, i.e., 258
10
.
00 01 0200
8000
10
Registers
00 1F 4000
01 0E 0A02
8000 8001 8002 8003
Main Memory
Figure 5.7: Example of a non-negative signed halfword value (0x0102 = 258
10
) being loaded by the
load halfword instruction
Figure 5.8 illustrates a negative halfword value (0xFFFE = 2
10
) being loaded from memory into
register a0. Again, the data is being loaded from the memory locations starting at address 8000, which
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
69
+
5.6. DATA MOVEMENT INSTRUCTIONS
The load unsigned halfword instruction (lhu) loads a 16-bit unsigned halfword from memory
into a register. Since an unsigned halfword datatype has two bytes, this instruction loads two bytes
from two consecutive memory positions (starting at the calculated address) and stores these two bytes
into the target register. Again, since the RV32I ISA follows the little-endian endianness format, the byte
loaded from the memory position associated with the lowest address is loaded into the register’s least
significant byte and the second byte loaded into the register’s second-least significant byte. The other
two register bytes are set to zero. Figure 5.6 illustrates an unsigned halfword value (0x0108) being
loaded from memory into register a0. In this example, the data, an unsigned halfword, is being loaded
from the memory locations starting at address 8000, which is calculated by adding the immediate value
(0) to the contents of register a2 (8000
10
). Notice that the two most-significant register bytes are set to
zero.
00 01 0200
8000
10
Registers
00 1F 4000
01 0E 0A02
8000 8001 8002 8003
Main Memory
Figure 5.6: Example of an unsigned halfword value (0x0108) being loaded by the load unsigned half-
word instruction
The load unsigned halfword instruction is used to load unsigned short C datatype values from
memory.
The load halfword instruction (lh) loads a 16-bit signed halfword from memory into a register.
Since a halfword datatype has two bytes, this instruction loads two bytes from two consecutive memory
positions (starting at the calculated address) and stores these two bytes into the target register. Again,
since the RV32I ISA follows the little-endian endianness format, the byte loaded from the memory
position associated with the lowest address is loaded into the register’s least significant byte and the
second byte loaded into the register’s second-least significant byte. In case the value is non-negative,
the bits of the other two bytes of the register are set to zeros, and in case it is negative, they are set to
ones. Figure 5.7 illustrates a non-negative halfword value (0x0102 = 258
10
) being loaded from memory
into register a0. In this example, the data, a non-negative halfword, is being loaded from the memory
location associated with address 8000, which is calculated by adding the immediate value (0) to the
contents of register a2 (8000
10
). Notice that the two most significant register bytes are properly set to
zero and the final result is 0x00000102, i.e., 258
10
.
00 01 0200
8000
10
Registers
00 1F 4000
01 0E 0A02
8000 8001 8002 8003
Main Memory
Figure 5.7: Example of a non-negative signed halfword value (0x0102 = 258
10
) being loaded by the
load halfword instruction
Figure 5.8 illustrates a negative halfword value (0xFFFE = 2
10
) being loaded from memory into
register a0. Again, the data is being loaded from the memory locations starting at address 8000, which
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
69
diff --git a/book/riscv-book-83.page b/book/riscv-book-83.page index 3e2e660..aa08b3d 100644 --- a/book/riscv-book-83.page +++ b/book/riscv-book-83.page @@ -1 +1 @@ -
5.6. DATA MOVEMENT INSTRUCTIONS
is calculated by adding the immediate value (0) to the contents of register a2 (8000
10
). Notice, however,
that the bits of the two most significant register bytes are set to ones and the final value is properly set
to 0xFFFFFFFE, i.e., 2
10
.
FF FF FEFF
8000
10
Registers
00 1F 4000
FF 0E 0AFE
8000 8001 8002 8003
Main Memory
Figure 5.8: Example of a negative signed halfword value (0xFFFE = 2
10
) being loaded by the load
halfword instruction
The load halfword instruction is used to load short C datatype values from memory.
5.6.2 Store instructions
All RV32I store instructions (sw, sh, and sb) store values from registers into memory. The assembly
syntax for these instructions is:
MNM rs1, imm(rs2)
where MNM indicates the instruction mnemonic. The first operand (rs1) indicates the source register,
i.e., the register that contains the value to be stored on memory. The second (imm) and third (rs2)
operands indicate an immediate value and a register, respectively. The value of these two operands are
added together to calculate the memory address.
The store word instruction (sw) stores a 32-bit word from rs1 into the memory. Since a word
datatype has four bytes, this instruction stores the four bytes into four consecutive memory positions
(starting at the calculated address). The RV32I ISA follows the little-endian endianness format, hence,
the least significant byte is stored on the memory position associated with the lowest address and so
on. Figure 5.9 illustrates a value from a0 being stored into the main memory by a sw instruction. In
this example, the data (a four-byte word) is being stored on four consecutive memory locations, starting
at address 8000. The start address is calculated by adding the immediate value (0) to the contents of
register a2 (8000
10
).
0E 01 080A
8000
10
Registers
00 1F 4000
01 0E 0A08
Main Memory
8000 8001 8002 8003
Figure 5.9: Example of a word value (0x0A0E0108) being stored by the store word instruction
The store word instruction is used to store int, unsigned int, long, unsigned long, and pointers
C data types into memory.
The store halfword instruction (sh) stores the least significant 16-bit halfword from rs1 into
memory. Since a halfword datatype has two bytes, this instruction stores the two least significant bytes
from register rs1 into two consecutive memory positions (starting at the calculated address). The RV32I
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
70
+
5.6. DATA MOVEMENT INSTRUCTIONS
is calculated by adding the immediate value (0) to the contents of register a2 (8000
10
). Notice, however,
that the bits of the two most significant register bytes are set to ones and the final value is properly set
to 0xFFFFFFFE, i.e., 2
10
.
FF FF FEFF
8000
10
Registers
00 1F 4000
FF 0E 0AFE
8000 8001 8002 8003
Main Memory
Figure 5.8: Example of a negative signed halfword value (0xFFFE = 2
10
) being loaded by the load
halfword instruction
The load halfword instruction is used to load short C datatype values from memory.
5.6.2 Store instructions
All RV32I store instructions (sw, sh, and sb) store values from registers into memory. The assembly
syntax for these instructions is:
MNM rs1, imm(rs2)
where MNM indicates the instruction mnemonic. The first operand (rs1) indicates the source register,
i.e., the register that contains the value to be stored on memory. The second (imm) and third (rs2)
operands indicate an immediate value and a register, respectively. The value of these two operands are
added together to calculate the memory address.
The store word instruction (sw) stores a 32-bit word from rs1 into the memory. Since a word
datatype has four bytes, this instruction stores the four bytes into four consecutive memory positions
(starting at the calculated address). The RV32I ISA follows the little-endian endianness format, hence,
the least significant byte is stored on the memory position associated with the lowest address and so
on. Figure 5.9 illustrates a value from a0 being stored into the main memory by a sw instruction. In
this example, the data (a four-byte word) is being stored on four consecutive memory locations, starting
at address 8000. The start address is calculated by adding the immediate value (0) to the contents of
register a2 (8000
10
).
0E 01 080A
8000
10
Registers
00 1F 4000
01 0E 0A08
Main Memory
8000 8001 8002 8003
Figure 5.9: Example of a word value (0x0A0E0108) being stored by the store word instruction
The store word instruction is used to store int, unsigned int, long, unsigned long, and pointers
C data types into memory.
The store halfword instruction (sh) stores the least significant 16-bit halfword from rs1 into
memory. Since a halfword datatype has two bytes, this instruction stores the two least significant bytes
from register rs1 into two consecutive memory positions (starting at the calculated address). The RV32I
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
70
diff --git a/book/riscv-book-84.page b/book/riscv-book-84.page index 4a33688..9e162b1 100644 --- a/book/riscv-book-84.page +++ b/book/riscv-book-84.page @@ -1 +1 @@ -
5.6. DATA MOVEMENT INSTRUCTIONS
ISA follows the little-endian endianness format, hence, the least significant byte is stored on the memory
position associated with the lowest address and so on. Figure 5.10 illustrates a halfword value from a0
being stored into the main memory by a sh instruction. In this example, the data (a two-byte halfword)
is being stored on two consecutive memory locations, starting at address 8000. The start address is
calculated by adding the immediate value (0) to the contents of register a2 (8000
10
).
0E 01 080A
8000
10
Registers
00 1F 4000
01
08
Main Memory
8000 8001 8002 8003
Figure 5.10: Example of a halfword value (0x0108) being stored by the store halfword instruction
The store halfword instruction is used to store short and unsigned short C datatype values into
memory.
The store byte instruction (sb) stores the least significant byte from rs1 into memory. Since a
byte datatype has the same size as a memory word, this instruction stores the least significant byte from
register rs1 into a single memory position, indicated by the calculated address. Figure 5.11 illustrates
a byte value from a0 being stored into the main memory by a sb instruction. In this example, the data
(a single byte) is being stored on a single memory location, at address 8000. The memory address is
calculated by adding the immediate value (0) to the contents of register a2 (8000
10
).
0E 01 080A
8000
10
Registers
00 1F 4000
08
Main Memory
8000 8001 8002 8003
Figure 5.11: Example of a byte value (0x08) being stored by the store byte instruction
The store byte instruction is used to store char and unsigned char C datatype values into memory.
5.6.3 Data movement pseudo-instructions
The copy register instruction (mv) is a pseudo-instruction that copies the value from one register into
another one. The assembly syntax for this instruction is
mv rd, rs
where rd indicates the target register and rs indicates the source register.
The load immediate instruction (li) is a pseudo-instruction that loads an immediate value into
a register. As discussed in Section 5.5.2, depending on the immediate value, the assembler may convert
this pseudo-instruction into a single or multiple machine instructions. The assembly syntax for this
instruction is
li rd, imm
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
71
+
5.6. DATA MOVEMENT INSTRUCTIONS
ISA follows the little-endian endianness format, hence, the least significant byte is stored on the memory
position associated with the lowest address and so on. Figure 5.10 illustrates a halfword value from a0
being stored into the main memory by a sh instruction. In this example, the data (a two-byte halfword)
is being stored on two consecutive memory locations, starting at address 8000. The start address is
calculated by adding the immediate value (0) to the contents of register a2 (8000
10
).
0E 01 080A
8000
10
Registers
00 1F 4000
01
08
Main Memory
8000 8001 8002 8003
Figure 5.10: Example of a halfword value (0x0108) being stored by the store halfword instruction
The store halfword instruction is used to store short and unsigned short C datatype values into
memory.
The store byte instruction (sb) stores the least significant byte from rs1 into memory. Since a
byte datatype has the same size as a memory word, this instruction stores the least significant byte from
register rs1 into a single memory position, indicated by the calculated address. Figure 5.11 illustrates
a byte value from a0 being stored into the main memory by a sb instruction. In this example, the data
(a single byte) is being stored on a single memory location, at address 8000. The memory address is
calculated by adding the immediate value (0) to the contents of register a2 (8000
10
).
0E 01 080A
8000
10
Registers
00 1F 4000
08
Main Memory
8000 8001 8002 8003
Figure 5.11: Example of a byte value (0x08) being stored by the store byte instruction
The store byte instruction is used to store char and unsigned char C datatype values into memory.
5.6.3 Data movement pseudo-instructions
The copy register instruction (mv) is a pseudo-instruction that copies the value from one register into
another one. The assembly syntax for this instruction is
mv rd, rs
where rd indicates the target register and rs indicates the source register.
The load immediate instruction (li) is a pseudo-instruction that loads an immediate value into
a register. As discussed in Section 5.5.2, depending on the immediate value, the assembler may convert
this pseudo-instruction into a single or multiple machine instructions. The assembly syntax for this
instruction is
li rd, imm
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
71
diff --git a/book/riscv-book-85.page b/book/riscv-book-85.page index afcc428..358b1cd 100644 --- a/book/riscv-book-85.page +++ b/book/riscv-book-85.page @@ -1 +1 @@ -
5.7. CONTROL-FLOW INSTRUCTIONS
where rd indicates the target register and imm the immediate value to be loaded into the target register.
The load address instruction (la) is a pseudo-instruction that loads a 32-bit address, indicated
by a label, into a register. The assembly syntax for this instruction is
la rd, symbol
where rd indicates the target register and symbol the name of the label.
The load global instructions are a set of pseudo-instructions to facilitate the load of values from
memory positions that are identified by labels. The assembly syntax for these instructions is
l{w|h|hu|b|bu} rd, symbol
where rd indicates the target register and symbol the name of the label. As an example, instruction
lh a0, var_x
loads a halfword datatype value from the memory positions starting at the address associated with
label var x”. The loaded value is stored into register a0. Since a label represents a 32-bit address and
may not be encoded as an immediate value on a load instruction
10
, the assembler may generate multiple
RV32I machine instructions to perform the load operation. In this case, it first generates instructions to
load the address of the label into rd
11
. Then, it generates a machine load instruction to load the value
from memory into rd.
The store global instructions are a set of pseudo-instructions to facilitate the store of values into
memory positions that are identified by labels. The assembly syntax for these instructions is
s{w|h|b} rs, symbol, rt
where rs indicates the source register, symbol indicates the name of the label, and rt indicates a
temporary register to support the computation of the address. As an example, instruction
sw a0, var_x, a5
stores the word value from register a0 into the memory positions starting at the address associated with
label var x”. Similar to the load global instructions, the label may not be encoded as an immediate
value, hence, the assembler may generate multiple RV32I machine instructions so that it can load the
label address into a register before executing a machine store instruction. In this case, however, the
assembler may not use the rs as a temporary register, since it would destroy the contents of the register
before storing it on the memory. For this reason, the user is required to explicitly indicate a general-
purpose register so that the assembler may use it as a temporary when generating the code for the
pseudo-instruction.
5.7 Control-flow instructions
In RISC-V, and most general-purpose processors, the normal execution flow consists in executing
instructions in the same order they are organized on memory. In other words, once an instruc-
tion is executed, the processor fetches the instruction that is located in the next memory position for
execution. RISC-V instructions are 4-byte long, hence, after executing an instruction that is located at
address 0x8000, the processor fetches the next instruction from address 0x8004.
Control-flow instructions are instructions capable of changing the normal execution flow.
In this case, the next instruction to be executed depends on the semantics of the control-flow instruction.
10
The immediate field (imm) of load and store instructions are limited to values that can be represented as 12-bit two’s-
complement numbers.
11
The assembler uses rd as a temporary, since its previous value will be discarded anyway after the load operation is
complete.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
72
+
5.7. CONTROL-FLOW INSTRUCTIONS
where rd indicates the target register and imm the immediate value to be loaded into the target register.
The load address instruction (la) is a pseudo-instruction that loads a 32-bit address, indicated
by a label, into a register. The assembly syntax for this instruction is
la rd, symbol
where rd indicates the target register and symbol the name of the label.
The load global instructions are a set of pseudo-instructions to facilitate the load of values from
memory positions that are identified by labels. The assembly syntax for these instructions is
l{w|h|hu|b|bu} rd, symbol
where rd indicates the target register and symbol the name of the label. As an example, instruction
lh a0, var_x
loads a halfword datatype value from the memory positions starting at the address associated with
label var x”. The loaded value is stored into register a0. Since a label represents a 32-bit address and
may not be encoded as an immediate value on a load instruction
10
, the assembler may generate multiple
RV32I machine instructions to perform the load operation. In this case, it first generates instructions to
load the address of the label into rd
11
. Then, it generates a machine load instruction to load the value
from memory into rd.
The store global instructions are a set of pseudo-instructions to facilitate the store of values into
memory positions that are identified by labels. The assembly syntax for these instructions is
s{w|h|b} rs, symbol, rt
where rs indicates the source register, symbol indicates the name of the label, and rt indicates a
temporary register to support the computation of the address. As an example, instruction
sw a0, var_x, a5
stores the word value from register a0 into the memory positions starting at the address associated with
label var x”. Similar to the load global instructions, the label may not be encoded as an immediate
value, hence, the assembler may generate multiple RV32I machine instructions so that it can load the
label address into a register before executing a machine store instruction. In this case, however, the
assembler may not use the rs as a temporary register, since it would destroy the contents of the register
before storing it on the memory. For this reason, the user is required to explicitly indicate a general-
purpose register so that the assembler may use it as a temporary when generating the code for the
pseudo-instruction.
5.7 Control-flow instructions
In RISC-V, and most general-purpose processors, the normal execution flow consists in executing
instructions in the same order they are organized on memory. In other words, once an instruc-
tion is executed, the processor fetches the instruction that is located in the next memory position for
execution. RISC-V instructions are 4-byte long, hence, after executing an instruction that is located at
address 0x8000, the processor fetches the next instruction from address 0x8004.
Control-flow instructions are instructions capable of changing the normal execution flow.
In this case, the next instruction to be executed depends on the semantics of the control-flow instruction.
10
The immediate field (imm) of load and store instructions are limited to values that can be represented as 12-bit two’s-
complement numbers.
11
The assembler uses rd as a temporary, since its previous value will be discarded anyway after the load operation is
complete.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
72
diff --git a/book/riscv-book-86.page b/book/riscv-book-86.page index 8737faa..1289e03 100644 --- a/book/riscv-book-86.page +++ b/book/riscv-book-86.page @@ -1 +1 @@ -
5.7. CONTROL-FLOW INSTRUCTIONS
NOTE: Different authors may use different terms to refer to control-flow instructions. For
example, Waterman and Asanovi´c [4] use the term control transfer instructions. Other
authors may also use the terms jump or branch to refer to control-flow instructions.
Control-flow instructions may be classified as conditional or unconditional control-flow instructions.
They may also be classified as direct or indirect control-flow instructions. The next sections discuss these
properties.
5.7.1 Conditional control-flow instructions
Conditional control-flow instructions change the normal execution flow under certain con-
ditions. In other words, the decision of changing or not the normal execution flow depends on whether
a given condition is satisfied. For example, the branch equal instruction, or beq, compares the values of
two registers and jumps to the target address (i.e., changes the normal execution flow) if their values
are equal.
NOTE: The verb “to jump” is commonly used to indicate that a control-flow instruction
changed the normal execution flow.
NOTE: The target address is the address of the next instruction that must be fetched in case
the instruction jumps.
In the following code, the beq instruction jumps to label L (which indicates the target address) if the
contents of a0 is equal to the contents of a1. In this case, the next instruction to be executed will be the
sub instruction.
1 beq a0, a1, L
2 add a0, a0, a1
3 L:
4 sub a2, a2, a3
If the contents of registers a0 and a1 differ from each other, then the beq instruction does not jump and
the execution flow continues normally, i.e., the next instruction on memory (add) is executed.
There are several conditional control-flow instructions in the RV32I ISA. Table 5.10 shows the RV32I
conditional control-flow instructions and pseudo-instructions.
The blt rs1, rs2, lab jumps to label lab if the value stored on the register indicated by rs1 is less
than the value stored on the register indicated by rs2. In this case, the processor assumes that the values
in rs1 and rs2 are signed values (represented in two’s complement), hence, 0xFFFFFFFF
12
is considered
less than 0x00000000 by this instruction. To compare unsigned values, one must use the bltu rs1, rs2,
lab instruction. In this case, the processor assumes that the values in rs1 and rs2 are unsigned integer
values, hence, 0xFFFFFFFF
13
is considered greater than 0x00000000 by this instruction.
The following assembly code shows examples of RV32I conditional control-flow instructions:
1 beq a0, a2, THEN # jump to label THEN if a0 = a2
2 bne a1, a3, ELSE # jump to label ELSE if a1 != a3
3 blt a2, a3, NEXT # jump to label NEXT if a2 < a3 (signed comp.)
4 bge a4, a1, LOOP # jump to label LOOP if a4 >= a1 (signed comp.)
5 bltu a0, a2, L # jump to label L if a0 < a2 (unsigned comp.)
12
0xFFFFFFFF represents -1 in two’s complement
13
0xFFFFFFFF represents 4294967295 in the unsigned integer representation
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
73
+
5.7. CONTROL-FLOW INSTRUCTIONS
NOTE: Different authors may use different terms to refer to control-flow instructions. For
example, Waterman and Asanovi´c [4] use the term control transfer instructions. Other
authors may also use the terms jump or branch to refer to control-flow instructions.
Control-flow instructions may be classified as conditional or unconditional control-flow instructions.
They may also be classified as direct or indirect control-flow instructions. The next sections discuss these
properties.
5.7.1 Conditional control-flow instructions
Conditional control-flow instructions change the normal execution flow under certain con-
ditions. In other words, the decision of changing or not the normal execution flow depends on whether
a given condition is satisfied. For example, the branch equal instruction, or beq, compares the values of
two registers and jumps to the target address (i.e., changes the normal execution flow) if their values
are equal.
NOTE: The verb “to jump” is commonly used to indicate that a control-flow instruction
changed the normal execution flow.
NOTE: The target address is the address of the next instruction that must be fetched in case
the instruction jumps.
In the following code, the beq instruction jumps to label L (which indicates the target address) if the
contents of a0 is equal to the contents of a1. In this case, the next instruction to be executed will be the
sub instruction.
1 beq a0, a1, L
2 add a0, a0, a1
3 L:
4 sub a2, a2, a3
If the contents of registers a0 and a1 differ from each other, then the beq instruction does not jump and
the execution flow continues normally, i.e., the next instruction on memory (add) is executed.
There are several conditional control-flow instructions in the RV32I ISA. Table 5.10 shows the RV32I
conditional control-flow instructions and pseudo-instructions.
The blt rs1, rs2, lab jumps to label lab if the value stored on the register indicated by rs1 is less
than the value stored on the register indicated by rs2. In this case, the processor assumes that the values
in rs1 and rs2 are signed values (represented in two’s complement), hence, 0xFFFFFFFF
12
is considered
less than 0x00000000 by this instruction. To compare unsigned values, one must use the bltu rs1, rs2,
lab instruction. In this case, the processor assumes that the values in rs1 and rs2 are unsigned integer
values, hence, 0xFFFFFFFF
13
is considered greater than 0x00000000 by this instruction.
The following assembly code shows examples of RV32I conditional control-flow instructions:
1 beq a0, a2, THEN # jump to label THEN if a0 = a2
2 bne a1, a3, ELSE # jump to label ELSE if a1 != a3
3 blt a2, a3, NEXT # jump to label NEXT if a2 < a3 (signed comp.)
4 bge a4, a1, LOOP # jump to label LOOP if a4 >= a1 (signed comp.)
5 bltu a0, a2, L # jump to label L if a0 < a2 (unsigned comp.)
12
0xFFFFFFFF represents -1 in two’s complement
13
0xFFFFFFFF represents 4294967295 in the unsigned integer representation
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
73
diff --git a/book/riscv-book-87.page b/book/riscv-book-87.page index 77f84e0..ccb4fa0 100644 --- a/book/riscv-book-87.page +++ b/book/riscv-book-87.page @@ -1 +1 @@ -
5.7. CONTROL-FLOW INSTRUCTIONS
Instruction Description
beq rs1, rs2, lab
Jumps to label lab if the value in rs1 is equal to the value in rs2.
bne rs1, rs2, lab
Jumps to label lab if the value in rs1 is different from the value in rs2.
beqz rs1, lab
Jumps to label lab if the value in rs1 is equal to zero (pseudo-
instruction).
bnez rs1, lab
Jumps to label lab if the value in rs1 is not equal to zero (pseudo-
instruction).
blt rs1, rs2, lab
Jumps to label lab if the signed value in rs1 is smaller than the signed
value in rs2.
bltu rs1, rs2, lab
Jumps to label lab if the unsigned value in rs1 is smaller than the
unsigned value in rs2.
bge rs1, rs2, lab
Jumps to label lab if the signed value in rs1 is greater or equal to the
signed value in rs2.
bgeu rs1, rs2, lab
Jumps to label lab if the unsigned value in rs1 is greater or equal to
the unsigned value in rs2.
Table 5.10: RV32I conditional control-flow instructions
Conditional control-flow instructions are usually employed to implement if and con-
ditional loop statements. The following code shows an example in which the branch not equal
instruction (bne) is used to implement a loop that iterates 10 times. In this example, register a0 is used
as the loop counter and is initialized with the value ten (line 2). After each loop iteration, the counter
is decremented by the subtract (sub) instruction (line 7), and the counter is compared with zero by the
bne instruction
14
(line 8). If the counter is not zero, the control-flow is redirected to the LOOP label
and the loop is executed again, otherwise, the execution flow proceeds normally, and the add instruction
(placed after the loop) is executed (line 9).
1 # Initializes the counter
2 li a0, 10
3 LOOP:
4 # Do something
5 # ...
6 # Decrements the counter and loop back
7 addi a0, a0, -1
8 bne a0, zero, LOOP
9 add a1, a1, a1 # Instruction after the loop
Chapter 6 discusses how control-flow instructions can be used to implement high-level language
conditional and loop statements, such as C and C++ if-then, and if-then-else statements and
while and for loops.
NOTE: In the RISC-V ISA manual [4], Waterman and Asanovi´c use the term conditional
branch to refer to conditional control-flow instructions. Notice that the term “branch” suggests
that the execution may diverge to two different paths, which is the case for RISC-V conditional
control-flow instructions. The authors use the term unconditional jumps to refer to unconditional
control-flow instructions.
14
The pseudo-instruction bnez a0, LOOP could also be used in this example, since it is equivalent to the bne a0, zero,
LOOP instruction.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
74
+
5.7. CONTROL-FLOW INSTRUCTIONS
Instruction Description
beq rs1, rs2, lab
Jumps to label lab if the value in rs1 is equal to the value in rs2.
bne rs1, rs2, lab
Jumps to label lab if the value in rs1 is different from the value in rs2.
beqz rs1, lab
Jumps to label lab if the value in rs1 is equal to zero (pseudo-
instruction).
bnez rs1, lab
Jumps to label lab if the value in rs1 is not equal to zero (pseudo-
instruction).
blt rs1, rs2, lab
Jumps to label lab if the signed value in rs1 is smaller than the signed
value in rs2.
bltu rs1, rs2, lab
Jumps to label lab if the unsigned value in rs1 is smaller than the
unsigned value in rs2.
bge rs1, rs2, lab
Jumps to label lab if the signed value in rs1 is greater or equal to the
signed value in rs2.
bgeu rs1, rs2, lab
Jumps to label lab if the unsigned value in rs1 is greater or equal to
the unsigned value in rs2.
Table 5.10: RV32I conditional control-flow instructions
Conditional control-flow instructions are usually employed to implement if and con-
ditional loop statements. The following code shows an example in which the branch not equal
instruction (bne) is used to implement a loop that iterates 10 times. In this example, register a0 is used
as the loop counter and is initialized with the value ten (line 2). After each loop iteration, the counter
is decremented by the subtract (sub) instruction (line 7), and the counter is compared with zero by the
bne instruction
14
(line 8). If the counter is not zero, the control-flow is redirected to the LOOP label
and the loop is executed again, otherwise, the execution flow proceeds normally, and the add instruction
(placed after the loop) is executed (line 9).
1 # Initializes the counter
2 li a0, 10
3 LOOP:
4 # Do something
5 # ...
6 # Decrements the counter and loop back
7 addi a0, a0, -1
8 bne a0, zero, LOOP
9 add a1, a1, a1 # Instruction after the loop
Chapter 6 discusses how control-flow instructions can be used to implement high-level language
conditional and loop statements, such as C and C++ if-then, and if-then-else statements and
while and for loops.
NOTE: In the RISC-V ISA manual [4], Waterman and Asanovi´c use the term conditional
branch to refer to conditional control-flow instructions. Notice that the term “branch” suggests
that the execution may diverge to two different paths, which is the case for RISC-V conditional
control-flow instructions. The authors use the term unconditional jumps to refer to unconditional
control-flow instructions.
14
The pseudo-instruction bnez a0, LOOP could also be used in this example, since it is equivalent to the bne a0, zero,
LOOP instruction.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
74
diff --git a/book/riscv-book-88.page b/book/riscv-book-88.page index f140b3d..1a8fd06 100644 --- a/book/riscv-book-88.page +++ b/book/riscv-book-88.page @@ -1 +1 @@ -
5.7. CONTROL-FLOW INSTRUCTIONS
5.7.2 Direct vs indirect control-flow instructions
A direct control-flow instruction is an instruction that has the target address encoded
directly into the instruction itself. For example, instruction beq a0, a1, L is a direct control-flow
instruction because the target address, i.e., the address defined by label L, is encoded into the instruction
itself.
An indirect control-flow instruction is a control-flow instruction that has the target
address specified indirectly, either through memory or through a register. For example, the
jr rs1 is an indirect control-flow instruction that jumps to an address that is defined indirectly by the
contents of the register rs1. Consequently, the target address of this indirect control-flow instruction
can be easily changed by changing the content of rs1.
NOTE: Indirect control-flow instructions are often referred to as indirect jump instructions.
As we will see in Section 6.3, these instructions can be used to return from functions.
Encoding direct target addresses in RISC-V control-flow instructions
The RV32I ISA encodes memory addresses as 32-bit unsigned values, hence, the target addresses are
naturally 32-bit addresses. RV32I instructions are all encoded using only 32-bits, hence, it would
not be possible to encode a 32-bit target address plus opcode and other parameters (such as registers)
inside a single 32-bit long instruction. To overcome this limitation, direct target addresses are encoded
as an offset that is added to the program counter
15
(PC) when the instruction is executed. In RV32I,
the target address of conditional control-flow instructions is encoded as 12-bit signed offsets. Using a
12-bit offset to encode the target prevents the instruction from jumping to addresses that are too far
away from the address of the instruction itself. In these cases, the programmer loads the target address
into a register and, then, uses an indirect jump instruction to jump to the target address.
5.7.3 Unconditional control-flow instructions
Unconditional control-flow instructions are control-flow instructions that always change the
execution flow to a given target. For example, the j L instruction is a control-flow instruction
that always jumps to label L. In the following code, the j instruction (line 2) jumps to label FOO, hence,
after executing the j instruction, the processor executes the sub instruction (line 7).
1 div a0, a1, a2
2 j FOO
3 add a0, a0, a1
4 mul a0, a1, a2
5
6 FOO:
7 sub a0, a1, a2
8 # ...
NOTE: In the RISC-V ISA manual [4], Waterman and Asanovi´c use the term “unconditional
jumps” to refer to unconditional control-flow instructions.
There are several unconditional control-flow instructions in the RV32I ISA. Table 5.11 shows the
RV32I unconditional control-flow instructions and pseudo-instructions.
Instruction j lab jumps to label lab while instruction jr rs1 jumps to the address stored on
register rs1.
15
The program counter contains the address of the currently executing instruction. When executing a control-flow
instruction it contains the address of the said instruction.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
75
+
5.7. CONTROL-FLOW INSTRUCTIONS
5.7.2 Direct vs indirect control-flow instructions
A direct control-flow instruction is an instruction that has the target address encoded
directly into the instruction itself. For example, instruction beq a0, a1, L is a direct control-flow
instruction because the target address, i.e., the address defined by label L, is encoded into the instruction
itself.
An indirect control-flow instruction is a control-flow instruction that has the target
address specified indirectly, either through memory or through a register. For example, the
jr rs1 is an indirect control-flow instruction that jumps to an address that is defined indirectly by the
contents of the register rs1. Consequently, the target address of this indirect control-flow instruction
can be easily changed by changing the content of rs1.
NOTE: Indirect control-flow instructions are often referred to as indirect jump instructions.
As we will see in Section 6.3, these instructions can be used to return from functions.
Encoding direct target addresses in RISC-V control-flow instructions
The RV32I ISA encodes memory addresses as 32-bit unsigned values, hence, the target addresses are
naturally 32-bit addresses. RV32I instructions are all encoded using only 32-bits, hence, it would
not be possible to encode a 32-bit target address plus opcode and other parameters (such as registers)
inside a single 32-bit long instruction. To overcome this limitation, direct target addresses are encoded
as an offset that is added to the program counter
15
(PC) when the instruction is executed. In RV32I,
the target address of conditional control-flow instructions is encoded as 12-bit signed offsets. Using a
12-bit offset to encode the target prevents the instruction from jumping to addresses that are too far
away from the address of the instruction itself. In these cases, the programmer loads the target address
into a register and, then, uses an indirect jump instruction to jump to the target address.
5.7.3 Unconditional control-flow instructions
Unconditional control-flow instructions are control-flow instructions that always change the
execution flow to a given target. For example, the j L instruction is a control-flow instruction
that always jumps to label L. In the following code, the j instruction (line 2) jumps to label FOO, hence,
after executing the j instruction, the processor executes the sub instruction (line 7).
1 div a0, a1, a2
2 j FOO
3 add a0, a0, a1
4 mul a0, a1, a2
5
6 FOO:
7 sub a0, a1, a2
8 # ...
NOTE: In the RISC-V ISA manual [4], Waterman and Asanovi´c use the term “unconditional
jumps” to refer to unconditional control-flow instructions.
There are several unconditional control-flow instructions in the RV32I ISA. Table 5.11 shows the
RV32I unconditional control-flow instructions and pseudo-instructions.
Instruction j lab jumps to label lab while instruction jr rs1 jumps to the address stored on
register rs1.
15
The program counter contains the address of the currently executing instruction. When executing a control-flow
instruction it contains the address of the said instruction.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
75
diff --git a/book/riscv-book-89.page b/book/riscv-book-89.page index 5a83f51..72044fc 100644 --- a/book/riscv-book-89.page +++ b/book/riscv-book-89.page @@ -1 +1 @@ -
5.7. CONTROL-FLOW INSTRUCTIONS
Instruction Description
j lab
Jumps to address indicated by symbol sym (pseudo-instruction).
jr rs1
Jumps to the address stored on register rs1 (pseudo-instruction).
jal lab
Stores the return address (PC+4) on the return register (ra), then jumps
to label lab (pseudo-instruction).
jal rd, lab
Stores the return address (PC+4) on register rd, then jumps to label lab.
jarl rd, rs1, imm
Stores the return address (PC+4) on register rd, then jumps to the ad-
dress calculated by adding the immediate value imm to the value on reg-
ister rs1.
ret
Jumps to the address stored on the return register (ra) (pseudo-
instruction).
Table 5.11: RV32I unconditional control-flow instructions
Jump and Link
The jump and link instruction (jal rd, lab) stores the address of the subsequent instruction (i.e.,
PC+4) in register rd and then jumps to label lab. This process, known as jump and link, is particularly
useful when invoking routines. The following code, annotated with addresses, illustrates this process:
First, the jal instruction (located at memory address 0x8000) is used to invoke (jump to) routine FOO
(line 1). When executed, this instruction will store the address of the subsequent instruction (PC+4 =
0x8004) into register ra and jump to FOO. Then, once FOO is executed, the routine returns by performing
an indirect jump (jr) to the contents of register ra (line 8). At this point, since ra contains the
value 0x8004, the execution flows back to the instruction sub (line 2). Next, another jump and link
instruction is executed to invoke routine FOO. Again, the jump and link instruction will store the address
of the subsequent instruction (PC+4 = 0x800C) into register ra and jump to FOO. Notice, however, that
at this time, the subsequent instruction is the mul instruction, and the return address is 0x800C. Finally,
once FOO is executed, the routine returns by performing an indirect jump (jr) to the contents of register
ra (line 8), which in this case contains the value 0x800C and will cause the execution to flow back to
instruction mul.
1 0x8000: jal ra, FOO # invoke routine FOO
2 0x8004: sub a0, a1, a2
3 0x8008: jal ra, FOO # invoke routine FOO again
4 0x800C: mul a0, a1, a2
5
6 FOO: # FOO routine
7 0x8080: add a0, a0, a1 # perform some computation
8 0x8084: jr ra # return from routine
The jarl rd, rs1, imm instruction also stores the address of the subsequent instruction (i.e.,
PC+4) in register rd, however, in this case, the target address is defined by adding the contents of rs1
to the immediate imm. Hence, it is an indirect jump.
NOTE: The jump register (jr) and return (ret) instructions are pseudo-instructions that are
converted into jarl instructions by the assembler. The jr rs1 is converted into jarl zero,
rs1, 0 and ret is converted into jarl zero, ra, 0. Notice that, in RV32I, any value stored in
register zero is discarded.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
76
+
5.7. CONTROL-FLOW INSTRUCTIONS
Instruction Description
j lab
Jumps to address indicated by symbol sym (pseudo-instruction).
jr rs1
Jumps to the address stored on register rs1 (pseudo-instruction).
jal lab
Stores the return address (PC+4) on the return register (ra), then jumps
to label lab (pseudo-instruction).
jal rd, lab
Stores the return address (PC+4) on register rd, then jumps to label lab.
jarl rd, rs1, imm
Stores the return address (PC+4) on register rd, then jumps to the ad-
dress calculated by adding the immediate value imm to the value on reg-
ister rs1.
ret
Jumps to the address stored on the return register (ra) (pseudo-
instruction).
Table 5.11: RV32I unconditional control-flow instructions
Jump and Link
The jump and link instruction (jal rd, lab) stores the address of the subsequent instruction (i.e.,
PC+4) in register rd and then jumps to label lab. This process, known as jump and link, is particularly
useful when invoking routines. The following code, annotated with addresses, illustrates this process:
First, the jal instruction (located at memory address 0x8000) is used to invoke (jump to) routine FOO
(line 1). When executed, this instruction will store the address of the subsequent instruction (PC+4 =
0x8004) into register ra and jump to FOO. Then, once FOO is executed, the routine returns by performing
an indirect jump (jr) to the contents of register ra (line 8). At this point, since ra contains the
value 0x8004, the execution flows back to the instruction sub (line 2). Next, another jump and link
instruction is executed to invoke routine FOO. Again, the jump and link instruction will store the address
of the subsequent instruction (PC+4 = 0x800C) into register ra and jump to FOO. Notice, however, that
at this time, the subsequent instruction is the mul instruction, and the return address is 0x800C. Finally,
once FOO is executed, the routine returns by performing an indirect jump (jr) to the contents of register
ra (line 8), which in this case contains the value 0x800C and will cause the execution to flow back to
instruction mul.
1 0x8000: jal ra, FOO # invoke routine FOO
2 0x8004: sub a0, a1, a2
3 0x8008: jal ra, FOO # invoke routine FOO again
4 0x800C: mul a0, a1, a2
5
6 FOO: # FOO routine
7 0x8080: add a0, a0, a1 # perform some computation
8 0x8084: jr ra # return from routine
The jarl rd, rs1, imm instruction also stores the address of the subsequent instruction (i.e.,
PC+4) in register rd, however, in this case, the target address is defined by adding the contents of rs1
to the immediate imm. Hence, it is an indirect jump.
NOTE: The jump register (jr) and return (ret) instructions are pseudo-instructions that are
converted into jarl instructions by the assembler. The jr rs1 is converted into jarl zero,
rs1, 0 and ret is converted into jarl zero, ra, 0. Notice that, in RV32I, any value stored in
register zero is discarded.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
76
diff --git a/book/riscv-book-9.page b/book/riscv-book-9.page index d06faab..36dc8b6 100644 --- a/book/riscv-book-9.page +++ b/book/riscv-book-9.page @@ -1 +1 @@ -
+
diff --git a/book/riscv-book-90.page b/book/riscv-book-90.page index a1d088f..e4f4b79 100644 --- a/book/riscv-book-90.page +++ b/book/riscv-book-90.page @@ -1 +1 @@ -
5.8. CONDITIONAL SET INSTRUCTIONS
NOTE: The “j lab” instruction is a pseudo-instruction that is converted by the assembler into
jal zero, lab. Notice that, in RV32I, any value stored in register zero is discarded.
5.7.4 System calls
User programs usually need to perform input and output operations. For example, after performing
some computation, the program may need to print the result on the screen, or write it to a file.
Input and output operations are usually performed by input and output devices, such as keyboards,
pointing devices, printers, display, network devices, hard drives, etc. These devices are managed by
the operating system, hence, input and output operations are also performed by the operating system.
To increase portability and facilitate software development, operating systems usually implement a set
of abstractions (such and folders, files, etc.) and offer a set of service routines to allow user programs
to perform input and output operations. In this context, user programs perform input and output
operations by invoking the operating system service routines.
A system call, or syscall, is a special operation used to invoke operating system service
routines. In RISC-V, this operation is performed by a special instruction called ecall.
As an example, let us assume the user wants to invoke the Linux operating system service routine
“write” (also known as write syscall) to display some information on the screen. The write syscall takes
three parameters: the file descriptor, the address of a buffer that contains the information that must
be written, and the number of bytes that must be written. The file descriptor is an integer value that
identifies a file
16
or a device. In this case, it indicates the file or device where the information must be
written to. In many Linux distributions, the file descriptor ‘1’ (one) is used to represent the standard
output, or stdout, which is usually the terminal screen. The following code shows an example in which
the contents of the msg buffer is written to the file descriptor ‘1’, hence, the screen. First, the code sets
the system call parameters (lines 6 to 8), then it sets register a7 with a number that indicates the service
routine that must be invoked, which, in this case, is the write syscall (line 9). Finally, it invokes the
operating system by executing the ecall instruction.
1 .data
2 msg: .asciz "Assembly rocks" # Allocates a string on memory
3
4 .text
5 start:
6 li a0, 1 # a0: file descriptor = 1 (stdout)
7 la a1, msg # a1: message buffer address
8 li a2, 14 # a2: message buffer size (14 bytes)
9 li a7, 64 # a7: syscall code (write = 64)
10 ecall # invoke the syscall
NOTE: Each operating system may have a different set of service routines. The focus of
this book is not to discuss the set of service routines offered by an specific operating system;
nonetheless, to illustrate the concepts, whenever necessary, it will use service routines available
on the Linux operating system.
5.8 Conditional set instructions
Similar to a conditional control-flow instruction, a conditional set instruction compares two values,
however, instead of jumping to a label, it sets the target register with values one or zero, indicating
16
The system call open may be used to open files, in this case, it returns the file descriptor of the opened file.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
77
+
5.8. CONDITIONAL SET INSTRUCTIONS
NOTE: The j lab instruction is a pseudo-instruction that is converted by the assembler into
jal zero, lab. Notice that, in RV32I, any value stored in register zero is discarded.
5.7.4 System calls
User programs usually need to perform input and output operations. For example, after performing
some computation, the program may need to print the result on the screen, or write it to a file.
Input and output operations are usually performed by input and output devices, such as keyboards,
pointing devices, printers, display, network devices, hard drives, etc. These devices are managed by
the operating system, hence, input and output operations are also performed by the operating system.
To increase portability and facilitate software development, operating systems usually implement a set
of abstractions (such and folders, files, etc.) and offer a set of service routines to allow user programs
to perform input and output operations. In this context, user programs perform input and output
operations by invoking the operating system service routines.
A system call, or syscall, is a special operation used to invoke operating system service
routines. In RISC-V, this operation is performed by a special instruction called ecall.
As an example, let us assume the user wants to invoke the Linux operating system service routine
“write” (also known as write syscall) to display some information on the screen. The write syscall takes
three parameters: the file descriptor, the address of a buffer that contains the information that must
be written, and the number of bytes that must be written. The file descriptor is an integer value that
identifies a file
16
or a device. In this case, it indicates the file or device where the information must be
written to. In many Linux distributions, the file descriptor ‘1’ (one) is used to represent the standard
output, or stdout, which is usually the terminal screen. The following code shows an example in which
the contents of the msg buffer is written to the file descriptor ‘1’, hence, the screen. First, the code sets
the system call parameters (lines 6 to 8), then it sets register a7 with a number that indicates the service
routine that must be invoked, which, in this case, is the write syscall (line 9). Finally, it invokes the
operating system by executing the ecall instruction.
1 .data
2 msg: .asciz "Assembly rocks" # Allocates a string on memory
3
4 .text
5 start:
6 li a0, 1 # a0: file descriptor = 1 (stdout)
7 la a1, msg # a1: message buffer address
8 li a2, 14 # a2: message buffer size (14 bytes)
9 li a7, 64 # a7: syscall code (write = 64)
10 ecall # invoke the syscall
NOTE: Each operating system may have a different set of service routines. The focus of
this book is not to discuss the set of service routines offered by an specific operating system;
nonetheless, to illustrate the concepts, whenever necessary, it will use service routines available
on the Linux operating system.
5.8 Conditional set instructions
Similar to a conditional control-flow instruction, a conditional set instruction compares two values,
however, instead of jumping to a label, it sets the target register with values one or zero, indicating
16
The system call open may be used to open files, in this case, it returns the file descriptor of the opened file.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
77
diff --git a/book/riscv-book-91.page b/book/riscv-book-91.page index d92eaf8..503427f 100644 --- a/book/riscv-book-91.page +++ b/book/riscv-book-91.page @@ -1 +1 @@ -
5.9. DETECTING OVERFLOW
whether or not the condition is true. Table 5.12 shows the RV32I conditional set instructions and
pseudo-instructions.
Instruction Description
slt rd, rs1, rs2
Sets rd with 1 if the signed value in rs1 is less than the signed value in
rs2, otherwise, sets it with 0.
slti rd, rs1, imm
Sets rd with 1 if the signed value in rs1 is less than the sign-extended
immediate value imm, otherwise, sets it with 0.
sltu rd, rs1, rs2
Sets rd with 1 if the unsigned value in rs1 is less than the unsigned
value in rs2, otherwise, sets it with 0.
sltui rd, rs1, imm
Sets rd with 1 if the unsigned value in rs1 is less than the unsigned
immediate value imm, otherwise, sets it with 0.
seqz rd, rs1
Sets rd with 1 if the value in rs1 is equal to zero, otherwise, sets it with
0 (pseudo-instruction).
snez rd, rs1
Sets rd with 1 if the value in rs1 is not equal to zero, otherwise, sets it
with 0 (pseudo-instruction).
sltz rd, rs1
Sets rd with 1 if the signed value in rs1 is less than zero, otherwise, sets
it with 0 (pseudo-instruction).
sgtz rd, rs1
Sets rd with 1 if the signed value in rs1 is greater than zero, otherwise,
sets it with 0 (pseudo-instruction).
Table 5.12: RV32I conditional set instructions
The set less than instruction (slt) places the value 1 in register rd if the signed value in register rs1
is less than the signed value in register rs2, else 0 is written to register rd. Notice that, in this case,
both values are treated as signed numbers. The sltu instruction is similar, however, it compares the
values as unsigned numbers.
The set less than immediate instruction (slti) places the value 1 in register rd if the signed value in
register rs1 is less than the sign-extended immediate, else 0 is written to register rd. Notice that, in this
case, both values are treated as signed numbers. The sltiu instruction is similar, however, it compares
the values as unsigned numbers.
5.9 Detecting overflow
The RISC-V ISA does not provide special hardware support to detect overflow when performing arith-
metic operations. However, regular conditional branch and conditional set instructions may be used to
find out whether or not an overflow occurred. The following code shows how to detect whether or not an
overflow occurred when adding two unsigned integers. In this case, the bltu instruction jumps to label
handle ov in case there is an overflow.
1 add a0, a1, a2 # add two values
2 bltu a0, a1, handle_ov # jumps to handle_ov in case
3 # an overflow happened
4 ...
5 handle_ov: # code to handle the overflow
6 ...
Alternatively, instead of jumping to a label to handle the overflow, the following code can be used
to set a register (t1 in this case) to indicate whether or not occurred an overflow. Notice that the sltu
instruction sets register t1 with one in case the contents of a0 (which contains a1+a2) is less than the
contents of a1.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
78
+
5.9. DETECTING OVERFLOW
whether or not the condition is true. Table 5.12 shows the RV32I conditional set instructions and
pseudo-instructions.
Instruction Description
slt rd, rs1, rs2
Sets rd with 1 if the signed value in rs1 is less than the signed value in
rs2, otherwise, sets it with 0.
slti rd, rs1, imm
Sets rd with 1 if the signed value in rs1 is less than the sign-extended
immediate value imm, otherwise, sets it with 0.
sltu rd, rs1, rs2
Sets rd with 1 if the unsigned value in rs1 is less than the unsigned
value in rs2, otherwise, sets it with 0.
sltui rd, rs1, imm
Sets rd with 1 if the unsigned value in rs1 is less than the unsigned
immediate value imm, otherwise, sets it with 0.
seqz rd, rs1
Sets rd with 1 if the value in rs1 is equal to zero, otherwise, sets it with
0 (pseudo-instruction).
snez rd, rs1
Sets rd with 1 if the value in rs1 is not equal to zero, otherwise, sets it
with 0 (pseudo-instruction).
sltz rd, rs1
Sets rd with 1 if the signed value in rs1 is less than zero, otherwise, sets
it with 0 (pseudo-instruction).
sgtz rd, rs1
Sets rd with 1 if the signed value in rs1 is greater than zero, otherwise,
sets it with 0 (pseudo-instruction).
Table 5.12: RV32I conditional set instructions
The set less than instruction (slt) places the value 1 in register rd if the signed value in register rs1
is less than the signed value in register rs2, else 0 is written to register rd. Notice that, in this case,
both values are treated as signed numbers. The sltu instruction is similar, however, it compares the
values as unsigned numbers.
The set less than immediate instruction (slti) places the value 1 in register rd if the signed value in
register rs1 is less than the sign-extended immediate, else 0 is written to register rd. Notice that, in this
case, both values are treated as signed numbers. The sltiu instruction is similar, however, it compares
the values as unsigned numbers.
5.9 Detecting overflow
The RISC-V ISA does not provide special hardware support to detect overflow when performing arith-
metic operations. However, regular conditional branch and conditional set instructions may be used to
find out whether or not an overflow occurred. The following code shows how to detect whether or not an
overflow occurred when adding two unsigned integers. In this case, the bltu instruction jumps to label
handle ov in case there is an overflow.
1 add a0, a1, a2 # add two values
2 bltu a0, a1, handle_ov # jumps to handle_ov in case
3 # an overflow happened
4 ...
5 handle_ov: # code to handle the overflow
6 ...
Alternatively, instead of jumping to a label to handle the overflow, the following code can be used
to set a register (t1 in this case) to indicate whether or not occurred an overflow. Notice that the sltu
instruction sets register t1 with one in case the contents of a0 (which contains a1+a2) is less than the
contents of a1.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
78
diff --git a/book/riscv-book-92.page b/book/riscv-book-92.page index 00d70d2..44fdf0c 100644 --- a/book/riscv-book-92.page +++ b/book/riscv-book-92.page @@ -1 +1 @@ -
5.10. ARITHMETIC ON MULTI-WORD VARIABLES
1 add a0, a1, a2 # add two values
2 sltu t1, a0, a1 # t1 := 1 if (a1+a2) < a1 (Overflow)
3 # otherwise, t1 := 0 (No overflow)
The following code shows how to detect overflow when adding two signed numbers.
1 add a0, a1, a2 # add two values
2 slti t1, a2, 0 # t1 = (a2 < 0)
3 slt t2, a0, a1 # t2 = (a1+a2 < a1)
4 bne t1, t2, handle_ov # overflow if (a2<0) && (a1+a2>=a1)
5 # or if (a2>=0) && (a1+a2<a1)
6 ...
7 handle_ov: # code to handle the overflow
8 ...
5.10 Arithmetic on multi-word variables
The RV32I ISA has natural hardware support to perform arithmetic operations on 32-bit values. The
add instruction, for example, can be used to add two (signed or unsigned) 32-bit numbers. However, in
some situations, it may be necessary to add multi-word (more than 32-bit) values. In these cases, the
user may add the 32-bit parts and account for the carry-outs and carry-ins across these parts.
The following examples show how two 64-bit values can be added together. The first value is stored
at register pair a1:a0
17
while the second value is stored in register pair a3:a2. Also, the results are
being placed in the register pair a5:a4. The first step is to add the least significant words (line 1). Then
to account for the carry-out, the code checks whether the result of the unsigned addition is less than
one of the operands (a2 in this case). If so, it means that there was a carry-out, and the register t1
is set with 1. Otherwise, there was no carry-out, and the register t1 is set with 0 (line 2). Next, the
most significant words are added together (line 4), and, finally, the carry-out is also added to the most
significant words (line 5).
1 add a4, a0, a2 # add the least significant word
2 sltu t1, a4, a2 # t1 := carry bit from previous addition
3 # t1 := 1 if (a0+a2) < a2 (Overflow = carry out)
4 # otherwise, t1 := 0
5 add a5, a1, a3 # add the most significant word
6 add a5, t1, a5 # add the carry out
17
This notation is used to indicate that two registers are being used to store a 64-bit value. The least significant value
is being stored by register a0 while the most significant value is being stored by register a1.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
79
+
5.10. ARITHMETIC ON MULTI-WORD VARIABLES
1 add a0, a1, a2 # add two values
2 sltu t1, a0, a1 # t1 := 1 if (a1+a2) < a1 (Overflow)
3 # otherwise, t1 := 0 (No overflow)
The following code shows how to detect overflow when adding two signed numbers.
1 add a0, a1, a2 # add two values
2 slti t1, a2, 0 # t1 = (a2 < 0)
3 slt t2, a0, a1 # t2 = (a1+a2 < a1)
4 bne t1, t2, handle_ov # overflow if (a2<0) && (a1+a2>=a1)
5 # or if (a2>=0) && (a1+a2<a1)
6 ...
7 handle_ov: # code to handle the overflow
8 ...
5.10 Arithmetic on multi-word variables
The RV32I ISA has natural hardware support to perform arithmetic operations on 32-bit values. The
add instruction, for example, can be used to add two (signed or unsigned) 32-bit numbers. However, in
some situations, it may be necessary to add multi-word (more than 32-bit) values. In these cases, the
user may add the 32-bit parts and account for the carry-outs and carry-ins across these parts.
The following examples show how two 64-bit values can be added together. The first value is stored
at register pair a1:a0
17
while the second value is stored in register pair a3:a2. Also, the results are
being placed in the register pair a5:a4. The first step is to add the least significant words (line 1). Then
to account for the carry-out, the code checks whether the result of the unsigned addition is less than
one of the operands (a2 in this case). If so, it means that there was a carry-out, and the register t1
is set with 1. Otherwise, there was no carry-out, and the register t1 is set with 0 (line 2). Next, the
most significant words are added together (line 4), and, finally, the carry-out is also added to the most
significant words (line 5).
1 add a4, a0, a2 # add the least significant word
2 sltu t1, a4, a2 # t1 := carry bit from previous addition
3 # t1 := 1 if (a0+a2) < a2 (Overflow = carry out)
4 # otherwise, t1 := 0
5 add a5, a1, a3 # add the most significant word
6 add a5, t1, a5 # add the carry out
17
This notation is used to indicate that two registers are being used to store a 64-bit value. The least significant value
is being stored by register a0 while the most significant value is being stored by register a1.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
79
diff --git a/book/riscv-book-93.page b/book/riscv-book-93.page index d2c10d1..00d074b 100644 --- a/book/riscv-book-93.page +++ b/book/riscv-book-93.page @@ -1 +1 @@ -
Chapter 6
Controlling the execution flow
This chapter discusses how to implement in assembly high-level language conditional and loop statements,
such as C and C++ if-then, and if-then-else statements and while and for loops. It also discusses
how to invoke and return from functions.
6.1 Conditional statements
6.1.1 if-then statements
The following code shows an if-then statement written in “C”. In this code, the value of x is assigned
to variable y if the value of x is greater or equal to ten. The if-then statement contains two main
parts: the condition (line 1) and the “then block” (lines 2-4). The condition consists of a boolean
expression that must be evaluated first and the “then block” contains a set of statements that must be
executed in case the boolean expression is true.
1 if (x >= 10)
2 {
3 y = x;
4 }
Assuming x is a signed integer (int) mapped to register a3
1
and y is mapped to register a4, the
following code shows how the previous “C” code can be implemented in assembly language. First, the
code loads the constant ten into temporary register t1 (line 1). Then, if the value in register a3 (variable
x) is less than ten
2
, it jumps to label skip, otherwise, it executes the next instruction (line 3), which
corresponds to the “then block”.
1 li t1, 10
2 blt a3, t1, skip # jump to skip if x < 10
3 mv a4, a3 # y := x
4 skip:
In case there are multiple statements in the “then block”, they can be placed between the branch
less than instruction (line 2) and the skip label (line 4).
1
When converting “C” programs to assembly language, the programmer, or the compiler, usually map variables to
machine registers or to memory positions.
2
Register t1 contains the value ten at this point
80
+
Chapter 6
Controlling the execution flow
This chapter discusses how to implement in assembly high-level language conditional and loop statements,
such as C and C++ if-then, and if-then-else statements and while and for loops. It also discusses
how to invoke and return from functions.
6.1 Conditional statements
6.1.1 if-then statements
The following code shows an if-then statement written in “C”. In this code, the value of x is assigned
to variable y if the value of x is greater or equal to ten. The if-then statement contains two main
parts: the condition (line 1) and the “then block” (lines 2-4). The condition consists of a boolean
expression that must be evaluated first and the “then block” contains a set of statements that must be
executed in case the boolean expression is true.
1 if (x >= 10)
2 {
3 y = x;
4 }
Assuming x is a signed integer (int) mapped to register a3
1
and y is mapped to register a4, the
following code shows how the previous “C” code can be implemented in assembly language. First, the
code loads the constant ten into temporary register t1 (line 1). Then, if the value in register a3 (variable
x) is less than ten
2
, it jumps to label skip, otherwise, it executes the next instruction (line 3), which
corresponds to the “then block”.
1 li t1, 10
2 blt a3, t1, skip # jump to skip if x < 10
3 mv a4, a3 # y := x
4 skip:
In case there are multiple statements in the “then block”, they can be placed between the branch
less than instruction (line 2) and the skip label (line 4).
1
When converting “C” programs to assembly language, the programmer, or the compiler, usually map variables to
machine registers or to memory positions.
2
Register t1 contains the value ten at this point
80
diff --git a/book/riscv-book-94.page b/book/riscv-book-94.page index e6f8762..ffbb7e2 100644 --- a/book/riscv-book-94.page +++ b/book/riscv-book-94.page @@ -1 +1 @@ -
6.1. CONDITIONAL STATEMENTS
6.1.2 Comparing signed vs unsigned variables
The previous code used the instruction blt to verify if the contents of variable x is less than 10. As
discussed in Section 5.7.1, this is correct because variable x is a signed variable. In case variable x was
an unsigned integer (unsigned “C” type), the programmer (or the compiler) must have used instruction
bltu to perform the comparison.
NOTE: It is important to notice that the processor does not automatically infer if the contents
of a register (or memory) is a signed or unsigned value. The programmer (or the compiler)
must inform the processor by selecting the proper instruction to perform the comparison - in the
previous example, blt for signed variables and bltu for unsigned variables.
6.1.3 if-then-else statements
The following code shows an if-then-else statement written in “C”. In this code, if the value of x is
greater or equal to ten, then the value of variable y is incremented by one, else, the value of x is assigned to
variable y. The if-then-else statement contains three main parts: the “condition (line 1), the “then
block” (lines 2-4), and the “else block” (lines 6-8). The condition consists of a boolean expression that
must be evaluated first. The “then block” contains a set of statements that must be executed in case
the boolean expression evaluates to true, and the “else block” contains a set of statements that must be
executed in case the boolean expression evaluates to false.
1 if (x >= 10)
2 {
3 y = y + 1;
4 }
5 else
6 {
7 y = x;
8 }
Assuming x is an unsigned integer (unsigned “C” type) mapped to register a1 and y is mapped
to register a2, the following code shows how the previous “C” code can be implemented in assembly
language. First, the code loads the constant ten into temporary register t3 (line 1). Then, if the
contents of register a1 (variable x) are less than ten
3
, it jumps to label else to execute the “else block”,
otherwise, it executes the next instruction (line 3), which corresponds to the first instruction of the “then
block”.
1 li t3, 10
2 bltu a1, t3, else # jump to else if x < 10
3 addi a2, a2, 1 # y := y + 1
4 j cont # skip the else block
5 else:
6 mv a2, a1 # y := x
7 cont:
In case there are multiple statements in the “then block”, they can be placed between the instruction
bltu (line 2) and the j cont instruction (line 4). In case there are multiple statements in the “else
block”, they can be placed between labels else (line 5) and cont (line 7).
3
Register t3 contains the value ten at this point
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
81
+
6.1. CONDITIONAL STATEMENTS
6.1.2 Comparing signed vs unsigned variables
The previous code used the instruction blt to verify if the contents of variable x is less than 10. As
discussed in Section 5.7.1, this is correct because variable x is a signed variable. In case variable x was
an unsigned integer (unsigned “C” type), the programmer (or the compiler) must have used instruction
bltu to perform the comparison.
NOTE: It is important to notice that the processor does not automatically infer if the contents
of a register (or memory) is a signed or unsigned value. The programmer (or the compiler)
must inform the processor by selecting the proper instruction to perform the comparison - in the
previous example, blt for signed variables and bltu for unsigned variables.
6.1.3 if-then-else statements
The following code shows an if-then-else statement written in “C”. In this code, if the value of x is
greater or equal to ten, then the value of variable y is incremented by one, else, the value of x is assigned to
variable y. The if-then-else statement contains three main parts: the condition (line 1), the “then
block” (lines 2-4), and the “else block” (lines 6-8). The condition consists of a boolean expression that
must be evaluated first. The “then block” contains a set of statements that must be executed in case
the boolean expression evaluates to true, and the “else block” contains a set of statements that must be
executed in case the boolean expression evaluates to false.
1 if (x >= 10)
2 {
3 y = y + 1;
4 }
5 else
6 {
7 y = x;
8 }
Assuming x is an unsigned integer (unsigned “C” type) mapped to register a1 and y is mapped
to register a2, the following code shows how the previous “C” code can be implemented in assembly
language. First, the code loads the constant ten into temporary register t3 (line 1). Then, if the
contents of register a1 (variable x) are less than ten
3
, it jumps to label else to execute the “else block”,
otherwise, it executes the next instruction (line 3), which corresponds to the first instruction of the “then
block”.
1 li t3, 10
2 bltu a1, t3, else # jump to else if x < 10
3 addi a2, a2, 1 # y := y + 1
4 j cont # skip the else block
5 else:
6 mv a2, a1 # y := x
7 cont:
In case there are multiple statements in the “then block”, they can be placed between the instruction
bltu (line 2) and the j cont instruction (line 4). In case there are multiple statements in the “else
block”, they can be placed between labels else (line 5) and cont (line 7).
3
Register t3 contains the value ten at this point
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
81
diff --git a/book/riscv-book-95.page b/book/riscv-book-95.page index 82acbc6..2b1c506 100644 --- a/book/riscv-book-95.page +++ b/book/riscv-book-95.page @@ -1 +1 @@ -
6.1. CONDITIONAL STATEMENTS
6.1.4 Handling non-trivial boolean expressions
In some cases, the boolean expression being evaluated by the conditional statement may contain multiple
operations. The following code shows an example in which the boolean expression contains multiple
operations. In this case, the “then block” can only be executed if the contents of variable x is greater or
equal to 10 and if the contents of variable y is less than 20.
1 if ((x>=10) && (y<20))
2 {
3 x = y;
4 }
Assuming x and y are a signed integer variables (int “C” type) mapped to registers a1 and a2,
respectively, the following code shows how the previous “C” code can be implemented in assembly
language. First, the code loads the constant ten into temporary register t1 (line 1). Then, if the value in
register a1 (variable x) is less than ten, it jumps to label skip to skip the execution of the “then block”.
Notice that, because of the and operator (represented by && in “C”), if the first part of the boolean
expression is false, then the whole expression is false, hence, there is no need to check the second part
4
.
If the first part of the boolean expression (lines 1 and 2) has been evaluated to true, then the code must
check the second part, which is verified by instructions in lines 3 and 4. In this case, if the contents of
variable y is greater or equal to 20, then the code (line 4) skips the “then block” by jumping to the skip
label. Otherwise, it executes the next instruction (line 5), which corresponds to the first instruction of
the “then block”.
1 li t1, 10
2 blt a1, t1, skip # jump to skip if x < 10
3 li t1, 20
4 bge a2, t1, skip # jump to skip if y >= 20
5 mv a1, a2 # x := y
6 skip:
The following code shows an example in which the boolean expression contains an or (||) operation.
1 if ((x>=10) || (y<20))
2 {
3 x = y;
4 }
Assuming x and y are signed integer variables (int “C” type) mapped to registers a1 and a2, respec-
tively, the following code shows how the previous “C” code can be implemented in assembly language.
First, the code loads the constant ten into temporary register t1 (line 1). Then, if the value in register
a1 (variable x) is greater or equal to ten, it jumps to label then to execute the “then block”. Notice
that, because of the or operator (represented by || in “C”), if the first part of the boolean expression
evaluates to true, then the whole expression is true, hence, there is no need to check the second part
5
.
If the first part of the boolean expression (lines 1 and 2) evaluates to false, then the code must check
the second part, which is verified by instructions in lines 3 and 4. In this case, if the contents of variable
y is greater or equal to 20, then the code (line 4) skips the “then block” by jumping to the skip label.
Otherwise, it executes the next instruction (line 5), which corresponds to the first instruction of the
“then block”.
4
The semantics of the “C” programming language implies that the remaining of this boolean expression must not be
evaluated if the first part is false.
5
The semantics of the “C” programming language implies that the remaining of this boolean expression must not be
evaluated if the first part is true.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
82
+
6.1. CONDITIONAL STATEMENTS
6.1.4 Handling non-trivial boolean expressions
In some cases, the boolean expression being evaluated by the conditional statement may contain multiple
operations. The following code shows an example in which the boolean expression contains multiple
operations. In this case, the “then block” can only be executed if the contents of variable x is greater or
equal to 10 and if the contents of variable y is less than 20.
1 if ((x>=10) && (y<20))
2 {
3 x = y;
4 }
Assuming x and y are a signed integer variables (int “C” type) mapped to registers a1 and a2,
respectively, the following code shows how the previous “C” code can be implemented in assembly
language. First, the code loads the constant ten into temporary register t1 (line 1). Then, if the value in
register a1 (variable x) is less than ten, it jumps to label skip to skip the execution of the “then block”.
Notice that, because of the and operator (represented by && in “C”), if the first part of the boolean
expression is false, then the whole expression is false, hence, there is no need to check the second part
4
.
If the first part of the boolean expression (lines 1 and 2) has been evaluated to true, then the code must
check the second part, which is verified by instructions in lines 3 and 4. In this case, if the contents of
variable y is greater or equal to 20, then the code (line 4) skips the “then block” by jumping to the skip
label. Otherwise, it executes the next instruction (line 5), which corresponds to the first instruction of
the “then block”.
1 li t1, 10
2 blt a1, t1, skip # jump to skip if x < 10
3 li t1, 20
4 bge a2, t1, skip # jump to skip if y >= 20
5 mv a1, a2 # x := y
6 skip:
The following code shows an example in which the boolean expression contains an or (||) operation.
1 if ((x>=10) || (y<20))
2 {
3 x = y;
4 }
Assuming x and y are signed integer variables (int “C” type) mapped to registers a1 and a2, respec-
tively, the following code shows how the previous “C” code can be implemented in assembly language.
First, the code loads the constant ten into temporary register t1 (line 1). Then, if the value in register
a1 (variable x) is greater or equal to ten, it jumps to label then to execute the “then block”. Notice
that, because of the or operator (represented by || in “C”), if the first part of the boolean expression
evaluates to true, then the whole expression is true, hence, there is no need to check the second part
5
.
If the first part of the boolean expression (lines 1 and 2) evaluates to false, then the code must check
the second part, which is verified by instructions in lines 3 and 4. In this case, if the contents of variable
y is greater or equal to 20, then the code (line 4) skips the “then block” by jumping to the skip label.
Otherwise, it executes the next instruction (line 5), which corresponds to the first instruction of the
“then block”.
4
The semantics of the “C” programming language implies that the remaining of this boolean expression must not be
evaluated if the first part is false.
5
The semantics of the “C” programming language implies that the remaining of this boolean expression must not be
evaluated if the first part is true.
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
82
diff --git a/book/riscv-book-96.page b/book/riscv-book-96.page index b30c113..89da0df 100644 --- a/book/riscv-book-96.page +++ b/book/riscv-book-96.page @@ -1 +1 @@ -
6.1. CONDITIONAL STATEMENTS
1 li t1, 10
2 bge a1, t1, then # jump to then if x >= 10
3 li t1, 20
4 bge a2, t1, skip # jump to skip if y >= 20
5 then:
6 mv a1, a2 # x := y
7 skip:
6.1.5 Nested if statements
Nested if-then and if-then-else are if statements in which the “then block” or the “else block” contain
other if statements. The following code shows an example of a nested if-then statement. Notice that
there are two if-then statements: an outer one (lines 1-8) and an inner one (lines 4-7). The “then
block” of the outer if-then statement contains two statements: a variable assignment (line 3) and the
inner if-then statement (lines 4-7).
1 if (x == 10)
2 {
3 x = 5;
4 if (y == 20)
5 {
6 x = 0;
7 }
8 }
Translating the previous code to assembly code can be easily done by starting with the outer if-then
statement. Assuming x and y are variables mapped to registers a1 and a2, respectively, the following
code shows the skeleton for the outer if-then statement.
1 li t1, 10
2 bne a1, t1, skip # jump to skip if x != 10
3 # <= Insert the code for the then block here
4 skip:
Once the skeleton code is generated, the next step is to generate the code for the “then block”. The
following code shows the final code.
1 li t1, 10
2 bne a1, t1, skip # jump to skip if x != 10
3 li a1, 5 # x := 5
4 li t1, 20
5 bne a2, 20, skip_inner # jump to skip_inner if y != 20
6 li a1, 0 # x := 0
7 skip_inner:
8 skip:
In the previous example, we used two different labels, one to skip the execution of the “then block”
of the outer if statement (skip) and another to skip the execution of the “then block” of the inner if
statement (skip inner). In this case, since both labels represent the same address (notice that there
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
83
+
6.1. CONDITIONAL STATEMENTS
1 li t1, 10
2 bge a1, t1, then # jump to then if x >= 10
3 li t1, 20
4 bge a2, t1, skip # jump to skip if y >= 20
5 then:
6 mv a1, a2 # x := y
7 skip:
6.1.5 Nested if statements
Nested if-then and if-then-else are if statements in which the “then block” or the “else block” contain
other if statements. The following code shows an example of a nested if-then statement. Notice that
there are two if-then statements: an outer one (lines 1-8) and an inner one (lines 4-7). The “then
block” of the outer if-then statement contains two statements: a variable assignment (line 3) and the
inner if-then statement (lines 4-7).
1 if (x == 10)
2 {
3 x = 5;
4 if (y == 20)
5 {
6 x = 0;
7 }
8 }
Translating the previous code to assembly code can be easily done by starting with the outer if-then
statement. Assuming x and y are variables mapped to registers a1 and a2, respectively, the following
code shows the skeleton for the outer if-then statement.
1 li t1, 10
2 bne a1, t1, skip # jump to skip if x != 10
3 # <= Insert the code for the then block here
4 skip:
Once the skeleton code is generated, the next step is to generate the code for the “then block”. The
following code shows the final code.
1 li t1, 10
2 bne a1, t1, skip # jump to skip if x != 10
3 li a1, 5 # x := 5
4 li t1, 20
5 bne a2, 20, skip_inner # jump to skip_inner if y != 20
6 li a1, 0 # x := 0
7 skip_inner:
8 skip:
In the previous example, we used two different labels, one to skip the execution of the “then block”
of the outer if statement (skip) and another to skip the execution of the “then block” of the inner if
statement (skip inner). In this case, since both labels represent the same address (notice that there
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
83
diff --git a/book/riscv-book-97.page b/book/riscv-book-97.page index 9ba87c0..f95bc1a 100644 --- a/book/riscv-book-97.page +++ b/book/riscv-book-97.page @@ -1 +1 @@ -
6.2. REPETITION STATEMENTS
are no instructions or data between both labels), we could simplify the code by using a single skip label.
Notice, however, that this simplification does not affect the code generated by the assembler, since labels
are basically addresses annotations.
6.2 Repetition statements
Repetition statements, or loops, are used to repeat a group of statements. In this section, we discuss
how to implement the most common repetition statements in assembly.
6.2.1 while loop
The following code shows a while loop in “C”. The while loop contains two main parts: the “loop
condition” (line 2) and the “loop body” (lines 3-6). The condition consists of a boolean expression
that must be evaluated before each iteration of the while loop, i.e., before each execution of the “loop
body”. If the “loop condition” evaluates to true, then the “loop body” must be executed. In this case,
after completing the execution of the “loop body”, the execution jumps back to the beginning of the
loop and the “loop condition” is evaluated again. If the “loop condition” evaluates to false, then the
loop execution is complete and the execution continues after the loop body.
1 int i=0;
2 while (i < 20)
3 {
4 y = y+3;
5 i = i+1;
6 }
Assuming that i and y are signed variables mapped to registers a1 and a2, respectively, the following
code shows how the previous “C” code can be implemented in assembly language. First, it contains
the code that comes before the while loop - in this case an instruction that loads the constant zero into
register a1 (line 1). Then, there is a label that defines the beginning of the loop (line 2) and the code
that checks the “loop condition” (lines 3 and 4). Notice that instruction bge checks whether variable
i (contents of register a1) is greater or equal to 20. If so, it jumps to label skip to leave the loop.
Otherwise, the execution continues on the next instruction, which is the first instruction of the “loop
body”. The “loop body” in this example is composed by two instructions (lines 5 and 6). The first one
implements the statement y=y+3 and the second one implements the statement i=i+1. After concluding
the execution of the “loop body”, the code jumps back to the beginning of the loop (line 7) so that the
loop can be executed again, starting by verifying again the “loop condition”.
1 li a1, 0 # i := 0
2 while:
3 li t1, 20 # if i>=20
4 bge a1, t1, skip # jump to skip to leave the loop
5 addi a2, a2, 3 # y := y+3
6 addi a1, a1, 1 # i := i+1
7 j while # loop back
8 skip:
6.2.2 do-while loop
The following code shows a do-while loop written in “C”. Similar to the while loop, the do-while
loop contains two main parts: the “loop condition” (line 6) and the “loop body” (lines 3-5). The
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
84
+
6.2. REPETITION STATEMENTS
are no instructions or data between both labels), we could simplify the code by using a single skip label.
Notice, however, that this simplification does not affect the code generated by the assembler, since labels
are basically addresses annotations.
6.2 Repetition statements
Repetition statements, or loops, are used to repeat a group of statements. In this section, we discuss
how to implement the most common repetition statements in assembly.
6.2.1 while loop
The following code shows a while loop in “C”. The while loop contains two main parts: the “loop
condition” (line 2) and the “loop body” (lines 3-6). The condition consists of a boolean expression
that must be evaluated before each iteration of the while loop, i.e., before each execution of the “loop
body”. If the “loop condition” evaluates to true, then the “loop body” must be executed. In this case,
after completing the execution of the “loop body”, the execution jumps back to the beginning of the
loop and the “loop condition” is evaluated again. If the “loop condition” evaluates to false, then the
loop execution is complete and the execution continues after the loop body.
1 int i=0;
2 while (i < 20)
3 {
4 y = y+3;
5 i = i+1;
6 }
Assuming that i and y are signed variables mapped to registers a1 and a2, respectively, the following
code shows how the previous “C” code can be implemented in assembly language. First, it contains
the code that comes before the while loop - in this case an instruction that loads the constant zero into
register a1 (line 1). Then, there is a label that defines the beginning of the loop (line 2) and the code
that checks the “loop condition” (lines 3 and 4). Notice that instruction bge checks whether variable
i (contents of register a1) is greater or equal to 20. If so, it jumps to label skip to leave the loop.
Otherwise, the execution continues on the next instruction, which is the first instruction of the “loop
body”. The “loop body” in this example is composed by two instructions (lines 5 and 6). The first one
implements the statement y=y+3 and the second one implements the statement i=i+1. After concluding
the execution of the “loop body”, the code jumps back to the beginning of the loop (line 7) so that the
loop can be executed again, starting by verifying again the “loop condition”.
1 li a1, 0 # i := 0
2 while:
3 li t1, 20 # if i>=20
4 bge a1, t1, skip # jump to skip to leave the loop
5 addi a2, a2, 3 # y := y+3
6 addi a1, a1, 1 # i := i+1
7 j while # loop back
8 skip:
6.2.2 do-while loop
The following code shows a do-while loop written in “C”. Similar to the while loop, the do-while
loop contains two main parts: the “loop condition” (line 6) and the “loop body” (lines 3-5). The
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
84
diff --git a/book/riscv-book-98.page b/book/riscv-book-98.page index b92622f..1833b27 100644 --- a/book/riscv-book-98.page +++ b/book/riscv-book-98.page @@ -1 +1 @@ -
6.2. REPETITION STATEMENTS
condition also consists of a boolean expression, however, in the do-while statement, the condition must
be evaluated after each iteration of the do-while loop, i.e., after each execution of the “loop body”.
If the “loop condition” evaluates to true, then the “loop body” must be executed again. In this case,
after completing the execution of the “loop body”, the “loop condition” is evaluated again. If the “loop
condition” evaluates as false, then the loop execution is complete and the execution continues after the
loop.
1 int i=0;
2 do
3 {
4 y = y+2;
5 i = i+1;
6 } while (i < 10);
Assuming that i and y are signed variables mapped to registers a1 and a2, respectively, the following
code shows how the previous “C” code can be implemented in assembly language. First, it contains
the code that comes before the while loop - in this case an instruction that loads the constant zero into
register a1 (line 1). Then, there is a label that marks the beginning of the loop (line 2) and the “loop
body”, which is composed of two instructions (lines 5 and 6). The first one implements the statement
y=y+2 and the second one implements the statement i=i+1. After the “loop body”, there is the code
that checks the “loop condition” (lines 5 and 6). Notice that instruction blt checks whether variable
i (contents of register a1) is less than 10. If so, it jumps back to label dowhile to repeat the loop
execution. Otherwise, the execution continues on the next instruction, leaving the loop.
1 li a1, 0 # i := 0
2 dowhile:
3 addi a2, a2, 2 # y := y+2
4 addi a1, a1, 1 # i := i+1
5 li t1, 10
6 blt a1, t1, dowhile # jump back to dowhile if i < 10
6.2.3 for loop
The following code shows a for loop written in “C”. The for loop contains four main parts: the
“initialization code”, the “loop condition”, the “update code” and the “loop body” (lines 2-4).
The “initialization code” (i=0) must be executed exactly once before the execution of the “loop body”.
Similar to the while loop, the “loop condition” (i<10) consists of a boolean expression that must be
evaluated before each iteration of the for loop, i.e., before each execution of the “loop body” (lines 2-4).
If the “loop condition” evaluates to true, then the “loop body” must be executed. In this case, after
completing the execution of the “loop body”, the “update code” (i=i+1) is executed and the execution
jumps back to the beginning of the loop so that the “loop condition” can be evaluated again. If the “loop
condition” evaluates to false, then the loop execution is complete and the execution continues after the
loop body.
1 for (i=0; i<10; i=i+1)
2 {
3 y = y+2;
4 }
Assuming that i and y are signed variables mapped to registers a1 and a2, respectively, the following
code shows how the previous “C” code can be implemented in assembly language. First, it contains the
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
85
+
6.2. REPETITION STATEMENTS
condition also consists of a boolean expression, however, in the do-while statement, the condition must
be evaluated after each iteration of the do-while loop, i.e., after each execution of the “loop body”.
If the “loop condition” evaluates to true, then the “loop body” must be executed again. In this case,
after completing the execution of the “loop body”, the “loop condition” is evaluated again. If the “loop
condition” evaluates as false, then the loop execution is complete and the execution continues after the
loop.
1 int i=0;
2 do
3 {
4 y = y+2;
5 i = i+1;
6 } while (i < 10);
Assuming that i and y are signed variables mapped to registers a1 and a2, respectively, the following
code shows how the previous “C” code can be implemented in assembly language. First, it contains
the code that comes before the while loop - in this case an instruction that loads the constant zero into
register a1 (line 1). Then, there is a label that marks the beginning of the loop (line 2) and the “loop
body”, which is composed of two instructions (lines 5 and 6). The first one implements the statement
y=y+2 and the second one implements the statement i=i+1. After the “loop body”, there is the code
that checks the “loop condition” (lines 5 and 6). Notice that instruction blt checks whether variable
i (contents of register a1) is less than 10. If so, it jumps back to label dowhile to repeat the loop
execution. Otherwise, the execution continues on the next instruction, leaving the loop.
1 li a1, 0 # i := 0
2 dowhile:
3 addi a2, a2, 2 # y := y+2
4 addi a1, a1, 1 # i := i+1
5 li t1, 10
6 blt a1, t1, dowhile # jump back to dowhile if i < 10
6.2.3 for loop
The following code shows a for loop written in “C”. The for loop contains four main parts: the
“initialization code”, the “loop condition”, the “update code” and the “loop body” (lines 2-4).
The “initialization code” (i=0) must be executed exactly once before the execution of the “loop body”.
Similar to the while loop, the “loop condition” (i<10) consists of a boolean expression that must be
evaluated before each iteration of the for loop, i.e., before each execution of the “loop body” (lines 2-4).
If the “loop condition” evaluates to true, then the “loop body” must be executed. In this case, after
completing the execution of the “loop body”, the “update code” (i=i+1) is executed and the execution
jumps back to the beginning of the loop so that the “loop condition” can be evaluated again. If the “loop
condition” evaluates to false, then the loop execution is complete and the execution continues after the
loop body.
1 for (i=0; i<10; i=i+1)
2 {
3 y = y+2;
4 }
Assuming that i and y are signed variables mapped to registers a1 and a2, respectively, the following
code shows how the previous “C” code can be implemented in assembly language. First, it contains the
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
85
diff --git a/book/riscv-book-99.page b/book/riscv-book-99.page index 84a202d..0656480 100644 --- a/book/riscv-book-99.page +++ b/book/riscv-book-99.page @@ -1 +1 @@ -
6.3. INVOKING AND RETURNING FROM ROUTINES
“initialization code”, i.e., i=0 (line 1). Then, there is a label that defines the beginning of the loop (line
2) and the code that checks the “loop condition” (lines 3 and 4). Notice that instruction bge checks
whether variable i (contents of register a1) is greater or equal to 10. If so, it jumps to label skip to
leave the loop. Otherwise, the execution continues on the next instruction, which is the first instruction
of the “loop body”. The “loop body” in this example is composed of only one instruction (line 5), which
implements the statement y=y+2. The “update code”, i.e., i=i+1 (line 6), is placed right after the “loop
body”. Finally, after the “update code”, the code jumps back to the beginning of the loop (line 7) so
that the loop can be executed again, starting by verifying again the “loop condition”.
1 li a1, 0 # i := 0
2 for:
3 li t1, 10 # if i >= 10 then jump
4 bge a1, t1, skip # to skip to leave the loop
5 addi a2, a2, 2 # y := y+2
6 addi a1, a1, 1 # i := i+1
7 j for
8 skip:
6.2.4 Hoisting loop-invariant code
Loop-invariant codes are those that always produce the same values and do not need to be re-
executed every time a “loop body” is repeated. In the following example, the instruction li t1,10 is a
loop-invariant code and should not be executed every time the “loop body” is repeated.
1 li a1, 0 # i := 0
2 for:
3 li t1, 10 # if i >= 10 then jump
4 bge a1, t1, skip # to skip to leave the loop
5 addi a2, a2, 2 # y := y+2
6 addi a1, a1, 1 # i := i+1
7 j for
8 skip:
In these cases, the instruction can be hoisted (moved) before the loop to improve the code per-
formance. This is an optimization called “loop-invariant code motion” (LICM) commonly applied by
compilers. The following code shows the code after applying LICM to the previous code. Notice that,
in this case, each loop repetition executes only four instructions.
1 li a1, 0 # i := 0
2 li t1, 10 # t1 := 10
3 for:
4 bge a1, t1, skip # if i >= 10 then jump to skip to leave the loop
5 addi a2, a2, 2 # y := y+2
6 addi a1, a1, 1 # i := i+1
7 j for
8 skip:
6.3 Invoking and returning from routines
Routines are defined in assembly language by a label and a fragment of code. The label defines the
routine entry point, i.e., the point to which the execution must flow when the routine is invoked. The
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on October 15, 2023)
86
+
6.3. INVOKING AND RETURNING FROM ROUTINES
“initialization code”, i.e., i=0 (line 1). Then, there is a label that defines the beginning of the loop (line
2) and the code that checks the “loop condition” (lines 3 and 4). Notice that instruction bge checks
whether variable i (contents of register a1) is greater or equal to 10. If so, it jumps to label skip to
leave the loop. Otherwise, the execution continues on the next instruction, which is the first instruction
of the “loop body”. The “loop body” in this example is composed of only one instruction (line 5), which
implements the statement y=y+2. The “update code”, i.e., i=i+1 (line 6), is placed right after the “loop
body”. Finally, after the “update code”, the code jumps back to the beginning of the loop (line 7) so
that the loop can be executed again, starting by verifying again the “loop condition”.
1 li a1, 0 # i := 0
2 for:
3 li t1, 10 # if i >= 10 then jump
4 bge a1, t1, skip # to skip to leave the loop
5 addi a2, a2, 2 # y := y+2
6 addi a1, a1, 1 # i := i+1
7 j for
8 skip:
6.2.4 Hoisting loop-invariant code
Loop-invariant codes are those that always produce the same values and do not need to be re-
executed every time a “loop body” is repeated. In the following example, the instruction li t1,10 is a
loop-invariant code and should not be executed every time the “loop body” is repeated.
1 li a1, 0 # i := 0
2 for:
3 li t1, 10 # if i >= 10 then jump
4 bge a1, t1, skip # to skip to leave the loop
5 addi a2, a2, 2 # y := y+2
6 addi a1, a1, 1 # i := i+1
7 j for
8 skip:
In these cases, the instruction can be hoisted (moved) before the loop to improve the code per-
formance. This is an optimization called “loop-invariant code motion” (LICM) commonly applied by
compilers. The following code shows the code after applying LICM to the previous code. Notice that,
in this case, each loop repetition executes only four instructions.
1 li a1, 0 # i := 0
2 li t1, 10 # t1 := 10
3 for:
4 bge a1, t1, skip # if i >= 10 then jump to skip to leave the loop
5 addi a2, a2, 2 # y := y+2
6 addi a1, a1, 1 # i := i+1
7 j for
8 skip:
6.3 Invoking and returning from routines
Routines are defined in assembly language by a label and a fragment of code. The label defines the
routine entry point, i.e., the point to which the execution must flow when the routine is invoked. The
Printed version available for purchase at Amazon.com
Free online version at http://riscv-programming.org
(Generated on May 31, 2024)
86
diff --git a/book/riscv-book.css b/book/riscv-book.css index 51f9614..7335feb 100644 --- a/book/riscv-book.css +++ b/book/riscv-book.css @@ -414,8 +414,9 @@ ._f{width:1553.860796px;} ._10{width:1569.562057px;} ._e{width:1604.833450px;} -.fc3{color:rgb(89,89,89);} -.fc2{color:rgb(102,102,102);} +.fc2{color:transparent;} +.fc4{color:rgb(89,89,89);} +.fc3{color:rgb(102,102,102);} .fc1{color:rgb(255,255,255);} .fc0{color:rgb(0,0,0);} .fs46{font-size:7.864960px;} @@ -508,5932 +509,5735 @@ .fs0{font-size:116.062618px;} .y0{bottom:0.000000px;} .y1{bottom:0.221000px;} -.y503{bottom:0.490896px;} -.y590{bottom:2.055302px;} -.y608{bottom:2.357590px;} -.y471{bottom:2.461249px;} -.y30d{bottom:2.993456px;} -.yf13{bottom:3.226091px;} -.y33c{bottom:3.241994px;} -.y13d8{bottom:3.379280px;} -.y62a{bottom:3.615809px;} -.y662{bottom:3.901928px;} -.y450{bottom:4.243410px;} -.y922{bottom:4.291566px;} -.y629{bottom:4.388294px;} -.yc06{bottom:4.672377px;} -.yf60{bottom:4.709349px;} -.y58e{bottom:4.806001px;} -.y12aa{bottom:5.204471px;} -.y606{bottom:5.346189px;} -.y11d6{bottom:5.491045px;} -.y58f{bottom:5.493676px;} -.y1261{bottom:5.502109px;} -.y11d7{bottom:5.527906px;} -.y7f7{bottom:5.805309px;} -.y607{bottom:6.093339px;} -.y1130{bottom:6.349832px;} -.y114{bottom:6.422245px;} -.y12f5{bottom:6.515442px;} -.y11bd{bottom:6.604686px;} -.y11be{bottom:6.641051px;} -.y663{bottom:6.685928px;} -.y1292{bottom:6.686154px;} -.y12fa{bottom:6.760620px;} -.y11b6{bottom:7.232080px;} -.y1260{bottom:7.303664px;} -.y131{bottom:7.305390px;} -.y661{bottom:7.381927px;} -.y19f{bottom:7.473192px;} -.yc0c{bottom:7.738046px;} -.yc07{bottom:7.761837px;} -.y997{bottom:7.804986px;} -.y7f4{bottom:8.043785px;} -.y19e{bottom:8.191946px;} -.yc05{bottom:8.540596px;} -.y6cd{bottom:9.543629px;} -.yf15{bottom:9.967257px;} -.y6d0{bottom:10.972168px;} -.y110{bottom:12.588488px;} -.y1267{bottom:12.854350px;} -.y60b{bottom:12.900841px;} -.y30c{bottom:13.686702px;} +.y4f4{bottom:0.490896px;} +.y57e{bottom:2.055302px;} +.y5f5{bottom:2.357590px;} +.y465{bottom:2.461249px;} +.y306{bottom:2.993456px;} +.yed1{bottom:3.226091px;} +.y334{bottom:3.241994px;} +.y137f{bottom:3.379280px;} +.y617{bottom:3.615809px;} +.y64e{bottom:3.901928px;} +.y444{bottom:4.243410px;} +.y8fc{bottom:4.291566px;} +.y616{bottom:4.388294px;} +.ybd2{bottom:4.672377px;} +.yf1e{bottom:4.709349px;} +.y57c{bottom:4.806001px;} +.y125a{bottom:5.204471px;} +.y5f3{bottom:5.346189px;} +.y1188{bottom:5.491045px;} +.y57d{bottom:5.493676px;} +.y1211{bottom:5.502109px;} +.y1189{bottom:5.527906px;} +.y7d9{bottom:5.805309px;} +.y5f4{bottom:6.093339px;} +.y10e6{bottom:6.349832px;} +.y115{bottom:6.422245px;} +.y12a2{bottom:6.515442px;} +.y116f{bottom:6.604686px;} +.y1170{bottom:6.641051px;} +.y64f{bottom:6.685928px;} +.y1242{bottom:6.686154px;} +.y12a7{bottom:6.760620px;} +.y1168{bottom:7.232080px;} +.y1210{bottom:7.303664px;} +.y132{bottom:7.305390px;} +.y64d{bottom:7.381927px;} +.y19c{bottom:7.473192px;} +.ybd8{bottom:7.738046px;} +.ybd3{bottom:7.761837px;} +.y96f{bottom:7.804986px;} +.y7d6{bottom:8.043785px;} +.y19b{bottom:8.191946px;} +.ybd1{bottom:8.540596px;} +.y6b6{bottom:9.543629px;} +.yed3{bottom:9.967257px;} +.y6b9{bottom:10.972168px;} +.y111{bottom:12.588488px;} +.y1217{bottom:12.854350px;} +.y5f8{bottom:12.900841px;} +.y305{bottom:13.686702px;} .y8{bottom:13.792221px;} -.y920{bottom:14.132247px;} -.y58d{bottom:15.235745px;} -.y501{bottom:15.893505px;} -.y13d7{bottom:16.223140px;} -.y605{bottom:16.677960px;} -.y30a{bottom:17.335347px;} -.y7f6{bottom:17.393574px;} -.y2fd{bottom:17.771428px;} -.y7f3{bottom:17.849240px;} -.y58b{bottom:17.986445px;} -.y130{bottom:18.128190px;} -.y11cf{bottom:18.129696px;} -.y113{bottom:18.183086px;} -.y12af{bottom:18.388124px;} -.yf61{bottom:18.446020px;} -.y58c{bottom:18.674120px;} -.y12b2{bottom:18.858697px;} -.y921{bottom:18.918984px;} -.y125f{bottom:19.101105px;} -.y993{bottom:19.271442px;} -.y125e{bottom:19.634448px;} -.y603{bottom:19.666560px;} -.y948{bottom:19.767358px;} -.y1291{bottom:19.915157px;} -.y11d9{bottom:20.046843px;} -.y11b5{bottom:20.366404px;} -.y92c{bottom:20.369963px;} -.y604{bottom:20.413710px;} -.y6cc{bottom:20.748629px;} -.y65f{bottom:20.801389px;} -.y11c0{bottom:20.964591px;} -.y30b{bottom:20.983992px;} -.y335{bottom:21.088468px;} -.y6cf{bottom:21.243419px;} -.y12f9{bottom:21.329182px;} -.y12f8{bottom:21.329434px;} -.y12fd{bottom:21.329897px;} -.y622{bottom:21.688434px;} -.y130c{bottom:21.728702px;} -.y596{bottom:21.846093px;} -.y19c{bottom:22.050155px;} -.y61b{bottom:22.460919px;} -.y1294{bottom:22.523976px;} -.y12b0{bottom:22.639897px;} -.y1131{bottom:22.712352px;} +.y8fa{bottom:14.132247px;} +.y57b{bottom:15.235745px;} +.y4f2{bottom:15.893505px;} +.y137e{bottom:16.223140px;} +.y5f2{bottom:16.677960px;} +.y303{bottom:17.335347px;} +.y7d8{bottom:17.393574px;} +.y2f6{bottom:17.771428px;} +.y7d5{bottom:17.849240px;} +.y579{bottom:17.986445px;} +.y131{bottom:18.128190px;} +.y1181{bottom:18.129696px;} +.y114{bottom:18.183086px;} +.y125f{bottom:18.388124px;} +.yf1f{bottom:18.446020px;} +.y57a{bottom:18.674120px;} +.y1262{bottom:18.858697px;} +.y8fb{bottom:18.918984px;} +.y120f{bottom:19.101105px;} +.y96b{bottom:19.271442px;} +.y120e{bottom:19.634448px;} +.y5f0{bottom:19.666560px;} +.y921{bottom:19.767358px;} +.y1241{bottom:19.915157px;} +.y118b{bottom:20.046843px;} +.y1167{bottom:20.366404px;} +.y906{bottom:20.369963px;} +.y5f1{bottom:20.413710px;} +.y6b5{bottom:20.748629px;} +.y64b{bottom:20.801389px;} +.y1172{bottom:20.964591px;} +.y304{bottom:20.983992px;} +.y32d{bottom:21.088468px;} +.y6b8{bottom:21.243419px;} +.y12a6{bottom:21.329182px;} +.y12a5{bottom:21.329434px;} +.y12aa{bottom:21.329897px;} +.y60f{bottom:21.688434px;} +.y12b9{bottom:21.728702px;} +.y584{bottom:21.846093px;} +.y199{bottom:22.050155px;} +.y608{bottom:22.460919px;} +.y1244{bottom:22.523976px;} +.y1260{bottom:22.639897px;} +.y10e7{bottom:22.712352px;} .y9{bottom:22.797079px;} -.y344{bottom:23.262571px;} -.y473{bottom:23.480082px;} -.y660{bottom:23.585389px;} -.y91f{bottom:23.705720px;} -.y65e{bottom:24.281389px;} -.y11c2{bottom:24.863251px;} -.y19d{bottom:24.925175px;} -.y595{bottom:24.940630px;} -.y12fb{bottom:25.432489px;} -.yc0d{bottom:25.565967px;} -.y128f{bottom:25.620109px;} -.y19b{bottom:25.643929px;} -.y33b{bottom:25.822234px;} -.y343{bottom:26.813304px;} -.y472{bottom:27.165634px;} -.y46d{bottom:27.166035px;} -.y7f2{bottom:27.654695px;} -.y11d3{bottom:27.698530px;} -.y11d4{bottom:28.000511px;} -.y12b1{bottom:28.213207px;} -.y58a{bottom:28.416182px;} -.y11ba{bottom:28.513301px;} -.y13d9{bottom:28.811120px;} -.y11bb{bottom:28.811218px;} -.y12a1{bottom:28.842244px;} -.y7f5{bottom:28.981838px;} -.y12f{bottom:29.221560px;} -.y339{bottom:29.372966px;} -.y333{bottom:29.373768px;} -.y1290{bottom:29.782982px;} -.y11b4{bottom:30.163609px;} -.y452{bottom:30.246684px;} -.y309{bottom:30.366222px;} -.y12d{bottom:30.574410px;} -.y121{bottom:30.844980px;} -.y602{bottom:30.998342px;} -.y98d{bottom:31.037496px;} -.y588{bottom:31.166882px;} -.y12fc{bottom:31.479048px;} -.y923{bottom:31.630701px;} -.y589{bottom:31.854557px;} -.yf5f{bottom:32.174349px;} -.y92e{bottom:32.408534px;} -.yf16{bottom:32.514230px;} -.yc08{bottom:32.888245px;} -.y33a{bottom:32.923699px;} -.y92d{bottom:33.173307px;} -.y11dc{bottom:33.206083px;} -.y502{bottom:33.308546px;} -.y504{bottom:33.308670px;} -.y125c{bottom:33.663595px;} -.y2fb{bottom:33.735991px;} -.y600{bottom:33.986941px;} -.y307{bottom:34.014867px;} -.y451{bottom:34.045059px;} -.y44c{bottom:34.045474px;} -.y60d{bottom:34.085028px;} -.y125d{bottom:34.400935px;} -.y2fa{bottom:34.450948px;} -.y11da{bottom:34.482853px;} -.y12ae{bottom:34.678194px;} -.y12ad{bottom:34.678477px;} -.y601{bottom:34.734091px;} -.yc09{bottom:35.363905px;} -.y1295{bottom:36.001000px;} -.y12f7{bottom:36.163931px;} -.yc0b{bottom:36.598062px;} -.y334{bottom:36.897014px;} -.y11b3{bottom:37.042453px;} -.y999{bottom:37.153533px;} -.y130d{bottom:37.329639px;} -.y308{bottom:37.663512px;} -.yc0a{bottom:37.684836px;} -.y65c{bottom:37.700872px;} -.y11c1{bottom:37.777749px;} -.y112f{bottom:39.064931px;} -.y199{bottom:39.502120px;} -.y91e{bottom:39.611587px;} -.y12e{bottom:40.044360px;} -.y998{bottom:40.129072px;} -.yf5e{bottom:40.209351px;} -.y475{bottom:40.328328px;} -.y12a9{bottom:40.412662px;} -.y65d{bottom:40.484872px;} -.y12a0{bottom:41.173189px;} -.y65b{bottom:41.180871px;} -.y587{bottom:41.596615px;} -.y338{bottom:42.054153px;} -.y19a{bottom:42.377140px;} -.y198{bottom:43.095894px;} -.y11db{bottom:43.136939px;} -.y12a7{bottom:43.307103px;} -.y474{bottom:44.013880px;} -.y46e{bottom:44.014280px;} -.y628{bottom:44.245724px;} -.y624{bottom:44.250944px;} -.y585{bottom:44.347315px;} -.y12f4{bottom:44.714818px;} -.y12a2{bottom:44.749358px;} -.y331{bottom:44.909917px;} -.y586{bottom:45.034990px;} -.y61f{bottom:45.322274px;} -.y10f{bottom:45.345742px;} -.y6ce{bottom:45.415265px;} -.y342{bottom:45.581462px;} -.y336{bottom:45.604885px;} -.y330{bottom:45.605692px;} -.y11ce{bottom:46.167144px;} -.y306{bottom:47.045743px;} -.y7db{bottom:47.076722px;} -.y133{bottom:47.349750px;} -.y454{bottom:47.610685px;} -.y125b{bottom:47.899161px;} -.y387{bottom:48.089000px;} -.y142{bottom:48.090000px;} -.yf5d{bottom:48.244350px;} -.yf65{bottom:48.250578px;} -.y5fe{bottom:48.307315px;} -.yf14{bottom:48.516085px;} -.y112e{bottom:48.635866px;} -.yf64{bottom:48.927912px;} -.y5ff{bottom:49.054465px;} -.y340{bottom:49.132194px;} -.y337{bottom:49.155618px;} -.y1346{bottom:49.352372px;} -.y12ef{bottom:49.420140px;} -.y11d5{bottom:49.667832px;} -.y951{bottom:49.718504px;} -.y12a8{bottom:49.767172px;} -.y2fc{bottom:50.058028px;} -.y11bc{bottom:50.186939px;} -.y11cc{bottom:50.197214px;} -.y2f7{bottom:50.415512px;} -.y304{bottom:50.694388px;} -.y2f6{bottom:50.695217px;} -.y12f6{bottom:50.732750px;} -.y2f9{bottom:51.130474px;} -.y12b{bottom:51.137730px;} -.y12ac{bottom:51.265894px;} -.yf1b{bottom:51.332101px;} -.y453{bottom:51.409060px;} -.y44d{bottom:51.409474px;} -.yf1d{bottom:52.145294px;} -.y91d{bottom:52.176558px;} -.y341{bottom:52.682927px;} -.yc04{bottom:52.693524px;} -.y950{bottom:52.694043px;} -.y135{bottom:53.031720px;} -.y1241{bottom:53.500000px;} -.y13dc{bottom:54.242965px;} -.y13dd{bottom:54.242966px;} -.y127c{bottom:54.332000px;} -.y305{bottom:54.343033px;} -.y627{bottom:54.586573px;} -.y623{bottom:54.591794px;} -.y659{bottom:54.600309px;} -.y584{bottom:54.777059px;} -.y12f3{bottom:54.863968px;} -.y1266{bottom:54.882720px;} -.y125a{bottom:55.599447px;} -.y61e{bottom:55.663124px;} -.y11cd{bottom:56.097999px;} -.y11d8{bottom:56.159044px;} -.yf5c{bottom:56.257883px;} -.y132{bottom:56.549130px;} -.y11bf{bottom:56.590792px;} -.y11d0{bottom:56.789611px;} -.y7da{bottom:56.882177px;} -.y196{bottom:56.954103px;} -.y11d1{bottom:57.091590px;} -.y477{bottom:57.176568px;} -.y11b7{bottom:57.212873px;} -.yf62{bottom:57.331297px;} -.y65a{bottom:57.384309px;} -.y11b8{bottom:57.510788px;} -.y582{bottom:57.527759px;} -.y926{bottom:57.698245px;} -.y658{bottom:58.080309px;} -.y112d{bottom:58.206811px;} -.y583{bottom:58.215434px;} -.y2f3{bottom:58.860965px;} -.y12f2{bottom:59.028657px;} -.y5fd{bottom:59.639090px;} -.y197{bottom:59.829123px;} -.y128b{bottom:59.878744px;} -.y128c{bottom:59.915371px;} -.y141{bottom:60.045000px;} -.y1284{bottom:60.510660px;} -.y195{bottom:60.547877px;} -.y332{bottom:60.793953px;} -.y476{bottom:60.862121px;} -.y46f{bottom:60.862521px;} -.y32e{bottom:61.141839px;} -.y1345{bottom:61.346823px;} -.y32f{bottom:61.837612px;} -.y1259{bottom:62.031510px;} -.y129{bottom:62.231100px;} -.y94f{bottom:62.283480px;} -.y5fb{bottom:62.627690px;} -.y60c{bottom:62.749237px;} -.yf1c{bottom:62.804069px;} -.y1343{bottom:63.197685px;} -.y5fc{bottom:63.374840px;} -.y303{bottom:63.725269px;} -.y1293{bottom:64.270268px;} -.yf5b{bottom:64.292885px;} -.y91c{bottom:64.741534px;} -.y456{bottom:64.974685px;} -.y94e{bottom:65.259019px;} -.y2f4{bottom:66.659780px;} -.y7d9{bottom:66.687632px;} -.y2f8{bottom:66.737548px;} -.y925{bottom:66.754233px;} -.y13da{bottom:67.086825px;} -.y13db{bottom:67.235178px;} -.y301{bottom:67.373914px;} -.y2f1{bottom:67.374742px;} -.y12ab{bottom:67.556243px;} -.y1122{bottom:67.752173px;} -.y11b2{bottom:67.856388px;} -.y33f{bottom:67.900355px;} -.y581{bottom:67.957496px;} -.y1125{bottom:68.513907px;} -.y455{bottom:68.773060px;} -.y44e{bottom:68.773477px;} -.y618{bottom:69.417523px;} -.y57f{bottom:70.708195px;} -.y2f2{bottom:70.935561px;} -.y302{bottom:71.022559px;} -.y580{bottom:71.395870px;} -.y33d{bottom:71.451087px;} -.y656{bottom:71.499781px;} +.y33c{bottom:23.262571px;} +.y467{bottom:23.480082px;} +.y64c{bottom:23.585389px;} +.y8f9{bottom:23.705720px;} +.y64a{bottom:24.281389px;} +.y1174{bottom:24.863251px;} +.y19a{bottom:24.925175px;} +.y583{bottom:24.940630px;} +.y12a8{bottom:25.432489px;} +.ybd9{bottom:25.565967px;} +.y123f{bottom:25.620109px;} +.y198{bottom:25.643929px;} +.y333{bottom:25.822234px;} +.y33b{bottom:26.813304px;} +.y466{bottom:27.165634px;} +.y461{bottom:27.166035px;} +.y7d4{bottom:27.654695px;} +.y1185{bottom:27.698530px;} +.y1186{bottom:28.000511px;} +.y1261{bottom:28.213207px;} +.y578{bottom:28.416182px;} +.y116c{bottom:28.513301px;} +.y1380{bottom:28.811120px;} +.y116d{bottom:28.811218px;} +.y1251{bottom:28.842244px;} +.y7d7{bottom:28.981838px;} +.y130{bottom:29.221560px;} +.y331{bottom:29.372966px;} +.y32b{bottom:29.373768px;} +.y1240{bottom:29.782982px;} +.y1166{bottom:30.163609px;} +.y446{bottom:30.246684px;} +.y302{bottom:30.366222px;} +.y12e{bottom:30.574410px;} +.y122{bottom:30.844980px;} +.y5ef{bottom:30.998342px;} +.y965{bottom:31.037496px;} +.y576{bottom:31.166882px;} +.y12a9{bottom:31.479048px;} +.y8fd{bottom:31.630701px;} +.y577{bottom:31.854557px;} +.yf1d{bottom:32.174349px;} +.y908{bottom:32.408534px;} +.yed4{bottom:32.514230px;} +.ybd4{bottom:32.888245px;} +.y332{bottom:32.923699px;} +.y907{bottom:33.173307px;} +.y118e{bottom:33.206083px;} +.y4f3{bottom:33.308546px;} +.y4f5{bottom:33.308670px;} +.y120c{bottom:33.663595px;} +.y2f4{bottom:33.735991px;} +.y5ed{bottom:33.986941px;} +.y300{bottom:34.014867px;} +.y445{bottom:34.045059px;} +.y440{bottom:34.045474px;} +.y5fa{bottom:34.085028px;} +.y120d{bottom:34.400935px;} +.y2f3{bottom:34.450948px;} +.y118c{bottom:34.482853px;} +.y125e{bottom:34.678194px;} +.y125d{bottom:34.678477px;} +.y5ee{bottom:34.734091px;} +.ybd5{bottom:35.363905px;} +.y1245{bottom:36.001000px;} +.y12a4{bottom:36.163931px;} +.ybd7{bottom:36.598062px;} +.y32c{bottom:36.897014px;} +.y1165{bottom:37.042453px;} +.y971{bottom:37.153533px;} +.y12ba{bottom:37.329639px;} +.y301{bottom:37.663512px;} +.ybd6{bottom:37.684836px;} +.y648{bottom:37.700872px;} +.y1173{bottom:37.777749px;} +.y10e5{bottom:39.064931px;} +.y196{bottom:39.502120px;} +.y8f8{bottom:39.611587px;} +.y12f{bottom:40.044360px;} +.y970{bottom:40.129072px;} +.yf1c{bottom:40.209351px;} +.y469{bottom:40.328328px;} +.y1259{bottom:40.412662px;} +.y649{bottom:40.484872px;} +.y1250{bottom:41.173189px;} +.y647{bottom:41.180871px;} +.y575{bottom:41.596615px;} +.y330{bottom:42.054153px;} +.y197{bottom:42.377140px;} +.y195{bottom:43.095894px;} +.y118d{bottom:43.136939px;} +.y1257{bottom:43.307103px;} +.y468{bottom:44.013880px;} +.y462{bottom:44.014280px;} +.y615{bottom:44.245724px;} +.y611{bottom:44.250944px;} +.y573{bottom:44.347315px;} +.y12a1{bottom:44.714818px;} +.y1252{bottom:44.749358px;} +.y329{bottom:44.909917px;} +.y574{bottom:45.034990px;} +.y60c{bottom:45.322274px;} +.y110{bottom:45.345742px;} +.y6b7{bottom:45.415265px;} +.y33a{bottom:45.581462px;} +.y32e{bottom:45.604885px;} +.y328{bottom:45.605692px;} +.y1180{bottom:46.167144px;} +.y2ff{bottom:47.045743px;} +.y7bd{bottom:47.076722px;} +.y134{bottom:47.349750px;} +.y448{bottom:47.610685px;} +.y120b{bottom:47.899161px;} +.y37f{bottom:48.089000px;} +.y143{bottom:48.090000px;} +.yf1b{bottom:48.244350px;} +.yf23{bottom:48.250578px;} +.y5eb{bottom:48.307315px;} +.yed2{bottom:48.516085px;} +.y10e4{bottom:48.635866px;} +.yf22{bottom:48.927912px;} +.y5ec{bottom:49.054465px;} +.y338{bottom:49.132194px;} +.y32f{bottom:49.155618px;} +.y12f1{bottom:49.352372px;} +.y129c{bottom:49.420140px;} +.y1187{bottom:49.667832px;} +.y92a{bottom:49.718504px;} +.y1258{bottom:49.767172px;} +.y2f5{bottom:50.058028px;} +.y116e{bottom:50.186939px;} +.y117e{bottom:50.197214px;} +.y2f0{bottom:50.415512px;} +.y2fd{bottom:50.694388px;} +.y2ef{bottom:50.695217px;} +.y12a3{bottom:50.732750px;} +.y2f2{bottom:51.130474px;} +.y12c{bottom:51.137730px;} +.y125c{bottom:51.265894px;} +.yed9{bottom:51.332101px;} +.y447{bottom:51.409060px;} +.y441{bottom:51.409474px;} +.yedb{bottom:52.145294px;} +.y8f7{bottom:52.176558px;} +.y339{bottom:52.682927px;} +.ybd0{bottom:52.693524px;} +.y929{bottom:52.694043px;} +.y136{bottom:53.031720px;} +.y1383{bottom:54.242965px;} +.y1384{bottom:54.242966px;} +.y122c{bottom:54.332000px;} +.y2fe{bottom:54.343033px;} +.y614{bottom:54.586573px;} +.y610{bottom:54.591794px;} +.y645{bottom:54.600309px;} +.y572{bottom:54.777059px;} +.y12a0{bottom:54.863968px;} +.y1216{bottom:54.882720px;} +.y120a{bottom:55.599447px;} +.y60b{bottom:55.663124px;} +.y117f{bottom:56.097999px;} +.y118a{bottom:56.159044px;} +.yf1a{bottom:56.257883px;} +.y133{bottom:56.549130px;} +.y1171{bottom:56.590792px;} +.y1182{bottom:56.789611px;} +.y7bc{bottom:56.882177px;} +.y193{bottom:56.954103px;} +.y1183{bottom:57.091590px;} +.y46b{bottom:57.176568px;} +.y1169{bottom:57.212873px;} +.yf20{bottom:57.331297px;} +.y646{bottom:57.384309px;} +.y116a{bottom:57.510788px;} +.y570{bottom:57.527759px;} +.y900{bottom:57.698245px;} +.y644{bottom:58.080309px;} +.y10e3{bottom:58.206811px;} +.y571{bottom:58.215434px;} +.y2ec{bottom:58.860965px;} +.y129f{bottom:59.028657px;} +.y5ea{bottom:59.639090px;} +.y194{bottom:59.829123px;} +.y123b{bottom:59.878744px;} +.y123c{bottom:59.915371px;} +.y142{bottom:60.045000px;} +.y1234{bottom:60.510660px;} +.y192{bottom:60.547877px;} +.y32a{bottom:60.793953px;} +.y46a{bottom:60.862121px;} +.y463{bottom:60.862521px;} +.y326{bottom:61.141839px;} +.y12f0{bottom:61.346823px;} +.y327{bottom:61.837612px;} +.y1209{bottom:62.031510px;} +.y12a{bottom:62.231100px;} +.y928{bottom:62.283480px;} +.y5e8{bottom:62.627690px;} +.y5f9{bottom:62.749237px;} +.yeda{bottom:62.804069px;} +.y12ee{bottom:63.197685px;} +.y5e9{bottom:63.374840px;} +.y2fc{bottom:63.725269px;} +.y1243{bottom:64.270268px;} +.yf19{bottom:64.292885px;} +.y8f6{bottom:64.741534px;} +.y44a{bottom:64.974685px;} +.y927{bottom:65.259019px;} +.y2ed{bottom:66.659780px;} +.y7bb{bottom:66.687632px;} +.y2f1{bottom:66.737548px;} +.y8ff{bottom:66.754233px;} +.y1381{bottom:67.086825px;} +.y1382{bottom:67.235178px;} +.y2fa{bottom:67.373914px;} +.y2ea{bottom:67.374742px;} +.y125b{bottom:67.556243px;} +.y10d8{bottom:67.752173px;} +.y1164{bottom:67.856388px;} +.y337{bottom:67.900355px;} +.y56f{bottom:67.957496px;} +.y10db{bottom:68.513907px;} +.y449{bottom:68.773060px;} +.y442{bottom:68.773477px;} +.y605{bottom:69.417523px;} +.y56d{bottom:70.708195px;} +.y2eb{bottom:70.935561px;} +.y2fb{bottom:71.022559px;} +.y56e{bottom:71.395870px;} +.y335{bottom:71.451087px;} +.y642{bottom:71.499781px;} .y33{bottom:72.000000px;} -.yf5a{bottom:72.327884px;} -.y112{bottom:72.557376px;} -.y127{bottom:73.053900px;} -.y1344{bottom:73.341274px;} -.y617{bottom:73.394774px;} -.y470{bottom:73.498701px;} -.y1283{bottom:73.739658px;} -.y5fa{bottom:73.959464px;} -.y657{bottom:74.283781px;} -.y128e{bottom:74.342158px;} -.yf1e{bottom:74.375082px;} -.y193{bottom:74.406078px;} -.y594{bottom:74.568751px;} -.y12a4{bottom:74.569952px;} -.y12a6{bottom:74.807599px;} -.y94d{bottom:74.848451px;} -.y655{bottom:74.979781px;} -.y33e{bottom:75.001820px;} -.y7e4{bottom:75.086335px;} -.y1134{bottom:75.691534px;} -.y924{bottom:75.810220px;} -.y1257{bottom:76.060628px;} -.y7d8{bottom:76.493088px;} -.y115{bottom:76.523366px;} -.y6be{bottom:76.744227px;} -.y1258{bottom:76.797968px;} -.y5f8{bottom:76.948064px;} -.y32d{bottom:77.025873px;} -.y194{bottom:77.281098px;} -.y91b{bottom:77.306505px;} -.y112c{bottom:77.323117px;} -.y60a{bottom:77.343083px;} -.y6bc{bottom:77.467990px;} -.y593{bottom:77.663289px;} -.y5f9{bottom:77.695214px;} -.y94c{bottom:77.823990px;} -.y192{bottom:77.999853px;} -.y11d2{bottom:78.758911px;} -.y11b9{bottom:78.886509px;} -.y127d{bottom:79.444611px;} -.y13de{bottom:79.674806px;} -.y1302{bottom:80.095401px;} -.yf59{bottom:80.341417px;} -.y300{bottom:80.404789px;} -.y57e{bottom:81.137933px;} -.y928{bottom:81.259032px;} -.y1288{bottom:81.945280px;} -.y1289{bottom:82.245345px;} -.y2f5{bottom:82.981824px;} -.y130e{bottom:83.332545px;} -.y2ef{bottom:83.339300px;} -.y1282{bottom:83.607484px;} -.y57c{bottom:83.888632px;} -.y2fe{bottom:84.053434px;} -.y2ee{bottom:84.054263px;} -.y125{bottom:84.147270px;} -.y111{bottom:84.318218px;} -.y57d{bottom:84.576307px;} -.y12a5{bottom:84.774404px;} -.yf1a{bottom:85.568048px;} -.y12a3{bottom:85.625283px;} -.y457{bottom:86.137063px;} -.y44f{bottom:86.137477px;} -.y7d7{bottom:86.298543px;} -.y7e3{bottom:86.674600px;} -.y112b{bottom:86.894053px;} -.y94b{bottom:87.413422px;} -.y2ff{bottom:87.702079px;} -.y6bb{bottom:87.739241px;} -.y927{bottom:87.813122px;} -.y6bd{bottom:87.949227px;} -.y5f7{bottom:88.279842px;} -.yf58{bottom:88.354950px;} -.y653{bottom:88.399264px;} -.y91a{bottom:89.871476px;} -.y1256{bottom:90.296212px;} -.y94a{bottom:90.388961px;} -.y621{bottom:90.862020px;} -.y626{bottom:91.043657px;} -.y654{bottom:91.183264px;} -.y5f5{bottom:91.268442px;} -.y190{bottom:91.858054px;} -.y652{bottom:91.879263px;} -.y5f6{bottom:92.015592px;} -.y991{bottom:92.111407px;} -.y61a{bottom:92.268149px;} -.y61d{bottom:92.634557px;} -.y1301{bottom:93.154168px;} -.y1342{bottom:93.373049px;} -.y12f1{bottom:93.373311px;} -.y57b{bottom:94.318369px;} -.y191{bottom:94.733074px;} -.y1268{bottom:94.842365px;} -.y123{bottom:94.970070px;} -.y18f{bottom:95.451828px;} -.y7d6{bottom:96.103998px;} -.yf19{bottom:96.226822px;} -.yf57{bottom:96.389948px;} -.y112a{bottom:96.439419px;} -.y579{bottom:97.069069px;} -.y1265{bottom:97.279772px;} -.y57a{bottom:97.756744px;} -.y1255{bottom:97.996498px;} -.y12ff{bottom:99.037405px;} -.y25c{bottom:99.115000px;} -.y466{bottom:99.338625px;} -.y2f0{bottom:99.661344px;} -.y946{bottom:99.858250px;} -.y945{bottom:99.978393px;} -.y2ec{bottom:100.018823px;} -.y1133{bottom:100.025404px;} -.y2ed{bottom:100.733783px;} -.y620{bottom:101.202870px;} -.y625{bottom:101.384508px;} -.ye1{bottom:101.888000px;} -.y83f{bottom:101.897000px;} -.ydae{bottom:101.901000px;} -.y952{bottom:101.928190px;} -.y22c{bottom:102.000000px;} -.yb1c{bottom:102.311000px;} -.y919{bottom:102.436447px;} -.y5f4{bottom:102.600217px;} -.y619{bottom:102.609000px;} -.y482{bottom:102.661000px;} -.yc38{bottom:102.864000px;} +.yf18{bottom:72.327884px;} +.y113{bottom:72.557376px;} +.y128{bottom:73.053900px;} +.y12ef{bottom:73.341274px;} +.y604{bottom:73.394774px;} +.y464{bottom:73.498701px;} +.y1233{bottom:73.739658px;} +.y5e7{bottom:73.959464px;} +.y643{bottom:74.283781px;} +.y123e{bottom:74.342158px;} +.yedc{bottom:74.375082px;} +.y190{bottom:74.406078px;} +.y582{bottom:74.568751px;} +.y1254{bottom:74.569952px;} +.y1256{bottom:74.807599px;} +.y926{bottom:74.848451px;} +.y641{bottom:74.979781px;} +.y336{bottom:75.001820px;} +.y7c6{bottom:75.086335px;} +.y10ea{bottom:75.691534px;} +.y8fe{bottom:75.810220px;} +.y1207{bottom:76.060628px;} +.y7ba{bottom:76.493088px;} +.y116{bottom:76.523366px;} +.y6a7{bottom:76.744227px;} +.y1208{bottom:76.797968px;} +.y5e5{bottom:76.948064px;} +.y325{bottom:77.025873px;} +.y191{bottom:77.281098px;} +.y8f5{bottom:77.306505px;} +.y10e2{bottom:77.323117px;} +.y5f7{bottom:77.343083px;} +.y6a5{bottom:77.467990px;} +.y581{bottom:77.663289px;} +.y5e6{bottom:77.695214px;} +.y925{bottom:77.823990px;} +.y18f{bottom:77.999853px;} +.y1184{bottom:78.758911px;} +.y116b{bottom:78.886509px;} +.y122d{bottom:79.444611px;} +.y1385{bottom:79.674806px;} +.y12af{bottom:80.095401px;} +.yf17{bottom:80.341417px;} +.y2f9{bottom:80.404789px;} +.y56c{bottom:81.137933px;} +.y902{bottom:81.259032px;} +.y1238{bottom:81.945280px;} +.y1239{bottom:82.245345px;} +.y2ee{bottom:82.981824px;} +.y12bb{bottom:83.332545px;} +.y2e8{bottom:83.339300px;} +.y1232{bottom:83.607484px;} +.y56a{bottom:83.888632px;} +.y2f7{bottom:84.053434px;} +.y2e7{bottom:84.054263px;} +.y126{bottom:84.147270px;} +.y112{bottom:84.318218px;} +.y56b{bottom:84.576307px;} +.y1255{bottom:84.774404px;} +.yed8{bottom:85.568048px;} +.y1253{bottom:85.625283px;} +.y44b{bottom:86.137063px;} +.y443{bottom:86.137477px;} +.y7b9{bottom:86.298543px;} +.y7c5{bottom:86.674600px;} +.y10e1{bottom:86.894053px;} +.y924{bottom:87.413422px;} +.y2f8{bottom:87.702079px;} +.y6a4{bottom:87.739241px;} +.y901{bottom:87.813122px;} +.y6a6{bottom:87.949227px;} +.y5e4{bottom:88.279842px;} +.yf16{bottom:88.354950px;} +.y63f{bottom:88.399264px;} +.y8f4{bottom:89.871476px;} +.y1206{bottom:90.296212px;} +.y923{bottom:90.388961px;} +.y60e{bottom:90.862020px;} +.y613{bottom:91.043657px;} +.y640{bottom:91.183264px;} +.y5e2{bottom:91.268442px;} +.y18d{bottom:91.858054px;} +.y63e{bottom:91.879263px;} +.y5e3{bottom:92.015592px;} +.y969{bottom:92.111407px;} +.y607{bottom:92.268149px;} +.y60a{bottom:92.634557px;} +.y12ae{bottom:93.154168px;} +.y12ed{bottom:93.373049px;} +.y129e{bottom:93.373311px;} +.y569{bottom:94.318369px;} +.y18e{bottom:94.733074px;} +.y1218{bottom:94.842365px;} +.y124{bottom:94.970070px;} +.y18c{bottom:95.451828px;} +.y7b8{bottom:96.103998px;} +.yed7{bottom:96.226822px;} +.yf15{bottom:96.389948px;} +.y10e0{bottom:96.439419px;} +.y567{bottom:97.069069px;} +.y1215{bottom:97.279772px;} +.y568{bottom:97.756744px;} +.y1205{bottom:97.996498px;} +.y12ac{bottom:99.037405px;} +.y256{bottom:99.115000px;} +.y45a{bottom:99.338625px;} +.y2e9{bottom:99.661344px;} +.y91f{bottom:99.858250px;} +.y91e{bottom:99.978393px;} +.y2e5{bottom:100.018823px;} +.y10e9{bottom:100.025404px;} +.y2e6{bottom:100.733783px;} +.y60d{bottom:101.202870px;} +.y612{bottom:101.384508px;} +.ye2{bottom:101.888000px;} +.y81e{bottom:101.897000px;} +.yd74{bottom:101.901000px;} +.y92b{bottom:101.928190px;} +.yaed{bottom:102.311000px;} +.y8f3{bottom:102.436447px;} +.y5e1{bottom:102.600217px;} +.y606{bottom:102.609000px;} +.y476{bottom:102.661000px;} +.yc03{bottom:102.864000px;} .y56{bottom:102.891000px;} -.y944{bottom:102.953932px;} -.y61c{bottom:102.975408px;} -.y1403{bottom:103.225000px;} -.y1300{bottom:103.303318px;} -.y1be{bottom:103.747000px;} -.y128a{bottom:103.775145px;} -.ye40{bottom:103.882000px;} -.y716{bottom:103.892000px;} -.ye1e{bottom:104.000000px;} -.y1426{bottom:104.095000px;} -.y152e{bottom:104.169000px;} -.y1453{bottom:104.178000px;} -.y1217{bottom:104.317000px;} -.y133e{bottom:104.409000px;} -.yf56{bottom:104.424951px;} -.y1254{bottom:104.428561px;} -.yb47{bottom:104.500000px;} -.y140{bottom:104.701000px;} -.y32a{bottom:104.723000px;} -.yb1b{bottom:105.124000px;} -.yc72{bottom:105.246000px;} -.y650{bottom:105.298726px;} -.yd8e{bottom:105.330000px;} -.y1341{bottom:105.367500px;} -.y12f0{bottom:105.367762px;} -.y386{bottom:105.382000px;} -.y22b{bottom:105.503000px;} -.y6b6{bottom:105.586000px;} -.y5f2{bottom:105.588816px;} -.y741{bottom:105.894000px;} -.y7d5{bottom:105.909456px;} -.y1129{bottom:105.984785px;} -.y1507{bottom:106.121000px;} -.y5e8{bottom:106.274000px;} -.y5f3{bottom:106.335966px;} -.y138c{bottom:106.436000px;} -.y4be{bottom:106.650000px;} -.y13d4{bottom:106.720000px;} -.yfa6{bottom:106.738000px;} -.y385{bottom:106.877000px;} -.yb8d{bottom:106.952000px;} -.y1452{bottom:106.991000px;} -.y1216{bottom:107.130000px;} -.y133d{bottom:107.222000px;} -.y578{bottom:107.498810px;} -.yf7b{bottom:107.658000px;} -.yc54{bottom:107.688000px;} -.y50b{bottom:107.813000px;} -.ya51{bottom:107.982000px;} -.yb67{bottom:108.013000px;} -.y651{bottom:108.082726px;} -.y953{bottom:108.111417px;} -.ya72{bottom:108.297000px;} -.y996{bottom:108.311144px;} -.y6b5{bottom:108.399000px;} -.ydf4{bottom:108.438000px;} -.y410{bottom:108.460000px;} -.y93d{bottom:108.699257px;} -.y64f{bottom:108.778725px;} +.y91d{bottom:102.953932px;} +.y609{bottom:102.975408px;} +.y13aa{bottom:103.225000px;} +.y12ad{bottom:103.303318px;} +.y1bb{bottom:103.747000px;} +.y123a{bottom:103.775145px;} +.ye03{bottom:103.882000px;} +.y6ff{bottom:103.892000px;} +.y13cd{bottom:104.095000px;} +.y14d2{bottom:104.169000px;} +.y13fa{bottom:104.178000px;} +.y11c8{bottom:104.317000px;} +.y12ea{bottom:104.409000px;} +.yf14{bottom:104.424951px;} +.y1204{bottom:104.428561px;} +.y141{bottom:104.701000px;} +.y323{bottom:104.723000px;} +.yaec{bottom:105.124000px;} +.yc3b{bottom:105.246000px;} +.y63c{bottom:105.298726px;} +.yd54{bottom:105.330000px;} +.y12ec{bottom:105.367500px;} +.y129d{bottom:105.367762px;} +.y37e{bottom:105.382000px;} +.y225{bottom:105.503000px;} +.y6a0{bottom:105.586000px;} +.y5df{bottom:105.588816px;} +.y729{bottom:105.894000px;} +.y7b7{bottom:105.909456px;} +.y10df{bottom:105.984785px;} +.y14ab{bottom:106.121000px;} +.y5d6{bottom:106.274000px;} +.y5e0{bottom:106.335966px;} +.y1336{bottom:106.436000px;} +.y4b0{bottom:106.650000px;} +.y137c{bottom:106.720000px;} +.yf63{bottom:106.738000px;} +.y37d{bottom:106.877000px;} +.yb5b{bottom:106.952000px;} +.y13f9{bottom:106.991000px;} +.y11c7{bottom:107.130000px;} +.y12e9{bottom:107.222000px;} +.ybb{bottom:107.374000px;} +.y566{bottom:107.498810px;} +.yf39{bottom:107.658000px;} +.yc1e{bottom:107.688000px;} +.y4fc{bottom:107.813000px;} +.ya26{bottom:107.982000px;} +.yb36{bottom:108.013000px;} +.y63d{bottom:108.082726px;} +.y92c{bottom:108.111417px;} +.ya46{bottom:108.297000px;} +.y96e{bottom:108.311144px;} +.y69f{bottom:108.399000px;} +.ydb8{bottom:108.438000px;} +.y406{bottom:108.460000px;} +.y916{bottom:108.699257px;} +.y63b{bottom:108.778725px;} .y85{bottom:108.868000px;} -.yf17{bottom:108.944086px;} -.y1164{bottom:109.263000px;} -.y18d{bottom:109.310026px;} -.y11ad{bottom:109.394000px;} -.y4bd{bottom:109.463000px;} -.y1179{bottom:109.595000px;} -.y100e{bottom:109.748000px;} -.y1a3{bottom:109.749162px;} -.yb8c{bottom:109.764000px;} -.y98a{bottom:110.147000px;} -.y128d{bottom:110.225159px;} -.y576{bottom:110.249509px;} -.y7ce{bottom:110.390000px;} -.y25b{bottom:110.393000px;} -.y50a{bottom:110.626000px;} -.y66b{bottom:110.702260px;} -.y1285{bottom:110.851724px;} -.y12ec{bottom:110.874000px;} -.y134{bottom:110.933700px;} -.y577{bottom:110.937184px;} -.y10a{bottom:111.000000px;} -.y8ef{bottom:111.028000px;} -.y1286{bottom:111.151786px;} -.y12ca{bottom:111.169000px;} -.ydf3{bottom:111.251000px;} -.y990{bottom:111.286683px;} -.y449{bottom:111.352000px;} -.y83e{bottom:111.362000px;} -.ydad{bottom:111.366000px;} -.y53b{bottom:111.392000px;} -.y25a{bottom:111.500000px;} -.y14b8{bottom:111.779000px;} -.y6e9{bottom:111.815000px;} -.yaf4{bottom:112.000000px;} -.y18e{bottom:112.185046px;} -.yf55{bottom:112.438484px;} -.y8f0{bottom:112.500000px;} -.y943{bottom:112.543361px;} -.y1402{bottom:112.690000px;} -.y18c{bottom:112.903800px;} -.y989{bottom:112.960000px;} -.y609{bottom:113.141512px;} -.y172{bottom:113.206000px;} -.y1bd{bottom:113.211000px;} -.y715{bottom:113.357000px;} -.y1317{bottom:113.500000px;} -.y1425{bottom:113.559000px;} -.y152d{bottom:113.633000px;} -.y1215{bottom:113.821000px;} -.ye0{bottom:113.843000px;} -.y1316{bottom:113.949000px;} -.y12c9{bottom:113.981000px;} -.y77f{bottom:114.165000px;} -.ydac{bottom:114.179000px;} -.y53a{bottom:114.205000px;} -.y259{bottom:114.313000px;} -.ydcc{bottom:114.438000px;} -.y14b7{bottom:114.592000px;} -.y1032{bottom:114.613000px;} -.y481{bottom:114.617000px;} -.y6e8{bottom:114.628000px;} +.yed5{bottom:108.944086px;} +.y1119{bottom:109.263000px;} +.y18a{bottom:109.310026px;} +.y1160{bottom:109.394000px;} +.y4af{bottom:109.463000px;} +.y112d{bottom:109.595000px;} +.yfc8{bottom:109.748000px;} +.y1a0{bottom:109.749162px;} +.yb5a{bottom:109.764000px;} +.y963{bottom:110.147000px;} +.y123d{bottom:110.225159px;} +.y564{bottom:110.249509px;} +.y7b2{bottom:110.390000px;} +.y255{bottom:110.393000px;} +.y4fb{bottom:110.626000px;} +.y657{bottom:110.702260px;} +.y1235{bottom:110.851724px;} +.y129a{bottom:110.874000px;} +.y135{bottom:110.933700px;} +.y565{bottom:110.937184px;} +.y8cb{bottom:111.028000px;} +.y1236{bottom:111.151786px;} +.y127a{bottom:111.169000px;} +.ydb7{bottom:111.251000px;} +.y968{bottom:111.286683px;} +.y43e{bottom:111.352000px;} +.y81d{bottom:111.362000px;} +.yd73{bottom:111.366000px;} +.y52b{bottom:111.392000px;} +.y254{bottom:111.500000px;} +.y145d{bottom:111.779000px;} +.y6d2{bottom:111.815000px;} +.y18b{bottom:112.185046px;} +.yf13{bottom:112.438484px;} +.y91c{bottom:112.543361px;} +.y13a9{bottom:112.690000px;} +.y189{bottom:112.903800px;} +.y962{bottom:112.960000px;} +.y5f6{bottom:113.141512px;} +.y170{bottom:113.206000px;} +.y1ba{bottom:113.211000px;} +.y6fe{bottom:113.357000px;} +.y13cc{bottom:113.559000px;} +.y14d1{bottom:113.633000px;} +.y11c6{bottom:113.821000px;} +.ye1{bottom:113.843000px;} +.y12c3{bottom:113.949000px;} +.y1279{bottom:113.981000px;} +.y765{bottom:114.165000px;} +.yd72{bottom:114.179000px;} +.y52a{bottom:114.205000px;} +.y253{bottom:114.313000px;} +.yd91{bottom:114.438000px;} +.y145c{bottom:114.592000px;} +.yfeb{bottom:114.613000px;} +.y475{bottom:114.617000px;} +.y6d1{bottom:114.628000px;} .y55{bottom:114.846000px;} -.y687{bottom:115.000000px;} -.y918{bottom:115.001415px;} -.y913{bottom:115.013000px;} -.y329{bottom:115.184000px;} -.y740{bottom:115.358000px;} -.y1401{bottom:115.503000px;} -.y942{bottom:115.518900px;} -.y1128{bottom:115.555721px;} -.y6b9{bottom:115.631423px;} -.y7d4{bottom:115.714912px;} -.y127f{bottom:115.740969px;} -.y10f8{bottom:115.760000px;} -.ye3f{bottom:115.837000px;} -.y1469{bottom:115.847000px;} -.ybe3{bottom:115.888000px;} -.y1281{bottom:115.991656px;} -.yb68{bottom:116.000000px;} -.y171{bottom:116.018000px;} -.y1bc{bottom:116.024000px;} -.y4bc{bottom:116.155000px;} -.y714{bottom:116.169000px;} -.y2eb{bottom:116.340865px;} -.y1424{bottom:116.372000px;} -.y152c{bottom:116.446000px;} -.y1214{bottom:116.634000px;} -.y328{bottom:116.678000px;} -.y1315{bottom:116.762000px;} -.y5f1{bottom:116.920595px;} -.y4bf{bottom:117.000000px;} -.y883{bottom:117.075000px;} -.y93c{bottom:117.104651px;} -.y686{bottom:117.106000px;} -.yc71{bottom:117.201000px;} -.ydcb{bottom:117.251000px;} -.yd8d{bottom:117.285000px;} -.ya50{bottom:117.446000px;} -.y22a{bottom:117.458000px;} -.ydcd{bottom:117.500000px;} -.y1506{bottom:118.076000px;} -.yc53{bottom:118.149000px;} -.y5e7{bottom:118.229000px;} -.yc18{bottom:118.351000px;} -.y138b{bottom:118.391000px;} -.y1252{bottom:118.457680px;} -.yfcc{bottom:118.568000px;} -.y13e{bottom:118.612000px;} -.y13d3{bottom:118.675000px;} -.yfa5{bottom:118.693000px;} -.y8a9{bottom:118.766000px;} -.y4bb{bottom:118.967000px;} -.yd5c{bottom:119.000000px;} -.yacb{bottom:119.120000px;} -.ya2d{bottom:119.187000px;} -.y1253{bottom:119.195020px;} -.y85e{bottom:119.262000px;} -.ybb{bottom:119.329000px;} -.y961{bottom:119.500000px;} -.y12fe{bottom:119.511008px;} -.yf7a{bottom:119.613000px;} -.yc52{bottom:119.643000px;} -.y98f{bottom:119.692077px;} -.yc17{bottom:119.846000px;} -.y148e{bottom:119.876000px;} -.y5ef{bottom:119.909194px;} -.y685{bottom:119.919000px;} -.y7e1{bottom:120.238424px;} -.ya71{bottom:120.252000px;} -.ya4f{bottom:120.259000px;} -.y40f{bottom:120.416000px;} -.y50c{bottom:120.500000px;} -.y5f0{bottom:120.656344px;} -.yb1a{bottom:120.666000px;} -.y575{bottom:120.679246px;} -.y448{bottom:120.817000px;} +.y8f2{bottom:115.001415px;} +.y8ee{bottom:115.013000px;} +.y322{bottom:115.184000px;} +.y728{bottom:115.358000px;} +.y13a8{bottom:115.503000px;} +.y91b{bottom:115.518900px;} +.y10de{bottom:115.555721px;} +.y6a2{bottom:115.631423px;} +.y7b6{bottom:115.714912px;} +.y122f{bottom:115.740969px;} +.y10ae{bottom:115.760000px;} +.ye02{bottom:115.837000px;} +.y1410{bottom:115.847000px;} +.ybaf{bottom:115.888000px;} +.y1231{bottom:115.991656px;} +.y16f{bottom:116.018000px;} +.y1b9{bottom:116.024000px;} +.y4ae{bottom:116.155000px;} +.y6fd{bottom:116.169000px;} +.y2e4{bottom:116.340865px;} +.y13cb{bottom:116.372000px;} +.y14d0{bottom:116.446000px;} +.y11c5{bottom:116.634000px;} +.y321{bottom:116.678000px;} +.y12c2{bottom:116.762000px;} +.y5de{bottom:116.920595px;} +.y861{bottom:117.075000px;} +.y915{bottom:117.104651px;} +.y671{bottom:117.106000px;} +.yc3a{bottom:117.201000px;} +.yd90{bottom:117.251000px;} +.yd53{bottom:117.285000px;} +.ya25{bottom:117.446000px;} +.y224{bottom:117.458000px;} +.y14aa{bottom:118.076000px;} +.yc1d{bottom:118.149000px;} +.y5d5{bottom:118.229000px;} +.ybe4{bottom:118.351000px;} +.y1335{bottom:118.391000px;} +.y1202{bottom:118.457680px;} +.yf89{bottom:118.568000px;} +.y13f{bottom:118.612000px;} +.y137b{bottom:118.675000px;} +.yf62{bottom:118.693000px;} +.y887{bottom:118.766000px;} +.y4ad{bottom:118.967000px;} +.yd23{bottom:119.000000px;} +.ya9e{bottom:119.120000px;} +.ya03{bottom:119.187000px;} +.y1203{bottom:119.195020px;} +.y83d{bottom:119.262000px;} +.yba{bottom:119.329000px;} +.y12ab{bottom:119.511008px;} +.yf38{bottom:119.613000px;} +.yc1c{bottom:119.643000px;} +.y967{bottom:119.692077px;} +.ybe3{bottom:119.846000px;} +.y1434{bottom:119.876000px;} +.y5dc{bottom:119.909194px;} +.y670{bottom:119.919000px;} +.y7c3{bottom:120.238424px;} +.ya45{bottom:120.252000px;} +.ya24{bottom:120.259000px;} +.y405{bottom:120.416000px;} +.y5dd{bottom:120.656344px;} +.yaeb{bottom:120.666000px;} +.y563{bottom:120.679246px;} +.y43d{bottom:120.817000px;} .y84{bottom:120.823000px;} -.y83d{bottom:120.826000px;} -.y569{bottom:120.857000px;} -.y6b7{bottom:121.000000px;} -.yc88{bottom:121.186000px;} -.y6b4{bottom:121.217000px;} -.y1163{bottom:121.219000px;} -.y1a2{bottom:121.249243px;} -.y10d8{bottom:121.281000px;} -.y11ac{bottom:121.349000px;} -.y1df{bottom:121.350000px;} -.y1c0{bottom:121.500000px;} -.y1178{bottom:121.551000px;} -.yb46{bottom:121.600000px;} -.y99a{bottom:121.652085px;} -.y100d{bottom:121.703000px;} -.yaf3{bottom:121.742000px;} -.y1451{bottom:121.747000px;} -.yf54{bottom:121.785454px;} -.y66a{bottom:121.838260px;} -.y133b{bottom:121.978000px;} -.y13d5{bottom:122.000000px;} -.y64d{bottom:122.198180px;} -.y13f{bottom:122.227000px;} -.yece{bottom:122.304000px;} -.y7cd{bottom:122.346000px;} -.y8aa{bottom:122.382000px;} -.y1095{bottom:122.484000px;} -.y173{bottom:122.500000px;} -.y148d{bottom:122.689000px;} -.y170{bottom:122.710000px;} -.y12eb{bottom:122.829000px;} -.y85f{bottom:122.877000px;} -.y8ee{bottom:122.983000px;} -.y12ed{bottom:123.000000px;} -.y1213{bottom:123.326000px;} -.y573{bottom:123.429946px;} -.y1240{bottom:123.630000px;} -.y568{bottom:123.670000px;} -.y992{bottom:123.722026px;} -.ydca{bottom:123.942000px;} -.y46b{bottom:124.043423px;} -.y574{bottom:124.117621px;} -.yc9b{bottom:124.165000px;} -.y1132{bottom:124.364211px;} -.yb8b{bottom:124.520000px;} -.yaf2{bottom:124.555000px;} -.y73f{bottom:124.823000px;} -.y64e{bottom:124.982180px;} -.y941{bottom:125.108332px;} -.y1127{bottom:125.126661px;} -.y1468{bottom:125.312000px;} -.y149b{bottom:125.334000px;} -.y509{bottom:125.381000px;} -.y258{bottom:125.414000px;} -.y16f{bottom:125.523000px;} -.y133c{bottom:125.593000px;} -.y4ba{bottom:125.659000px;} -.y64c{bottom:125.678180px;} -.y109{bottom:125.798000px;} -.y158b{bottom:126.000000px;} -.y1212{bottom:126.139000px;} -.y3c8{bottom:126.400000px;} -.y670{bottom:126.500000px;} -.y1280{bottom:126.505375px;} -.ydf2{bottom:126.560000px;} -.y1031{bottom:126.568000px;} -.y480{bottom:126.572000px;} -.y947{bottom:126.740878px;} -.y18a{bottom:126.761998px;} +.y81c{bottom:120.826000px;} +.y558{bottom:120.857000px;} +.yc50{bottom:121.186000px;} +.y69e{bottom:121.217000px;} +.y1118{bottom:121.219000px;} +.y19f{bottom:121.249243px;} +.y108f{bottom:121.281000px;} +.y115f{bottom:121.349000px;} +.y1da{bottom:121.350000px;} +.y112c{bottom:121.551000px;} +.yb16{bottom:121.600000px;} +.y972{bottom:121.652085px;} +.yfc7{bottom:121.703000px;} +.yac5{bottom:121.742000px;} +.y13f8{bottom:121.747000px;} +.yf12{bottom:121.785454px;} +.y656{bottom:121.838260px;} +.y12e7{bottom:121.978000px;} +.y639{bottom:122.198180px;} +.y140{bottom:122.227000px;} +.ye8f{bottom:122.304000px;} +.y7b1{bottom:122.346000px;} +.y888{bottom:122.382000px;} +.y104d{bottom:122.484000px;} +.y1433{bottom:122.689000px;} +.y16e{bottom:122.710000px;} +.y1299{bottom:122.829000px;} +.y83e{bottom:122.877000px;} +.y8ca{bottom:122.983000px;} +.y11c4{bottom:123.326000px;} +.y561{bottom:123.429946px;} +.y11f1{bottom:123.630000px;} +.y557{bottom:123.670000px;} +.y96a{bottom:123.722026px;} +.yd8f{bottom:123.942000px;} +.y45f{bottom:124.043423px;} +.y562{bottom:124.117621px;} +.yc63{bottom:124.165000px;} +.y10e8{bottom:124.364211px;} +.yb59{bottom:124.520000px;} +.yac4{bottom:124.555000px;} +.y727{bottom:124.823000px;} +.y63a{bottom:124.982180px;} +.y91a{bottom:125.108332px;} +.y10dd{bottom:125.126661px;} +.y140f{bottom:125.312000px;} +.y1440{bottom:125.334000px;} +.y4fa{bottom:125.381000px;} +.y252{bottom:125.414000px;} +.y16d{bottom:125.523000px;} +.y12e8{bottom:125.593000px;} +.y4ac{bottom:125.659000px;} +.y638{bottom:125.678180px;} +.ye0{bottom:125.798000px;} +.y11c3{bottom:126.139000px;} +.y3bf{bottom:126.400000px;} +.y1230{bottom:126.505375px;} +.ydb6{bottom:126.560000px;} +.yfea{bottom:126.568000px;} +.y474{bottom:126.572000px;} +.y920{bottom:126.740878px;} +.y187{bottom:126.761998px;} .y54{bottom:126.801000px;} -.y912{bottom:126.968000px;} -.y592{bottom:127.286891px;} -.y127e{bottom:127.402945px;} -.yd10{bottom:127.415000px;} -.y917{bottom:127.566386px;} -.ycf0{bottom:127.589000px;} -.y73e{bottom:127.635000px;} -.y988{bottom:127.715000px;} -.ye3e{bottom:127.792000px;} -.y940{bottom:128.083871px;} -.y1467{bottom:128.125000px;} -.y256{bottom:128.235000px;} -.y539{bottom:128.277000px;} -.y77e{bottom:128.422000px;} -.yc37{bottom:128.423000px;} -.y327{bottom:128.633000px;} -.y12c8{bottom:128.737000px;} -.y383{bottom:128.794000px;} -.y15fb{bottom:128.803000px;} -.y713{bottom:128.988000px;} -.y9b5{bottom:129.000000px;} -.y882{bottom:129.030000px;} -.y1120{bottom:129.076000px;} -.yc70{bottom:129.156000px;} -.yd8c{bottom:129.240000px;} -.y14b6{bottom:129.347000px;} -.y148c{bottom:129.381000px;} -.y229{bottom:129.414000px;} -.y18b{bottom:129.637018px;} -.y6e7{bottom:129.660000px;} -.y53c{bottom:130.000000px;} -.y1505{bottom:130.031000px;} -.y5e6{bottom:130.184000px;} -.y447{bottom:130.281000px;} -.y83c{bottom:130.291000px;} -.ye1d{bottom:130.321000px;} -.y138a{bottom:130.346000px;} -.y189{bottom:130.355773px;} -.y591{bottom:130.381428px;} -.yfcb{bottom:130.523000px;} -.y13d{bottom:130.567000px;} -.y13d2{bottom:130.630000px;} -.yfa4{bottom:130.648000px;} -.y8a8{bottom:130.722000px;} -.y1bb{bottom:130.780000px;} -.y1400{bottom:130.812000px;} -.yd5b{bottom:130.955000px;} -.yacc{bottom:131.000000px;} -.yaca{bottom:131.075000px;} -.ya2b{bottom:131.142000px;} -.y85d{bottom:131.217000px;} -.y5ee{bottom:131.240967px;} -.yba{bottom:131.284000px;} -.y152b{bottom:131.479000px;} -.y1314{bottom:131.518000px;} -.yf79{bottom:131.568000px;} -.y1423{bottom:131.681000px;} -.yecd{bottom:131.769000px;} -.yc16{bottom:131.801000px;} -.y257{bottom:131.851000px;} -.y1094{bottom:131.948000px;} -.ycc1{bottom:131.994000px;} -.y143{bottom:132.000000px;} -.ya70{bottom:132.207000px;} -.ye66{bottom:132.232000px;} -.y40e{bottom:132.371000px;} -.y384{bottom:132.410000px;} -.y9b4{bottom:132.459000px;} -.y11e6{bottom:132.500000px;} -.yb19{bottom:132.621000px;} -.y15f9{bottom:132.638000px;} -.y1287{bottom:132.681587px;} -.y1121{bottom:132.691000px;} -.y1251{bottom:132.693263px;} -.y1a1{bottom:132.749323px;} -.y7fe{bottom:132.751000px;} -.yf18{bottom:132.752236px;} +.y8ed{bottom:126.968000px;} +.y580{bottom:127.286891px;} +.y122e{bottom:127.402945px;} +.ycd7{bottom:127.415000px;} +.y8f1{bottom:127.566386px;} +.ycb7{bottom:127.589000px;} +.y726{bottom:127.635000px;} +.y961{bottom:127.715000px;} +.ye01{bottom:127.792000px;} +.y919{bottom:128.083871px;} +.y140e{bottom:128.125000px;} +.y250{bottom:128.235000px;} +.y529{bottom:128.277000px;} +.y764{bottom:128.422000px;} +.yc02{bottom:128.423000px;} +.y320{bottom:128.633000px;} +.y1278{bottom:128.737000px;} +.y37b{bottom:128.794000px;} +.y159d{bottom:128.803000px;} +.y6fc{bottom:128.988000px;} +.y860{bottom:129.030000px;} +.y10d6{bottom:129.076000px;} +.yc39{bottom:129.156000px;} +.yd52{bottom:129.240000px;} +.y145b{bottom:129.347000px;} +.y1432{bottom:129.381000px;} +.y223{bottom:129.414000px;} +.y188{bottom:129.637018px;} +.y6d0{bottom:129.660000px;} +.y14a9{bottom:130.031000px;} +.y5d4{bottom:130.184000px;} +.y43c{bottom:130.281000px;} +.y81b{bottom:130.291000px;} +.yde1{bottom:130.321000px;} +.y1334{bottom:130.346000px;} +.y186{bottom:130.355773px;} +.y57f{bottom:130.381428px;} +.yf88{bottom:130.523000px;} +.y13e{bottom:130.567000px;} +.y137a{bottom:130.630000px;} +.yf61{bottom:130.648000px;} +.y886{bottom:130.722000px;} +.y1b8{bottom:130.780000px;} +.y13a7{bottom:130.812000px;} +.yd22{bottom:130.955000px;} +.ya9d{bottom:131.075000px;} +.ya01{bottom:131.142000px;} +.y83c{bottom:131.217000px;} +.y5db{bottom:131.240967px;} +.yb9{bottom:131.284000px;} +.y14cf{bottom:131.479000px;} +.y12c1{bottom:131.518000px;} +.yf37{bottom:131.568000px;} +.y13ca{bottom:131.681000px;} +.ye8e{bottom:131.769000px;} +.ybe2{bottom:131.801000px;} +.y251{bottom:131.851000px;} +.y104c{bottom:131.948000px;} +.yc89{bottom:131.994000px;} +.ya44{bottom:132.207000px;} +.ye28{bottom:132.232000px;} +.y404{bottom:132.371000px;} +.y37c{bottom:132.410000px;} +.y98c{bottom:132.459000px;} +.yaea{bottom:132.621000px;} +.y159b{bottom:132.638000px;} +.y1237{bottom:132.681587px;} +.y10d7{bottom:132.691000px;} +.y1201{bottom:132.693263px;} +.y19e{bottom:132.749323px;} +.y7e0{bottom:132.751000px;} +.yed6{bottom:132.752236px;} .y83{bottom:132.778000px;} .y9d{bottom:132.779000px;} -.y669{bottom:132.974260px;} -.y446{bottom:133.094000px;} -.y83b{bottom:133.104000px;} -.ye1c{bottom:133.134000px;} -.y6b3{bottom:133.172000px;} -.y1162{bottom:133.174000px;} -.y10d7{bottom:133.237000px;} -.yf53{bottom:133.245529px;} -.y11ab{bottom:133.305000px;} -.ydc9{bottom:133.407000px;} -.y1177{bottom:133.506000px;} -.yb45{bottom:133.556000px;} -.yc9a{bottom:133.629000px;} -.y1450{bottom:133.702000px;} -.y572{bottom:133.859687px;} -.y7e8{bottom:133.918534px;} -.ybb6{bottom:134.000000px;} -.y5ec{bottom:134.229567px;} -.y7cc{bottom:134.301000px;} -.y73d{bottom:134.327000px;} -.ye67{bottom:134.500000px;} -.yecc{bottom:134.581000px;} -.y1126{bottom:134.672026px;} -.ya2c{bottom:134.758000px;} -.y1093{bottom:134.761000px;} -.y12ea{bottom:134.784000px;} -.y8ed{bottom:134.938000px;} -.y684{bottom:134.952000px;} -.y5ed{bottom:134.976717px;} -.y4b9{bottom:135.123000px;} -.y8cc{bottom:135.664000px;} +.y655{bottom:132.974260px;} +.y43b{bottom:133.094000px;} +.y81a{bottom:133.104000px;} +.yde0{bottom:133.134000px;} +.y69d{bottom:133.172000px;} +.y1117{bottom:133.174000px;} +.y108e{bottom:133.237000px;} +.yf11{bottom:133.245529px;} +.y115e{bottom:133.305000px;} +.yd8e{bottom:133.407000px;} +.y112b{bottom:133.506000px;} +.yb15{bottom:133.556000px;} +.yc62{bottom:133.629000px;} +.y13f7{bottom:133.702000px;} +.y560{bottom:133.859687px;} +.y7ca{bottom:133.918534px;} +.y5d9{bottom:134.229567px;} +.y7b0{bottom:134.301000px;} +.y725{bottom:134.327000px;} +.ye8d{bottom:134.581000px;} +.y10dc{bottom:134.672026px;} +.ya02{bottom:134.758000px;} +.y104b{bottom:134.761000px;} +.y1298{bottom:134.784000px;} +.y8c9{bottom:134.938000px;} +.y66f{bottom:134.952000px;} +.y5da{bottom:134.976717px;} +.y4ab{bottom:135.123000px;} +.y8a9{bottom:135.664000px;} .y7{bottom:135.992197px;} -.ydc8{bottom:136.220000px;} -.yc99{bottom:136.442000px;} -.yb8a{bottom:136.475000px;} -.y570{bottom:136.610386px;} -.ya4e{bottom:136.664000px;} -.y994{bottom:136.715000px;} -.y15fa{bottom:136.773000px;} -.yb66{bottom:137.015000px;} -.ycef{bottom:137.054000px;} -.y253{bottom:137.185000px;} -.y468{bottom:137.205709px;} -.y149a{bottom:137.290000px;} -.y571{bottom:137.298061px;} -.y508{bottom:137.337000px;} -.y255{bottom:137.369000px;} -.y123f{bottom:137.645000px;} -.y93f{bottom:137.673303px;} -.y5b6{bottom:137.753000px;} -.y62c{bottom:137.783000px;} -.y4b8{bottom:137.936000px;} -.ybe2{bottom:138.205000px;} -.y567{bottom:138.311000px;} -.y3c6{bottom:138.355000px;} -.ydf1{bottom:138.515000px;} -.y47f{bottom:138.527000px;} -.ye8b{bottom:138.555000px;} -.ydf{bottom:138.709000px;} +.yd8d{bottom:136.220000px;} +.yc61{bottom:136.442000px;} +.yb58{bottom:136.475000px;} +.y55e{bottom:136.610386px;} +.ya23{bottom:136.664000px;} +.y96c{bottom:136.715000px;} +.y159c{bottom:136.773000px;} +.yb35{bottom:137.015000px;} +.ycb6{bottom:137.054000px;} +.y24d{bottom:137.185000px;} +.y45c{bottom:137.205709px;} +.y143f{bottom:137.290000px;} +.y55f{bottom:137.298061px;} +.y4f9{bottom:137.337000px;} +.y24f{bottom:137.369000px;} +.y11f0{bottom:137.645000px;} +.y918{bottom:137.673303px;} +.y5a4{bottom:137.753000px;} +.y619{bottom:137.783000px;} +.y4aa{bottom:137.936000px;} +.ybae{bottom:138.205000px;} +.y556{bottom:138.311000px;} +.y3bd{bottom:138.355000px;} +.ydb5{bottom:138.515000px;} +.y473{bottom:138.527000px;} +.ye4c{bottom:138.555000px;} .y53{bottom:138.756000px;} -.y148b{bottom:138.845000px;} -.yc36{bottom:138.884000px;} -.y911{bottom:138.923000px;} -.y64a{bottom:139.097645px;} -.y9dc{bottom:139.113000px;} -.yaf1{bottom:139.310000px;} -.yd0f{bottom:139.370000px;} -.y828{bottom:139.500000px;} -.y987{bottom:139.670000px;} -.y445{bottom:139.786000px;} -.yf4c{bottom:139.834000px;} -.ycee{bottom:139.866000px;} -.y916{bottom:140.131357px;} -.y251{bottom:140.191000px;} -.y538{bottom:140.232000px;} -.y16e{bottom:140.278000px;} -.y77d{bottom:140.377000px;} -.yc35{bottom:140.379000px;} -.y1250{bottom:140.393549px;} -.y1264{bottom:140.414163px;} -.y326{bottom:140.588000px;} -.y93e{bottom:140.648842px;} -.y12c7{bottom:140.692000px;} -.y467{bottom:140.891262px;} -.y464{bottom:140.891665px;} -.y1211{bottom:140.894000px;} -.yd33{bottom:140.929000px;} -.y712{bottom:140.943000px;} -.y881{bottom:140.985000px;} -.y111f{bottom:141.031000px;} -.yc6f{bottom:141.111000px;} -.yd8b{bottom:141.195000px;} -.yecb{bottom:141.273000px;} -.y1dd{bottom:141.275000px;} -.y14b4{bottom:141.302000px;} -.ya9d{bottom:141.388000px;} -.y1092{bottom:141.452000px;} -.y6e6{bottom:141.615000px;} -.y148a{bottom:141.658000px;} -.y64b{bottom:141.881646px;} -.y133a{bottom:141.903000px;} -.y3c7{bottom:141.971000px;} -.y1504{bottom:141.986000px;} -.y7ea{bottom:142.059930px;} -.y5e5{bottom:142.139000px;} -.y228{bottom:142.192000px;} -.y1389{bottom:142.301000px;} -.yfca{bottom:142.479000px;} -.ydaf{bottom:142.500000px;} -.y13c{bottom:142.522000px;} -.y649{bottom:142.577645px;} -.y13d1{bottom:142.585000px;} -.yfa3{bottom:142.603000px;} -.y8a7{bottom:142.677000px;} -.y1ba{bottom:142.735000px;} -.y13ff{bottom:142.767000px;} -.yac9{bottom:143.030000px;} -.yc98{bottom:143.133000px;} -.yb9{bottom:143.240000px;} -.y1466{bottom:143.434000px;} -.y1313{bottom:143.473000px;} -.y6c2{bottom:143.505790px;} -.yf78{bottom:143.523000px;} -.y100c{bottom:143.524000px;} -.y1422{bottom:143.637000px;} -.y7e7{bottom:143.723989px;} -.yc15{bottom:143.756000px;} -.y73c{bottom:143.791000px;} -.y254{bottom:143.806000px;} -.ycc0{bottom:143.949000px;} -.y668{bottom:144.110261px;} -.ya9c{bottom:144.201000px;} -.y187{bottom:144.213981px;} -.y1a0{bottom:144.249404px;} -.y1091{bottom:144.265000px;} -.y108{bottom:144.301000px;} -.y40d{bottom:144.326000px;} -.y9b3{bottom:144.414000px;} -.y252{bottom:144.452000px;} -.y4b7{bottom:144.628000px;} -.ye1b{bottom:144.705000px;} -.y7fd{bottom:144.707000px;} +.y1431{bottom:138.845000px;} +.yc01{bottom:138.884000px;} +.y8ec{bottom:138.923000px;} +.y636{bottom:139.097645px;} +.y9b3{bottom:139.113000px;} +.yac3{bottom:139.310000px;} +.ycd6{bottom:139.370000px;} +.y960{bottom:139.670000px;} +.y43a{bottom:139.786000px;} +.yf0a{bottom:139.834000px;} +.ycb5{bottom:139.866000px;} +.y8f0{bottom:140.131357px;} +.y24b{bottom:140.191000px;} +.y528{bottom:140.232000px;} +.y16c{bottom:140.278000px;} +.y763{bottom:140.377000px;} +.yc00{bottom:140.379000px;} +.y1200{bottom:140.393549px;} +.y1214{bottom:140.414163px;} +.y31f{bottom:140.588000px;} +.y917{bottom:140.648842px;} +.y1277{bottom:140.692000px;} +.y45b{bottom:140.891262px;} +.y458{bottom:140.891665px;} +.y11c2{bottom:140.894000px;} +.ycfa{bottom:140.929000px;} +.y6fb{bottom:140.943000px;} +.y85f{bottom:140.985000px;} +.y10d5{bottom:141.031000px;} +.yc38{bottom:141.111000px;} +.yd51{bottom:141.195000px;} +.ye8c{bottom:141.273000px;} +.y1d8{bottom:141.275000px;} +.y1459{bottom:141.302000px;} +.ya70{bottom:141.388000px;} +.y104a{bottom:141.452000px;} +.y6cf{bottom:141.615000px;} +.y1430{bottom:141.658000px;} +.y637{bottom:141.881646px;} +.y12e6{bottom:141.903000px;} +.y3be{bottom:141.971000px;} +.y14a8{bottom:141.986000px;} +.y7cc{bottom:142.059930px;} +.y5d3{bottom:142.139000px;} +.y222{bottom:142.192000px;} +.y1333{bottom:142.301000px;} +.yf87{bottom:142.479000px;} +.y13d{bottom:142.522000px;} +.y635{bottom:142.577645px;} +.y1379{bottom:142.585000px;} +.yf60{bottom:142.603000px;} +.y885{bottom:142.677000px;} +.y1b7{bottom:142.735000px;} +.y13a6{bottom:142.767000px;} +.ya9c{bottom:143.030000px;} +.yc60{bottom:143.133000px;} +.y140d{bottom:143.434000px;} +.y12c0{bottom:143.473000px;} +.y6ab{bottom:143.505790px;} +.yf36{bottom:143.523000px;} +.yfc6{bottom:143.524000px;} +.y13c9{bottom:143.637000px;} +.y7c9{bottom:143.723989px;} +.ybe1{bottom:143.756000px;} +.y724{bottom:143.791000px;} +.y24e{bottom:143.806000px;} +.yc88{bottom:143.949000px;} +.y654{bottom:144.110261px;} +.ya6f{bottom:144.201000px;} +.y184{bottom:144.213981px;} +.y19d{bottom:144.249404px;} +.y1049{bottom:144.265000px;} +.y10b{bottom:144.301000px;} +.y403{bottom:144.326000px;} +.y98b{bottom:144.414000px;} +.y24c{bottom:144.452000px;} +.y4a9{bottom:144.628000px;} +.yddf{bottom:144.705000px;} +.y7df{bottom:144.707000px;} .y82{bottom:144.734000px;} -.y93a{bottom:144.828000px;} -.y1de{bottom:144.890000px;} -.y14b5{bottom:144.918000px;} -.y6b2{bottom:145.128000px;} -.y1161{bottom:145.129000px;} -.y15f8{bottom:145.141000px;} -.y10d6{bottom:145.192000px;} -.yc51{bottom:145.203000px;} -.y11aa{bottom:145.260000px;} -.y1176{bottom:145.461000px;} -.yb44{bottom:145.511000px;} -.y1124{bottom:145.548240px;} -.y144f{bottom:145.657000px;} -.y7cb{bottom:146.256000px;} -.ycc2{bottom:146.500000px;} -.y224{bottom:146.604000px;} -.y12e9{bottom:146.739000px;} -.y124f{bottom:146.825613px;} -.y8ec{bottom:146.893000px;} -.y14df{bottom:146.950000px;} -.y56f{bottom:147.040122px;} -.y188{bottom:147.089001px;} -.y4b6{bottom:147.441000px;} -.y5eb{bottom:147.653263px;} -.y186{bottom:147.807755px;} -.y6c4{bottom:147.883224px;} -.y146a{bottom:148.000000px;} -.y100f{bottom:148.500000px;} -.yb65{bottom:148.971000px;} -.y15f6{bottom:148.977000px;} -.y1191{bottom:149.216000px;} -.y382{bottom:149.218000px;} -.y1499{bottom:149.245000px;} -.y444{bottom:149.250000px;} -.y123e{bottom:149.600000px;} -.y5b5{bottom:149.709000px;} -.y62b{bottom:149.738000px;} -.y56d{bottom:149.790821px;} -.ybdf{bottom:150.060000px;} -.ybe1{bottom:150.160000px;} -.y566{bottom:150.266000px;} -.ydf0{bottom:150.470000px;} -.y56e{bottom:150.478497px;} -.y47e{bottom:150.482000px;} -.y9fe{bottom:150.491000px;} -.ye8a{bottom:150.510000px;} -.yde{bottom:150.664000px;} +.y914{bottom:144.828000px;} +.y1d9{bottom:144.890000px;} +.y145a{bottom:144.918000px;} +.y69c{bottom:145.128000px;} +.y1116{bottom:145.129000px;} +.y159a{bottom:145.141000px;} +.y108d{bottom:145.192000px;} +.yc1b{bottom:145.203000px;} +.ydf{bottom:145.248000px;} +.y115d{bottom:145.260000px;} +.y112a{bottom:145.461000px;} +.yb14{bottom:145.511000px;} +.y10da{bottom:145.548240px;} +.y13f6{bottom:145.657000px;} +.y7af{bottom:146.256000px;} +.y21e{bottom:146.604000px;} +.y1297{bottom:146.739000px;} +.y11ff{bottom:146.825613px;} +.y8c8{bottom:146.893000px;} +.y1484{bottom:146.950000px;} +.y55d{bottom:147.040122px;} +.y185{bottom:147.089001px;} +.y4a8{bottom:147.441000px;} +.y5d8{bottom:147.653263px;} +.y183{bottom:147.807755px;} +.y6ad{bottom:147.883224px;} +.yb34{bottom:148.971000px;} +.y1598{bottom:148.977000px;} +.y1145{bottom:149.216000px;} +.y37a{bottom:149.218000px;} +.y143e{bottom:149.245000px;} +.y439{bottom:149.250000px;} +.y11ef{bottom:149.600000px;} +.y5a3{bottom:149.709000px;} +.y618{bottom:149.738000px;} +.y55b{bottom:149.790821px;} +.ybab{bottom:150.060000px;} +.ybad{bottom:150.160000px;} +.y555{bottom:150.266000px;} +.ydb4{bottom:150.470000px;} +.y55c{bottom:150.478497px;} +.y472{bottom:150.482000px;} +.y9d4{bottom:150.491000px;} +.ye4b{bottom:150.510000px;} .y52{bottom:150.711000px;} -.y381{bottom:150.712000px;} -.yeca{bottom:150.737000px;} -.y85c{bottom:150.753000px;} -.y910{bottom:150.878000px;} -.ya9b{bottom:150.892000px;} -.y1090{bottom:150.957000px;} -.y9db{bottom:151.068000px;} -.yaef{bottom:151.266000px;} -.yd0e{bottom:151.326000px;} -.y152a{bottom:151.404000px;} -.ydc7{bottom:151.529000px;} -.y10f7{bottom:151.625000px;} -.y986{bottom:151.626000px;} -.y227{bottom:151.684000px;} -.yf4b{bottom:151.789000px;} -.y6c1{bottom:151.909540px;} -.y915{bottom:151.909575px;} -.y1e0{bottom:152.000000px;} -.y1030{bottom:152.042000px;} -.y443{bottom:152.063000px;} -.y250{bottom:152.146000px;} -.y537{bottom:152.187000px;} -.y16d{bottom:152.233000px;} -.y77c{bottom:152.332000px;} -.y325{bottom:152.543000px;} -.yc97{bottom:152.598000px;} -.y12c6{bottom:152.647000px;} -.yd5a{bottom:152.776000px;} -.y98c{bottom:152.777545px;} -.y1210{bottom:152.849000px;} -.yd32{bottom:152.884000px;} -.y711{bottom:152.898000px;} -.y880{bottom:152.941000px;} -.y111e{bottom:152.986000px;} -.y717{bottom:153.000000px;} -.yc6e{bottom:153.067000px;} -.y15f7{bottom:153.112000px;} -.y14b3{bottom:153.258000px;} -.yf25{bottom:153.305000px;} -.y7e6{bottom:153.529445px;} -.yec9{bottom:153.550000px;} -.y6e5{bottom:153.570000px;} -.y7e9{bottom:153.648195px;} -.ya9a{bottom:153.705000px;} -.y108f{bottom:153.770000px;} -.y1339{bottom:153.858000px;} -.y1503{bottom:153.941000px;} -.y483{bottom:154.000000px;} -.y46a{bottom:154.053950px;} -.y5e4{bottom:154.094000px;} -.y1388{bottom:154.257000px;} -.y98b{bottom:154.500000px;} -.y13d0{bottom:154.540000px;} -.yfa2{bottom:154.559000px;} -.y8a6{bottom:154.632000px;} -.y1b9{bottom:154.690000px;} -.y13fe{bottom:154.722000px;} -.yaf0{bottom:154.881000px;} -.yac8{bottom:154.986000px;} -.y98e{bottom:155.046000px;} -.y667{bottom:155.246261px;} -.y1465{bottom:155.389000px;} -.yc96{bottom:155.411000px;} -.y1312{bottom:155.428000px;} -.yf77{bottom:155.478000px;} -.ye3d{bottom:155.480000px;} -.y1421{bottom:155.592000px;} -.yc50{bottom:155.664000px;} -.yc14{bottom:155.711000px;} -.y226{bottom:155.896000px;} -.ycbf{bottom:155.904000px;} -.ya2a{bottom:155.943000px;} -.y647{bottom:155.997121px;} -.yf24{bottom:156.118000px;} -.y107{bottom:156.256000px;} -.y40c{bottom:156.281000px;} -.y9b2{bottom:156.369000px;} -.y1489{bottom:156.414000px;} -.ye1a{bottom:156.661000px;} -.y7fc{bottom:156.662000px;} +.y379{bottom:150.712000px;} +.ye8b{bottom:150.737000px;} +.y83b{bottom:150.753000px;} +.y8eb{bottom:150.878000px;} +.ya6e{bottom:150.892000px;} +.y1048{bottom:150.957000px;} +.y9b2{bottom:151.068000px;} +.yb8{bottom:151.210000px;} +.yac1{bottom:151.266000px;} +.ycd5{bottom:151.326000px;} +.y14ce{bottom:151.404000px;} +.yd8c{bottom:151.529000px;} +.y10ad{bottom:151.625000px;} +.y95f{bottom:151.626000px;} +.y221{bottom:151.684000px;} +.yf09{bottom:151.789000px;} +.y6aa{bottom:151.909540px;} +.y8ef{bottom:151.909575px;} +.yfe9{bottom:152.042000px;} +.y438{bottom:152.063000px;} +.y24a{bottom:152.146000px;} +.y527{bottom:152.187000px;} +.y16b{bottom:152.233000px;} +.y762{bottom:152.332000px;} +.y31e{bottom:152.543000px;} +.yc5f{bottom:152.598000px;} +.y1276{bottom:152.647000px;} +.yd21{bottom:152.776000px;} +.y964{bottom:152.777545px;} +.y11c1{bottom:152.849000px;} +.ycf9{bottom:152.884000px;} +.y6fa{bottom:152.898000px;} +.y85e{bottom:152.941000px;} +.y10d4{bottom:152.986000px;} +.yc37{bottom:153.067000px;} +.y1599{bottom:153.112000px;} +.y1458{bottom:153.258000px;} +.yee3{bottom:153.305000px;} +.y7c8{bottom:153.529445px;} +.ye8a{bottom:153.550000px;} +.y6ce{bottom:153.570000px;} +.y7cb{bottom:153.648195px;} +.ya6d{bottom:153.705000px;} +.y1047{bottom:153.770000px;} +.y12e5{bottom:153.858000px;} +.y14a7{bottom:153.941000px;} +.y45e{bottom:154.053950px;} +.y5d2{bottom:154.094000px;} +.y1332{bottom:154.257000px;} +.y1378{bottom:154.540000px;} +.yf5f{bottom:154.559000px;} +.y884{bottom:154.632000px;} +.y1b6{bottom:154.690000px;} +.y13a5{bottom:154.722000px;} +.yac2{bottom:154.881000px;} +.ya9b{bottom:154.986000px;} +.y966{bottom:155.046000px;} +.y653{bottom:155.246261px;} +.y140c{bottom:155.389000px;} +.yc5e{bottom:155.411000px;} +.y12bf{bottom:155.428000px;} +.yf35{bottom:155.478000px;} +.ye00{bottom:155.480000px;} +.y13c8{bottom:155.592000px;} +.yc1a{bottom:155.664000px;} +.ybe0{bottom:155.711000px;} +.y220{bottom:155.896000px;} +.yc87{bottom:155.904000px;} +.ya00{bottom:155.943000px;} +.y633{bottom:155.997121px;} +.yee2{bottom:156.118000px;} +.y10a{bottom:156.256000px;} +.y402{bottom:156.281000px;} +.y98a{bottom:156.369000px;} +.y142f{bottom:156.414000px;} +.ydde{bottom:156.661000px;} +.y7de{bottom:156.662000px;} .y81{bottom:156.689000px;} -.y939{bottom:156.784000px;} -.y221{bottom:156.864000px;} -.y683{bottom:156.870000px;} -.y6b1{bottom:157.083000px;} -.y10d5{bottom:157.147000px;} -.yc4f{bottom:157.158000px;} -.y11a9{bottom:157.215000px;} -.y1175{bottom:157.416000px;} -.yb43{bottom:157.466000px;} -.yb18{bottom:157.486000px;} -.y144e{bottom:157.612000px;} -.y469{bottom:157.739502px;} -.y465{bottom:157.739904px;} -.ya6f{bottom:157.767000px;} -.yc19{bottom:158.000000px;} -.y7a4{bottom:158.334000px;} -.y220{bottom:158.359000px;} -.y411{bottom:158.500000px;} -.y1a4{bottom:158.505665px;} -.y1190{bottom:158.680000px;} -.y12e8{bottom:158.694000px;} -.yc34{bottom:158.710000px;} -.y648{bottom:158.781121px;} -.y8eb{bottom:158.849000px;} -.y14de{bottom:158.905000px;} -.ya4d{bottom:158.981000px;} -.y6c3{bottom:159.088224px;} -.y507{bottom:159.158000px;} -.y1123{bottom:159.198976px;} -.y646{bottom:159.477121px;} -.y10b2{bottom:159.797000px;} -.yb89{bottom:159.956000px;} -.ye41{bottom:160.000000px;} -.y11e5{bottom:160.092000px;} -.y6c0{bottom:160.313290px;} -.ya99{bottom:160.397000px;} -.y108e{bottom:160.461000px;} -.y124d{bottom:160.854735px;} -.yfc9{bottom:160.868000px;} -.y66f{bottom:161.054000px;} -.y1dc{bottom:161.200000px;} -.y73b{bottom:161.360000px;} -.y15f4{bottom:161.480000px;} -.y118f{bottom:161.493000px;} -.y123d{bottom:161.555000px;} -.y322{bottom:161.571000px;} -.y124e{bottom:161.592075px;} -.y15f5{bottom:161.630000px;} -.y5b4{bottom:161.664000px;} -.y184{bottom:161.665950px;} -.y324{bottom:161.755000px;} -.yc89{bottom:162.000000px;} -.ybe0{bottom:162.115000px;} -.y56c{bottom:162.145959px;} -.y4b5{bottom:162.196000px;} -.y565{bottom:162.221000px;} -.y13b{bottom:162.328000px;} -.y9fd{bottom:162.446000px;} -.ye89{bottom:162.466000px;} -.y225{bottom:162.472000px;} -.yced{bottom:162.606000px;} -.ydd{bottom:162.619000px;} +.y913{bottom:156.784000px;} +.y21b{bottom:156.864000px;} +.y66e{bottom:156.870000px;} +.y69b{bottom:157.083000px;} +.y108c{bottom:157.147000px;} +.yc19{bottom:157.158000px;} +.yde{bottom:157.203000px;} +.y115c{bottom:157.215000px;} +.y1129{bottom:157.416000px;} +.yb13{bottom:157.466000px;} +.yae9{bottom:157.486000px;} +.y13f5{bottom:157.612000px;} +.y45d{bottom:157.739502px;} +.y459{bottom:157.739904px;} +.ya43{bottom:157.767000px;} +.y789{bottom:158.334000px;} +.y21a{bottom:158.359000px;} +.y1a1{bottom:158.505665px;} +.y1144{bottom:158.680000px;} +.y1296{bottom:158.694000px;} +.ybff{bottom:158.710000px;} +.y634{bottom:158.781121px;} +.y8c7{bottom:158.849000px;} +.y1483{bottom:158.905000px;} +.ya22{bottom:158.981000px;} +.y6ac{bottom:159.088224px;} +.y4f8{bottom:159.158000px;} +.y10d9{bottom:159.198976px;} +.y632{bottom:159.477121px;} +.y1069{bottom:159.797000px;} +.yb57{bottom:159.956000px;} +.y1197{bottom:160.092000px;} +.y6a9{bottom:160.313290px;} +.ya6c{bottom:160.397000px;} +.y1046{bottom:160.461000px;} +.y11fd{bottom:160.854735px;} +.yf86{bottom:160.868000px;} +.y65b{bottom:161.054000px;} +.y1d7{bottom:161.200000px;} +.y723{bottom:161.360000px;} +.y1596{bottom:161.480000px;} +.y1143{bottom:161.493000px;} +.y11ee{bottom:161.555000px;} +.y31b{bottom:161.571000px;} +.y11fe{bottom:161.592075px;} +.y1597{bottom:161.630000px;} +.y5a2{bottom:161.664000px;} +.y181{bottom:161.665950px;} +.y31d{bottom:161.755000px;} +.ybac{bottom:162.115000px;} +.y55a{bottom:162.145959px;} +.y4a7{bottom:162.196000px;} +.y554{bottom:162.221000px;} +.y13c{bottom:162.328000px;} +.y9d3{bottom:162.446000px;} +.ye4a{bottom:162.466000px;} +.y21f{bottom:162.472000px;} +.ycb4{bottom:162.606000px;} .y51{bottom:162.666000px;} -.y85b{bottom:162.708000px;} -.yf23{bottom:162.810000px;} -.y90f{bottom:162.834000px;} -.yd5d{bottom:163.000000px;} -.y9da{bottom:163.023000px;} -.yb8{bottom:163.165000px;} -.ya98{bottom:163.209000px;} -.yaed{bottom:163.221000px;} -.yd0d{bottom:163.281000px;} -.y7e5{bottom:163.334900px;} -.y1529{bottom:163.359000px;} -.y929{bottom:163.440276px;} -.ydc6{bottom:163.484000px;} -.y10f6{bottom:163.580000px;} -.y985{bottom:163.581000px;} -.y3c5{bottom:163.915000px;} -.y102f{bottom:163.997000px;} -.y24f{bottom:164.101000px;} -.y536{bottom:164.142000px;} -.y16c{bottom:164.189000px;} -.y77b{bottom:164.287000px;} -.y320{bottom:164.499000px;} +.y83a{bottom:162.708000px;} +.yee1{bottom:162.810000px;} +.y8ea{bottom:162.834000px;} +.y9b1{bottom:163.023000px;} +.yb7{bottom:163.165000px;} +.ya6b{bottom:163.209000px;} +.yabf{bottom:163.221000px;} +.ycd4{bottom:163.281000px;} +.y7c7{bottom:163.334900px;} +.y14cd{bottom:163.359000px;} +.y903{bottom:163.440276px;} +.yd8b{bottom:163.484000px;} +.y10ac{bottom:163.580000px;} +.y95e{bottom:163.581000px;} +.y3bc{bottom:163.915000px;} +.yfe8{bottom:163.997000px;} +.y249{bottom:164.101000px;} +.y526{bottom:164.142000px;} +.y16a{bottom:164.189000px;} +.y761{bottom:164.287000px;} +.y319{bottom:164.499000px;} .y6{bottom:164.507581px;} -.y185{bottom:164.540970px;} -.y12c5{bottom:164.603000px;} -.y120f{bottom:164.804000px;} -.ybb5{bottom:164.838000px;} -.yd31{bottom:164.839000px;} -.y710{bottom:164.853000px;} -.y87f{bottom:164.896000px;} -.y111d{bottom:164.941000px;} -.yc87{bottom:165.022000px;} -.y1160{bottom:165.054000px;} -.y183{bottom:165.259724px;} -.y6e4{bottom:165.526000px;} -.y40b{bottom:165.580000px;} -.ye65{bottom:165.755000px;} -.y1338{bottom:165.813000px;} -.y1502{bottom:165.897000px;} -.y5e3{bottom:166.050000px;} -.y1387{bottom:166.212000px;} -.y666{bottom:166.382261px;} -.y442{bottom:166.434000px;} -.y13cf{bottom:166.495000px;} -.yfa1{bottom:166.514000px;} -.y8a5{bottom:166.587000px;} -.y1b8{bottom:166.645000px;} -.yd8a{bottom:166.669000px;} -.y13fd{bottom:166.677000px;} -.yaee{bottom:166.836000px;} -.yac7{bottom:166.941000px;} -.y1311{bottom:167.383000px;} -.ye3c{bottom:167.435000px;} -.y5e9{bottom:167.500000px;} -.y1420{bottom:167.547000px;} -.yc13{bottom:167.666000px;} -.y223{bottom:167.823000px;} -.ycbe{bottom:167.859000px;} -.ya29{bottom:167.898000px;} -.y8ab{bottom:168.000000px;} -.y616{bottom:168.069000px;} -.y7ca{bottom:168.077000px;} -.y323{bottom:168.114000px;} -.y106{bottom:168.212000px;} -.y409{bottom:168.236000px;} -.yec8{bottom:168.306000px;} -.y9b1{bottom:168.324000px;} -.y1488{bottom:168.369000px;} -.ye19{bottom:168.616000px;} -.y7fb{bottom:168.617000px;} +.y182{bottom:164.540970px;} +.y1275{bottom:164.603000px;} +.y11c0{bottom:164.804000px;} +.yb82{bottom:164.838000px;} +.ycf8{bottom:164.839000px;} +.y6f9{bottom:164.853000px;} +.y85d{bottom:164.896000px;} +.y10d3{bottom:164.941000px;} +.yc4f{bottom:165.022000px;} +.y1115{bottom:165.054000px;} +.y180{bottom:165.259724px;} +.y6cd{bottom:165.526000px;} +.y401{bottom:165.580000px;} +.ye27{bottom:165.755000px;} +.y12e4{bottom:165.813000px;} +.y14a6{bottom:165.897000px;} +.y5d1{bottom:166.050000px;} +.y1331{bottom:166.212000px;} +.y652{bottom:166.382261px;} +.y437{bottom:166.434000px;} +.y1377{bottom:166.495000px;} +.yf5e{bottom:166.514000px;} +.y883{bottom:166.587000px;} +.y1b5{bottom:166.645000px;} +.yd50{bottom:166.669000px;} +.y13a4{bottom:166.677000px;} +.yac0{bottom:166.836000px;} +.ya9a{bottom:166.941000px;} +.y12be{bottom:167.383000px;} +.ydff{bottom:167.435000px;} +.y13c7{bottom:167.547000px;} +.ybdf{bottom:167.666000px;} +.y21d{bottom:167.823000px;} +.yc86{bottom:167.859000px;} +.y9ff{bottom:167.898000px;} +.y603{bottom:168.069000px;} +.y7ae{bottom:168.077000px;} +.y31c{bottom:168.114000px;} +.y109{bottom:168.212000px;} +.y3ff{bottom:168.236000px;} +.ye89{bottom:168.306000px;} +.y989{bottom:168.324000px;} +.y142e{bottom:168.369000px;} +.yddd{bottom:168.616000px;} +.y7dd{bottom:168.617000px;} .y80{bottom:168.644000px;} -.y6bf{bottom:168.717040px;} -.y938{bottom:168.739000px;} -.y321{bottom:168.760000px;} -.y682{bottom:168.825000px;} -.y47d{bottom:168.871000px;} -.y6b0{bottom:169.038000px;} -.y11a8{bottom:169.170000px;} -.y960{bottom:169.251000px;} -.y10b1{bottom:169.262000px;} -.yb42{bottom:169.421000px;} -.yb17{bottom:169.441000px;} -.ya73{bottom:169.500000px;} -.y144d{bottom:169.567000px;} -.ya6e{bottom:169.722000px;} -.y108d{bottom:169.926000px;} -.y15f2{bottom:169.998000px;} -.y15f3{bottom:170.148000px;} -.yc95{bottom:170.166000px;} -.y7a3{bottom:170.289000px;} -.y46c{bottom:170.376085px;} -.y12e7{bottom:170.649000px;} -.y8ea{bottom:170.804000px;} -.y222{bottom:170.812000px;} -.ya4c{bottom:171.334000px;} -.y11e4{bottom:172.047000px;} -.y10b0{bottom:172.075000px;} -.yf22{bottom:172.274000px;} -.yb64{bottom:172.452000px;} -.y40a{bottom:172.498000px;} -.y37f{bottom:172.630000px;} -.y108c{bottom:172.738000px;} -.y644{bottom:172.896579px;} -.y1da{bottom:173.155000px;} -.y73a{bottom:173.315000px;} -.y123c{bottom:173.510000px;} -.y5b3{bottom:173.619000px;} -.yeab{bottom:173.644000px;} -.y1464{bottom:173.778000px;} -.y8cb{bottom:173.885000px;} -.y4b4{bottom:174.151000px;} -.y564{bottom:174.177000px;} -.y13a{bottom:174.283000px;} -.y9fc{bottom:174.401000px;} -.ye88{bottom:174.421000px;} -.ybde{bottom:174.469000px;} -.ycec{bottom:174.561000px;} +.y6a8{bottom:168.717040px;} +.y912{bottom:168.739000px;} +.y31a{bottom:168.760000px;} +.y66d{bottom:168.825000px;} +.y471{bottom:168.871000px;} +.y69a{bottom:169.038000px;} +.ydd{bottom:169.159000px;} +.y115b{bottom:169.170000px;} +.y939{bottom:169.251000px;} +.y1068{bottom:169.262000px;} +.yb12{bottom:169.421000px;} +.yae8{bottom:169.441000px;} +.y13f4{bottom:169.567000px;} +.ya42{bottom:169.722000px;} +.y1045{bottom:169.926000px;} +.y1594{bottom:169.998000px;} +.y1595{bottom:170.148000px;} +.yc5d{bottom:170.166000px;} +.y788{bottom:170.289000px;} +.y460{bottom:170.376085px;} +.y1295{bottom:170.649000px;} +.y8c6{bottom:170.804000px;} +.y21c{bottom:170.812000px;} +.ya21{bottom:171.334000px;} +.y1196{bottom:172.047000px;} +.y1067{bottom:172.075000px;} +.yee0{bottom:172.274000px;} +.yb33{bottom:172.452000px;} +.y400{bottom:172.498000px;} +.y377{bottom:172.630000px;} +.y1044{bottom:172.738000px;} +.y630{bottom:172.896579px;} +.y1d5{bottom:173.155000px;} +.y722{bottom:173.315000px;} +.y11ed{bottom:173.510000px;} +.y5a1{bottom:173.619000px;} +.ye6c{bottom:173.644000px;} +.y140b{bottom:173.778000px;} +.y8a8{bottom:173.885000px;} +.y4a6{bottom:174.151000px;} +.y553{bottom:174.177000px;} +.y13b{bottom:174.283000px;} +.y9d2{bottom:174.401000px;} +.ye49{bottom:174.421000px;} +.ybaa{bottom:174.469000px;} +.ycb3{bottom:174.561000px;} .y50{bottom:174.622000px;} -.y85a{bottom:174.663000px;} -.y90e{bottom:174.789000px;} -.yc39{bottom:175.000000px;} -.y14b2{bottom:175.078000px;} -.y124c{bottom:175.090311px;} -.yb7{bottom:175.120000px;} -.yaec{bottom:175.176000px;} -.y1528{bottom:175.314000px;} -.y106c{bottom:175.358000px;} -.yc4e{bottom:175.489000px;} -.y984{bottom:175.536000px;} -.y645{bottom:175.680579px;} -.ydef{bottom:175.944000px;} -.y102e{bottom:175.952000px;} -.y24e{bottom:176.056000px;} -.y16b{bottom:176.144000px;} -.y380{bottom:176.245000px;} -.y118e{bottom:176.249000px;} -.y643{bottom:176.376579px;} -.y75c{bottom:176.401000px;} -.y31f{bottom:176.454000px;} -.y100b{bottom:176.470000px;} -.y12c4{bottom:176.558000px;} -.y120d{bottom:176.760000px;} -.y1db{bottom:176.771000px;} -.ybb4{bottom:176.793000px;} -.yd30{bottom:176.795000px;} -.y87e{bottom:176.851000px;} -.y111c{bottom:176.896000px;} -.yc86{bottom:176.977000px;} -.y115f{bottom:177.009000px;} -.y665{bottom:177.518262px;} -.ye64{bottom:177.710000px;} -.y1337{bottom:177.768000px;} -.y1501{bottom:177.852000px;} -.ya97{bottom:177.965000px;} -.y5e2{bottom:178.005000px;} -.yc6d{bottom:178.073000px;} -.y1386{bottom:178.167000px;} -.y441{bottom:178.389000px;} -.y13ce{bottom:178.451000px;} -.yfa0{bottom:178.469000px;} -.y62d{bottom:178.500000px;} -.y15f1{bottom:178.516000px;} -.y8a4{bottom:178.542000px;} -.y1b7{bottom:178.600000px;} -.yd89{bottom:178.624000px;} -.y13fc{bottom:178.633000px;} -.y10af{bottom:178.766000px;} -.yac5{bottom:178.896000px;} -.y1096{bottom:179.000000px;} -.y181{bottom:179.117929px;} -.y75b{bottom:179.214000px;} -.y1310{bottom:179.339000px;} -.y632{bottom:179.386000px;} -.ye3b{bottom:179.390000px;} -.y1165{bottom:179.500000px;} -.y141f{bottom:179.502000px;} -.yc12{bottom:179.622000px;} -.ycbd{bottom:179.814000px;} -.ya28{bottom:179.853000px;} -.y408{bottom:180.191000px;} -.yec7{bottom:180.261000px;} -.y9b0{bottom:180.279000px;} -.y1487{bottom:180.324000px;} -.y120e{bottom:180.375000px;} -.ye18{bottom:180.571000px;} -.y7fa{bottom:180.572000px;} +.y839{bottom:174.663000px;} +.y8e9{bottom:174.789000px;} +.y1457{bottom:175.078000px;} +.y11fc{bottom:175.090311px;} +.yabe{bottom:175.176000px;} +.y14cc{bottom:175.314000px;} +.y1024{bottom:175.358000px;} +.yc18{bottom:175.489000px;} +.y95d{bottom:175.536000px;} +.y631{bottom:175.680579px;} +.ydb3{bottom:175.944000px;} +.yfe7{bottom:175.952000px;} +.y248{bottom:176.056000px;} +.y169{bottom:176.144000px;} +.y378{bottom:176.245000px;} +.y1142{bottom:176.249000px;} +.y62f{bottom:176.376579px;} +.y742{bottom:176.401000px;} +.y318{bottom:176.454000px;} +.yfc5{bottom:176.470000px;} +.y1274{bottom:176.558000px;} +.y11be{bottom:176.760000px;} +.y1d6{bottom:176.771000px;} +.yb81{bottom:176.793000px;} +.ycf7{bottom:176.795000px;} +.y85c{bottom:176.851000px;} +.y10d2{bottom:176.896000px;} +.yc4e{bottom:176.977000px;} +.y1114{bottom:177.009000px;} +.y651{bottom:177.518262px;} +.ye26{bottom:177.710000px;} +.y12e3{bottom:177.768000px;} +.y14a5{bottom:177.852000px;} +.ya6a{bottom:177.965000px;} +.y5d0{bottom:178.005000px;} +.yc36{bottom:178.073000px;} +.y1330{bottom:178.167000px;} +.y436{bottom:178.389000px;} +.y1376{bottom:178.451000px;} +.yf5d{bottom:178.469000px;} +.y1593{bottom:178.516000px;} +.y882{bottom:178.542000px;} +.y1b4{bottom:178.600000px;} +.yd4f{bottom:178.624000px;} +.y13a3{bottom:178.633000px;} +.y1066{bottom:178.766000px;} +.ya98{bottom:178.896000px;} +.y17e{bottom:179.117929px;} +.y741{bottom:179.214000px;} +.y12bd{bottom:179.339000px;} +.y61e{bottom:179.386000px;} +.ydfe{bottom:179.390000px;} +.y13c6{bottom:179.502000px;} +.ybde{bottom:179.622000px;} +.yc85{bottom:179.814000px;} +.y9fe{bottom:179.853000px;} +.y3fe{bottom:180.191000px;} +.ye88{bottom:180.261000px;} +.y988{bottom:180.279000px;} +.y142d{bottom:180.324000px;} +.y11bf{bottom:180.375000px;} +.yddc{bottom:180.571000px;} +.y7dc{bottom:180.572000px;} .y7f{bottom:180.599000px;} -.y937{bottom:180.694000px;} -.y14dd{bottom:180.726000px;} -.y681{bottom:180.780000px;} -.y6af{bottom:180.993000px;} -.yf4a{bottom:181.087000px;} -.y11a7{bottom:181.125000px;} -.y95f{bottom:181.206000px;} -.yb41{bottom:181.376000px;} -.yb16{bottom:181.396000px;} -.y144c{bottom:181.522000px;} -.y7e0{bottom:181.555020px;} -.y10ae{bottom:181.579000px;} -.yef6{bottom:181.707000px;} -.yf21{bottom:181.739000px;} -.y182{bottom:181.992949px;} -.ydc{bottom:182.026000px;} -.yc94{bottom:182.122000px;} -.y7a2{bottom:182.245000px;} -.y15ef{bottom:182.352000px;} -.y1263{bottom:182.442548px;} -.y388{bottom:182.500000px;} -.yac6{bottom:182.511000px;} -.y535{bottom:182.532000px;} -.y12e6{bottom:182.605000px;} -.y10d4{bottom:182.620000px;} -.y180{bottom:182.711703px;} -.y8e9{bottom:182.759000px;} -.y124b{bottom:182.790601px;} -.ya4b{bottom:183.688000px;} -.y1174{bottom:183.720000px;} -.y6e3{bottom:183.915000px;} -.y11e3{bottom:184.003000px;} -.yf20{bottom:184.552000px;} -.y37e{bottom:184.585000px;} -.yfc8{bottom:184.681000px;} -.y3c4{bottom:184.737000px;} -.y1d9{bottom:185.110000px;} -.y739{bottom:185.270000px;} -.y123b{bottom:185.465000px;} -.y5b2{bottom:185.574000px;} -.yeaa{bottom:185.599000px;} -.y8ca{bottom:185.840000px;} -.y75a{bottom:185.905000px;} -.y4b3{bottom:186.107000px;} -.y563{bottom:186.132000px;} -.y3c3{bottom:186.231000px;} -.y139{bottom:186.239000px;} -.ybdb{bottom:186.324000px;} -.y9fb{bottom:186.357000px;} -.ybdd{bottom:186.424000px;} -.y15f0{bottom:186.486000px;} -.yceb{bottom:186.516000px;} +.y911{bottom:180.694000px;} +.y1482{bottom:180.726000px;} +.y66c{bottom:180.780000px;} +.y699{bottom:180.993000px;} +.yf08{bottom:181.087000px;} +.ydc{bottom:181.114000px;} +.y115a{bottom:181.125000px;} +.y938{bottom:181.206000px;} +.yb11{bottom:181.376000px;} +.yae7{bottom:181.396000px;} +.y13f3{bottom:181.522000px;} +.y7c2{bottom:181.555020px;} +.y1065{bottom:181.579000px;} +.yeb6{bottom:181.707000px;} +.yedf{bottom:181.739000px;} +.y17f{bottom:181.992949px;} +.yc5c{bottom:182.122000px;} +.y787{bottom:182.245000px;} +.y1591{bottom:182.352000px;} +.y1213{bottom:182.442548px;} +.ya99{bottom:182.511000px;} +.y525{bottom:182.532000px;} +.y1294{bottom:182.605000px;} +.y108b{bottom:182.620000px;} +.y17d{bottom:182.711703px;} +.y8c5{bottom:182.759000px;} +.y11fb{bottom:182.790601px;} +.ya20{bottom:183.688000px;} +.y1128{bottom:183.720000px;} +.y6cc{bottom:183.915000px;} +.y1195{bottom:184.003000px;} +.yede{bottom:184.552000px;} +.y376{bottom:184.585000px;} +.yf85{bottom:184.681000px;} +.y3bb{bottom:184.737000px;} +.y1d4{bottom:185.110000px;} +.y721{bottom:185.270000px;} +.y11ec{bottom:185.465000px;} +.y5a0{bottom:185.574000px;} +.ye6b{bottom:185.599000px;} +.y8a7{bottom:185.840000px;} +.y740{bottom:185.905000px;} +.y4a5{bottom:186.107000px;} +.y552{bottom:186.132000px;} +.y3ba{bottom:186.231000px;} +.y13a{bottom:186.239000px;} +.yba7{bottom:186.324000px;} +.y9d1{bottom:186.357000px;} +.yba9{bottom:186.424000px;} +.y1592{bottom:186.486000px;} +.ycb2{bottom:186.516000px;} .y4f{bottom:186.577000px;} -.y105{bottom:186.715000px;} -.y90d{bottom:186.744000px;} -.y70f{bottom:186.771000px;} -.yf76{bottom:186.937000px;} -.yaeb{bottom:187.131000px;} -.y1527{bottom:187.269000px;} -.y106b{bottom:187.313000px;} -.y983{bottom:187.491000px;} -.ydee{bottom:187.899000px;} -.y102d{bottom:187.907000px;} -.y24d{bottom:188.011000px;} -.y16a{bottom:188.099000px;} -.y118d{bottom:188.204000px;} -.y10ad{bottom:188.271000px;} -.y31e{bottom:188.409000px;} -.y100a{bottom:188.425000px;} -.y12c3{bottom:188.513000px;} -.y664{bottom:188.654263px;} -.y120c{bottom:188.715000px;} -.y759{bottom:188.718000px;} -.ybb3{bottom:188.749000px;} -.y87d{bottom:188.806000px;} -.yc85{bottom:188.932000px;} -.yb88{bottom:188.959000px;} -.y108b{bottom:189.113000px;} -.y124a{bottom:189.222664px;} -.y21f{bottom:189.374000px;} -.yd0c{bottom:189.485000px;} -.ye63{bottom:189.665000px;} -.y641{bottom:189.796051px;} -.y1500{bottom:189.807000px;} -.ya96{bottom:189.920000px;} -.y5e1{bottom:189.960000px;} -.y152f{bottom:190.000000px;} -.y1385{bottom:190.122000px;} -.y440{bottom:190.344000px;} -.y13cd{bottom:190.406000px;} -.yf9f{bottom:190.424000px;} -.y8a3{bottom:190.497000px;} -.y1b5{bottom:190.556000px;} -.yd88{bottom:190.579000px;} -.y13fb{bottom:190.588000px;} -.y77a{bottom:190.726000px;} -.yac4{bottom:190.851000px;} -.yf05{bottom:191.000000px;} -.y10ac{bottom:191.083000px;} -.ydc5{bottom:191.171000px;} -.ya6d{bottom:191.341000px;} -.ye3a{bottom:191.345000px;} -.y7df{bottom:191.360476px;} -.y141e{bottom:191.457000px;} -.yc10{bottom:191.577000px;} -.ya27{bottom:191.808000px;} -.y406{bottom:192.147000px;} -.yec6{bottom:192.216000px;} -.y9af{bottom:192.235000px;} -.y1486{bottom:192.279000px;} -.ye17{bottom:192.526000px;} -.y7f9{bottom:192.527000px;} +.y108{bottom:186.715000px;} +.y8e8{bottom:186.744000px;} +.y6f8{bottom:186.771000px;} +.yf34{bottom:186.937000px;} +.yabd{bottom:187.131000px;} +.y14cb{bottom:187.269000px;} +.y1023{bottom:187.313000px;} +.y95c{bottom:187.491000px;} +.ydb2{bottom:187.899000px;} +.yfe6{bottom:187.907000px;} +.y247{bottom:188.011000px;} +.y168{bottom:188.099000px;} +.y1141{bottom:188.204000px;} +.y1064{bottom:188.271000px;} +.y317{bottom:188.409000px;} +.yfc4{bottom:188.425000px;} +.y1273{bottom:188.513000px;} +.y650{bottom:188.654263px;} +.y11bd{bottom:188.715000px;} +.y73f{bottom:188.718000px;} +.yb80{bottom:188.749000px;} +.y85b{bottom:188.806000px;} +.yc4d{bottom:188.932000px;} +.yb56{bottom:188.959000px;} +.yb6{bottom:189.068000px;} +.y1043{bottom:189.113000px;} +.y11fa{bottom:189.222664px;} +.y219{bottom:189.374000px;} +.ycd3{bottom:189.485000px;} +.ye25{bottom:189.665000px;} +.y62d{bottom:189.796051px;} +.y14a4{bottom:189.807000px;} +.ya69{bottom:189.920000px;} +.y5cf{bottom:189.960000px;} +.y132f{bottom:190.122000px;} +.y435{bottom:190.344000px;} +.y1375{bottom:190.406000px;} +.yf5c{bottom:190.424000px;} +.y881{bottom:190.497000px;} +.y1b2{bottom:190.556000px;} +.yd4e{bottom:190.579000px;} +.y13a2{bottom:190.588000px;} +.y760{bottom:190.726000px;} +.ya97{bottom:190.851000px;} +.y1063{bottom:191.083000px;} +.yd8a{bottom:191.171000px;} +.ya41{bottom:191.341000px;} +.ydfd{bottom:191.345000px;} +.y7c1{bottom:191.360476px;} +.y13c5{bottom:191.457000px;} +.ybdc{bottom:191.577000px;} +.y9fd{bottom:191.808000px;} +.y3fc{bottom:192.147000px;} +.ye87{bottom:192.216000px;} +.y987{bottom:192.235000px;} +.y142c{bottom:192.279000px;} +.yddb{bottom:192.526000px;} +.y7db{bottom:192.527000px;} .y7e{bottom:192.554000px;} -.y642{bottom:192.580052px;} -.y936{bottom:192.649000px;} -.y680{bottom:192.735000px;} -.y6ae{bottom:192.948000px;} +.y62e{bottom:192.580052px;} +.y910{bottom:192.649000px;} +.y66b{bottom:192.735000px;} +.y698{bottom:192.948000px;} .y5{bottom:193.022963px;} -.yf49{bottom:193.042000px;} -.y11a6{bottom:193.080000px;} -.y95e{bottom:193.161000px;} -.y640{bottom:193.276051px;} -.yb15{bottom:193.351000px;} -.y144b{bottom:193.478000px;} -.y2ae{bottom:193.628000px;} -.y158a{bottom:193.762000px;} -.yd59{bottom:193.797000px;} -.y2b0{bottom:193.811000px;} -.ydb{bottom:193.981000px;} -.y6ba{bottom:194.066427px;} -.yc93{bottom:194.077000px;} -.y1b6{bottom:194.171000px;} -.y12e5{bottom:194.560000px;} -.y10d3{bottom:194.576000px;} -.y7ec{bottom:194.590192px;} -.y8e8{bottom:194.714000px;} -.y15ee{bottom:194.855000px;} -.yc11{bottom:195.192000px;} -.y111b{bottom:195.286000px;} -.y758{bottom:195.410000px;} -.y154a{bottom:195.481000px;} -.y9d9{bottom:195.595000px;} -.y1173{bottom:195.675000px;} -.y407{bottom:195.762000px;} -.y11e2{bottom:195.958000px;} -.yc55{bottom:196.000000px;} -.ya4a{bottom:196.042000px;} -.y859{bottom:196.094000px;} -.yc6c{bottom:196.404000px;} -.y37d{bottom:196.540000px;} -.y17e{bottom:196.569905px;} -.y2ac{bottom:196.633000px;} -.y115e{bottom:196.935000px;} -.y1498{bottom:197.065000px;} -.y3c2{bottom:197.091000px;} -.y738{bottom:197.226000px;} -.y123a{bottom:197.421000px;} -.y5b1{bottom:197.529000px;} -.yea9{bottom:197.554000px;} -.y8c9{bottom:197.796000px;} -.y4b2{bottom:198.062000px;} -.y562{bottom:198.087000px;} -.y757{bottom:198.222000px;} -.y9fa{bottom:198.312000px;} -.ybdc{bottom:198.379000px;} -.ycea{bottom:198.472000px;} +.yf07{bottom:193.042000px;} +.y1159{bottom:193.080000px;} +.y937{bottom:193.161000px;} +.y62c{bottom:193.276051px;} +.yae6{bottom:193.351000px;} +.y13f2{bottom:193.478000px;} +.y2a8{bottom:193.628000px;} +.y152d{bottom:193.762000px;} +.yd20{bottom:193.797000px;} +.y2aa{bottom:193.811000px;} +.y6a3{bottom:194.066427px;} +.yc5b{bottom:194.077000px;} +.y1b3{bottom:194.171000px;} +.y1293{bottom:194.560000px;} +.y108a{bottom:194.576000px;} +.y7ce{bottom:194.590192px;} +.y8c4{bottom:194.714000px;} +.y1590{bottom:194.855000px;} +.ybdd{bottom:195.192000px;} +.y10d1{bottom:195.286000px;} +.y73e{bottom:195.410000px;} +.y14ed{bottom:195.481000px;} +.y9b0{bottom:195.595000px;} +.y1127{bottom:195.675000px;} +.y3fd{bottom:195.762000px;} +.y1194{bottom:195.958000px;} +.ya1f{bottom:196.042000px;} +.y838{bottom:196.094000px;} +.yc35{bottom:196.404000px;} +.y375{bottom:196.540000px;} +.y17b{bottom:196.569905px;} +.y2a6{bottom:196.633000px;} +.y1113{bottom:196.935000px;} +.y143d{bottom:197.065000px;} +.y3b9{bottom:197.091000px;} +.y720{bottom:197.226000px;} +.y11eb{bottom:197.421000px;} +.y59f{bottom:197.529000px;} +.ye6a{bottom:197.554000px;} +.y8a6{bottom:197.796000px;} +.y4a4{bottom:198.062000px;} +.y551{bottom:198.087000px;} +.y73d{bottom:198.222000px;} +.y9d0{bottom:198.312000px;} +.yba8{bottom:198.379000px;} +.ycb1{bottom:198.472000px;} .y4e{bottom:198.532000px;} -.y3c1{bottom:198.585000px;} -.y104{bottom:198.670000px;} -.y15ec{bottom:198.691000px;} -.y90c{bottom:198.699000px;} -.y70e{bottom:198.726000px;} -.yf75{bottom:198.892000px;} -.yaea{bottom:199.086000px;} -.y1526{bottom:199.225000px;} -.y106a{bottom:199.268000px;} -.y17f{bottom:199.444925px;} -.y982{bottom:199.446000px;} -.y1336{bottom:199.589000px;} -.y43f{bottom:199.643000px;} -.y1463{bottom:199.674000px;} -.y43d{bottom:199.827000px;} -.yded{bottom:199.854000px;} -.y102c{bottom:199.862000px;} -.y24c{bottom:199.966000px;} -.y169{bottom:200.054000px;} -.y118c{bottom:200.159000px;} -.y17d{bottom:200.163679px;} -.y2af{bottom:200.248000px;} -.y31d{bottom:200.364000px;} -.y1009{bottom:200.380000px;} -.y12c2{bottom:200.468000px;} -.y1d8{bottom:200.580000px;} -.y120b{bottom:200.670000px;} -.ybb2{bottom:200.704000px;} -.y87c{bottom:200.761000px;} -.y2ad{bottom:200.895000px;} -.yb87{bottom:200.914000px;} -.yb6{bottom:201.023000px;} -.y108a{bottom:201.068000px;} -.y7de{bottom:201.165931px;} -.y21e{bottom:201.329000px;} -.yd0b{bottom:201.440000px;} -.yb63{bottom:201.454000px;} -.y1d6{bottom:201.549000px;} -.y1587{bottom:201.583000px;} -.ye62{bottom:201.620000px;} -.y1589{bottom:201.732000px;} -.y14ff{bottom:201.762000px;} -.ya95{bottom:201.875000px;} -.y5e0{bottom:201.915000px;} -.y1384{bottom:202.077000px;} -.y43b{bottom:202.300000px;} -.y13cc{bottom:202.361000px;} -.yf9e{bottom:202.379000px;} -.y8a2{bottom:202.453000px;} -.y66c{bottom:202.460098px;} -.y1b4{bottom:202.511000px;} -.yd87{bottom:202.534000px;} -.y779{bottom:202.682000px;} -.yac3{bottom:202.806000px;} -.y15ed{bottom:202.825000px;} -.y780{bottom:203.000000px;} -.y1d5{bottom:203.043000px;} -.ydc4{bottom:203.127000px;} -.y1248{bottom:203.251786px;} -.ye39{bottom:203.300000px;} -.y141d{bottom:203.412000px;} -.yecf{bottom:203.500000px;} -.yc0f{bottom:203.532000px;} -.y7c8{bottom:203.659000px;} -.yd2f{bottom:203.752000px;} -.ya26{bottom:203.764000px;} -.y1249{bottom:203.989126px;} -.y405{bottom:204.102000px;} -.yec5{bottom:204.171000px;} -.y9ae{bottom:204.190000px;} -.y130f{bottom:204.348000px;} -.ye15{bottom:204.481000px;} -.y742{bottom:204.500000px;} +.y3b8{bottom:198.585000px;} +.y107{bottom:198.670000px;} +.y158e{bottom:198.691000px;} +.y8e7{bottom:198.699000px;} +.y6f7{bottom:198.726000px;} +.yf33{bottom:198.892000px;} +.yabc{bottom:199.086000px;} +.y14ca{bottom:199.225000px;} +.y1022{bottom:199.268000px;} +.y17c{bottom:199.444925px;} +.y95b{bottom:199.446000px;} +.y12e2{bottom:199.589000px;} +.y434{bottom:199.643000px;} +.y140a{bottom:199.674000px;} +.y432{bottom:199.827000px;} +.ydb1{bottom:199.854000px;} +.yfe5{bottom:199.862000px;} +.y246{bottom:199.966000px;} +.y167{bottom:200.054000px;} +.y1140{bottom:200.159000px;} +.y17a{bottom:200.163679px;} +.y2a9{bottom:200.248000px;} +.y316{bottom:200.364000px;} +.yfc3{bottom:200.380000px;} +.y1272{bottom:200.468000px;} +.ydb{bottom:200.564000px;} +.y1d3{bottom:200.580000px;} +.y11bc{bottom:200.670000px;} +.yb7f{bottom:200.704000px;} +.y85a{bottom:200.761000px;} +.y2a7{bottom:200.895000px;} +.yb55{bottom:200.914000px;} +.yb5{bottom:201.023000px;} +.y1042{bottom:201.068000px;} +.y7c0{bottom:201.165931px;} +.y218{bottom:201.329000px;} +.ycd2{bottom:201.440000px;} +.yb32{bottom:201.454000px;} +.y1d1{bottom:201.549000px;} +.y152a{bottom:201.583000px;} +.ye24{bottom:201.620000px;} +.y152c{bottom:201.732000px;} +.y14a3{bottom:201.762000px;} +.ya68{bottom:201.875000px;} +.y5ce{bottom:201.915000px;} +.y132e{bottom:202.077000px;} +.y430{bottom:202.300000px;} +.y1374{bottom:202.361000px;} +.yf5b{bottom:202.379000px;} +.y880{bottom:202.453000px;} +.y658{bottom:202.460098px;} +.y1b1{bottom:202.511000px;} +.yd4d{bottom:202.534000px;} +.y75f{bottom:202.682000px;} +.ya96{bottom:202.806000px;} +.y158f{bottom:202.825000px;} +.y1d0{bottom:203.043000px;} +.yd89{bottom:203.127000px;} +.y11f8{bottom:203.251786px;} +.ydfc{bottom:203.300000px;} +.y13c4{bottom:203.412000px;} +.ybdb{bottom:203.532000px;} +.y7ac{bottom:203.659000px;} +.ycf6{bottom:203.752000px;} +.y9fc{bottom:203.764000px;} +.y11f9{bottom:203.989126px;} +.y3fb{bottom:204.102000px;} +.ye86{bottom:204.171000px;} +.y986{bottom:204.190000px;} +.y12bc{bottom:204.348000px;} +.ydd9{bottom:204.481000px;} .y7d{bottom:204.510000px;} -.y935{bottom:204.604000px;} -.y138{bottom:204.628000px;} -.ye87{bottom:204.654000px;} -.y67f{bottom:204.690000px;} -.y6ad{bottom:204.903000px;} -.ya67{bottom:204.990000px;} -.yf48{bottom:204.998000px;} -.ya52{bottom:205.000000px;} -.y11a5{bottom:205.036000px;} -.y95d{bottom:205.116000px;} -.yb14{bottom:205.306000px;} -.y144a{bottom:205.433000px;} -.y506{bottom:205.708000px;} -.yd58{bottom:205.753000px;} -.y10ab{bottom:205.839000px;} -.y10f5{bottom:205.880000px;} -.y43c{bottom:205.915000px;} -.yda{bottom:205.936000px;} -.yc92{bottom:206.032000px;} -.y7eb{bottom:206.178457px;} -.y7a1{bottom:206.381000px;} -.y12e4{bottom:206.515000px;} -.y10d2{bottom:206.531000px;} -.y43e{bottom:206.561000px;} -.y8e7{bottom:206.669000px;} -.y63e{bottom:206.695513px;} -.y1d7{bottom:207.157000px;} -.yef5{bottom:207.181000px;} -.ycbc{bottom:207.218000px;} -.y1549{bottom:207.436000px;} -.y9d8{bottom:207.550000px;} -.y1172{bottom:207.630000px;} -.y11e1{bottom:207.913000px;} -.y14b1{bottom:208.024000px;} -.y858{bottom:208.049000px;} -.ye16{bottom:208.097000px;} -.ya49{bottom:208.395000px;} -.y37c{bottom:208.496000px;} -.y25d{bottom:208.500000px;} -.y2ab{bottom:208.588000px;} -.yc84{bottom:208.857000px;} -.yb40{bottom:208.873000px;} -.y115d{bottom:208.890000px;} -.y1497{bottom:209.021000px;} -.y737{bottom:209.181000px;} -.y1239{bottom:209.376000px;} -.y3c0{bottom:209.444000px;} -.y63f{bottom:209.479513px;} -.y5b0{bottom:209.484000px;} -.yea8{bottom:209.509000px;} -.y31a{bottom:209.663000px;} -.y1588{bottom:209.702000px;} -.y8c8{bottom:209.751000px;} -.y47c{bottom:209.811000px;} -.y31c{bottom:209.846000px;} -.y4b0{bottom:210.017000px;} -.y561{bottom:210.042000px;} -.y534{bottom:210.126000px;} -.y63d{bottom:210.175513px;} -.y9f9{bottom:210.267000px;} -.yce9{bottom:210.427000px;} +.y90f{bottom:204.604000px;} +.y139{bottom:204.628000px;} +.ye48{bottom:204.654000px;} +.y66a{bottom:204.690000px;} +.y697{bottom:204.903000px;} +.ya3b{bottom:204.990000px;} +.yf06{bottom:204.998000px;} +.y1158{bottom:205.036000px;} +.y936{bottom:205.116000px;} +.yae5{bottom:205.306000px;} +.y13f1{bottom:205.433000px;} +.y4f7{bottom:205.708000px;} +.yd1f{bottom:205.753000px;} +.y1062{bottom:205.839000px;} +.y10ab{bottom:205.880000px;} +.y431{bottom:205.915000px;} +.yc5a{bottom:206.032000px;} +.y7cd{bottom:206.178457px;} +.y786{bottom:206.381000px;} +.y1292{bottom:206.515000px;} +.y1089{bottom:206.531000px;} +.y433{bottom:206.561000px;} +.y8c3{bottom:206.669000px;} +.y62a{bottom:206.695513px;} +.y1d2{bottom:207.157000px;} +.yeb5{bottom:207.181000px;} +.yc84{bottom:207.218000px;} +.y14ec{bottom:207.436000px;} +.y9af{bottom:207.550000px;} +.y1126{bottom:207.630000px;} +.y1193{bottom:207.913000px;} +.y1456{bottom:208.024000px;} +.y837{bottom:208.049000px;} +.ydda{bottom:208.097000px;} +.ya1e{bottom:208.395000px;} +.y374{bottom:208.496000px;} +.y2a5{bottom:208.588000px;} +.yc4c{bottom:208.857000px;} +.yb10{bottom:208.873000px;} +.y1112{bottom:208.890000px;} +.y143c{bottom:209.021000px;} +.y71f{bottom:209.181000px;} +.y11ea{bottom:209.376000px;} +.y3b7{bottom:209.444000px;} +.y62b{bottom:209.479513px;} +.y59e{bottom:209.484000px;} +.ye69{bottom:209.509000px;} +.y313{bottom:209.663000px;} +.y152b{bottom:209.702000px;} +.y8a5{bottom:209.751000px;} +.y470{bottom:209.811000px;} +.y315{bottom:209.846000px;} +.y4a2{bottom:210.017000px;} +.y550{bottom:210.042000px;} +.y524{bottom:210.126000px;} +.y629{bottom:210.175513px;} +.y9cf{bottom:210.267000px;} +.ycb0{bottom:210.427000px;} .y4d{bottom:210.487000px;} -.y13fa{bottom:210.513000px;} -.y103{bottom:210.625000px;} -.y90b{bottom:210.654000px;} -.y1485{bottom:210.669000px;} -.y70d{bottom:210.682000px;} -.ybda{bottom:210.733000px;} -.yf74{bottom:210.848000px;} -.y3bf{bottom:210.939000px;} -.y7dd{bottom:210.971385px;} -.yae9{bottom:211.041000px;} -.y1525{bottom:211.180000px;} -.y15eb{bottom:211.194000px;} -.y1069{bottom:211.223000px;} -.y981{bottom:211.401000px;} -.y1462{bottom:211.629000px;} -.y6e2{bottom:211.803000px;} -.ydec{bottom:211.809000px;} -.y24b{bottom:211.922000px;} -.y168{bottom:212.009000px;} -.y118b{bottom:212.114000px;} -.y318{bottom:212.319000px;} -.y12c1{bottom:212.423000px;} -.y120a{bottom:212.625000px;} -.ybb1{bottom:212.659000px;} -.y87b{bottom:212.716000px;} -.yb86{bottom:212.869000px;} -.yf1f{bottom:212.912000px;} -.yb5{bottom:212.978000px;} -.y1089{bottom:213.023000px;} -.y14dc{bottom:213.267000px;} -.y404{bottom:213.400000px;} -.yb62{bottom:213.409000px;} -.ye61{bottom:213.575000px;} -.y4b1{bottom:213.632000px;} -.ya94{bottom:213.831000px;} -.y5df{bottom:213.870000px;} -.y17b{bottom:214.021880px;} -.y1383{bottom:214.032000px;} -.y43a{bottom:214.255000px;} -.y13cb{bottom:214.316000px;} -.yf9d{bottom:214.334000px;} -.y8a1{bottom:214.408000px;} -.ya6c{bottom:214.459950px;} -.y1b3{bottom:214.466000px;} -.yd86{bottom:214.489000px;} -.y778{bottom:214.637000px;} -.yac2{bottom:214.761000px;} -.y15e9{bottom:215.029000px;} -.ydc3{bottom:215.082000px;} -.ye38{bottom:215.256000px;} -.y141c{bottom:215.368000px;} -.y7c7{bottom:215.614000px;} -.yd2e{bottom:215.707000px;} -.ya25{bottom:215.719000px;} -.y31b{bottom:215.935000px;} -.y402{bottom:216.057000px;} -.yec4{bottom:216.127000px;} -.y9ad{bottom:216.145000px;} -.ye14{bottom:216.436000px;} +.y13a1{bottom:210.513000px;} +.y106{bottom:210.625000px;} +.y8e6{bottom:210.654000px;} +.y142b{bottom:210.669000px;} +.y6f6{bottom:210.682000px;} +.yba6{bottom:210.733000px;} +.yf32{bottom:210.848000px;} +.y3b6{bottom:210.939000px;} +.y7bf{bottom:210.971385px;} +.yabb{bottom:211.041000px;} +.y14c9{bottom:211.180000px;} +.y158d{bottom:211.194000px;} +.y1021{bottom:211.223000px;} +.y95a{bottom:211.401000px;} +.y1409{bottom:211.629000px;} +.y6cb{bottom:211.803000px;} +.ydb0{bottom:211.809000px;} +.y245{bottom:211.922000px;} +.y166{bottom:212.009000px;} +.y113f{bottom:212.114000px;} +.y311{bottom:212.319000px;} +.y1271{bottom:212.423000px;} +.y11bb{bottom:212.625000px;} +.yb7e{bottom:212.659000px;} +.y859{bottom:212.716000px;} +.yb54{bottom:212.869000px;} +.yedd{bottom:212.912000px;} +.y73c{bottom:212.978000px;} +.y1041{bottom:213.023000px;} +.y1481{bottom:213.267000px;} +.y3fa{bottom:213.400000px;} +.yb31{bottom:213.409000px;} +.ye23{bottom:213.575000px;} +.y4a3{bottom:213.632000px;} +.ya67{bottom:213.831000px;} +.y5cd{bottom:213.870000px;} +.y178{bottom:214.021880px;} +.y132d{bottom:214.032000px;} +.y42f{bottom:214.255000px;} +.y1373{bottom:214.316000px;} +.yf5a{bottom:214.334000px;} +.y87f{bottom:214.408000px;} +.ya40{bottom:214.459950px;} +.y1b0{bottom:214.466000px;} +.yd4c{bottom:214.489000px;} +.y75e{bottom:214.637000px;} +.ya95{bottom:214.761000px;} +.y158b{bottom:215.029000px;} +.yd88{bottom:215.082000px;} +.ydfb{bottom:215.256000px;} +.y13c3{bottom:215.368000px;} +.y7ab{bottom:215.614000px;} +.ycf5{bottom:215.707000px;} +.y9fb{bottom:215.719000px;} +.y314{bottom:215.935000px;} +.y3f8{bottom:216.057000px;} +.ye85{bottom:216.127000px;} +.y985{bottom:216.145000px;} +.ydd8{bottom:216.436000px;} .y9c{bottom:216.465000px;} -.y319{bottom:216.581000px;} -.ye86{bottom:216.609000px;} -.ybd8{bottom:216.611000px;} -.y67d{bottom:216.645000px;} -.y6ac{bottom:216.859000px;} -.y17c{bottom:216.896900px;} -.yf47{bottom:216.953000px;} -.y11a4{bottom:216.991000px;} -.y1033{bottom:217.000000px;} -.y95c{bottom:217.071000px;} -.y21d{bottom:217.085000px;} -.yb13{bottom:217.262000px;} -.y1449{bottom:217.388000px;} -.y1247{bottom:217.487366px;} -.y17a{bottom:217.615655px;} -.y505{bottom:217.663000px;} -.yd57{bottom:217.708000px;} -.y127b{bottom:217.774000px;} -.y10aa{bottom:217.794000px;} -.yc91{bottom:217.987000px;} -.y1586{bottom:218.071000px;} -.y7f8{bottom:218.087000px;} -.y7a0{bottom:218.336000px;} -.y12e3{bottom:218.470000px;} -.y10d1{bottom:218.486000px;} -.y8e6{bottom:218.624000px;} -.y1008{bottom:218.770000px;} -.yef4{bottom:219.136000px;} -.y15ea{bottom:219.164000px;} -.ycba{bottom:219.173000px;} -.y1246{bottom:219.288930px;} -.y1548{bottom:219.392000px;} -.y9d7{bottom:219.505000px;} -.y1171{bottom:219.585000px;} -.y11e0{bottom:219.868000px;} -.y14b0{bottom:219.980000px;} -.y857{bottom:220.004000px;} -.y14fe{bottom:220.151000px;} -.y67e{bottom:220.261000px;} -.y403{bottom:220.319000px;} -.y37a{bottom:220.451000px;} -.y2aa{bottom:220.543000px;} -.y104e{bottom:220.626000px;} -.ya48{bottom:220.749000px;} -.y7dc{bottom:220.776840px;} -.y1238{bottom:221.331000px;} -.y6c8{bottom:221.411373px;} -.y6cb{bottom:221.457467px;} -.yea7{bottom:221.465000px;} -.y219{bottom:221.498000px;} -.y8c7{bottom:221.706000px;} -.y47b{bottom:221.766000px;} -.y3be{bottom:221.798000px;} -.y1584{bottom:221.907000px;} -.y4ae{bottom:221.972000px;} -.y55f{bottom:221.997000px;} -.y533{bottom:222.081000px;} -.y9f8{bottom:222.222000px;} -.y13f9{bottom:222.468000px;} -.y102{bottom:222.580000px;} -.y909{bottom:222.609000px;} -.y90a{bottom:222.610000px;} -.y70c{bottom:222.637000px;} -.y130b{bottom:222.680000px;} -.ybd9{bottom:222.688000px;} -.ycbb{bottom:222.788000px;} -.yf73{bottom:222.803000px;} -.yae8{bottom:222.997000px;} -.y1119{bottom:223.003000px;} -.y1524{bottom:223.135000px;} -.y1068{bottom:223.178000px;} -.y3bd{bottom:223.292000px;} -.y980{bottom:223.357000px;} -.y63b{bottom:223.594975px;} -.y6e1{bottom:223.759000px;} -.ydeb{bottom:223.764000px;} -.y24a{bottom:223.877000px;} -.y167{bottom:223.965000px;} -.y37b{bottom:224.066000px;} -.y118a{bottom:224.069000px;} -.y12c0{bottom:224.378000px;} -.y1208{bottom:224.580000px;} -.ybb0{bottom:224.614000px;} -.yb85{bottom:224.824000px;} -.y1262{bottom:224.839601px;} -.y756{bottom:224.933000px;} -.y1088{bottom:224.978000px;} -.y14db{bottom:225.222000px;} -.ya6b{bottom:225.282750px;} -.yd9{bottom:225.343000px;} -.yb61{bottom:225.364000px;} -.ye60{bottom:225.531000px;} -.y4af{bottom:225.587000px;} -.y560{bottom:225.613000px;} -.ya93{bottom:225.786000px;} -.yfc7{bottom:225.793000px;} -.y5de{bottom:225.825000px;} -.y1585{bottom:226.041000px;} -.y439{bottom:226.210000px;} -.y13ca{bottom:226.271000px;} -.yf9c{bottom:226.290000px;} -.y63c{bottom:226.378975px;} -.y1b2{bottom:226.421000px;} -.y934{bottom:226.425000px;} +.y312{bottom:216.581000px;} +.ye47{bottom:216.609000px;} +.yba4{bottom:216.611000px;} +.y668{bottom:216.645000px;} +.y696{bottom:216.859000px;} +.y179{bottom:216.896900px;} +.yf05{bottom:216.953000px;} +.y1157{bottom:216.991000px;} +.y935{bottom:217.071000px;} +.y217{bottom:217.085000px;} +.yae4{bottom:217.262000px;} +.y13f0{bottom:217.388000px;} +.y11f7{bottom:217.487366px;} +.y177{bottom:217.615655px;} +.y4f6{bottom:217.663000px;} +.yd1e{bottom:217.708000px;} +.y122b{bottom:217.774000px;} +.y1061{bottom:217.794000px;} +.yc59{bottom:217.987000px;} +.y1529{bottom:218.071000px;} +.y7da{bottom:218.087000px;} +.y785{bottom:218.336000px;} +.y1291{bottom:218.470000px;} +.y1088{bottom:218.486000px;} +.y8c2{bottom:218.624000px;} +.yfc2{bottom:218.770000px;} +.yeb4{bottom:219.136000px;} +.y158c{bottom:219.164000px;} +.yc82{bottom:219.173000px;} +.y11f6{bottom:219.288930px;} +.y14eb{bottom:219.392000px;} +.y9ae{bottom:219.505000px;} +.y1125{bottom:219.585000px;} +.y1192{bottom:219.868000px;} +.y1455{bottom:219.980000px;} +.y836{bottom:220.004000px;} +.yda{bottom:220.014000px;} +.y14a2{bottom:220.151000px;} +.y669{bottom:220.261000px;} +.y3f9{bottom:220.319000px;} +.y372{bottom:220.451000px;} +.y2a4{bottom:220.543000px;} +.y1006{bottom:220.626000px;} +.ya1d{bottom:220.749000px;} +.y7be{bottom:220.776840px;} +.y11e9{bottom:221.331000px;} +.y6b1{bottom:221.411373px;} +.y6b4{bottom:221.457467px;} +.ye68{bottom:221.465000px;} +.y213{bottom:221.498000px;} +.y8a4{bottom:221.706000px;} +.y46f{bottom:221.766000px;} +.y3b5{bottom:221.798000px;} +.y1527{bottom:221.907000px;} +.y4a0{bottom:221.972000px;} +.y54e{bottom:221.997000px;} +.y523{bottom:222.081000px;} +.y9ce{bottom:222.222000px;} +.y13a0{bottom:222.468000px;} +.y105{bottom:222.580000px;} +.y8e4{bottom:222.609000px;} +.y8e5{bottom:222.610000px;} +.y6f5{bottom:222.637000px;} +.y12b8{bottom:222.680000px;} +.yba5{bottom:222.688000px;} +.yc83{bottom:222.788000px;} +.yf31{bottom:222.803000px;} +.yaba{bottom:222.997000px;} +.y10cf{bottom:223.003000px;} +.y14c8{bottom:223.135000px;} +.y1020{bottom:223.178000px;} +.y3b4{bottom:223.292000px;} +.y959{bottom:223.357000px;} +.y627{bottom:223.594975px;} +.y6ca{bottom:223.759000px;} +.ydaf{bottom:223.764000px;} +.y244{bottom:223.877000px;} +.y165{bottom:223.965000px;} +.y373{bottom:224.066000px;} +.y113e{bottom:224.069000px;} +.y1270{bottom:224.378000px;} +.y11b9{bottom:224.580000px;} +.yb7d{bottom:224.614000px;} +.yb53{bottom:224.824000px;} +.y1212{bottom:224.839601px;} +.y73b{bottom:224.933000px;} +.y1040{bottom:224.978000px;} +.y1480{bottom:225.222000px;} +.ya3f{bottom:225.282750px;} +.yb30{bottom:225.364000px;} +.ye22{bottom:225.531000px;} +.y4a1{bottom:225.587000px;} +.y54f{bottom:225.613000px;} +.ya66{bottom:225.786000px;} +.yf84{bottom:225.793000px;} +.y5cc{bottom:225.825000px;} +.y1528{bottom:226.041000px;} +.y42e{bottom:226.210000px;} +.y1372{bottom:226.271000px;} +.yf59{bottom:226.290000px;} +.y628{bottom:226.378975px;} +.y1af{bottom:226.421000px;} +.y90e{bottom:226.425000px;} .y7c{bottom:226.427000px;} -.yd85{bottom:226.444000px;} -.y21c{bottom:226.577000px;} -.y777{bottom:226.592000px;} -.y111a{bottom:226.618000px;} -.yac1{bottom:226.717000px;} -.y1d4{bottom:226.953000px;} -.yb1d{bottom:227.000000px;} -.ydc2{bottom:227.037000px;} -.y63a{bottom:227.074974px;} -.ye37{bottom:227.211000px;} -.y141b{bottom:227.323000px;} -.y15e8{bottom:227.533000px;} -.y7c6{bottom:227.570000px;} -.yd2d{bottom:227.662000px;} -.ya24{bottom:227.674000px;} -.y401{bottom:228.012000px;} -.yec3{bottom:228.082000px;} -.y9ac{bottom:228.100000px;} -.y1209{bottom:228.196000px;} -.yc0e{bottom:228.374000px;} -.ye13{bottom:228.392000px;} +.yd4b{bottom:226.444000px;} +.y216{bottom:226.577000px;} +.y75d{bottom:226.592000px;} +.y10d0{bottom:226.618000px;} +.ya94{bottom:226.717000px;} +.yb4{bottom:226.926000px;} +.y1cf{bottom:226.953000px;} +.yd87{bottom:227.037000px;} +.y626{bottom:227.074974px;} +.ydfa{bottom:227.211000px;} +.y13c2{bottom:227.323000px;} +.y158a{bottom:227.533000px;} +.y7aa{bottom:227.570000px;} +.ycf4{bottom:227.662000px;} +.y9fa{bottom:227.674000px;} +.y3f7{bottom:228.012000px;} +.ye84{bottom:228.082000px;} +.y984{bottom:228.100000px;} +.y11ba{bottom:228.196000px;} +.ybda{bottom:228.374000px;} +.ydd7{bottom:228.392000px;} .y9b{bottom:228.420000px;} -.ye85{bottom:228.565000px;} -.y67c{bottom:228.601000px;} -.yc83{bottom:228.783000px;} -.y6ab{bottom:228.814000px;} -.yf46{bottom:228.908000px;} -.y11a3{bottom:228.946000px;} -.y95b{bottom:229.027000px;} -.y1448{bottom:229.343000px;} -.yd56{bottom:229.663000px;} -.y2a9{bottom:229.677000px;} -.y127a{bottom:229.729000px;} -.y10a9{bottom:229.749000px;} -.y6c7{bottom:229.815123px;} -.yc90{bottom:229.942000px;} -.y56a{bottom:230.000000px;} -.y1461{bottom:230.019000px;} -.y79f{bottom:230.292000px;} -.y12e2{bottom:230.425000px;} -.y10d0{bottom:230.441000px;} -.y8e5{bottom:230.580000px;} -.y21b{bottom:230.789000px;} -.y115c{bottom:230.808000px;} -.y102b{bottom:230.857000px;} -.y379{bottom:230.912000px;} -.y1245{bottom:231.086371px;} -.yef3{bottom:231.091000px;} -.ycb9{bottom:231.128000px;} -.yb3f{bottom:231.190000px;} -.yf12{bottom:231.243000px;} -.y1547{bottom:231.347000px;} -.y15e6{bottom:231.368000px;} -.y9d6{bottom:231.460000px;} -.y1170{bottom:231.541000px;} -.y1244{bottom:231.619714px;} -.y216{bottom:231.758000px;} -.y11df{bottom:231.823000px;} -.y14af{bottom:231.935000px;} -.yd0a{bottom:231.953000px;} -.y856{bottom:231.959000px;} +.ye46{bottom:228.565000px;} +.y667{bottom:228.601000px;} +.yc4b{bottom:228.783000px;} +.y695{bottom:228.814000px;} +.yf04{bottom:228.908000px;} +.y1156{bottom:228.946000px;} +.y934{bottom:229.027000px;} +.y13ef{bottom:229.343000px;} +.yd1d{bottom:229.663000px;} +.y2a3{bottom:229.677000px;} +.y122a{bottom:229.729000px;} +.y1060{bottom:229.749000px;} +.y6b0{bottom:229.815123px;} +.yc58{bottom:229.942000px;} +.y1408{bottom:230.019000px;} +.y784{bottom:230.292000px;} +.y1290{bottom:230.425000px;} +.y1087{bottom:230.441000px;} +.y8c1{bottom:230.580000px;} +.y215{bottom:230.789000px;} +.y1111{bottom:230.808000px;} +.yfe4{bottom:230.857000px;} +.y371{bottom:230.912000px;} +.y11f5{bottom:231.086371px;} +.yeb3{bottom:231.091000px;} +.yc81{bottom:231.128000px;} +.yb0f{bottom:231.190000px;} +.yed0{bottom:231.243000px;} +.y14ea{bottom:231.347000px;} +.y1588{bottom:231.368000px;} +.y9ad{bottom:231.460000px;} +.y1124{bottom:231.541000px;} +.y11f4{bottom:231.619714px;} +.y210{bottom:231.758000px;} +.y1191{bottom:231.823000px;} +.y1454{bottom:231.935000px;} +.ycd1{bottom:231.953000px;} +.y835{bottom:231.959000px;} +.yd9{bottom:231.969000px;} .y4c{bottom:232.405000px;} -.y378{bottom:232.406000px;} -.y1382{bottom:232.422000px;} -.y2a7{bottom:232.498000px;} -.y1335{bottom:232.535000px;} -.y104d{bottom:232.581000px;} -.y6ca{bottom:232.662467px;} -.ya47{bottom:233.103000px;} -.y215{bottom:233.252000px;} -.y1237{bottom:233.286000px;} -.y114b{bottom:233.323000px;} -.yea6{bottom:233.420000px;} -.y8c6{bottom:233.661000px;} -.y47a{bottom:233.721000px;} -.y10f4{bottom:233.769000px;} -.y4ad{bottom:233.927000px;} -.y55e{bottom:233.953000px;} -.y532{bottom:234.036000px;} -.y5af{bottom:234.147000px;} -.y3bc{bottom:234.152000px;} -.y9f7{bottom:234.177000px;} -.y179{bottom:234.348876px;} -.y1582{bottom:234.410000px;} -.y13f8{bottom:234.423000px;} -.y860{bottom:234.500000px;} -.y1583{bottom:234.559000px;} -.y908{bottom:234.565000px;} -.y70b{bottom:234.592000px;} -.y736{bottom:234.654000px;} -.yf72{bottom:234.758000px;} -.y1118{bottom:234.958000px;} -.ybd7{bottom:235.042000px;} -.y178{bottom:235.067630px;} -.y1523{bottom:235.090000px;} -.y1067{bottom:235.134000px;} -.y97f{bottom:235.312000px;} -.y15e7{bottom:235.503000px;} -.y3bb{bottom:235.646000px;} -.y6e0{bottom:235.714000px;} -.ydea{bottom:235.720000px;} -.y166{bottom:235.920000px;} -.y500{bottom:235.994000px;} -.y7cf{bottom:236.000000px;} -.y1189{bottom:236.024000px;} -.y2a8{bottom:236.114000px;} -.y8a0{bottom:236.229000px;} -.y12bf{bottom:236.334000px;} -.ya6a{bottom:236.376120px;} -.y317{bottom:236.385000px;} -.y7d3{bottom:236.418000px;} -.y1207{bottom:236.535000px;} -.ybaf{bottom:236.569000px;} -.yb84{bottom:236.779000px;} -.y755{bottom:236.888000px;} -.y1087{bottom:236.933000px;} -.y14da{bottom:237.177000px;} -.y21a{bottom:237.366000px;} -.yce8{bottom:237.384000px;} -.ye5f{bottom:237.486000px;} -.ya92{bottom:237.741000px;} -.yfc6{bottom:237.749000px;} -.y5dd{bottom:237.781000px;} -.y316{bottom:237.879000px;} -.y438{bottom:238.165000px;} -.y6c6{bottom:238.218874px;} -.y13c9{bottom:238.227000px;} -.yf9b{bottom:238.245000px;} +.y370{bottom:232.406000px;} +.y132c{bottom:232.422000px;} +.y2a1{bottom:232.498000px;} +.y12e1{bottom:232.535000px;} +.y1005{bottom:232.581000px;} +.y6b3{bottom:232.662467px;} +.ya1c{bottom:233.103000px;} +.y20f{bottom:233.252000px;} +.y11e8{bottom:233.286000px;} +.y1101{bottom:233.323000px;} +.ye67{bottom:233.420000px;} +.y8a3{bottom:233.661000px;} +.y46e{bottom:233.721000px;} +.y10aa{bottom:233.769000px;} +.y49f{bottom:233.927000px;} +.y54d{bottom:233.953000px;} +.y522{bottom:234.036000px;} +.y59d{bottom:234.147000px;} +.y3b3{bottom:234.152000px;} +.y9cd{bottom:234.177000px;} +.y176{bottom:234.348876px;} +.y1525{bottom:234.410000px;} +.y139f{bottom:234.423000px;} +.y1526{bottom:234.559000px;} +.y8e3{bottom:234.565000px;} +.y6f4{bottom:234.592000px;} +.y71e{bottom:234.654000px;} +.yf30{bottom:234.758000px;} +.y10ce{bottom:234.958000px;} +.yba3{bottom:235.042000px;} +.y175{bottom:235.067630px;} +.y14c7{bottom:235.090000px;} +.y101f{bottom:235.134000px;} +.y958{bottom:235.312000px;} +.y1589{bottom:235.503000px;} +.y3b2{bottom:235.646000px;} +.y6c9{bottom:235.714000px;} +.ydae{bottom:235.720000px;} +.y164{bottom:235.920000px;} +.y4f1{bottom:235.994000px;} +.y113d{bottom:236.024000px;} +.y2a2{bottom:236.114000px;} +.y87e{bottom:236.229000px;} +.y126f{bottom:236.334000px;} +.ya3e{bottom:236.376120px;} +.y310{bottom:236.385000px;} +.y7b5{bottom:236.418000px;} +.y11b8{bottom:236.535000px;} +.yb7c{bottom:236.569000px;} +.yb52{bottom:236.779000px;} +.y73a{bottom:236.888000px;} +.y103f{bottom:236.933000px;} +.y147f{bottom:237.177000px;} +.y214{bottom:237.366000px;} +.ycaf{bottom:237.384000px;} +.ye21{bottom:237.486000px;} +.ya65{bottom:237.741000px;} +.yf83{bottom:237.749000px;} +.y5cb{bottom:237.781000px;} +.y30f{bottom:237.879000px;} +.y42d{bottom:238.165000px;} +.y6af{bottom:238.218874px;} +.y1371{bottom:238.227000px;} +.yf58{bottom:238.245000px;} .y7b{bottom:238.383000px;} -.y776{bottom:238.547000px;} -.yac0{bottom:238.672000px;} -.yb4{bottom:238.881000px;} -.y1d3{bottom:238.909000px;} -.ye36{bottom:239.166000px;} -.y141a{bottom:239.278000px;} -.y7c5{bottom:239.525000px;} -.y87a{bottom:239.574000px;} -.ya23{bottom:239.629000px;} -.y135d{bottom:239.909000px;} -.y7ef{bottom:239.955657px;} -.y400{bottom:239.967000px;} -.y9ab{bottom:240.055000px;} -.ye12{bottom:240.347000px;} -.y638{bottom:240.494440px;} -.ye84{bottom:240.520000px;} -.y67b{bottom:240.556000px;} -.yc82{bottom:240.738000px;} -.y6aa{bottom:240.769000px;} -.yf45{bottom:240.863000px;} -.y11a2{bottom:240.901000px;} -.y95a{bottom:240.982000px;} -.y101{bottom:241.084000px;} -.y1447{bottom:241.298000px;} -.yae7{bottom:241.386000px;} -.y1484{bottom:241.504000px;} -.y2a6{bottom:241.632000px;} -.y1279{bottom:241.684000px;} -.y10a8{bottom:241.705000px;} -.yc8f{bottom:241.897000px;} -.y79e{bottom:242.247000px;} -.y249{bottom:242.266000px;} -.y12e1{bottom:242.380000px;} -.y10cf{bottom:242.396000px;} -.y218{bottom:242.717000px;} -.y135c{bottom:242.721000px;} -.y115b{bottom:242.763000px;} -.y102a{bottom:242.812000px;} -.y1580{bottom:242.928000px;} -.yb3c{bottom:243.045000px;} -.yef2{bottom:243.046000px;} -.y1581{bottom:243.077000px;} -.ycb8{bottom:243.083000px;} -.y83a{bottom:243.087000px;} -.yb3e{bottom:243.145000px;} -.y639{bottom:243.278440px;} -.y1546{bottom:243.302000px;} -.y116f{bottom:243.496000px;} -.y7f1{bottom:243.756677px;} -.y11de{bottom:243.778000px;} -.y6c9{bottom:243.867467px;} -.yd09{bottom:243.909000px;} -.y637{bottom:243.974439px;} +.y75c{bottom:238.547000px;} +.ya93{bottom:238.672000px;} +.yb3{bottom:238.881000px;} +.y1ce{bottom:238.909000px;} +.ydf9{bottom:239.166000px;} +.y13c1{bottom:239.278000px;} +.y7a9{bottom:239.525000px;} +.y858{bottom:239.574000px;} +.y9f9{bottom:239.629000px;} +.y1308{bottom:239.909000px;} +.y7d1{bottom:239.955657px;} +.y3f6{bottom:239.967000px;} +.y983{bottom:240.055000px;} +.ydd6{bottom:240.347000px;} +.y624{bottom:240.494440px;} +.ye45{bottom:240.520000px;} +.y666{bottom:240.556000px;} +.yc4a{bottom:240.738000px;} +.y694{bottom:240.769000px;} +.yf03{bottom:240.863000px;} +.y1155{bottom:240.901000px;} +.y933{bottom:240.982000px;} +.y104{bottom:241.084000px;} +.y13ee{bottom:241.298000px;} +.yab9{bottom:241.386000px;} +.y142a{bottom:241.504000px;} +.y2a0{bottom:241.632000px;} +.y1229{bottom:241.684000px;} +.y105f{bottom:241.705000px;} +.yc57{bottom:241.897000px;} +.y783{bottom:242.247000px;} +.y243{bottom:242.266000px;} +.y128f{bottom:242.380000px;} +.y1086{bottom:242.396000px;} +.y212{bottom:242.717000px;} +.y1307{bottom:242.721000px;} +.y1110{bottom:242.763000px;} +.yfe3{bottom:242.812000px;} +.y1523{bottom:242.928000px;} +.yb0c{bottom:243.045000px;} +.yeb2{bottom:243.046000px;} +.y1524{bottom:243.077000px;} +.yc80{bottom:243.083000px;} +.y819{bottom:243.087000px;} +.yb0e{bottom:243.145000px;} +.y625{bottom:243.278440px;} +.y14e9{bottom:243.302000px;} +.y1123{bottom:243.496000px;} +.y7d3{bottom:243.756677px;} +.y1190{bottom:243.778000px;} +.y6b2{bottom:243.867467px;} +.ycd0{bottom:243.909000px;} +.y623{bottom:243.974439px;} .y4b{bottom:244.360000px;} -.y377{bottom:244.361000px;} -.y2a4{bottom:244.454000px;} -.y1334{bottom:244.490000px;} -.y104c{bottom:244.536000px;} -.yd8{bottom:244.749000px;} -.y1243{bottom:244.763932px;} -.y137{bottom:244.913000px;} -.y1236{bottom:245.241000px;} -.y114a{bottom:245.278000px;} -.yea5{bottom:245.375000px;} -.ya46{bottom:245.456000px;} -.y479{bottom:245.677000px;} -.y217{bottom:245.706000px;} -.y10f3{bottom:245.724000px;} -.y4ac{bottom:245.882000px;} -.y55d{bottom:245.908000px;} -.y531{bottom:245.991000px;} -.y5ae{bottom:246.102000px;} -.y15e5{bottom:246.262000px;} -.yb12{bottom:246.264000px;} -.y13f6{bottom:246.379000px;} -.yec2{bottom:246.471000px;} -.y3ba{bottom:246.505000px;} -.y907{bottom:246.520000px;} -.y70a{bottom:246.547000px;} -.y735{bottom:246.609000px;} -.y6c5{bottom:246.622624px;} -.yc03{bottom:246.705000px;} -.yf71{bottom:246.713000px;} -.ybd4{bottom:246.897000px;} -.y1117{bottom:246.913000px;} -.ybd6{bottom:246.997000px;} -.yfe1{bottom:247.000000px;} -.y1522{bottom:247.045000px;} -.ya69{bottom:247.198920px;} -.y97e{bottom:247.267000px;} -.y315{bottom:247.361000px;} -.y6df{bottom:247.669000px;} -.yde9{bottom:247.675000px;} -.y165{bottom:247.875000px;} -.y1188{bottom:247.980000px;} -.y3b9{bottom:248.000000px;} -.y2a5{bottom:248.069000px;} -.y1b1{bottom:248.242000px;} -.y12be{bottom:248.289000px;} -.y1206{bottom:248.491000px;} -.y176{bottom:248.824903px;} -.y754{bottom:248.843000px;} -.y827{bottom:248.844000px;} -.y1496{bottom:248.871000px;} -.y1086{bottom:248.889000px;} -.y133f{bottom:249.000000px;} -.y14d9{bottom:249.132000px;} -.y3ff{bottom:249.266000px;} -.yce7{bottom:249.339000px;} -.ye5e{bottom:249.441000px;} -.ya91{bottom:249.696000px;} -.yfc5{bottom:249.704000px;} -.y5dc{bottom:249.736000px;} -.y7ee{bottom:249.761112px;} -.y313{bottom:249.834000px;} -.y13f7{bottom:249.994000px;} -.y437{bottom:250.120000px;} -.y13c8{bottom:250.182000px;} -.yf9a{bottom:250.200000px;} -.y1007{bottom:250.214000px;} -.yb60{bottom:250.229000px;} +.y36f{bottom:244.361000px;} +.y29e{bottom:244.454000px;} +.y12e0{bottom:244.490000px;} +.y1004{bottom:244.536000px;} +.y11f3{bottom:244.763932px;} +.y138{bottom:244.913000px;} +.y11e7{bottom:245.241000px;} +.y1100{bottom:245.278000px;} +.ye66{bottom:245.375000px;} +.ya1b{bottom:245.456000px;} +.y46d{bottom:245.677000px;} +.y211{bottom:245.706000px;} +.y10a9{bottom:245.724000px;} +.y49e{bottom:245.882000px;} +.y54c{bottom:245.908000px;} +.y521{bottom:245.991000px;} +.y59c{bottom:246.102000px;} +.y1587{bottom:246.262000px;} +.yae3{bottom:246.264000px;} +.y139d{bottom:246.379000px;} +.ye83{bottom:246.471000px;} +.y3b1{bottom:246.505000px;} +.y8e2{bottom:246.520000px;} +.y6f3{bottom:246.547000px;} +.y71d{bottom:246.609000px;} +.y6ae{bottom:246.622624px;} +.ybcf{bottom:246.705000px;} +.yf2f{bottom:246.713000px;} +.yba0{bottom:246.897000px;} +.y10cd{bottom:246.913000px;} +.yba2{bottom:246.997000px;} +.y14c6{bottom:247.045000px;} +.ya3d{bottom:247.198920px;} +.y957{bottom:247.267000px;} +.y30e{bottom:247.361000px;} +.y6c8{bottom:247.669000px;} +.ydad{bottom:247.675000px;} +.y163{bottom:247.875000px;} +.y113c{bottom:247.980000px;} +.y3b0{bottom:248.000000px;} +.y29f{bottom:248.069000px;} +.y1ae{bottom:248.242000px;} +.y126e{bottom:248.289000px;} +.y11b7{bottom:248.491000px;} +.y173{bottom:248.824903px;} +.y739{bottom:248.843000px;} +.y807{bottom:248.844000px;} +.y143b{bottom:248.871000px;} +.y103e{bottom:248.889000px;} +.y147e{bottom:249.132000px;} +.y3f5{bottom:249.266000px;} +.ycae{bottom:249.339000px;} +.ye20{bottom:249.441000px;} +.ya64{bottom:249.696000px;} +.yf82{bottom:249.704000px;} +.y5ca{bottom:249.736000px;} +.y7d0{bottom:249.761112px;} +.y30c{bottom:249.834000px;} +.y139e{bottom:249.994000px;} +.y42c{bottom:250.120000px;} +.y1370{bottom:250.182000px;} +.yf57{bottom:250.200000px;} +.yfc1{bottom:250.214000px;} +.yb2f{bottom:250.229000px;} .y7a{bottom:250.338000px;} -.yabf{bottom:250.627000px;} -.yb3{bottom:250.836000px;} -.y1d2{bottom:250.864000px;} -.y1419{bottom:251.233000px;} -.y157e{bottom:251.446000px;} -.y879{bottom:251.529000px;} -.ya22{bottom:251.584000px;} -.y157f{bottom:251.595000px;} -.y14ae{bottom:251.860000px;} -.y3fd{bottom:251.922000px;} -.y9aa{bottom:252.011000px;} -.ye11{bottom:252.302000px;} -.ye83{bottom:252.475000px;} -.y8cd{bottom:252.500000px;} -.y67a{bottom:252.511000px;} -.y9f6{bottom:252.567000px;} -.y6a9{bottom:252.724000px;} -.yf44{bottom:252.818000px;} -.y11a1{bottom:252.856000px;} -.y959{bottom:252.937000px;} -.y100{bottom:253.039000px;} -.y1446{bottom:253.254000px;} -.y855{bottom:253.390000px;} -.y314{bottom:253.450000px;} -.y1483{bottom:253.459000px;} -.y14fd{bottom:253.626000px;} -.y1278{bottom:253.640000px;} -.y10a7{bottom:253.660000px;} -.y79d{bottom:254.202000px;} -.y10ce{bottom:254.351000px;} -.y177{bottom:254.574943px;} -.y1029{bottom:254.767000px;} -.yef1{bottom:255.001000px;} -.ycb6{bottom:255.038000px;} -.yb3d{bottom:255.100000px;} -.y1545{bottom:255.257000px;} -.y7f0{bottom:255.344942px;} -.yd2c{bottom:255.350000px;} -.y116e{bottom:255.451000px;} -.yd08{bottom:255.864000px;} -.y15e4{bottom:256.026000px;} -.y8e4{bottom:256.053000px;} -.y3fe{bottom:256.184000px;} +.ya92{bottom:250.627000px;} +.y1cd{bottom:250.864000px;} +.y13c0{bottom:251.233000px;} +.yd8{bottom:251.419000px;} +.y1521{bottom:251.446000px;} +.y857{bottom:251.529000px;} +.y9f8{bottom:251.584000px;} +.y1522{bottom:251.595000px;} +.y1453{bottom:251.860000px;} +.y3f3{bottom:251.922000px;} +.y982{bottom:252.011000px;} +.ydd5{bottom:252.302000px;} +.ye44{bottom:252.475000px;} +.y665{bottom:252.511000px;} +.y9cc{bottom:252.567000px;} +.y693{bottom:252.724000px;} +.yf02{bottom:252.818000px;} +.y1154{bottom:252.856000px;} +.y932{bottom:252.937000px;} +.y103{bottom:253.039000px;} +.y13ed{bottom:253.254000px;} +.y834{bottom:253.390000px;} +.y30d{bottom:253.450000px;} +.y1429{bottom:253.459000px;} +.y14a1{bottom:253.626000px;} +.y1228{bottom:253.640000px;} +.y105e{bottom:253.660000px;} +.y782{bottom:254.202000px;} +.y1085{bottom:254.351000px;} +.y174{bottom:254.574943px;} +.yfe2{bottom:254.767000px;} +.yeb1{bottom:255.001000px;} +.yc7e{bottom:255.038000px;} +.yb0d{bottom:255.100000px;} +.y14e8{bottom:255.257000px;} +.y7d2{bottom:255.344942px;} +.ycf3{bottom:255.350000px;} +.y1122{bottom:255.451000px;} +.yccf{bottom:255.864000px;} +.y1586{bottom:256.026000px;} +.y8c0{bottom:256.053000px;} +.y3f4{bottom:256.184000px;} .y4a{bottom:256.315000px;} -.y376{bottom:256.316000px;} -.y2a3{bottom:256.409000px;} -.y1333{bottom:256.446000px;} -.y104b{bottom:256.491000px;} -.yb8e{bottom:256.500000px;} -.y136{bottom:256.868000px;} -.y1235{bottom:257.197000px;} -.y1149{bottom:257.233000px;} -.yea4{bottom:257.330000px;} -.y635{bottom:257.393905px;} -.yd84{bottom:257.439000px;} -.y135b{bottom:257.477000px;} -.y478{bottom:257.632000px;} -.y10f2{bottom:257.679000px;} -.ya45{bottom:257.810000px;} -.y4ab{bottom:257.838000px;} -.y55c{bottom:257.863000px;} -.y145f{bottom:257.907000px;} -.ydc1{bottom:258.032000px;} -.y5ad{bottom:258.057000px;} -.yb11{bottom:258.219000px;} -.ya68{bottom:258.292290px;} -.y1381{bottom:258.318000px;} -.y13f5{bottom:258.334000px;} -.y906{bottom:258.475000px;} -.y709{bottom:258.502000px;} -.y734{bottom:258.565000px;} -.ycb7{bottom:258.654000px;} -.yf70{bottom:258.668000px;} -.y3b8{bottom:258.859000px;} -.y1116{bottom:258.868000px;} -.ybd5{bottom:258.952000px;} -.y1521{bottom:259.000000px;} -.yc81{bottom:259.127000px;} -.y310{bottom:259.133000px;} -.y97d{bottom:259.222000px;} -.y312{bottom:259.317000px;} -.y933{bottom:259.371000px;} -.y7ed{bottom:259.566568px;} -.y6de{bottom:259.624000px;} -.y164{bottom:259.830000px;} -.y15e2{bottom:259.861000px;} -.y157c{bottom:259.964000px;} -.y157d{bottom:260.113000px;} -.y636{bottom:260.177905px;} -.y12bd{bottom:260.244000px;} -.yb83{bottom:260.260000px;} -.y175{bottom:260.324984px;} -.y3b7{bottom:260.353000px;} -.y1205{bottom:260.446000px;} -.y753{bottom:260.799000px;} -.y1085{bottom:260.844000px;} -.y634{bottom:260.873905px;} -.y14d8{bottom:261.088000px;} -.yd55{bottom:261.094000px;} -.yce6{bottom:261.295000px;} -.ybae{bottom:261.434000px;} -.y7c4{bottom:261.443000px;} -.y1460{bottom:261.523000px;} -.y5db{bottom:261.691000px;} -.y8c5{bottom:261.786000px;} -.y30e{bottom:261.789000px;} -.y436{bottom:262.075000px;} -.y13c7{bottom:262.137000px;} -.yf99{bottom:262.155000px;} -.y1006{bottom:262.169000px;} -.yb5f{bottom:262.184000px;} +.y36e{bottom:256.316000px;} +.y29d{bottom:256.409000px;} +.y12df{bottom:256.446000px;} +.y1003{bottom:256.491000px;} +.y137{bottom:256.868000px;} +.y11e6{bottom:257.197000px;} +.y10ff{bottom:257.233000px;} +.ye65{bottom:257.330000px;} +.y621{bottom:257.393905px;} +.yd4a{bottom:257.439000px;} +.y1306{bottom:257.477000px;} +.y46c{bottom:257.632000px;} +.y10a8{bottom:257.679000px;} +.ya1a{bottom:257.810000px;} +.y49d{bottom:257.838000px;} +.y54b{bottom:257.863000px;} +.y1406{bottom:257.907000px;} +.yd86{bottom:258.032000px;} +.y59b{bottom:258.057000px;} +.yae2{bottom:258.219000px;} +.ya3c{bottom:258.292290px;} +.y132b{bottom:258.318000px;} +.y139c{bottom:258.334000px;} +.y8e1{bottom:258.475000px;} +.y6f2{bottom:258.502000px;} +.y71c{bottom:258.565000px;} +.yc7f{bottom:258.654000px;} +.yf2e{bottom:258.668000px;} +.yb2{bottom:258.806000px;} +.y3af{bottom:258.859000px;} +.y10cc{bottom:258.868000px;} +.yba1{bottom:258.952000px;} +.y14c5{bottom:259.000000px;} +.yc49{bottom:259.127000px;} +.y309{bottom:259.133000px;} +.y956{bottom:259.222000px;} +.y30b{bottom:259.317000px;} +.y90d{bottom:259.371000px;} +.y7cf{bottom:259.566568px;} +.y6c7{bottom:259.624000px;} +.y162{bottom:259.830000px;} +.y1584{bottom:259.861000px;} +.y151f{bottom:259.964000px;} +.y1520{bottom:260.113000px;} +.y622{bottom:260.177905px;} +.y126d{bottom:260.244000px;} +.yb51{bottom:260.260000px;} +.y172{bottom:260.324984px;} +.y3ae{bottom:260.353000px;} +.y11b6{bottom:260.446000px;} +.y738{bottom:260.799000px;} +.y103d{bottom:260.844000px;} +.y620{bottom:260.873905px;} +.y147d{bottom:261.088000px;} +.yd1c{bottom:261.094000px;} +.ycad{bottom:261.295000px;} +.yb7b{bottom:261.434000px;} +.y7a8{bottom:261.443000px;} +.y1407{bottom:261.523000px;} +.y5c9{bottom:261.691000px;} +.y8a2{bottom:261.786000px;} +.y307{bottom:261.789000px;} +.yd7{bottom:261.880000px;} +.y42b{bottom:262.075000px;} +.y136f{bottom:262.137000px;} +.yf56{bottom:262.155000px;} +.yfc0{bottom:262.169000px;} +.yb2e{bottom:262.184000px;} .y79{bottom:262.293000px;} -.y9d5{bottom:262.455000px;} -.yabe{bottom:262.582000px;} -.y1d1{bottom:262.819000px;} -.y839{bottom:263.013000px;} -.y1418{bottom:263.188000px;} -.yc8e{bottom:263.718000px;} -.y14ad{bottom:263.815000px;} -.y3fc{bottom:263.878000px;} -.y9a9{bottom:263.966000px;} -.y15e3{bottom:263.996000px;} -.yd7{bottom:264.156000px;} -.ye10{bottom:264.257000px;} -.y214{bottom:264.268000px;} -.ye82{bottom:264.430000px;} -.y530{bottom:264.548000px;} -.y115a{bottom:264.584000px;} -.y6a8{bottom:264.679000px;} -.yf43{bottom:264.773000px;} -.y11a0{bottom:264.811000px;} -.y958{bottom:264.892000px;} -.yff{bottom:264.994000px;} -.y1445{bottom:265.209000px;} -.y854{bottom:265.345000px;} -.y311{bottom:265.405000px;} -.y1482{bottom:265.414000px;} -.y2a2{bottom:265.542000px;} -.y1277{bottom:265.595000px;} -.yc33{bottom:265.596000px;} -.y10a6{bottom:265.615000px;} -.y30f{bottom:266.051000px;} -.y79c{bottom:266.157000px;} -.y1066{bottom:266.304000px;} -.y10cd{bottom:266.307000px;} -.y1028{bottom:266.723000px;} -.yef0{bottom:266.957000px;} -.ycb5{bottom:266.994000px;} -.yc32{bottom:267.090000px;} -.yd2b{bottom:267.305000px;} -.yb3b{bottom:267.454000px;} -.yd07{bottom:267.819000px;} -.ydab{bottom:267.939000px;} -.y12e0{bottom:267.940000px;} -.y8e3{bottom:268.008000px;} +.y9ac{bottom:262.455000px;} +.ya91{bottom:262.582000px;} +.y1cc{bottom:262.819000px;} +.y818{bottom:263.013000px;} +.y13bf{bottom:263.188000px;} +.yd6{bottom:263.374000px;} +.yc56{bottom:263.718000px;} +.y1452{bottom:263.815000px;} +.y3f2{bottom:263.878000px;} +.y981{bottom:263.966000px;} +.y1585{bottom:263.996000px;} +.ydd4{bottom:264.257000px;} +.y20e{bottom:264.268000px;} +.ye43{bottom:264.430000px;} +.y520{bottom:264.548000px;} +.y110f{bottom:264.584000px;} +.y692{bottom:264.679000px;} +.yf01{bottom:264.773000px;} +.y1153{bottom:264.811000px;} +.y931{bottom:264.892000px;} +.y102{bottom:264.994000px;} +.y13ec{bottom:265.209000px;} +.y833{bottom:265.345000px;} +.y30a{bottom:265.405000px;} +.y1428{bottom:265.414000px;} +.y29c{bottom:265.542000px;} +.y1227{bottom:265.595000px;} +.ybfe{bottom:265.596000px;} +.y105d{bottom:265.615000px;} +.y308{bottom:266.051000px;} +.y781{bottom:266.157000px;} +.y101e{bottom:266.304000px;} +.y1084{bottom:266.307000px;} +.yfe1{bottom:266.723000px;} +.yeb0{bottom:266.957000px;} +.yc7d{bottom:266.994000px;} +.ybfd{bottom:267.090000px;} +.ycf2{bottom:267.305000px;} +.yb0b{bottom:267.454000px;} +.ycce{bottom:267.819000px;} +.yd71{bottom:267.939000px;} +.y128e{bottom:267.940000px;} +.y8bf{bottom:268.008000px;} .y49{bottom:268.271000px;} -.y375{bottom:268.272000px;} -.y774{bottom:268.294000px;} -.y2a0{bottom:268.364000px;} -.y1332{bottom:268.401000px;} -.y104a{bottom:268.447000px;} -.y157b{bottom:268.482000px;} -.y11dd{bottom:268.785000px;} -.y1495{bottom:268.796000px;} -.ya66{bottom:269.115090px;} -.y1234{bottom:269.152000px;} -.y1148{bottom:269.188000px;} -.yae6{bottom:269.274000px;} -.yd83{bottom:269.394000px;} -.y248{bottom:269.415000px;} -.y135a{bottom:269.432000px;} -.y10f1{bottom:269.634000px;} -.y4aa{bottom:269.793000px;} -.y55b{bottom:269.818000px;} -.y145e{bottom:269.862000px;} -.ydbf{bottom:269.987000px;} -.y5ac{bottom:270.012000px;} -.ye35{bottom:270.161000px;} -.ya44{bottom:270.164000px;} -.yb10{bottom:270.174000px;} -.y1380{bottom:270.273000px;} -.y13f4{bottom:270.289000px;} -.y905{bottom:270.430000px;} -.y708{bottom:270.457000px;} -.y733{bottom:270.520000px;} -.yf6f{bottom:270.623000px;} -.yb2{bottom:270.761000px;} -.y1115{bottom:270.823000px;} -.y1520{bottom:270.956000px;} -.y97c{bottom:271.177000px;} -.y3b6{bottom:271.213000px;} -.ybd3{bottom:271.306000px;} -.y932{bottom:271.326000px;} -.ya90{bottom:271.517000px;} -.y163{bottom:271.785000px;} -.y775{bottom:271.909000px;} -.y2a1{bottom:271.979000px;} -.y14e0{bottom:272.000000px;} -.y12bc{bottom:272.199000px;} -.y1579{bottom:272.318000px;} -.y15e1{bottom:272.364000px;} -.y1204{bottom:272.401000px;} -.y89f{bottom:272.433000px;} -.y3b5{bottom:272.707000px;} -.y752{bottom:272.754000px;} -.y14d7{bottom:273.043000px;} -.yd54{bottom:273.049000px;} -.yb39{bottom:273.332000px;} -.y823{bottom:273.381000px;} -.y7c3{bottom:273.398000px;} -.ydc0{bottom:273.602000px;} -.y435{bottom:274.031000px;} -.y13c6{bottom:274.092000px;} -.yf98{bottom:274.110000px;} -.y1005{bottom:274.124000px;} -.yb5e{bottom:274.139000px;} +.y36d{bottom:268.272000px;} +.y75a{bottom:268.294000px;} +.y29a{bottom:268.364000px;} +.y12de{bottom:268.401000px;} +.y1002{bottom:268.447000px;} +.y151e{bottom:268.482000px;} +.y118f{bottom:268.785000px;} +.y143a{bottom:268.796000px;} +.ya3a{bottom:269.115090px;} +.y11e5{bottom:269.152000px;} +.y10fe{bottom:269.188000px;} +.yab8{bottom:269.274000px;} +.yd49{bottom:269.394000px;} +.y242{bottom:269.415000px;} +.y1305{bottom:269.432000px;} +.y10a7{bottom:269.634000px;} +.y49c{bottom:269.793000px;} +.y54a{bottom:269.818000px;} +.y1405{bottom:269.862000px;} +.yd84{bottom:269.987000px;} +.y59a{bottom:270.012000px;} +.ydf8{bottom:270.161000px;} +.ya19{bottom:270.164000px;} +.yae1{bottom:270.174000px;} +.y132a{bottom:270.273000px;} +.y139b{bottom:270.289000px;} +.y8e0{bottom:270.430000px;} +.y6f1{bottom:270.457000px;} +.y71b{bottom:270.520000px;} +.yf2d{bottom:270.623000px;} +.yb1{bottom:270.761000px;} +.y10cb{bottom:270.823000px;} +.y14c4{bottom:270.956000px;} +.y955{bottom:271.177000px;} +.y3ad{bottom:271.213000px;} +.yb9f{bottom:271.306000px;} +.y90c{bottom:271.326000px;} +.ya63{bottom:271.517000px;} +.y161{bottom:271.785000px;} +.y75b{bottom:271.909000px;} +.y29b{bottom:271.979000px;} +.y126c{bottom:272.199000px;} +.y151c{bottom:272.318000px;} +.y1583{bottom:272.364000px;} +.y11b5{bottom:272.401000px;} +.y87d{bottom:272.433000px;} +.y3ac{bottom:272.707000px;} +.y737{bottom:272.754000px;} +.y147c{bottom:273.043000px;} +.yd1b{bottom:273.049000px;} +.yb09{bottom:273.332000px;} +.y804{bottom:273.381000px;} +.y7a7{bottom:273.398000px;} +.yd85{bottom:273.602000px;} +.y42a{bottom:274.031000px;} +.y136e{bottom:274.092000px;} +.yf55{bottom:274.110000px;} +.yfbf{bottom:274.124000px;} +.yb2d{bottom:274.139000px;} .y78{bottom:274.248000px;} -.y9d4{bottom:274.411000px;} -.yd6{bottom:274.617000px;} -.y838{bottom:274.968000px;} -.y1417{bottom:275.143000px;} -.y122{bottom:275.199000px;} -.y44a{bottom:275.500000px;} -.y1187{bottom:275.667000px;} -.y7e2{bottom:275.735830px;} -.y14ac{bottom:275.770000px;} -.y3fb{bottom:275.833000px;} -.y14fc{bottom:275.942000px;} -.y463{bottom:275.963000px;} -.y633{bottom:276.019213px;} -.yd5{bottom:276.111000px;} -.y15df{bottom:276.200000px;} -.y213{bottom:276.223000px;} -.ye81{bottom:276.385000px;} -.y157a{bottom:276.452000px;} -.y52f{bottom:276.504000px;} -.y6a7{bottom:276.634000px;} -.yf42{bottom:276.729000px;} -.y119f{bottom:276.767000px;} -.y679{bottom:276.822000px;} -.y957{bottom:276.847000px;} -.y13b4{bottom:277.065000px;} -.y1444{bottom:277.164000px;} -.y853{bottom:277.301000px;} -.y1481{bottom:277.369000px;} -.y29f{bottom:277.498000px;} -.y1276{bottom:277.550000px;} -.y1065{bottom:278.259000px;} -.y10cc{bottom:278.262000px;} -.yde8{bottom:278.670000px;} -.yeef{bottom:278.912000px;} -.ycb4{bottom:278.949000px;} -.yc31{bottom:279.045000px;} -.yd2a{bottom:279.260000px;} -.yb3a{bottom:279.409000px;} -.ye5d{bottom:279.647000px;} -.yd06{bottom:279.774000px;} -.y13b3{bottom:279.878000px;} -.ydaa{bottom:279.895000px;} -.y8e2{bottom:279.963000px;} -.y2b1{bottom:280.000000px;} +.y9ab{bottom:274.411000px;} +.y817{bottom:274.968000px;} +.y13be{bottom:275.143000px;} +.y123{bottom:275.199000px;} +.y113b{bottom:275.667000px;} +.y7c4{bottom:275.735830px;} +.y1451{bottom:275.770000px;} +.y3f1{bottom:275.833000px;} +.y14a0{bottom:275.942000px;} +.y457{bottom:275.963000px;} +.y61f{bottom:276.019213px;} +.y1581{bottom:276.200000px;} +.y20d{bottom:276.223000px;} +.ye42{bottom:276.385000px;} +.y151d{bottom:276.452000px;} +.y51f{bottom:276.504000px;} +.y691{bottom:276.634000px;} +.yf00{bottom:276.729000px;} +.y1152{bottom:276.767000px;} +.y664{bottom:276.822000px;} +.y930{bottom:276.847000px;} +.y135d{bottom:277.065000px;} +.y13eb{bottom:277.164000px;} +.y832{bottom:277.301000px;} +.y1427{bottom:277.369000px;} +.y299{bottom:277.498000px;} +.y1226{bottom:277.550000px;} +.y101d{bottom:278.259000px;} +.y1083{bottom:278.262000px;} +.ydac{bottom:278.670000px;} +.yeaf{bottom:278.912000px;} +.yc7c{bottom:278.949000px;} +.ybfc{bottom:279.045000px;} +.ycf1{bottom:279.260000px;} +.yb0a{bottom:279.409000px;} +.ye1f{bottom:279.647000px;} +.yccd{bottom:279.774000px;} +.y135c{bottom:279.878000px;} +.yd70{bottom:279.895000px;} +.y8be{bottom:279.963000px;} .y48{bottom:280.226000px;} -.y374{bottom:280.227000px;} -.y773{bottom:280.249000px;} -.y4a9{bottom:280.254000px;} -.y29d{bottom:280.319000px;} -.y15e0{bottom:280.334000px;} -.y1331{bottom:280.356000px;} -.y1049{bottom:280.402000px;} -.y9dd{bottom:280.500000px;} -.y2ea{bottom:280.508000px;} -.y1233{bottom:281.107000px;} -.y1147{bottom:281.143000px;} -.y1b0{bottom:281.188000px;} -.yae5{bottom:281.230000px;} -.y1d0{bottom:281.250000px;} -.ya21{bottom:281.333000px;} -.yd82{bottom:281.350000px;} -.y247{bottom:281.370000px;} -.y1359{bottom:281.387000px;} -.y6dd{bottom:281.542000px;} -.y10f0{bottom:281.589000px;} -.y4a8{bottom:281.748000px;} -.y55a{bottom:281.773000px;} -.y145d{bottom:281.818000px;} -.ydbe{bottom:281.942000px;} -.y5ab{bottom:281.967000px;} -.ye34{bottom:282.116000px;} -.yb0f{bottom:282.129000px;} -.y137f{bottom:282.228000px;} -.y13f3{bottom:282.244000px;} -.yc4d{bottom:282.375000px;} -.y904{bottom:282.385000px;} -.y707{bottom:282.413000px;} -.y732{bottom:282.475000px;} -.ya43{bottom:282.517000px;} -.y878{bottom:282.524000px;} -.yec1{bottom:282.631000px;} -.yb1{bottom:282.716000px;} -.y1cf{bottom:282.744000px;} -.y1114{bottom:282.778000px;} -.y822{bottom:282.846000px;} -.y151e{bottom:282.911000px;} -.y97b{bottom:283.133000px;} -.ybd0{bottom:283.161000px;} -.ybd2{bottom:283.261000px;} -.y931{bottom:283.281000px;} -.yfe{bottom:283.356000px;} -.y162{bottom:283.740000px;} -.yc4c{bottom:283.870000px;} -.y29e{bottom:283.934000px;} -.y9f5{bottom:284.011000px;} -.yea3{bottom:284.054000px;} -.y12bb{bottom:284.154000px;} -.y1203{bottom:284.356000px;} -.yfc4{bottom:284.379000px;} -.y89e{bottom:284.388000px;} -.yabd{bottom:284.403000px;} -.y12c{bottom:284.668950px;} -.y751{bottom:284.709000px;} -.y1578{bottom:284.821000px;} -.y14d6{bottom:284.998000px;} -.yd53{bottom:285.004000px;} -.y3b4{bottom:285.061000px;} -.y7c2{bottom:285.353000px;} +.y36c{bottom:280.227000px;} +.y759{bottom:280.249000px;} +.y49b{bottom:280.254000px;} +.y297{bottom:280.319000px;} +.y1582{bottom:280.334000px;} +.y12dd{bottom:280.356000px;} +.y1001{bottom:280.402000px;} +.y2e3{bottom:280.508000px;} +.y11e4{bottom:281.107000px;} +.y10fd{bottom:281.143000px;} +.y1ad{bottom:281.188000px;} +.yab7{bottom:281.230000px;} +.y1cb{bottom:281.250000px;} +.y9f7{bottom:281.333000px;} +.yd48{bottom:281.350000px;} +.y241{bottom:281.370000px;} +.y1304{bottom:281.387000px;} +.y6c6{bottom:281.542000px;} +.y10a6{bottom:281.589000px;} +.y49a{bottom:281.748000px;} +.y549{bottom:281.773000px;} +.y1404{bottom:281.818000px;} +.yd83{bottom:281.942000px;} +.y599{bottom:281.967000px;} +.ydf7{bottom:282.116000px;} +.yae0{bottom:282.129000px;} +.y1329{bottom:282.228000px;} +.y139a{bottom:282.244000px;} +.yc17{bottom:282.375000px;} +.y8df{bottom:282.385000px;} +.y6f0{bottom:282.413000px;} +.y71a{bottom:282.475000px;} +.ya18{bottom:282.517000px;} +.y856{bottom:282.524000px;} +.ye82{bottom:282.631000px;} +.y1ca{bottom:282.744000px;} +.y10ca{bottom:282.778000px;} +.yd5{bottom:282.825000px;} +.y803{bottom:282.846000px;} +.y14c2{bottom:282.911000px;} +.y954{bottom:283.133000px;} +.yb9c{bottom:283.161000px;} +.yb9e{bottom:283.261000px;} +.y90b{bottom:283.281000px;} +.y101{bottom:283.356000px;} +.y160{bottom:283.740000px;} +.yc16{bottom:283.870000px;} +.y298{bottom:283.934000px;} +.y9cb{bottom:284.011000px;} +.ye64{bottom:284.054000px;} +.y126b{bottom:284.154000px;} +.y11b4{bottom:284.356000px;} +.yf81{bottom:284.379000px;} +.y87c{bottom:284.388000px;} +.ya90{bottom:284.403000px;} +.y12d{bottom:284.668950px;} +.y736{bottom:284.709000px;} +.y151b{bottom:284.821000px;} +.y147b{bottom:284.998000px;} +.yd1a{bottom:285.004000px;} +.y3ab{bottom:285.061000px;} +.y7a6{bottom:285.353000px;} .y32{bottom:285.467000px;} -.y12de{bottom:285.500000px;} -.y434{bottom:285.986000px;} -.yf97{bottom:286.066000px;} -.y1004{bottom:286.079000px;} +.y429{bottom:285.986000px;} +.yf54{bottom:286.066000px;} +.yfbe{bottom:286.079000px;} .y77{bottom:286.203000px;} -.y1544{bottom:286.252000px;} -.y12df{bottom:286.271000px;} -.y9d3{bottom:286.366000px;} -.y11ae{bottom:286.500000px;} -.y151f{bottom:286.526000px;} -.y13b2{bottom:286.569000px;} -.y8c4{bottom:286.604000px;} -.yce5{bottom:286.989000px;} -.yc80{bottom:287.016000px;} -.y11cb{bottom:287.116000px;} -.y116d{bottom:287.276000px;} -.y10a5{bottom:287.436000px;} -.ye0f{bottom:287.443000px;} -.y14ab{bottom:287.725000px;} -.y14fb{bottom:288.296000px;} -.ye80{bottom:288.340000px;} -.y52e{bottom:288.459000px;} -.y6a6{bottom:288.590000px;} -.y1576{bottom:288.656000px;} -.yf41{bottom:288.684000px;} -.y15de{bottom:288.703000px;} -.y119e{bottom:288.722000px;} -.y678{bottom:288.777000px;} -.y956{bottom:288.802000px;} -.y1443{bottom:289.119000px;} -.y852{bottom:289.256000px;} -.yb82{bottom:289.263000px;} -.y1480{bottom:289.325000px;} -.y13b1{bottom:289.382000px;} -.y1275{bottom:289.505000px;} -.yc30{bottom:289.506000px;} -.y371{bottom:289.525000px;} -.y373{bottom:289.709000px;} -.y1064{bottom:290.214000px;} -.y10cb{bottom:290.217000px;} -.ybad{bottom:290.436000px;} -.yde7{bottom:290.625000px;} -.yeee{bottom:290.867000px;} -.ycb3{bottom:290.904000px;} -.yc2f{bottom:291.001000px;} -.y3b3{bottom:291.038000px;} -.y615{bottom:291.175000px;} -.yd29{bottom:291.215000px;} -.ye5c{bottom:291.602000px;} -.yd05{bottom:291.729000px;} -.yb38{bottom:291.762000px;} -.y1084{bottom:291.839000px;} -.yda9{bottom:291.850000px;} -.y8e1{bottom:291.919000px;} -.y5da{bottom:291.920000px;} +.y14e7{bottom:286.252000px;} +.y128d{bottom:286.271000px;} +.y9aa{bottom:286.366000px;} +.y14c3{bottom:286.526000px;} +.y135b{bottom:286.569000px;} +.y8a1{bottom:286.604000px;} +.ycac{bottom:286.989000px;} +.yc48{bottom:287.016000px;} +.y117d{bottom:287.116000px;} +.y1121{bottom:287.276000px;} +.y105c{bottom:287.436000px;} +.ydd3{bottom:287.443000px;} +.y1450{bottom:287.725000px;} +.y149f{bottom:288.296000px;} +.ye41{bottom:288.340000px;} +.y51e{bottom:288.459000px;} +.y690{bottom:288.590000px;} +.y1519{bottom:288.656000px;} +.yeff{bottom:288.684000px;} +.y1580{bottom:288.703000px;} +.y1151{bottom:288.722000px;} +.y663{bottom:288.777000px;} +.y92f{bottom:288.802000px;} +.y13ea{bottom:289.119000px;} +.y831{bottom:289.256000px;} +.yb50{bottom:289.263000px;} +.y1426{bottom:289.325000px;} +.y135a{bottom:289.382000px;} +.y1225{bottom:289.505000px;} +.ybfb{bottom:289.506000px;} +.y369{bottom:289.525000px;} +.y36b{bottom:289.709000px;} +.y101c{bottom:290.214000px;} +.y1082{bottom:290.217000px;} +.yb7a{bottom:290.436000px;} +.ydab{bottom:290.625000px;} +.yb0{bottom:290.687000px;} +.yeae{bottom:290.867000px;} +.yc7b{bottom:290.904000px;} +.ybfa{bottom:291.001000px;} +.y3aa{bottom:291.038000px;} +.y602{bottom:291.175000px;} +.ycf0{bottom:291.215000px;} +.ye1e{bottom:291.602000px;} +.yccc{bottom:291.729000px;} +.yb08{bottom:291.762000px;} +.y103c{bottom:291.839000px;} +.yd6f{bottom:291.850000px;} +.y8bd{bottom:291.919000px;} +.y5c8{bottom:291.920000px;} .y47{bottom:292.181000px;} -.y36f{bottom:292.182000px;} -.y772{bottom:292.204000px;} -.y821{bottom:292.310000px;} -.y1330{bottom:292.311000px;} -.y1048{bottom:292.357000px;} -.y13c5{bottom:292.481000px;} -.y914{bottom:292.500000px;} -.y1577{bottom:292.791000px;} -.y1027{bottom:293.026000px;} -.y1232{bottom:293.062000px;} -.y1146{bottom:293.099000px;} -.y1af{bottom:293.143000px;} -.yae4{bottom:293.185000px;} -.ya20{bottom:293.288000px;} -.yd81{bottom:293.305000px;} -.y1358{bottom:293.343000px;} -.y6dc{bottom:293.497000px;} -.y1416{bottom:293.533000px;} -.y10ef{bottom:293.544000px;} -.y4a7{bottom:293.703000px;} -.y66e{bottom:293.778128px;} -.ydbd{bottom:293.897000px;} -.y5aa{bottom:293.922000px;} -.y137e{bottom:294.183000px;} -.y3fa{bottom:294.222000px;} -.y9a8{bottom:294.224000px;} -.y4ff{bottom:294.273000px;} -.yc4b{bottom:294.331000px;} -.y903{bottom:294.340000px;} -.y706{bottom:294.368000px;} -.y731{bottom:294.430000px;} -.y877{bottom:294.479000px;} -.yec0{bottom:294.587000px;} -.y1113{bottom:294.734000px;} -.yfe0{bottom:294.746000px;} -.y212{bottom:294.758000px;} -.y151d{bottom:294.866000px;} -.ya42{bottom:294.871000px;} -.y837{bottom:294.893000px;} -.y97a{bottom:295.088000px;} -.y820{bottom:295.123000px;} -.ybd1{bottom:295.216000px;} -.y930{bottom:295.237000px;} -.y12a{bottom:295.491750px;} -.yd4{bottom:295.518000px;} -.y161{bottom:295.696000px;} -.y372{bottom:295.797000px;} -.y79b{bottom:295.815000px;} -.yc4a{bottom:295.825000px;} -.y9f4{bottom:295.966000px;} -.yea2{bottom:296.009000px;} -.y13b0{bottom:296.074000px;} -.y12ba{bottom:296.110000px;} -.y1202{bottom:296.311000px;} -.y370{bottom:296.444000px;} -.y15db{bottom:296.524000px;} -.y750{bottom:296.664000px;} -.y15dd{bottom:296.673000px;} -.y14d5{bottom:296.953000px;} -.yd52{bottom:296.960000px;} -.y3b1{bottom:297.016000px;} +.y367{bottom:292.182000px;} +.y758{bottom:292.204000px;} +.y802{bottom:292.310000px;} +.y12dc{bottom:292.311000px;} +.y1000{bottom:292.357000px;} +.y136d{bottom:292.481000px;} +.y151a{bottom:292.791000px;} +.yfe0{bottom:293.026000px;} +.y11e3{bottom:293.062000px;} +.y10fc{bottom:293.099000px;} +.y1ac{bottom:293.143000px;} +.yab6{bottom:293.185000px;} +.y9f6{bottom:293.288000px;} +.yd47{bottom:293.305000px;} +.y1303{bottom:293.343000px;} +.y6c5{bottom:293.497000px;} +.y13bd{bottom:293.533000px;} +.y10a5{bottom:293.544000px;} +.y499{bottom:293.703000px;} +.y65a{bottom:293.778128px;} +.yd82{bottom:293.897000px;} +.y598{bottom:293.922000px;} +.y1328{bottom:294.183000px;} +.y3f0{bottom:294.222000px;} +.y980{bottom:294.224000px;} +.y4f0{bottom:294.273000px;} +.yc15{bottom:294.331000px;} +.y8de{bottom:294.340000px;} +.y6ef{bottom:294.368000px;} +.y719{bottom:294.430000px;} +.y855{bottom:294.479000px;} +.ye81{bottom:294.587000px;} +.y10c9{bottom:294.734000px;} +.yf9b{bottom:294.746000px;} +.y20c{bottom:294.758000px;} +.yd4{bottom:294.780000px;} +.y14c1{bottom:294.866000px;} +.ya17{bottom:294.871000px;} +.y816{bottom:294.893000px;} +.y953{bottom:295.088000px;} +.y801{bottom:295.123000px;} +.yb9d{bottom:295.216000px;} +.y90a{bottom:295.237000px;} +.y12b{bottom:295.491750px;} +.y15f{bottom:295.696000px;} +.y36a{bottom:295.797000px;} +.y780{bottom:295.815000px;} +.yc14{bottom:295.825000px;} +.y9ca{bottom:295.966000px;} +.ye63{bottom:296.009000px;} +.y1359{bottom:296.074000px;} +.y126a{bottom:296.110000px;} +.y11b3{bottom:296.311000px;} +.y368{bottom:296.444000px;} +.y157d{bottom:296.524000px;} +.y735{bottom:296.664000px;} +.y157f{bottom:296.673000px;} +.y147a{bottom:296.953000px;} +.yd19{bottom:296.960000px;} +.y3a8{bottom:297.016000px;} .y31{bottom:297.422000px;} -.y1159{bottom:297.530000px;} -.yfdf{bottom:297.559000px;} -.yb36{bottom:297.640000px;} -.y433{bottom:297.941000px;} -.yf6e{bottom:297.945000px;} -.yf96{bottom:298.021000px;} -.y1003{bottom:298.034000px;} +.y110e{bottom:297.530000px;} +.yf9a{bottom:297.559000px;} +.yb06{bottom:297.640000px;} +.y428{bottom:297.941000px;} +.yf2c{bottom:297.945000px;} +.yf53{bottom:298.021000px;} +.yfbd{bottom:298.034000px;} .y76{bottom:298.158000px;} -.y1543{bottom:298.207000px;} -.y9d2{bottom:298.321000px;} -.y8c3{bottom:298.559000px;} -.yce4{bottom:298.945000px;} -.y116c{bottom:299.231000px;} -.ye0e{bottom:299.398000px;} -.y14aa{bottom:299.681000px;} -.ye7f{bottom:300.296000px;} -.y29b{bottom:300.384000px;} -.y52c{bottom:300.414000px;} -.yb0e{bottom:300.519000px;} -.yf40{bottom:300.639000px;} -.y14fa{bottom:300.650000px;} -.y119d{bottom:300.677000px;} -.y677{bottom:300.732000px;} -.y1575{bottom:301.159000px;} -.y1ce{bottom:301.175000px;} -.y851{bottom:301.211000px;} -.yb81{bottom:301.218000px;} -.y147f{bottom:301.280000px;} -.y1274{bottom:301.460000px;} -.y36e{bottom:301.480000px;} -.y7ff{bottom:301.500000px;} -.y1063{bottom:302.169000px;} -.y10ca{bottom:302.172000px;} -.y29c{bottom:302.376000px;} -.ybac{bottom:302.391000px;} -.yde5{bottom:302.580000px;} -.yb0{bottom:302.642000px;} -.y1cc{bottom:302.670000px;} -.yeed{bottom:302.822000px;} -.ycb2{bottom:302.859000px;} -.yc2e{bottom:302.956000px;} -.y614{bottom:303.130000px;} -.yb5d{bottom:303.142000px;} -.yd28{bottom:303.170000px;} -.ye5b{bottom:303.557000px;} -.yd04{bottom:303.684000px;} -.yb37{bottom:303.718000px;} -.y1083{bottom:303.794000px;} -.yda8{bottom:303.805000px;} -.yc6b{bottom:303.843000px;} -.y8e0{bottom:303.874000px;} -.y5d9{bottom:303.875000px;} -.yfcd{bottom:304.000000px;} -.y52d{bottom:304.029000px;} +.y14e6{bottom:298.207000px;} +.y9a9{bottom:298.321000px;} +.y8a0{bottom:298.559000px;} +.ycab{bottom:298.945000px;} +.y1120{bottom:299.231000px;} +.ydd2{bottom:299.398000px;} +.y144f{bottom:299.681000px;} +.ye40{bottom:300.296000px;} +.y295{bottom:300.384000px;} +.y51c{bottom:300.414000px;} +.yadf{bottom:300.519000px;} +.yefe{bottom:300.639000px;} +.y149e{bottom:300.650000px;} +.y1150{bottom:300.677000px;} +.y662{bottom:300.732000px;} +.y1518{bottom:301.159000px;} +.y1c9{bottom:301.175000px;} +.y830{bottom:301.211000px;} +.yb4f{bottom:301.218000px;} +.y1425{bottom:301.280000px;} +.y1224{bottom:301.460000px;} +.y366{bottom:301.480000px;} +.y101b{bottom:302.169000px;} +.y1081{bottom:302.172000px;} +.y296{bottom:302.376000px;} +.yb79{bottom:302.391000px;} +.yda9{bottom:302.580000px;} +.yaf{bottom:302.642000px;} +.y1c7{bottom:302.670000px;} +.yead{bottom:302.822000px;} +.yc7a{bottom:302.859000px;} +.ybf9{bottom:302.956000px;} +.y601{bottom:303.130000px;} +.yb2c{bottom:303.142000px;} +.ycef{bottom:303.170000px;} +.ye1d{bottom:303.557000px;} +.yccb{bottom:303.684000px;} +.yb07{bottom:303.718000px;} +.y103b{bottom:303.794000px;} +.yd6e{bottom:303.805000px;} +.yc34{bottom:303.843000px;} +.y8bc{bottom:303.874000px;} +.y5c7{bottom:303.875000px;} +.y51d{bottom:304.029000px;} .y46{bottom:304.136000px;} -.y36c{bottom:304.137000px;} -.y771{bottom:304.159000px;} -.y13f2{bottom:304.162000px;} -.y132f{bottom:304.266000px;} -.y1047{bottom:304.312000px;} -.ya8f{bottom:304.463000px;} -.y15dc{bottom:304.643000px;} -.y66d{bottom:304.914129px;} -.y1026{bottom:304.982000px;} -.y1573{bottom:304.995000px;} -.y1231{bottom:305.017000px;} -.y1145{bottom:305.054000px;} -.yae3{bottom:305.140000px;} -.yfd{bottom:305.177000px;} -.y246{bottom:305.212000px;} -.ya1e{bottom:305.243000px;} -.yd80{bottom:305.260000px;} -.y1357{bottom:305.298000px;} -.yc6a{bottom:305.338000px;} -.y6db{bottom:305.452000px;} -.y10ee{bottom:305.500000px;} -.y13af{bottom:305.538000px;} -.y4a6{bottom:305.658000px;} -.ydbb{bottom:305.853000px;} -.y5a9{bottom:305.878000px;} -.y137d{bottom:306.138000px;} -.y9a7{bottom:306.179000px;} -.yde6{bottom:306.195000px;} -.y4fe{bottom:306.228000px;} -.y1cd{bottom:306.285000px;} -.y902{bottom:306.296000px;} -.y705{bottom:306.323000px;} -.y876{bottom:306.434000px;} -.yebf{bottom:306.542000px;} -.y128{bottom:306.585120px;} -.y1112{bottom:306.689000px;} -.y836{bottom:306.848000px;} -.y979{bottom:307.043000px;} -.y955{bottom:307.192000px;} -.ya41{bottom:307.225000px;} -.y7c1{bottom:307.271000px;} -.yd3{bottom:307.473000px;} -.y1186{bottom:307.492000px;} -.y1442{bottom:307.508000px;} -.ybcf{bottom:307.570000px;} -.y160{bottom:307.651000px;} -.y79a{bottom:307.770000px;} -.yc49{bottom:307.780000px;} -.y559{bottom:307.792000px;} -.y9f3{bottom:307.921000px;} -.y81f{bottom:307.942000px;} -.yea1{bottom:307.965000px;} -.y12b8{bottom:308.065000px;} -.y1201{bottom:308.266000px;} -.y13ae{bottom:308.351000px;} -.y36d{bottom:308.399000px;} -.y12dd{bottom:308.515000px;} -.y74f{bottom:308.619000px;} -.ya1f{bottom:308.859000px;} -.y14d4{bottom:308.908000px;} -.yd51{bottom:308.915000px;} -.y3b2{bottom:308.971000px;} -.y1574{bottom:309.130000px;} +.y364{bottom:304.137000px;} +.y757{bottom:304.159000px;} +.y1399{bottom:304.162000px;} +.y12db{bottom:304.266000px;} +.yfff{bottom:304.312000px;} +.ya62{bottom:304.463000px;} +.y157e{bottom:304.643000px;} +.y659{bottom:304.914129px;} +.yfdf{bottom:304.982000px;} +.y1516{bottom:304.995000px;} +.y11e2{bottom:305.017000px;} +.y10fb{bottom:305.054000px;} +.yab5{bottom:305.140000px;} +.y100{bottom:305.177000px;} +.y240{bottom:305.212000px;} +.y9f4{bottom:305.243000px;} +.yd46{bottom:305.260000px;} +.y1302{bottom:305.298000px;} +.yc33{bottom:305.338000px;} +.y6c4{bottom:305.452000px;} +.y10a4{bottom:305.500000px;} +.y1358{bottom:305.538000px;} +.y498{bottom:305.658000px;} +.yd80{bottom:305.853000px;} +.y597{bottom:305.878000px;} +.y1327{bottom:306.138000px;} +.y97f{bottom:306.179000px;} +.ydaa{bottom:306.195000px;} +.y4ef{bottom:306.228000px;} +.y1c8{bottom:306.285000px;} +.y8dd{bottom:306.296000px;} +.y6ee{bottom:306.323000px;} +.y854{bottom:306.434000px;} +.ye80{bottom:306.542000px;} +.y129{bottom:306.585120px;} +.y10c8{bottom:306.689000px;} +.yd3{bottom:306.735000px;} +.y815{bottom:306.848000px;} +.y952{bottom:307.043000px;} +.y92e{bottom:307.192000px;} +.ya16{bottom:307.225000px;} +.y7a5{bottom:307.271000px;} +.y113a{bottom:307.492000px;} +.y13e9{bottom:307.508000px;} +.yb9b{bottom:307.570000px;} +.y15e{bottom:307.651000px;} +.y77f{bottom:307.770000px;} +.yc13{bottom:307.780000px;} +.y548{bottom:307.792000px;} +.y9c9{bottom:307.921000px;} +.y800{bottom:307.942000px;} +.ye62{bottom:307.965000px;} +.y1268{bottom:308.065000px;} +.y11b2{bottom:308.266000px;} +.y1357{bottom:308.351000px;} +.y365{bottom:308.399000px;} +.y128c{bottom:308.515000px;} +.y734{bottom:308.619000px;} +.y9f5{bottom:308.859000px;} +.y1479{bottom:308.908000px;} +.yd18{bottom:308.915000px;} +.y3a9{bottom:308.971000px;} +.y1517{bottom:309.130000px;} .y30{bottom:309.378000px;} -.ydbc{bottom:309.468000px;} -.y1158{bottom:309.485000px;} -.y145c{bottom:309.505000px;} -.y29a{bottom:309.799000px;} -.ye33{bottom:309.803000px;} -.y432{bottom:309.896000px;} -.yf6d{bottom:309.900000px;} -.yf95{bottom:309.976000px;} -.y1002{bottom:309.990000px;} +.yd81{bottom:309.468000px;} +.y110d{bottom:309.485000px;} +.y1403{bottom:309.505000px;} +.y294{bottom:309.799000px;} +.ydf6{bottom:309.803000px;} +.y427{bottom:309.896000px;} +.yf2b{bottom:309.900000px;} +.yf52{bottom:309.976000px;} +.yfbc{bottom:309.990000px;} .y75{bottom:310.114000px;} -.y1542{bottom:310.162000px;} -.y9d1{bottom:310.276000px;} -.y1ae{bottom:310.423000px;} -.y6a5{bottom:310.507000px;} -.y8c2{bottom:310.514000px;} -.yfc3{bottom:310.783000px;} -.yce3{bottom:310.900000px;} -.y211{bottom:311.167000px;} -.ye0d{bottom:311.353000px;} -.y14a9{bottom:311.636000px;} -.y12b9{bottom:311.680000px;} -.yc7f{bottom:312.022000px;} -.ye7e{bottom:312.251000px;} -.yf3f{bottom:312.594000px;} -.y119c{bottom:312.632000px;} -.y676{bottom:312.688000px;} -.yfde{bottom:312.868000px;} -.y14f9{bottom:313.003000px;} -.y15d9{bottom:313.012000px;} -.y15da{bottom:313.161000px;} -.y850{bottom:313.166000px;} -.yb80{bottom:313.173000px;} -.y147e{bottom:313.235000px;} -.y151c{bottom:313.255000px;} -.y1273{bottom:313.416000px;} -.yc2d{bottom:313.417000px;} -.y89d{bottom:313.658000px;} -.y297{bottom:313.983000px;} -.y20f{bottom:313.989000px;} -.y1062{bottom:314.125000px;} -.ybab{bottom:314.347000px;} -.y299{bottom:314.525000px;} -.yde4{bottom:314.535000px;} -.yaf{bottom:314.597000px;} -.yeec{bottom:314.777000px;} -.ycb1{bottom:314.814000px;} -.yc2c{bottom:314.911000px;} -.y138d{bottom:315.000000px;} -.y613{bottom:315.085000px;} -.yb5c{bottom:315.097000px;} -.yd27{bottom:315.126000px;} -.ye5a{bottom:315.513000px;} -.yd03{bottom:315.640000px;} -.y1081{bottom:315.749000px;} -.yda7{bottom:315.760000px;} -.y8df{bottom:315.829000px;} -.y5d8{bottom:315.830000px;} -.yb35{bottom:316.071000px;} +.y14e5{bottom:310.162000px;} +.y9a8{bottom:310.276000px;} +.y1ab{bottom:310.423000px;} +.y68f{bottom:310.507000px;} +.y89f{bottom:310.514000px;} +.yf80{bottom:310.783000px;} +.ycaa{bottom:310.900000px;} +.y20b{bottom:311.167000px;} +.ydd1{bottom:311.353000px;} +.y144e{bottom:311.636000px;} +.y1269{bottom:311.680000px;} +.yc47{bottom:312.022000px;} +.ye3f{bottom:312.251000px;} +.yefd{bottom:312.594000px;} +.y114f{bottom:312.632000px;} +.y661{bottom:312.688000px;} +.yf99{bottom:312.868000px;} +.y149d{bottom:313.003000px;} +.y157b{bottom:313.012000px;} +.y157c{bottom:313.161000px;} +.y82f{bottom:313.166000px;} +.yb4e{bottom:313.173000px;} +.y1424{bottom:313.235000px;} +.y14c0{bottom:313.255000px;} +.y1223{bottom:313.416000px;} +.ybf8{bottom:313.417000px;} +.y87b{bottom:313.658000px;} +.y291{bottom:313.983000px;} +.y209{bottom:313.989000px;} +.y101a{bottom:314.125000px;} +.yb78{bottom:314.347000px;} +.y293{bottom:314.525000px;} +.yda8{bottom:314.535000px;} +.yae{bottom:314.597000px;} +.yeac{bottom:314.777000px;} +.yc79{bottom:314.814000px;} +.ybf7{bottom:314.911000px;} +.y600{bottom:315.085000px;} +.yb2b{bottom:315.097000px;} +.ycee{bottom:315.126000px;} +.ye1c{bottom:315.513000px;} +.ycca{bottom:315.640000px;} +.y1039{bottom:315.749000px;} +.yd6d{bottom:315.760000px;} +.y8bb{bottom:315.829000px;} +.y5c6{bottom:315.830000px;} +.yb05{bottom:316.071000px;} .y45{bottom:316.091000px;} -.y36b{bottom:316.092000px;} -.y770{bottom:316.114000px;} -.y13f1{bottom:316.117000px;} -.y1046{bottom:316.267000px;} -.ya8e{bottom:316.418000px;} -.y1025{bottom:316.937000px;} -.y295{bottom:316.988000px;} -.y1144{bottom:317.009000px;} -.yae2{bottom:317.095000px;} -.y245{bottom:317.167000px;} -.ya1c{bottom:317.199000px;} -.yabc{bottom:317.204000px;} -.y1356{bottom:317.253000px;} -.yc69{bottom:317.293000px;} -.y6da{bottom:317.407000px;} -.y126{bottom:317.407920px;} -.y10ed{bottom:317.455000px;} -.y1572{bottom:317.498000px;} -.y210{bottom:317.604000px;} -.y4a5{bottom:317.613000px;} -.y116b{bottom:317.620000px;} -.y137c{bottom:318.094000px;} -.y9a6{bottom:318.134000px;} -.y4fd{bottom:318.184000px;} -.y901{bottom:318.251000px;} -.y704{bottom:318.278000px;} -.yebe{bottom:318.497000px;} -.y1111{bottom:318.644000px;} -.y7c0{bottom:319.226000px;} -.y1082{bottom:319.364000px;} -.ybcc{bottom:319.425000px;} -.yd2{bottom:319.428000px;} -.y1185{bottom:319.447000px;} -.ybce{bottom:319.525000px;} -.ya40{bottom:319.578000px;} -.y15f{bottom:319.606000px;} -.y799{bottom:319.725000px;} -.yc48{bottom:319.735000px;} -.y558{bottom:319.747000px;} -.y9f2{bottom:319.876000px;} -.yea0{bottom:319.920000px;} -.y12b7{bottom:320.020000px;} -.y3f8{bottom:320.118000px;} -.y13c4{bottom:320.370000px;} -.y12dc{bottom:320.470000px;} -.y74e{bottom:320.574000px;} -.y826{bottom:320.575000px;} -.ya1d{bottom:320.814000px;} -.y14d3{bottom:320.863000px;} -.yd50{bottom:320.870000px;} -.y298{bottom:321.102000px;} -.y296{bottom:321.250000px;} +.y363{bottom:316.092000px;} +.y756{bottom:316.114000px;} +.y1398{bottom:316.117000px;} +.yffe{bottom:316.267000px;} +.ya61{bottom:316.418000px;} +.yfde{bottom:316.937000px;} +.y28f{bottom:316.988000px;} +.y10fa{bottom:317.009000px;} +.yab4{bottom:317.095000px;} +.y23f{bottom:317.167000px;} +.y9f2{bottom:317.199000px;} +.ya8f{bottom:317.204000px;} +.y1301{bottom:317.253000px;} +.yc32{bottom:317.293000px;} +.y6c3{bottom:317.407000px;} +.y127{bottom:317.407920px;} +.y10a3{bottom:317.455000px;} +.y1515{bottom:317.498000px;} +.y20a{bottom:317.604000px;} +.y497{bottom:317.613000px;} +.y111f{bottom:317.620000px;} +.y1326{bottom:318.094000px;} +.y97e{bottom:318.134000px;} +.y4ee{bottom:318.184000px;} +.y8dc{bottom:318.251000px;} +.y6ed{bottom:318.278000px;} +.ye7f{bottom:318.497000px;} +.y10c7{bottom:318.644000px;} +.y7a4{bottom:319.226000px;} +.y103a{bottom:319.364000px;} +.yb98{bottom:319.425000px;} +.y1139{bottom:319.447000px;} +.yb9a{bottom:319.525000px;} +.ya15{bottom:319.578000px;} +.y15d{bottom:319.606000px;} +.y77e{bottom:319.725000px;} +.yc12{bottom:319.735000px;} +.y547{bottom:319.747000px;} +.y9c8{bottom:319.876000px;} +.ye61{bottom:319.920000px;} +.y1267{bottom:320.020000px;} +.y3ee{bottom:320.118000px;} +.y136c{bottom:320.370000px;} +.y128b{bottom:320.470000px;} +.y733{bottom:320.574000px;} +.y806{bottom:320.575000px;} +.y9f3{bottom:320.814000px;} +.y1478{bottom:320.863000px;} +.yd17{bottom:320.870000px;} +.y292{bottom:321.102000px;} +.y290{bottom:321.250000px;} .y2f{bottom:321.333000px;} -.y1570{bottom:321.334000px;} -.y1415{bottom:321.421000px;} -.y1157{bottom:321.440000px;} -.y145b{bottom:321.460000px;} -.y15d7{bottom:321.530000px;} -.y15d8{bottom:321.679000px;} -.ye32{bottom:321.759000px;} -.y431{bottom:321.851000px;} -.yf6c{bottom:321.855000px;} -.yf94{bottom:321.931000px;} -.y1001{bottom:321.945000px;} -.yb33{bottom:321.949000px;} +.y1513{bottom:321.334000px;} +.y13bc{bottom:321.421000px;} +.y110c{bottom:321.440000px;} +.y1402{bottom:321.460000px;} +.y1579{bottom:321.530000px;} +.y157a{bottom:321.679000px;} +.ydf5{bottom:321.759000px;} +.y426{bottom:321.851000px;} +.yf2a{bottom:321.855000px;} +.yf51{bottom:321.931000px;} +.yfbb{bottom:321.945000px;} +.yb03{bottom:321.949000px;} .y74{bottom:322.069000px;} -.y132e{bottom:322.100000px;} -.y1541{bottom:322.117000px;} -.y9d0{bottom:322.231000px;} -.y8c1{bottom:322.470000px;} -.y1cb{bottom:322.595000px;} -.yfc2{bottom:322.738000px;} -.yce2{bottom:322.855000px;} -.ye0c{bottom:323.309000px;} -.y1ad{bottom:323.374000px;} -.y14a8{bottom:323.591000px;} -.y13ad{bottom:323.660000px;} -.y3f9{bottom:323.733000px;} -.y10a4{bottom:323.937000px;} -.yf3e{bottom:324.549000px;} -.y119b{bottom:324.587000px;} -.y675{bottom:324.643000px;} -.yfdd{bottom:324.823000px;} -.y52b{bottom:325.008000px;} -.y84f{bottom:325.121000px;} -.y147d{bottom:325.190000px;} -.y14f8{bottom:325.357000px;} -.y1272{bottom:325.371000px;} -.y730{bottom:325.425000px;} -.y1571{bottom:325.468000px;} -.y1061{bottom:326.080000px;} -.ybaa{bottom:326.302000px;} -.yde3{bottom:326.490000px;} -.yae{bottom:326.552000px;} -.y1200{bottom:326.656000px;} -.yeeb{bottom:326.732000px;} -.ycb0{bottom:326.769000px;} -.y835{bottom:326.773000px;} -.y1230{bottom:326.838000px;} -.y612{bottom:327.040000px;} -.yb5b{bottom:327.052000px;} -.yd26{bottom:327.081000px;} -.ye59{bottom:327.468000px;} -.y107f{bottom:327.704000px;} -.yda6{bottom:327.715000px;} -.y5d7{bottom:327.786000px;} -.yb34{bottom:328.026000px;} +.y12da{bottom:322.100000px;} +.y14e4{bottom:322.117000px;} +.y9a7{bottom:322.231000px;} +.y89e{bottom:322.470000px;} +.y1c6{bottom:322.595000px;} +.yf7f{bottom:322.738000px;} +.yca9{bottom:322.855000px;} +.ydd0{bottom:323.309000px;} +.y1aa{bottom:323.374000px;} +.y144d{bottom:323.591000px;} +.y1356{bottom:323.660000px;} +.y3ef{bottom:323.733000px;} +.y105b{bottom:323.937000px;} +.yefc{bottom:324.549000px;} +.y114e{bottom:324.587000px;} +.y660{bottom:324.643000px;} +.yf98{bottom:324.823000px;} +.y51b{bottom:325.008000px;} +.y82e{bottom:325.121000px;} +.y1423{bottom:325.190000px;} +.y149c{bottom:325.357000px;} +.y1222{bottom:325.371000px;} +.y718{bottom:325.425000px;} +.y1514{bottom:325.468000px;} +.y1019{bottom:326.080000px;} +.yd2{bottom:326.185000px;} +.yb77{bottom:326.302000px;} +.yda7{bottom:326.490000px;} +.yad{bottom:326.552000px;} +.y11b1{bottom:326.656000px;} +.yeab{bottom:326.732000px;} +.yc78{bottom:326.769000px;} +.y814{bottom:326.773000px;} +.y11e1{bottom:326.838000px;} +.y5ff{bottom:327.040000px;} +.yb2a{bottom:327.052000px;} +.yced{bottom:327.081000px;} +.ye1b{bottom:327.468000px;} +.y1037{bottom:327.704000px;} +.yd6c{bottom:327.715000px;} +.y5c5{bottom:327.786000px;} +.yb04{bottom:328.026000px;} .y44{bottom:328.046000px;} -.y76f{bottom:328.070000px;} -.y1045{bottom:328.223000px;} -.ya8d{bottom:328.373000px;} -.yb0d{bottom:328.407000px;} -.y124{bottom:328.501290px;} -.y92f{bottom:328.711000px;} -.y1024{bottom:328.892000px;} -.y1143{bottom:328.964000px;} -.yae1{bottom:329.050000px;} -.ya1a{bottom:329.154000px;} -.yabb{bottom:329.159000px;} -.y1355{bottom:329.208000px;} -.yc68{bottom:329.248000px;} -.y6d9{bottom:329.363000px;} -.y10ec{bottom:329.410000px;} -.yc73{bottom:329.500000px;} -.y4a4{bottom:329.569000px;} -.y137b{bottom:330.049000px;} -.y9a5{bottom:330.090000px;} -.y4fb{bottom:330.139000px;} -.yc47{bottom:330.196000px;} -.y900{bottom:330.206000px;} -.y703{bottom:330.233000px;} -.yc7e{bottom:330.353000px;} -.yebd{bottom:330.452000px;} -.y1110{bottom:330.599000px;} -.ye7d{bottom:330.640000px;} -.y7bf{bottom:331.181000px;} -.y1080{bottom:331.319000px;} -.y1184{bottom:331.403000px;} -.ybcd{bottom:331.480000px;} -.y15d{bottom:331.561000px;} -.y3b0{bottom:331.630000px;} -.y798{bottom:331.680000px;} -.yc46{bottom:331.690000px;} -.y557{bottom:331.702000px;} -.y9f1{bottom:331.831000px;} -.y81e{bottom:331.852000px;} -.ya3f{bottom:331.932000px;} -.y12b6{bottom:331.975000px;} -.y13f0{bottom:332.057000px;} -.y3f7{bottom:332.073000px;} -.ydba{bottom:332.156000px;} -.y430{bottom:332.312000px;} -.y13c3{bottom:332.325000px;} -.y6a4{bottom:332.425000px;} -.y15d6{bottom:332.439000px;} -.y978{bottom:332.516000px;} -.y20e{bottom:332.524000px;} -.y74d{bottom:332.530000px;} -.ya1b{bottom:332.769000px;} -.y14d2{bottom:332.819000px;} -.yd4f{bottom:332.825000px;} -.y1ca{bottom:333.056000px;} -.y10c9{bottom:333.167000px;} +.y755{bottom:328.070000px;} +.yffd{bottom:328.223000px;} +.ya60{bottom:328.373000px;} +.yade{bottom:328.407000px;} +.y125{bottom:328.501290px;} +.y909{bottom:328.711000px;} +.yfdd{bottom:328.892000px;} +.y10f9{bottom:328.964000px;} +.yab3{bottom:329.050000px;} +.y9f0{bottom:329.154000px;} +.ya8e{bottom:329.159000px;} +.y1300{bottom:329.208000px;} +.yc31{bottom:329.248000px;} +.y6c2{bottom:329.363000px;} +.y10a2{bottom:329.410000px;} +.y496{bottom:329.569000px;} +.y1325{bottom:330.049000px;} +.y97d{bottom:330.090000px;} +.y4ec{bottom:330.139000px;} +.yc11{bottom:330.196000px;} +.y8db{bottom:330.206000px;} +.y6ec{bottom:330.233000px;} +.yc46{bottom:330.353000px;} +.ye7e{bottom:330.452000px;} +.y10c6{bottom:330.599000px;} +.ye3e{bottom:330.640000px;} +.y7a3{bottom:331.181000px;} +.y1038{bottom:331.319000px;} +.y1138{bottom:331.403000px;} +.yb99{bottom:331.480000px;} +.y15b{bottom:331.561000px;} +.y3a7{bottom:331.630000px;} +.y77d{bottom:331.680000px;} +.yc10{bottom:331.690000px;} +.y546{bottom:331.702000px;} +.y9c7{bottom:331.831000px;} +.y7ff{bottom:331.852000px;} +.ya14{bottom:331.932000px;} +.y1266{bottom:331.975000px;} +.y1397{bottom:332.057000px;} +.y3ed{bottom:332.073000px;} +.yd7f{bottom:332.156000px;} +.y425{bottom:332.312000px;} +.y136b{bottom:332.325000px;} +.y68e{bottom:332.425000px;} +.y1578{bottom:332.439000px;} +.y951{bottom:332.516000px;} +.y208{bottom:332.524000px;} +.y732{bottom:332.530000px;} +.y9f1{bottom:332.769000px;} +.y1477{bottom:332.819000px;} +.yd16{bottom:332.825000px;} +.y1c5{bottom:333.056000px;} +.y1080{bottom:333.167000px;} .y2e{bottom:333.288000px;} -.y1414{bottom:333.376000px;} -.y1156{bottom:333.395000px;} -.y145a{bottom:333.415000px;} -.ye31{bottom:333.714000px;} -.y4fc{bottom:333.754000px;} -.y42f{bottom:333.806000px;} -.y156f{bottom:333.837000px;} -.yf93{bottom:333.886000px;} -.y1000{bottom:333.900000px;} +.y13bb{bottom:333.376000px;} +.y110b{bottom:333.395000px;} +.y1401{bottom:333.415000px;} +.ydf4{bottom:333.714000px;} +.y4ed{bottom:333.754000px;} +.y424{bottom:333.806000px;} +.y1512{bottom:333.837000px;} +.yf50{bottom:333.886000px;} +.yfba{bottom:333.900000px;} .y73{bottom:334.024000px;} -.y1540{bottom:334.073000px;} -.y875{bottom:334.121000px;} -.y9cf{bottom:334.186000px;} -.y8c0{bottom:334.425000px;} -.y36a{bottom:334.482000px;} -.y1c9{bottom:334.550000px;} -.yfc0{bottom:334.694000px;} -.yce1{bottom:334.810000px;} -.y132d{bottom:335.051000px;} -.y15e{bottom:335.176000px;} -.y1ac{bottom:335.329000px;} -.y14a7{bottom:335.546000px;} -.y13ac{bottom:335.616000px;} -.y10a3{bottom:335.893000px;} -.y5a8{bottom:336.061000px;} -.yf3d{bottom:336.505000px;} -.y1494{bottom:336.542000px;} -.y119a{bottom:336.543000px;} -.yfdb{bottom:336.778000px;} -.y52a{bottom:336.963000px;} -.y147c{bottom:337.145000px;} -.y1271{bottom:337.326000px;} -.y72e{bottom:337.380000px;} -.y89c{bottom:337.406000px;} -.yfc{bottom:337.511000px;} -.y156d{bottom:337.672000px;} -.y14f7{bottom:337.711000px;} -.ya65{bottom:337.937000px;} -.y1060{bottom:338.035000px;} -.yb7f{bottom:338.038000px;} -.yba9{bottom:338.257000px;} -.yfc1{bottom:338.309000px;} -.yde2{bottom:338.445000px;} -.yad{bottom:338.507000px;} -.yeea{bottom:338.688000px;} -.y834{bottom:338.729000px;} -.yd1{bottom:338.835000px;} -.y294{bottom:338.906000px;} -.y611{bottom:338.995000px;} -.yb5a{bottom:339.007000px;} -.yd25{bottom:339.036000px;} -.y120{bottom:339.324090px;} -.ye58{bottom:339.423000px;} -.y244{bottom:339.484000px;} -.y107e{bottom:339.659000px;} -.y5d6{bottom:339.741000px;} +.y14e3{bottom:334.073000px;} +.y853{bottom:334.121000px;} +.y9a6{bottom:334.186000px;} +.y89d{bottom:334.425000px;} +.y362{bottom:334.482000px;} +.y1c4{bottom:334.550000px;} +.yf7d{bottom:334.694000px;} +.yca8{bottom:334.810000px;} +.y12d9{bottom:335.051000px;} +.y15c{bottom:335.176000px;} +.y1a9{bottom:335.329000px;} +.y144c{bottom:335.546000px;} +.y1355{bottom:335.616000px;} +.y105a{bottom:335.893000px;} +.y596{bottom:336.061000px;} +.yefb{bottom:336.505000px;} +.y1439{bottom:336.542000px;} +.y114d{bottom:336.543000px;} +.yf96{bottom:336.778000px;} +.y51a{bottom:336.963000px;} +.y1422{bottom:337.145000px;} +.y1221{bottom:337.326000px;} +.y716{bottom:337.380000px;} +.y87a{bottom:337.406000px;} +.yff{bottom:337.511000px;} +.y1510{bottom:337.672000px;} +.y149b{bottom:337.711000px;} +.ya39{bottom:337.937000px;} +.y1018{bottom:338.035000px;} +.yb4d{bottom:338.038000px;} +.yd1{bottom:338.140000px;} +.yb76{bottom:338.257000px;} +.yf7e{bottom:338.309000px;} +.yda6{bottom:338.445000px;} +.yac{bottom:338.507000px;} +.yeaa{bottom:338.688000px;} +.y813{bottom:338.729000px;} +.y28e{bottom:338.906000px;} +.y5fe{bottom:338.995000px;} +.yb29{bottom:339.007000px;} +.ycec{bottom:339.036000px;} +.y121{bottom:339.324090px;} +.ye1a{bottom:339.423000px;} +.y23e{bottom:339.484000px;} +.y1036{bottom:339.659000px;} +.y5c4{bottom:339.741000px;} .y43{bottom:340.002000px;} -.y1441{bottom:340.112000px;} -.ya8c{bottom:340.328000px;} -.yb32{bottom:340.380000px;} -.yfdc{bottom:340.393000px;} -.yc2b{bottom:340.471000px;} -.y4fa{bottom:340.599000px;} -.y954{bottom:340.666000px;} -.y1142{bottom:340.919000px;} -.y72f{bottom:340.995000px;} -.yae0{bottom:341.005000px;} -.ya19{bottom:341.109000px;} -.yaba{bottom:341.114000px;} -.y151b{bottom:341.144000px;} -.yc67{bottom:341.203000px;} -.y6d8{bottom:341.318000px;} -.y10eb{bottom:341.365000px;} -.y4a2{bottom:341.524000px;} -.yd02{bottom:341.630000px;} -.y156e{bottom:341.807000px;} -.y137a{bottom:342.004000px;} -.y9a4{bottom:342.045000px;} -.y4f9{bottom:342.094000px;} -.y8ff{bottom:342.161000px;} -.y702{bottom:342.188000px;} -.yebc{bottom:342.407000px;} -.y7be{bottom:343.136000px;} -.ye9f{bottom:343.336000px;} -.y1183{bottom:343.358000px;} -.y15b{bottom:343.516000px;} -.y3af{bottom:343.586000px;} -.y797{bottom:343.636000px;} -.yc45{bottom:343.646000px;} -.y556{bottom:343.657000px;} -.y9f0{bottom:343.787000px;} -.ybcb{bottom:343.834000px;} -.y12b5{bottom:343.930000px;} +.y13e8{bottom:340.112000px;} +.ya5f{bottom:340.328000px;} +.yb02{bottom:340.380000px;} +.yf97{bottom:340.393000px;} +.ybf6{bottom:340.471000px;} +.y4eb{bottom:340.599000px;} +.y92d{bottom:340.666000px;} +.y10f8{bottom:340.919000px;} +.y717{bottom:340.995000px;} +.yab2{bottom:341.005000px;} +.y9ef{bottom:341.109000px;} +.ya8d{bottom:341.114000px;} +.y14bf{bottom:341.144000px;} +.yc30{bottom:341.203000px;} +.y6c1{bottom:341.318000px;} +.y10a1{bottom:341.365000px;} +.y494{bottom:341.524000px;} +.ycc9{bottom:341.630000px;} +.y1511{bottom:341.807000px;} +.y1324{bottom:342.004000px;} +.y97c{bottom:342.045000px;} +.y4ea{bottom:342.094000px;} +.y8da{bottom:342.161000px;} +.y6eb{bottom:342.188000px;} +.ye7d{bottom:342.407000px;} +.y7a2{bottom:343.136000px;} +.ye60{bottom:343.336000px;} +.y1137{bottom:343.358000px;} +.y159{bottom:343.516000px;} +.y3a6{bottom:343.586000px;} +.y77c{bottom:343.636000px;} +.yc0f{bottom:343.646000px;} +.y545{bottom:343.657000px;} +.y9c6{bottom:343.787000px;} +.yb97{bottom:343.834000px;} +.y1265{bottom:343.930000px;} .y9a{bottom:343.987000px;} -.y13ef{bottom:344.012000px;} -.ydb9{bottom:344.111000px;} -.y13c2{bottom:344.280000px;} -.ya3e{bottom:344.286000px;} -.y6a3{bottom:344.380000px;} -.y12db{bottom:344.381000px;} -.y977{bottom:344.472000px;} -.y74c{bottom:344.485000px;} -.y14d1{bottom:344.774000px;} -.yd4e{bottom:344.780000px;} -.y15d4{bottom:345.037000px;} -.y10c8{bottom:345.122000px;} -.y4a3{bottom:345.139000px;} -.y15d5{bottom:345.187000px;} -.y1413{bottom:345.332000px;} -.y1155{bottom:345.350000px;} -.y1459{bottom:345.370000px;} -.y116a{bottom:345.509000px;} -.ye30{bottom:345.669000px;} -.y42e{bottom:345.762000px;} -.yf92{bottom:345.841000px;} -.yfff{bottom:345.855000px;} +.y1396{bottom:344.012000px;} +.yd7e{bottom:344.111000px;} +.y136a{bottom:344.280000px;} +.ya13{bottom:344.286000px;} +.y68d{bottom:344.380000px;} +.y128a{bottom:344.381000px;} +.y950{bottom:344.472000px;} +.y731{bottom:344.485000px;} +.y1476{bottom:344.774000px;} +.yd15{bottom:344.780000px;} +.y1576{bottom:345.037000px;} +.y107f{bottom:345.122000px;} +.y495{bottom:345.139000px;} +.y1577{bottom:345.187000px;} +.y13ba{bottom:345.332000px;} +.y110a{bottom:345.350000px;} +.y1400{bottom:345.370000px;} +.y111e{bottom:345.509000px;} +.ydf3{bottom:345.669000px;} +.y423{bottom:345.762000px;} +.yf4f{bottom:345.841000px;} +.yfb9{bottom:345.855000px;} .y72{bottom:345.979000px;} -.y153f{bottom:346.028000px;} -.y874{bottom:346.077000px;} -.y9ce{bottom:346.142000px;} -.yb30{bottom:346.258000px;} -.y8bf{bottom:346.380000px;} -.y20b{bottom:346.409000px;} -.y76e{bottom:346.459000px;} -.y84e{bottom:346.552000px;} -.yfbf{bottom:346.649000px;} -.yce0{bottom:346.765000px;} -.y8de{bottom:346.824000px;} -.y20d{bottom:346.951000px;} -.y132c{bottom:347.006000px;} -.y92b{bottom:347.042000px;} -.y15c{bottom:347.132000px;} -.y1ab{bottom:347.284000px;} -.y14a6{bottom:347.501000px;} -.y13ab{bottom:347.571000px;} -.y1354{bottom:347.597000px;} -.y10a2{bottom:347.848000px;} -.y209{bottom:347.920000px;} -.y5a7{bottom:348.016000px;} -.yb0c{bottom:348.332000px;} -.yf3c{bottom:348.460000px;} -.y1199{bottom:348.498000px;} -.yfda{bottom:348.733000px;} -.y529{bottom:348.918000px;} -.y110f{bottom:348.989000px;} -.y147b{bottom:349.100000px;} -.y1270{bottom:349.281000px;} -.y72d{bottom:349.335000px;} -.y89b{bottom:349.362000px;} -.y208{bottom:349.414000px;} -.yfb{bottom:349.466000px;} -.ya64{bottom:349.893000px;} -.y105f{bottom:349.990000px;} -.yb7e{bottom:349.993000px;} -.ycaf{bottom:350.035000px;} -.y14f6{bottom:350.064000px;} -.y156c{bottom:350.176000px;} -.yba8{bottom:350.212000px;} -.yac{bottom:350.462000px;} -.yee9{bottom:350.643000px;} -.y833{bottom:350.684000px;} -.yd0{bottom:350.790000px;} -.yc2a{bottom:350.932000px;} -.y610{bottom:350.951000px;} -.yb59{bottom:350.962000px;} -.ye57{bottom:351.378000px;} -.y243{bottom:351.439000px;} -.y107d{bottom:351.614000px;} -.y5d5{bottom:351.696000px;} +.y14e2{bottom:346.028000px;} +.y852{bottom:346.077000px;} +.y9a5{bottom:346.142000px;} +.yb00{bottom:346.258000px;} +.y89c{bottom:346.380000px;} +.y205{bottom:346.409000px;} +.y754{bottom:346.459000px;} +.y82d{bottom:346.552000px;} +.yf7c{bottom:346.649000px;} +.yca7{bottom:346.765000px;} +.y8ba{bottom:346.824000px;} +.y207{bottom:346.951000px;} +.y12d8{bottom:347.006000px;} +.y905{bottom:347.042000px;} +.y15a{bottom:347.132000px;} +.y1a8{bottom:347.284000px;} +.y144b{bottom:347.501000px;} +.y1354{bottom:347.571000px;} +.y12ff{bottom:347.597000px;} +.y1059{bottom:347.848000px;} +.y203{bottom:347.920000px;} +.y595{bottom:348.016000px;} +.yadd{bottom:348.332000px;} +.yefa{bottom:348.460000px;} +.y114c{bottom:348.498000px;} +.yf95{bottom:348.733000px;} +.y519{bottom:348.918000px;} +.y10c5{bottom:348.989000px;} +.y1421{bottom:349.100000px;} +.y1220{bottom:349.281000px;} +.y715{bottom:349.335000px;} +.y879{bottom:349.362000px;} +.y202{bottom:349.414000px;} +.yfe{bottom:349.466000px;} +.ya38{bottom:349.893000px;} +.y1017{bottom:349.990000px;} +.yb4c{bottom:349.993000px;} +.yc77{bottom:350.035000px;} +.y149a{bottom:350.064000px;} +.yd0{bottom:350.095000px;} +.y150f{bottom:350.176000px;} +.yb75{bottom:350.212000px;} +.yea9{bottom:350.643000px;} +.y812{bottom:350.684000px;} +.ybf5{bottom:350.932000px;} +.y5fd{bottom:350.951000px;} +.yb28{bottom:350.962000px;} +.ye19{bottom:351.378000px;} +.y23d{bottom:351.439000px;} +.y1035{bottom:351.614000px;} +.y5c3{bottom:351.696000px;} .y42{bottom:351.957000px;} -.ye0b{bottom:352.016000px;} -.ya8b{bottom:352.284000px;} -.yb31{bottom:352.335000px;} -.yc29{bottom:352.426000px;} -.yf6b{bottom:352.484000px;} -.y1141{bottom:352.875000px;} -.y3ae{bottom:352.884000px;} -.y1440{bottom:353.064000px;} -.yab9{bottom:353.070000px;} -.y151a{bottom:353.099000px;} -.yc66{bottom:353.159000px;} -.y10ea{bottom:353.320000px;} -.y4a1{bottom:353.479000px;} -.y20c{bottom:353.528000px;} -.y15d2{bottom:353.555000px;} -.yd01{bottom:353.586000px;} -.y20a{bottom:353.676000px;} -.y15d3{bottom:353.705000px;} -.y1379{bottom:353.959000px;} -.yc02{bottom:353.980000px;} -.y9a3{bottom:354.000000px;} -.y156a{bottom:354.011000px;} -.y4f8{bottom:354.049000px;} -.y701{bottom:354.144000px;} -.y1c8{bottom:354.475000px;} -.y11ff{bottom:354.544000px;} -.y7bd{bottom:355.091000px;} -.ye9e{bottom:355.291000px;} -.y1182{bottom:355.313000px;} -.y15a{bottom:355.471000px;} -.yc01{bottom:355.475000px;} -.y3ac{bottom:355.541000px;} -.y796{bottom:355.591000px;} -.yc44{bottom:355.601000px;} -.y555{bottom:355.612000px;} -.ybc8{bottom:355.689000px;} -.y9ef{bottom:355.742000px;} -.y81d{bottom:355.762000px;} -.ybca{bottom:355.789000px;} -.y12b4{bottom:355.885000px;} -.y13ee{bottom:355.968000px;} -.ydb8{bottom:356.067000px;} -.y13c1{bottom:356.235000px;} -.y6a2{bottom:356.336000px;} -.y976{bottom:356.427000px;} -.y74b{bottom:356.440000px;} -.ya3d{bottom:356.639000px;} -.yd4d{bottom:356.735000px;} -.y1044{bottom:356.841000px;} -.y10c7{bottom:357.077000px;} -.y1154{bottom:357.305000px;} -.y1458{bottom:357.326000px;} -.y3f6{bottom:357.633000px;} -.y42d{bottom:357.717000px;} -.yf91{bottom:357.797000px;} -.yffe{bottom:357.810000px;} -.y291{bottom:357.819000px;} +.ydcf{bottom:352.016000px;} +.ya5e{bottom:352.284000px;} +.yb01{bottom:352.335000px;} +.ybf4{bottom:352.426000px;} +.yf29{bottom:352.484000px;} +.y10f7{bottom:352.875000px;} +.y3a5{bottom:352.884000px;} +.y13e7{bottom:353.064000px;} +.ya8c{bottom:353.070000px;} +.y14be{bottom:353.099000px;} +.yc2f{bottom:353.159000px;} +.y10a0{bottom:353.320000px;} +.y493{bottom:353.479000px;} +.y206{bottom:353.528000px;} +.y1574{bottom:353.555000px;} +.ycc8{bottom:353.586000px;} +.y204{bottom:353.676000px;} +.y1575{bottom:353.705000px;} +.y1323{bottom:353.959000px;} +.ybce{bottom:353.980000px;} +.y97b{bottom:354.000000px;} +.y150d{bottom:354.011000px;} +.y4e9{bottom:354.049000px;} +.y6ea{bottom:354.144000px;} +.y1c3{bottom:354.475000px;} +.y11b0{bottom:354.544000px;} +.y7a1{bottom:355.091000px;} +.ye5f{bottom:355.291000px;} +.y1136{bottom:355.313000px;} +.y158{bottom:355.471000px;} +.ybcd{bottom:355.475000px;} +.y3a3{bottom:355.541000px;} +.y77b{bottom:355.591000px;} +.yc0e{bottom:355.601000px;} +.y544{bottom:355.612000px;} +.yb94{bottom:355.689000px;} +.y9c5{bottom:355.742000px;} +.y7fe{bottom:355.762000px;} +.yb96{bottom:355.789000px;} +.y1264{bottom:355.885000px;} +.y1395{bottom:355.968000px;} +.yd7d{bottom:356.067000px;} +.y1369{bottom:356.235000px;} +.y68c{bottom:356.336000px;} +.y94f{bottom:356.427000px;} +.y730{bottom:356.440000px;} +.ya12{bottom:356.639000px;} +.yd14{bottom:356.735000px;} +.yffc{bottom:356.841000px;} +.y107e{bottom:357.077000px;} +.y1109{bottom:357.305000px;} +.y13ff{bottom:357.326000px;} +.y3ec{bottom:357.633000px;} +.y422{bottom:357.717000px;} +.yf4e{bottom:357.797000px;} +.yfb8{bottom:357.810000px;} +.y28b{bottom:357.819000px;} .y71{bottom:357.934000px;} -.y153e{bottom:357.983000px;} -.y873{bottom:358.032000px;} -.y156b{bottom:358.146000px;} -.y293{bottom:358.361000px;} -.y93b{bottom:358.500000px;} -.y84d{bottom:358.507000px;} -.yfbe{bottom:358.604000px;} -.yda5{bottom:358.710000px;} -.ycdf{bottom:358.720000px;} -.y8dd{bottom:358.779000px;} -.y949{bottom:358.997000px;} -.y122f{bottom:359.227000px;} -.y1aa{bottom:359.240000px;} -.y14a5{bottom:359.457000px;} -.y13aa{bottom:359.526000px;} -.y3ad{bottom:359.803000px;} -.y132b{bottom:359.958000px;} -.y5a6{bottom:359.972000px;} -.yd7f{bottom:360.027000px;} -.yf3b{bottom:360.415000px;} -.y1493{bottom:360.453000px;} -.yfd9{bottom:360.688000px;} -.y1023{bottom:360.717000px;} -.y28f{bottom:360.824000px;} -.y528{bottom:360.873000px;} -.y147a{bottom:361.056000px;} -.y126f{bottom:361.236000px;} -.y72c{bottom:361.290000px;} -.y89a{bottom:361.317000px;} -.yfa{bottom:361.421000px;} -.ya63{bottom:361.848000px;} -.y105e{bottom:361.945000px;} -.yb7d{bottom:361.948000px;} -.ycae{bottom:361.990000px;} -.y15d0{bottom:362.073000px;} -.yba7{bottom:362.167000px;} -.y15d1{bottom:362.223000px;} -.y369{bottom:362.370000px;} -.y14f5{bottom:362.418000px;} -.yee8{bottom:362.598000px;} -.ycf{bottom:362.745000px;} -.yb58{bottom:362.917000px;} -.y6d7{bottom:363.236000px;} -.ye56{bottom:363.333000px;} -.y242{bottom:363.394000px;} -.y107b{bottom:363.570000px;} +.y14e1{bottom:357.983000px;} +.y851{bottom:358.032000px;} +.y150e{bottom:358.146000px;} +.y28d{bottom:358.361000px;} +.y82c{bottom:358.507000px;} +.yf7b{bottom:358.604000px;} +.yd6b{bottom:358.710000px;} +.yca6{bottom:358.720000px;} +.y8b9{bottom:358.779000px;} +.y922{bottom:358.997000px;} +.y11e0{bottom:359.227000px;} +.y1a7{bottom:359.240000px;} +.y144a{bottom:359.457000px;} +.y1353{bottom:359.526000px;} +.y3a4{bottom:359.803000px;} +.y12d7{bottom:359.958000px;} +.y594{bottom:359.972000px;} +.yd45{bottom:360.027000px;} +.yef9{bottom:360.415000px;} +.y1438{bottom:360.453000px;} +.yf94{bottom:360.688000px;} +.yfdc{bottom:360.717000px;} +.y289{bottom:360.824000px;} +.y518{bottom:360.873000px;} +.y1420{bottom:361.056000px;} +.y121f{bottom:361.236000px;} +.y714{bottom:361.290000px;} +.y878{bottom:361.317000px;} +.yfd{bottom:361.421000px;} +.ya37{bottom:361.848000px;} +.y1016{bottom:361.945000px;} +.yb4b{bottom:361.948000px;} +.yc76{bottom:361.990000px;} +.y1572{bottom:362.073000px;} +.yb74{bottom:362.167000px;} +.y1573{bottom:362.223000px;} +.y361{bottom:362.370000px;} +.y1499{bottom:362.418000px;} +.yea8{bottom:362.598000px;} +.yb27{bottom:362.917000px;} +.y6c0{bottom:363.236000px;} +.ye18{bottom:363.333000px;} +.y23c{bottom:363.394000px;} +.y1033{bottom:363.570000px;} .y41{bottom:363.912000px;} -.ye7c{bottom:364.024000px;} -.ya8a{bottom:364.239000px;} -.yf6a{bottom:364.439000px;} -.yb2f{bottom:364.689000px;} -.yde1{bottom:364.749000px;} -.y3a9{bottom:364.839000px;} -.y292{bottom:364.937000px;} -.y143f{bottom:365.019000px;} -.y3ab{bottom:365.023000px;} -.yab8{bottom:365.025000px;} -.y1519{bottom:365.054000px;} -.y290{bottom:365.086000px;} -.yc65{bottom:365.114000px;} -.y1412{bottom:365.257000px;} -.y10e9{bottom:365.275000px;} -.y4a0{bottom:365.434000px;} -.yd00{bottom:365.541000px;} -.y8fe{bottom:365.642000px;} -.y1378{bottom:365.914000px;} -.y9a2{bottom:365.955000px;} -.y4f7{bottom:366.004000px;} -.y6ff{bottom:366.099000px;} -.y1c7{bottom:366.430000px;} -.y11fe{bottom:366.499000px;} -.y12cb{bottom:366.500000px;} -.y1568{bottom:366.514000px;} -.y14d0{bottom:366.595000px;} -.y1569{bottom:366.664000px;} -.y107c{bottom:367.185000px;} -.ye9d{bottom:367.247000px;} -.ya18{bottom:367.313000px;} -.y1169{bottom:367.330000px;} -.y159{bottom:367.427000px;} -.yc00{bottom:367.430000px;} -.y3a7{bottom:367.496000px;} -.y130a{bottom:367.516000px;} -.y795{bottom:367.546000px;} -.yc43{bottom:367.556000px;} -.y554{bottom:367.567000px;} -.y9ee{bottom:367.697000px;} -.y81c{bottom:367.718000px;} -.ybc9{bottom:367.744000px;} -.yadf{bottom:367.863000px;} -.y13ed{bottom:367.923000px;} -.ydb7{bottom:368.022000px;} -.y9cd{bottom:368.059000px;} -.y13c0{bottom:368.191000px;} -.yb0b{bottom:368.258000px;} -.y6a1{bottom:368.291000px;} -.y74a{bottom:368.395000px;} -.yd4c{bottom:368.691000px;} -.y1043{bottom:368.796000px;} -.yebb{bottom:368.811000px;} -.y10c6{bottom:369.033000px;} -.y1153{bottom:369.261000px;} -.y1457{bottom:369.281000px;} -.y3f5{bottom:369.588000px;} -.y42c{bottom:369.672000px;} -.y700{bottom:369.714000px;} -.yf90{bottom:369.752000px;} -.yffd{bottom:369.766000px;} -.y12da{bottom:369.854000px;} +.ye3d{bottom:364.024000px;} +.ya5d{bottom:364.239000px;} +.yab{bottom:364.410000px;} +.yf28{bottom:364.439000px;} +.yaff{bottom:364.689000px;} +.yda5{bottom:364.749000px;} +.y3a0{bottom:364.839000px;} +.y28c{bottom:364.937000px;} +.y13e6{bottom:365.019000px;} +.y3a2{bottom:365.023000px;} +.ya8b{bottom:365.025000px;} +.y14bd{bottom:365.054000px;} +.y28a{bottom:365.086000px;} +.yc2e{bottom:365.114000px;} +.y13b9{bottom:365.257000px;} +.y109f{bottom:365.275000px;} +.y492{bottom:365.434000px;} +.ycc7{bottom:365.541000px;} +.y8d9{bottom:365.642000px;} +.y1322{bottom:365.914000px;} +.y97a{bottom:365.955000px;} +.y4e8{bottom:366.004000px;} +.y6e8{bottom:366.099000px;} +.y1c2{bottom:366.430000px;} +.y11af{bottom:366.499000px;} +.y150b{bottom:366.514000px;} +.y1475{bottom:366.595000px;} +.y150c{bottom:366.664000px;} +.y1034{bottom:367.185000px;} +.ye5e{bottom:367.247000px;} +.y9ee{bottom:367.313000px;} +.y111d{bottom:367.330000px;} +.y157{bottom:367.427000px;} +.ybcc{bottom:367.430000px;} +.y39e{bottom:367.496000px;} +.y12b7{bottom:367.516000px;} +.y77a{bottom:367.546000px;} +.yc0d{bottom:367.556000px;} +.y543{bottom:367.567000px;} +.y9c4{bottom:367.697000px;} +.y7fd{bottom:367.718000px;} +.yb95{bottom:367.744000px;} +.yab1{bottom:367.863000px;} +.y1394{bottom:367.923000px;} +.yd7c{bottom:368.022000px;} +.y9a4{bottom:368.059000px;} +.y1368{bottom:368.191000px;} +.yadc{bottom:368.258000px;} +.y68b{bottom:368.291000px;} +.y72f{bottom:368.395000px;} +.yd13{bottom:368.691000px;} +.yffb{bottom:368.796000px;} +.ye7c{bottom:368.811000px;} +.y107d{bottom:369.033000px;} +.y1108{bottom:369.261000px;} +.y13fe{bottom:369.281000px;} +.y3eb{bottom:369.588000px;} +.y421{bottom:369.672000px;} +.y6e9{bottom:369.714000px;} +.yf4d{bottom:369.752000px;} +.yfb7{bottom:369.766000px;} +.y1289{bottom:369.854000px;} .y70{bottom:369.889000px;} -.y153d{bottom:369.938000px;} -.y872{bottom:369.987000px;} -.yd24{bottom:370.031000px;} -.y5d4{bottom:370.085000px;} -.y1198{bottom:370.319000px;} -.y84c{bottom:370.463000px;} -.yfbd{bottom:370.559000px;} -.yb2d{bottom:370.567000px;} -.y15cf{bottom:370.592000px;} -.yda4{bottom:370.665000px;} -.ycde{bottom:370.676000px;} -.y8dc{bottom:370.734000px;} -.yc28{bottom:370.757000px;} -.y3aa{bottom:371.111000px;} -.y122e{bottom:371.182000px;} -.y1a9{bottom:371.195000px;} -.y13a9{bottom:371.481000px;} -.y3a8{bottom:371.758000px;} -.y132a{bottom:371.913000px;} -.y5a5{bottom:371.927000px;} -.yd7e{bottom:371.982000px;} -.yf3a{bottom:372.370000px;} -.y1492{bottom:372.408000px;} -.y832{bottom:372.602000px;} -.yfd8{bottom:372.644000px;} -.y1022{bottom:372.672000px;} -.y60f{bottom:372.772000px;} -.y110e{bottom:372.802000px;} -.y527{bottom:372.828000px;} -.y126e{bottom:373.191000px;} -.y72b{bottom:373.246000px;} -.y899{bottom:373.272000px;} -.y207{bottom:373.325000px;} -.yf9{bottom:373.377000px;} -.y1181{bottom:373.702000px;} -.ycad{bottom:373.945000px;} -.yba6{bottom:374.122000px;} -.y76d{bottom:374.132000px;} -.y368{bottom:374.325000px;} -.y15cd{bottom:374.427000px;} -.y8be{bottom:374.505000px;} -.yee7{bottom:374.553000px;} -.y14f4{bottom:374.772000px;} -.yb57{bottom:374.873000px;} -.y1566{bottom:375.032000px;} -.y1567{bottom:375.182000px;} -.ye55{bottom:375.288000px;} -.y241{bottom:375.349000px;} -.y1353{bottom:375.486000px;} -.y107a{bottom:375.525000px;} +.y14e0{bottom:369.938000px;} +.y850{bottom:369.987000px;} +.yceb{bottom:370.031000px;} +.y5c2{bottom:370.085000px;} +.y114b{bottom:370.319000px;} +.y82b{bottom:370.463000px;} +.yf7a{bottom:370.559000px;} +.yafd{bottom:370.567000px;} +.y1571{bottom:370.592000px;} +.yd6a{bottom:370.665000px;} +.yca5{bottom:370.676000px;} +.y8b8{bottom:370.734000px;} +.ybf3{bottom:370.757000px;} +.y3a1{bottom:371.111000px;} +.y11df{bottom:371.182000px;} +.y1a6{bottom:371.195000px;} +.y1352{bottom:371.481000px;} +.y39f{bottom:371.758000px;} +.y12d6{bottom:371.913000px;} +.y593{bottom:371.927000px;} +.yd44{bottom:371.982000px;} +.yef8{bottom:372.370000px;} +.y1437{bottom:372.408000px;} +.y811{bottom:372.602000px;} +.yf93{bottom:372.644000px;} +.yfdb{bottom:372.672000px;} +.y5fc{bottom:372.772000px;} +.y10c4{bottom:372.802000px;} +.y517{bottom:372.828000px;} +.y121e{bottom:373.191000px;} +.y713{bottom:373.246000px;} +.y877{bottom:373.272000px;} +.y201{bottom:373.325000px;} +.yfc{bottom:373.377000px;} +.y1135{bottom:373.702000px;} +.yc75{bottom:373.945000px;} +.yb73{bottom:374.122000px;} +.y753{bottom:374.132000px;} +.y360{bottom:374.325000px;} +.y156f{bottom:374.427000px;} +.y89b{bottom:374.505000px;} +.yea7{bottom:374.553000px;} +.y1498{bottom:374.772000px;} +.yb26{bottom:374.873000px;} +.y1509{bottom:375.032000px;} +.ycf{bottom:375.048000px;} +.y150a{bottom:375.182000px;} +.ye17{bottom:375.288000px;} +.y23b{bottom:375.349000px;} +.y12fe{bottom:375.486000px;} +.y1032{bottom:375.525000px;} .y40{bottom:375.867000px;} -.ye7b{bottom:375.979000px;} -.ya89{bottom:376.194000px;} -.yab{bottom:376.365000px;} -.yf69{bottom:376.394000px;} -.ye0a{bottom:376.585000px;} -.yb2e{bottom:376.644000px;} -.ye2f{bottom:376.664000px;} -.yde0{bottom:376.704000px;} -.y3a6{bottom:376.795000px;} -.y143e{bottom:376.974000px;} -.yab7{bottom:376.980000px;} -.y7a5{bottom:377.000000px;} -.y1518{bottom:377.009000px;} -.yc64{bottom:377.069000px;} -.y1411{bottom:377.212000px;} -.y10e8{bottom:377.231000px;} -.ycff{bottom:377.496000px;} -.y8fd{bottom:377.597000px;} -.y9a1{bottom:377.910000px;} -.y4f6{bottom:377.959000px;} -.y6fe{bottom:378.054000px;} +.ye3c{bottom:375.979000px;} +.ya5c{bottom:376.194000px;} +.yaa{bottom:376.365000px;} +.yf27{bottom:376.394000px;} +.ydce{bottom:376.585000px;} +.yafe{bottom:376.644000px;} +.ydf2{bottom:376.664000px;} +.yda4{bottom:376.704000px;} +.y39d{bottom:376.795000px;} +.y13e5{bottom:376.974000px;} +.ya8a{bottom:376.980000px;} +.y14bc{bottom:377.009000px;} +.yc2d{bottom:377.069000px;} +.y13b8{bottom:377.212000px;} +.y109e{bottom:377.231000px;} +.ycc6{bottom:377.496000px;} +.y8d8{bottom:377.597000px;} +.y979{bottom:377.910000px;} +.y4e7{bottom:377.959000px;} +.y6e7{bottom:378.054000px;} .y99{bottom:378.358000px;} -.y1c6{bottom:378.386000px;} -.y11fd{bottom:378.455000px;} -.y15ce{bottom:378.562000px;} -.ye9c{bottom:379.202000px;} -.ya17{bottom:379.269000px;} -.y158{bottom:379.382000px;} -.ybff{bottom:379.385000px;} -.y3a4{bottom:379.451000px;} -.y1309{bottom:379.471000px;} -.yc42{bottom:379.511000px;} -.y9ed{bottom:379.652000px;} -.y28c{bottom:379.736000px;} -.yade{bottom:379.818000px;} -.y28e{bottom:379.920000px;} -.y9cc{bottom:380.015000px;} -.ybc7{bottom:380.098000px;} -.y13bf{bottom:380.146000px;} -.yb0a{bottom:380.213000px;} -.y6a0{bottom:380.246000px;} -.y749{bottom:380.350000px;} -.y1042{bottom:380.751000px;} -.yeba{bottom:380.766000px;} -.ya3c{bottom:380.948000px;} -.y10c5{bottom:380.988000px;} -.y1456{bottom:381.236000px;} -.y105d{bottom:381.347000px;} -.y12b3{bottom:381.445000px;} -.y42b{bottom:381.627000px;} -.yf8f{bottom:381.707000px;} -.yffc{bottom:381.721000px;} -.y12d9{bottom:381.809000px;} +.y1c1{bottom:378.386000px;} +.y11ae{bottom:378.455000px;} +.y1570{bottom:378.562000px;} +.ye5d{bottom:379.202000px;} +.y9ed{bottom:379.269000px;} +.y156{bottom:379.382000px;} +.ybcb{bottom:379.385000px;} +.y39b{bottom:379.451000px;} +.y12b6{bottom:379.471000px;} +.yc0c{bottom:379.511000px;} +.y9c3{bottom:379.652000px;} +.y286{bottom:379.736000px;} +.yab0{bottom:379.818000px;} +.y288{bottom:379.920000px;} +.y9a3{bottom:380.015000px;} +.yb93{bottom:380.098000px;} +.y1367{bottom:380.146000px;} +.yadb{bottom:380.213000px;} +.y68a{bottom:380.246000px;} +.y72e{bottom:380.350000px;} +.yffa{bottom:380.751000px;} +.ye7b{bottom:380.766000px;} +.ya11{bottom:380.948000px;} +.y107c{bottom:380.988000px;} +.y13fd{bottom:381.236000px;} +.y1015{bottom:381.347000px;} +.y1263{bottom:381.445000px;} +.y420{bottom:381.627000px;} +.yf4c{bottom:381.707000px;} +.yfb6{bottom:381.721000px;} +.y1288{bottom:381.809000px;} .y6f{bottom:381.845000px;} -.y153c{bottom:381.893000px;} -.y871{bottom:381.942000px;} -.yd23{bottom:381.986000px;} -.y1140{bottom:382.234000px;} -.y84b{bottom:382.418000px;} -.yfbc{bottom:382.514000px;} -.yda3{bottom:382.621000px;} -.ycdd{bottom:382.631000px;} -.y8db{bottom:382.689000px;} -.y28a{bottom:382.742000px;} -.y7bc{bottom:382.779000px;} -.y122d{bottom:383.137000px;} -.y13a8{bottom:383.436000px;} -.y1564{bottom:383.550000px;} -.y1565{bottom:383.700000px;} -.y3a5{bottom:383.713000px;} -.y1329{bottom:383.868000px;} -.yd7d{bottom:383.937000px;} -.y1377{bottom:384.304000px;} -.yf39{bottom:384.325000px;} -.y1491{bottom:384.363000px;} -.y831{bottom:384.557000px;} -.yfd7{bottom:384.599000px;} -.y1021{bottom:384.627000px;} -.y526{bottom:384.783000px;} -.y126d{bottom:385.147000px;} -.y6d6{bottom:385.153000px;} -.y72a{bottom:385.201000px;} -.y898{bottom:385.227000px;} -.y206{bottom:385.280000px;} -.yf8{bottom:385.332000px;} -.ycac{bottom:385.901000px;} -.y794{bottom:385.935000px;} -.yba5{bottom:386.078000px;} -.y76c{bottom:386.088000px;} -.y367{bottom:386.280000px;} -.y1a8{bottom:386.283000px;} -.y28d{bottom:386.357000px;} -.y8bd{bottom:386.460000px;} -.yee6{bottom:386.508000px;} -.yb56{bottom:386.828000px;} -.y15cb{bottom:386.930000px;} -.y28b{bottom:387.003000px;} -.y15cc{bottom:387.080000px;} -.y14f3{bottom:387.125000px;} -.ye54{bottom:387.244000px;} -.y49f{bottom:387.255000px;} -.y240{bottom:387.304000px;} -.y5a4{bottom:387.380000px;} -.ya62{bottom:387.407000px;} -.yf11{bottom:387.421000px;} -.y975{bottom:387.422000px;} -.y1352{bottom:387.441000px;} -.yce{bottom:387.611000px;} -.y1152{bottom:387.650000px;} +.y14df{bottom:381.893000px;} +.y84f{bottom:381.942000px;} +.ycea{bottom:381.986000px;} +.y10f6{bottom:382.234000px;} +.y82a{bottom:382.418000px;} +.yf79{bottom:382.514000px;} +.yd69{bottom:382.621000px;} +.yca4{bottom:382.631000px;} +.y8b7{bottom:382.689000px;} +.y285{bottom:382.742000px;} +.y7a0{bottom:382.779000px;} +.y11de{bottom:383.137000px;} +.y1351{bottom:383.436000px;} +.y1507{bottom:383.550000px;} +.y1508{bottom:383.700000px;} +.y39c{bottom:383.713000px;} +.y12d5{bottom:383.868000px;} +.yd43{bottom:383.937000px;} +.y1321{bottom:384.304000px;} +.yef7{bottom:384.325000px;} +.y1436{bottom:384.363000px;} +.y810{bottom:384.557000px;} +.yf92{bottom:384.599000px;} +.yfda{bottom:384.627000px;} +.y516{bottom:384.783000px;} +.y121d{bottom:385.147000px;} +.y6bf{bottom:385.153000px;} +.y712{bottom:385.201000px;} +.y876{bottom:385.227000px;} +.y200{bottom:385.280000px;} +.yfb{bottom:385.332000px;} +.yc74{bottom:385.901000px;} +.y779{bottom:385.935000px;} +.yb72{bottom:386.078000px;} +.y752{bottom:386.088000px;} +.y35f{bottom:386.280000px;} +.y1a5{bottom:386.283000px;} +.y287{bottom:386.357000px;} +.y89a{bottom:386.460000px;} +.yea6{bottom:386.508000px;} +.yb25{bottom:386.828000px;} +.y156d{bottom:386.930000px;} +.yce{bottom:387.003000px;} +.y156e{bottom:387.080000px;} +.y1497{bottom:387.125000px;} +.ye16{bottom:387.244000px;} +.y491{bottom:387.255000px;} +.y23a{bottom:387.304000px;} +.y592{bottom:387.380000px;} +.ya36{bottom:387.407000px;} +.yecf{bottom:387.421000px;} +.y94e{bottom:387.422000px;} +.y12fd{bottom:387.441000px;} +.y1107{bottom:387.650000px;} .y3f{bottom:387.822000px;} -.ye7a{bottom:387.934000px;} -.y3c9{bottom:388.000000px;} -.ya87{bottom:388.149000px;} -.yaa{bottom:388.321000px;} -.yf68{bottom:388.350000px;} -.ye09{bottom:388.540000px;} -.ye2e{bottom:388.619000px;} -.yddf{bottom:388.659000px;} -.y5a3{bottom:388.875000px;} -.y143d{bottom:388.929000px;} -.yab6{bottom:388.935000px;} -.y1517{bottom:388.964000px;} -.yef7{bottom:389.000000px;} -.yc63{bottom:389.024000px;} -.y10e7{bottom:389.186000px;} -.y11ca{bottom:389.436000px;} -.y8fc{bottom:389.553000px;} -.y81a{bottom:389.635000px;} -.y9a0{bottom:389.866000px;} -.y4f5{bottom:389.915000px;} -.y6fd{bottom:390.009000px;} +.ye3b{bottom:387.934000px;} +.ya5a{bottom:388.149000px;} +.yf26{bottom:388.350000px;} +.ydcd{bottom:388.540000px;} +.ydf1{bottom:388.619000px;} +.yda3{bottom:388.659000px;} +.y591{bottom:388.875000px;} +.y13e4{bottom:388.929000px;} +.ya89{bottom:388.935000px;} +.y14bb{bottom:388.964000px;} +.yc2c{bottom:389.024000px;} +.y109d{bottom:389.186000px;} +.y117c{bottom:389.436000px;} +.y8d7{bottom:389.553000px;} +.y7fb{bottom:389.635000px;} +.y978{bottom:389.866000px;} +.y4e6{bottom:389.915000px;} +.y6e6{bottom:390.009000px;} .y98{bottom:390.313000px;} -.y1c5{bottom:390.341000px;} -.y3f4{bottom:390.410000px;} -.y42a{bottom:390.926000px;} -.yb7c{bottom:390.950000px;} -.ye9b{bottom:391.157000px;} -.ya16{bottom:391.224000px;} -.y157{bottom:391.337000px;} -.ybfe{bottom:391.340000px;} -.yb2c{bottom:391.389000px;} -.y3a3{bottom:391.406000px;} -.y1308{bottom:391.426000px;} -.yc41{bottom:391.466000px;} -.ya88{bottom:391.764000px;} -.yadd{bottom:391.773000px;} -.y3f3{bottom:391.904000px;} -.ybc4{bottom:391.953000px;} -.y9cb{bottom:391.970000px;} -.y1479{bottom:392.050000px;} -.ybc6{bottom:392.053000px;} -.y1562{bottom:392.069000px;} -.yb09{bottom:392.168000px;} -.y69f{bottom:392.201000px;} -.y1563{bottom:392.218000px;} -.y7c9{bottom:392.305000px;} -.y748{bottom:392.306000px;} -.yf04{bottom:392.513000px;} -.yeb9{bottom:392.722000px;} -.y10c4{bottom:392.943000px;} -.y1455{bottom:393.191000px;} -.y81b{bottom:393.251000px;} -.ya3b{bottom:393.302000px;} -.y428{bottom:393.582000px;} -.yf8e{bottom:393.662000px;} -.yffb{bottom:393.676000px;} -.y12d8{bottom:393.764000px;} +.y1c0{bottom:390.341000px;} +.y3ea{bottom:390.410000px;} +.y41f{bottom:390.926000px;} +.yb4a{bottom:390.950000px;} +.ye5c{bottom:391.157000px;} +.y9ec{bottom:391.224000px;} +.y155{bottom:391.337000px;} +.ybca{bottom:391.340000px;} +.yafc{bottom:391.389000px;} +.y39a{bottom:391.406000px;} +.y12b5{bottom:391.426000px;} +.yc0b{bottom:391.466000px;} +.ya5b{bottom:391.764000px;} +.yaaf{bottom:391.773000px;} +.y3e9{bottom:391.904000px;} +.yb90{bottom:391.953000px;} +.y9a2{bottom:391.970000px;} +.y141f{bottom:392.050000px;} +.yb92{bottom:392.053000px;} +.y1505{bottom:392.069000px;} +.yada{bottom:392.168000px;} +.y689{bottom:392.201000px;} +.y1506{bottom:392.218000px;} +.y7ad{bottom:392.305000px;} +.y72d{bottom:392.306000px;} +.yec3{bottom:392.513000px;} +.ye7a{bottom:392.722000px;} +.y107b{bottom:392.943000px;} +.y13fc{bottom:393.191000px;} +.y7fc{bottom:393.251000px;} +.ya10{bottom:393.302000px;} +.y41d{bottom:393.582000px;} +.yf4b{bottom:393.662000px;} +.yfb5{bottom:393.676000px;} +.y1287{bottom:393.764000px;} .y6e{bottom:393.800000px;} -.y153b{bottom:393.848000px;} -.y870{bottom:393.897000px;} -.yd22{bottom:393.941000px;} -.y13ec{bottom:394.127000px;} -.y113e{bottom:394.189000px;} -.yfbb{bottom:394.469000px;} -.yda2{bottom:394.576000px;} -.y8da{bottom:394.645000px;} -.y7bb{bottom:394.734000px;} -.y122b{bottom:395.092000px;} -.y13a7{bottom:395.391000px;} -.y15ca{bottom:395.448000px;} -.y10a1{bottom:395.668000px;} -.y1328{bottom:395.823000px;} -.ycfe{bottom:395.885000px;} -.yd7c{bottom:395.892000px;} -.yf38{bottom:396.280000px;} -.y830{bottom:396.512000px;} -.y1020{bottom:396.582000px;} -.y525{bottom:396.739000px;} -.y126c{bottom:397.102000px;} -.y6d5{bottom:397.109000px;} -.y1410{bottom:397.137000px;} -.y729{bottom:397.156000px;} -.y897{bottom:397.182000px;} -.yf7{bottom:397.287000px;} -.y113f{bottom:397.805000px;} -.y429{bottom:397.844000px;} -.y76b{bottom:398.043000px;} -.y366{bottom:398.236000px;} -.y8bc{bottom:398.415000px;} -.yee5{bottom:398.464000px;} -.yd4b{bottom:398.545000px;} -.y122c{bottom:398.708000px;} -.yb55{bottom:398.783000px;} -.y552{bottom:399.107000px;} -.ye53{bottom:399.199000px;} -.y23f{bottom:399.259000px;} -.y15c8{bottom:399.284000px;} -.yf10{bottom:399.376000px;} -.y974{bottom:399.377000px;} -.y1351{bottom:399.396000px;} -.y14f2{bottom:399.479000px;} -.ycd{bottom:399.566000px;} -.y129f{bottom:399.776000px;} +.y14de{bottom:393.848000px;} +.y84e{bottom:393.897000px;} +.yce9{bottom:393.941000px;} +.y1393{bottom:394.127000px;} +.y10f4{bottom:394.189000px;} +.yf78{bottom:394.469000px;} +.yd68{bottom:394.576000px;} +.y8b6{bottom:394.645000px;} +.y79f{bottom:394.734000px;} +.y11dc{bottom:395.092000px;} +.y1350{bottom:395.391000px;} +.y156c{bottom:395.448000px;} +.y1058{bottom:395.668000px;} +.y12d4{bottom:395.823000px;} +.ycc5{bottom:395.885000px;} +.yd42{bottom:395.892000px;} +.yef6{bottom:396.280000px;} +.ya9{bottom:396.291000px;} +.y80f{bottom:396.512000px;} +.yfd9{bottom:396.582000px;} +.y515{bottom:396.739000px;} +.y121c{bottom:397.102000px;} +.y6be{bottom:397.109000px;} +.y13b7{bottom:397.137000px;} +.y711{bottom:397.156000px;} +.y875{bottom:397.182000px;} +.yfa{bottom:397.287000px;} +.y10f5{bottom:397.805000px;} +.y41e{bottom:397.844000px;} +.y751{bottom:398.043000px;} +.y35e{bottom:398.236000px;} +.y899{bottom:398.415000px;} +.yea5{bottom:398.464000px;} +.yd12{bottom:398.545000px;} +.y11dd{bottom:398.708000px;} +.yb24{bottom:398.783000px;} +.y541{bottom:399.107000px;} +.ye15{bottom:399.199000px;} +.y239{bottom:399.259000px;} +.y156a{bottom:399.284000px;} +.yece{bottom:399.376000px;} +.y94d{bottom:399.377000px;} +.y12fc{bottom:399.396000px;} +.y1496{bottom:399.479000px;} +.y124f{bottom:399.776000px;} .y3e{bottom:399.777000px;} -.ydb6{bottom:399.847000px;} -.ye79{bottom:399.890000px;} -.y1a7{bottom:399.976000px;} -.ya86{bottom:400.104000px;} +.yd7b{bottom:399.847000px;} +.ye3a{bottom:399.890000px;} +.y1a4{bottom:399.976000px;} +.ya59{bottom:400.104000px;} .y2d{bottom:400.276000px;} -.ye08{bottom:400.496000px;} -.ye2d{bottom:400.574000px;} -.y1560{bottom:400.587000px;} -.ydde{bottom:400.615000px;} -.y1561{bottom:400.736000px;} -.y143c{bottom:400.885000px;} -.yab5{bottom:400.890000px;} -.y1516{bottom:400.920000px;} -.yc62{bottom:400.979000px;} -.y10e6{bottom:401.141000px;} -.y11c9{bottom:401.391000px;} -.y819{bottom:401.591000px;} -.y99f{bottom:401.821000px;} -.y1079{bottom:401.828000px;} -.y4f4{bottom:401.870000px;} -.y6fc{bottom:401.964000px;} -.y13be{bottom:401.967000px;} -.y84a{bottom:402.148000px;} +.ydcc{bottom:400.496000px;} +.ydf0{bottom:400.574000px;} +.y1503{bottom:400.587000px;} +.yda2{bottom:400.615000px;} +.y1504{bottom:400.736000px;} +.y13e3{bottom:400.885000px;} +.ya88{bottom:400.890000px;} +.y14ba{bottom:400.920000px;} +.yc2b{bottom:400.979000px;} +.y109c{bottom:401.141000px;} +.y117b{bottom:401.391000px;} +.y7fa{bottom:401.591000px;} +.y977{bottom:401.821000px;} +.y1031{bottom:401.828000px;} +.y4e5{bottom:401.870000px;} +.y6e5{bottom:401.964000px;} +.y1366{bottom:401.967000px;} +.y829{bottom:402.148000px;} .y97{bottom:402.268000px;} -.y1c4{bottom:402.296000px;} -.y205{bottom:402.321000px;} -.y11fc{bottom:402.365000px;} -.y553{bottom:402.723000px;} -.y3f2{bottom:402.764000px;} -.yb7b{bottom:402.905000px;} -.y426{bottom:403.065000px;} -.ye9a{bottom:403.112000px;} -.ya15{bottom:403.179000px;} -.y1197{bottom:403.264000px;} -.y156{bottom:403.292000px;} -.ybfd{bottom:403.295000px;} -.y1307{bottom:403.381000px;} -.y15c9{bottom:403.418000px;} -.yc40{bottom:403.421000px;} -.y204{bottom:403.815000px;} -.y9ca{bottom:403.925000px;} -.y1478{bottom:404.006000px;} -.ybc5{bottom:404.008000px;} -.y5d3{bottom:404.033000px;} -.yb08{bottom:404.123000px;} -.y69d{bottom:404.156000px;} -.y3f1{bottom:404.258000px;} -.y747{bottom:404.261000px;} -.yf03{bottom:404.469000px;} -.y1041{bottom:404.678000px;} -.y10c3{bottom:404.898000px;} -.y1180{bottom:405.146000px;} -.y424{bottom:405.537000px;} -.y427{bottom:405.538000px;} -.y110d{bottom:405.576000px;} -.ya3a{bottom:405.656000px;} -.y12d7{bottom:405.719000px;} +.y1bf{bottom:402.296000px;} +.y1ff{bottom:402.321000px;} +.y11ad{bottom:402.365000px;} +.y542{bottom:402.723000px;} +.y3e8{bottom:402.764000px;} +.yb49{bottom:402.905000px;} +.y41b{bottom:403.065000px;} +.ye5b{bottom:403.112000px;} +.y9eb{bottom:403.179000px;} +.y114a{bottom:403.264000px;} +.y154{bottom:403.292000px;} +.ybc9{bottom:403.295000px;} +.y12b4{bottom:403.381000px;} +.y156b{bottom:403.418000px;} +.yc0a{bottom:403.421000px;} +.y1fe{bottom:403.815000px;} +.y9a1{bottom:403.925000px;} +.y141e{bottom:404.006000px;} +.yb91{bottom:404.008000px;} +.y5c1{bottom:404.033000px;} +.yad9{bottom:404.123000px;} +.y687{bottom:404.156000px;} +.y3e7{bottom:404.258000px;} +.ya1{bottom:404.261000px;} +.yec2{bottom:404.469000px;} +.yff9{bottom:404.678000px;} +.y107a{bottom:404.898000px;} +.y1134{bottom:405.146000px;} +.y419{bottom:405.537000px;} +.y41c{bottom:405.538000px;} +.y10c3{bottom:405.576000px;} +.ya0f{bottom:405.656000px;} +.y1286{bottom:405.719000px;} .y6d{bottom:405.755000px;} -.y153a{bottom:405.804000px;} -.y11f{bottom:405.807000px;} -.y86f{bottom:405.852000px;} -.yd21{bottom:405.896000px;} -.y13eb{bottom:406.082000px;} -.y113c{bottom:406.145000px;} -.y1490{bottom:406.184000px;} -.yfba{bottom:406.425000px;} -.yda1{bottom:406.531000px;} -.y8d9{bottom:406.600000px;} -.y7ba{bottom:406.689000px;} -.y122a{bottom:407.048000px;} -.y11e{bottom:407.302000px;} -.y13a6{bottom:407.347000px;} -.y14cf{bottom:407.408000px;} -.y69e{bottom:407.772000px;} -.yd7b{bottom:407.847000px;} -.yf37{bottom:408.236000px;} -.ya9{bottom:408.246000px;} -.y135e{bottom:408.500000px;} -.y524{bottom:408.694000px;} -.y126b{bottom:409.057000px;} -.y6d3{bottom:409.064000px;} -.y140f{bottom:409.093000px;} -.y155e{bottom:409.105000px;} -.y896{bottom:409.137000px;} -.y425{bottom:409.153000px;} -.yf6{bottom:409.242000px;} -.y155f{bottom:409.254000px;} -.ya61{bottom:409.724000px;} -.y113d{bottom:409.760000px;} -.y3a2{bottom:409.796000px;} -.y365{bottom:410.191000px;} -.y8bb{bottom:410.370000px;} -.yee4{bottom:410.419000px;} -.yd4a{bottom:410.500000px;} -.y9ec{bottom:410.647000px;} -.y1327{bottom:410.911000px;} -.y551{bottom:411.062000px;} -.yba4{bottom:411.084000px;} -.yf0f{bottom:411.331000px;} -.y972{bottom:411.332000px;} -.y1350{bottom:411.351000px;} -.y23e{bottom:411.613000px;} -.ycdc{bottom:411.633000px;} -.y15c6{bottom:411.787000px;} -.ydb5{bottom:411.802000px;} -.y14f1{bottom:411.833000px;} -.ye78{bottom:411.845000px;} -.y1a6{bottom:411.931000px;} -.y15c7{bottom:411.936000px;} -.yf8d{bottom:412.051000px;} -.ya84{bottom:412.059000px;} -.yb2b{bottom:412.111000px;} +.y14dd{bottom:405.804000px;} +.y120{bottom:405.807000px;} +.y84d{bottom:405.852000px;} +.yce8{bottom:405.896000px;} +.y1392{bottom:406.082000px;} +.y10f2{bottom:406.145000px;} +.y1435{bottom:406.184000px;} +.yf77{bottom:406.425000px;} +.yd67{bottom:406.531000px;} +.y8b5{bottom:406.600000px;} +.y79e{bottom:406.689000px;} +.y11db{bottom:407.048000px;} +.y11f{bottom:407.302000px;} +.y134f{bottom:407.347000px;} +.y1474{bottom:407.408000px;} +.y688{bottom:407.772000px;} +.yd41{bottom:407.847000px;} +.yef5{bottom:408.236000px;} +.ya8{bottom:408.246000px;} +.y514{bottom:408.694000px;} +.y121b{bottom:409.057000px;} +.y6bc{bottom:409.064000px;} +.y13b6{bottom:409.093000px;} +.y1501{bottom:409.105000px;} +.y874{bottom:409.137000px;} +.y41a{bottom:409.153000px;} +.yf9{bottom:409.242000px;} +.y1502{bottom:409.254000px;} +.ya35{bottom:409.724000px;} +.y10f3{bottom:409.760000px;} +.y399{bottom:409.796000px;} +.y35d{bottom:410.191000px;} +.y898{bottom:410.370000px;} +.yea4{bottom:410.419000px;} +.yd11{bottom:410.500000px;} +.y9c2{bottom:410.647000px;} +.y12d3{bottom:410.911000px;} +.y540{bottom:411.062000px;} +.yb71{bottom:411.084000px;} +.yecd{bottom:411.331000px;} +.y94b{bottom:411.332000px;} +.y12fb{bottom:411.351000px;} +.y238{bottom:411.613000px;} +.yca3{bottom:411.633000px;} +.y1568{bottom:411.787000px;} +.yd7a{bottom:411.802000px;} +.y1495{bottom:411.833000px;} +.ye39{bottom:411.845000px;} +.y1a3{bottom:411.931000px;} +.y1569{bottom:411.936000px;} +.ycd{bottom:411.955000px;} +.yf4a{bottom:412.051000px;} +.ya57{bottom:412.059000px;} +.yafb{bottom:412.111000px;} .y2c{bottom:412.231000px;} -.yfd6{bottom:412.286000px;} -.ye07{bottom:412.451000px;} -.yddd{bottom:412.570000px;} -.y6d4{bottom:412.679000px;} -.y5a2{bottom:412.785000px;} -.yab4{bottom:412.845000px;} -.y1515{bottom:412.875000px;} -.yc61{bottom:412.934000px;} -.y105c{bottom:412.966000px;} -.y10e5{bottom:413.096000px;} -.ycab{bottom:413.304000px;} -.y11c8{bottom:413.346000px;} -.y818{bottom:413.546000px;} -.y793{bottom:413.593000px;} -.y99e{bottom:413.776000px;} -.y1078{bottom:413.784000px;} -.y4f3{bottom:413.825000px;} -.y143b{bottom:413.836000px;} -.y6fb{bottom:413.920000px;} -.y849{bottom:414.104000px;} +.yf91{bottom:412.286000px;} +.ydcb{bottom:412.451000px;} +.yda1{bottom:412.570000px;} +.y6bd{bottom:412.679000px;} +.y590{bottom:412.785000px;} +.ya87{bottom:412.845000px;} +.y14b9{bottom:412.875000px;} +.yc2a{bottom:412.934000px;} +.y1014{bottom:412.966000px;} +.y109b{bottom:413.096000px;} +.yc73{bottom:413.304000px;} +.y117a{bottom:413.346000px;} +.y7f9{bottom:413.546000px;} +.y778{bottom:413.593000px;} +.y976{bottom:413.776000px;} +.y1030{bottom:413.784000px;} +.y4e4{bottom:413.825000px;} +.y13e2{bottom:413.836000px;} +.y6e4{bottom:413.920000px;} +.y828{bottom:414.104000px;} .y96{bottom:414.223000px;} -.y1c3{bottom:414.251000px;} -.y11fb{bottom:414.320000px;} -.yb7a{bottom:414.861000px;} -.y973{bottom:414.947000px;} -.ye99{bottom:415.067000px;} -.y3f0{bottom:415.117000px;} -.y1196{bottom:415.220000px;} -.y14a4{bottom:415.247000px;} -.ybfc{bottom:415.250000px;} -.y1306{bottom:415.336000px;} -.yc3f{bottom:415.377000px;} -.y1151{bottom:415.538000px;} -.y728{bottom:415.545000px;} -.ya85{bottom:415.675000px;} -.yf67{bottom:415.700000px;} -.y1476{bottom:415.961000px;} -.y5d2{bottom:415.989000px;} -.y69c{bottom:416.112000px;} -.ya1{bottom:416.216000px;} -.yf02{bottom:416.424000px;} -.y3ef{bottom:416.612000px;} -.y1040{bottom:416.633000px;} -.y10c2{bottom:416.853000px;} -.y60e{bottom:417.005000px;} -.y117f{bottom:417.101000px;} -.y423{bottom:417.493000px;} -.y110c{bottom:417.531000px;} -.y12d6{bottom:417.675000px;} +.y1be{bottom:414.251000px;} +.y11ac{bottom:414.320000px;} +.yb48{bottom:414.861000px;} +.y94c{bottom:414.947000px;} +.ye5a{bottom:415.067000px;} +.y3e6{bottom:415.117000px;} +.y1149{bottom:415.220000px;} +.y1449{bottom:415.247000px;} +.ybc8{bottom:415.250000px;} +.y12b3{bottom:415.336000px;} +.yc09{bottom:415.377000px;} +.y1106{bottom:415.538000px;} +.y710{bottom:415.545000px;} +.ya58{bottom:415.675000px;} +.yf25{bottom:415.700000px;} +.y141c{bottom:415.961000px;} +.y5c0{bottom:415.989000px;} +.y686{bottom:416.112000px;} +.y284{bottom:416.216000px;} +.yec1{bottom:416.424000px;} +.y3e5{bottom:416.612000px;} +.yff8{bottom:416.633000px;} +.y1079{bottom:416.853000px;} +.y5fb{bottom:417.005000px;} +.y1133{bottom:417.101000px;} +.y418{bottom:417.493000px;} +.y10c2{bottom:417.531000px;} +.y1285{bottom:417.675000px;} .y6c{bottom:417.710000px;} -.y1539{bottom:417.759000px;} -.yd20{bottom:417.851000px;} -.ya39{bottom:418.009000px;} -.y113b{bottom:418.100000px;} -.y82f{bottom:418.333000px;} -.yfb9{bottom:418.380000px;} -.yda0{bottom:418.486000px;} -.y8d8{bottom:418.555000px;} -.y7b9{bottom:418.644000px;} -.y76a{bottom:418.712000px;} -.ybc3{bottom:418.753000px;} -.y1229{bottom:419.003000px;} -.y11d{bottom:419.257000px;} -.y13a5{bottom:419.302000px;} -.y14ce{bottom:419.363000px;} -.y1477{bottom:419.576000px;} -.yd7a{bottom:419.803000px;} -.y155d{bottom:420.014000px;} -.yf36{bottom:420.191000px;} -.ya8{bottom:420.201000px;} -.y202{bottom:420.224000px;} -.y15c4{bottom:420.305000px;} -.yeb8{bottom:420.409000px;} -.y15c5{bottom:420.455000px;} -.y1376{bottom:420.464000px;} -.y523{bottom:420.649000px;} -.y6d2{bottom:421.019000px;} -.y895{bottom:421.093000px;} -.yf5{bottom:421.197000px;} -.y203{bottom:421.551000px;} +.y14dc{bottom:417.759000px;} +.yce7{bottom:417.851000px;} +.ya0e{bottom:418.009000px;} +.y10f1{bottom:418.100000px;} +.y80e{bottom:418.333000px;} +.yf76{bottom:418.380000px;} +.yd66{bottom:418.486000px;} +.y8b4{bottom:418.555000px;} +.y79d{bottom:418.644000px;} +.y750{bottom:418.712000px;} +.yb8f{bottom:418.753000px;} +.y11da{bottom:419.003000px;} +.y11e{bottom:419.257000px;} +.y134e{bottom:419.302000px;} +.y1473{bottom:419.363000px;} +.y141d{bottom:419.576000px;} +.yd40{bottom:419.803000px;} +.y1500{bottom:420.014000px;} +.yef4{bottom:420.191000px;} +.ya7{bottom:420.201000px;} +.y1fc{bottom:420.224000px;} +.y1566{bottom:420.305000px;} +.ye79{bottom:420.409000px;} +.y1567{bottom:420.455000px;} +.y1320{bottom:420.464000px;} +.y513{bottom:420.649000px;} +.y6bb{bottom:421.019000px;} +.y873{bottom:421.093000px;} +.yf8{bottom:421.197000px;} +.y1fd{bottom:421.551000px;} .y3d{bottom:421.695000px;} -.y101f{bottom:422.056000px;} -.ya60{bottom:422.077000px;} -.y364{bottom:422.146000px;} -.y8ba{bottom:422.326000px;} -.yee3{bottom:422.374000px;} -.yd49{bottom:422.455000px;} -.y9eb{bottom:422.602000px;} -.yadc{bottom:422.768000px;} -.y550{bottom:423.018000px;} -.y200{bottom:423.045000px;} -.ycfd{bottom:423.125000px;} -.y971{bottom:423.287000px;} -.y134e{bottom:423.306000px;} -.y23d{bottom:423.568000px;} -.ycdb{bottom:423.588000px;} -.yb54{bottom:423.648000px;} -.y2e9{bottom:423.666000px;} -.ydb4{bottom:423.757000px;} -.ye77{bottom:423.800000px;} -.ya83{bottom:424.015000px;} -.yb2a{bottom:424.066000px;} +.yfd8{bottom:422.056000px;} +.ya34{bottom:422.077000px;} +.y35c{bottom:422.146000px;} +.y897{bottom:422.326000px;} +.yea3{bottom:422.374000px;} +.yd10{bottom:422.455000px;} +.y9c1{bottom:422.602000px;} +.yaae{bottom:422.768000px;} +.y53f{bottom:423.018000px;} +.y1fa{bottom:423.045000px;} +.ycc4{bottom:423.125000px;} +.y94a{bottom:423.287000px;} +.y12f9{bottom:423.306000px;} +.y237{bottom:423.568000px;} +.yca2{bottom:423.588000px;} +.yb23{bottom:423.648000px;} +.y2e2{bottom:423.666000px;} +.yd79{bottom:423.757000px;} +.ye38{bottom:423.800000px;} +.ya56{bottom:424.015000px;} +.yafa{bottom:424.066000px;} .y2b{bottom:424.186000px;} -.yfd5{bottom:424.241000px;} -.ye06{bottom:424.406000px;} -.ycc{bottom:424.432000px;} -.yddc{bottom:424.525000px;} -.yffa{bottom:424.671000px;} -.ye52{bottom:424.714000px;} -.y5a1{bottom:424.740000px;} -.yab3{bottom:424.801000px;} -.y1514{bottom:424.830000px;} -.yc60{bottom:424.890000px;} -.y140e{bottom:425.033000px;} -.y10e4{bottom:425.051000px;} -.y155{bottom:425.113000px;} -.ycaa{bottom:425.259000px;} -.y11c7{bottom:425.301000px;} -.y817{bottom:425.501000px;} -.y792{bottom:425.549000px;} -.y99d{bottom:425.731000px;} -.y1077{bottom:425.739000px;} -.y4f2{bottom:425.780000px;} -.y9c9{bottom:425.843000px;} -.y848{bottom:426.059000px;} +.yf90{bottom:424.241000px;} +.ydca{bottom:424.406000px;} +.yda0{bottom:424.525000px;} +.yfb4{bottom:424.671000px;} +.ye14{bottom:424.714000px;} +.y58f{bottom:424.740000px;} +.ya86{bottom:424.801000px;} +.y14b8{bottom:424.830000px;} +.yc29{bottom:424.890000px;} +.y13b5{bottom:425.033000px;} +.y109a{bottom:425.051000px;} +.y153{bottom:425.113000px;} +.yc72{bottom:425.259000px;} +.y1179{bottom:425.301000px;} +.y7f8{bottom:425.501000px;} +.y777{bottom:425.549000px;} +.y975{bottom:425.731000px;} +.y102f{bottom:425.739000px;} +.y4e3{bottom:425.780000px;} +.y9a0{bottom:425.843000px;} +.y827{bottom:426.059000px;} .y95{bottom:426.178000px;} -.y825{bottom:426.179000px;} -.y1c2{bottom:426.206000px;} -.y11fa{bottom:426.275000px;} -.y1326{bottom:426.541000px;} -.y201{bottom:426.661000px;} -.y10a0{bottom:426.663000px;} -.y143a{bottom:426.787000px;} -.yb79{bottom:426.816000px;} -.ye2c{bottom:426.878000px;} -.y134f{bottom:426.922000px;} -.ye98{bottom:427.023000px;} -.y1195{bottom:427.175000px;} -.ybfb{bottom:427.206000px;} -.y1305{bottom:427.292000px;} -.yc3e{bottom:427.332000px;} -.y3ee{bottom:427.471000px;} -.y1150{bottom:427.494000px;} -.yf66{bottom:427.655000px;} -.y1475{bottom:427.916000px;} -.y5d1{bottom:427.944000px;} -.y69b{bottom:428.067000px;} -.y289{bottom:428.171000px;} -.yf01{bottom:428.379000px;} -.y103f{bottom:428.588000px;} -.y15c3{bottom:428.823000px;} +.y805{bottom:426.179000px;} +.y1bd{bottom:426.206000px;} +.y11ab{bottom:426.275000px;} +.y12d2{bottom:426.541000px;} +.y1fb{bottom:426.661000px;} +.y1057{bottom:426.663000px;} +.y13e1{bottom:426.787000px;} +.yb47{bottom:426.816000px;} +.ydef{bottom:426.878000px;} +.y12fa{bottom:426.922000px;} +.ye59{bottom:427.023000px;} +.y1148{bottom:427.175000px;} +.ybc7{bottom:427.206000px;} +.y12b2{bottom:427.292000px;} +.yc08{bottom:427.332000px;} +.y3e4{bottom:427.471000px;} +.y1105{bottom:427.494000px;} +.yf24{bottom:427.655000px;} +.y141b{bottom:427.916000px;} +.y5bf{bottom:427.944000px;} +.y685{bottom:428.067000px;} +.y283{bottom:428.171000px;} +.yec0{bottom:428.379000px;} +.yff7{bottom:428.588000px;} +.y1565{bottom:428.823000px;} .yb{bottom:428.841000px;} -.y3ed{bottom:428.965000px;} -.yb07{bottom:428.988000px;} -.y117e{bottom:429.057000px;} -.y110b{bottom:429.487000px;} -.y12d5{bottom:429.630000px;} +.y3e3{bottom:428.965000px;} +.yad8{bottom:428.988000px;} +.y1132{bottom:429.057000px;} +.y10c1{bottom:429.487000px;} +.y1284{bottom:429.630000px;} .y6b{bottom:429.665000px;} -.y1538{bottom:429.714000px;} -.yd1f{bottom:429.807000px;} -.y113a{bottom:430.055000px;} -.yfb8{bottom:430.335000px;} -.ya38{bottom:430.363000px;} -.yd9e{bottom:430.441000px;} -.y8d7{bottom:430.510000px;} -.y7b8{bottom:430.600000px;} -.y769{bottom:430.667000px;} -.y1228{bottom:430.958000px;} -.y11c{bottom:431.212000px;} -.y13a4{bottom:431.257000px;} -.y14cd{bottom:431.318000px;} -.yd79{bottom:431.758000px;} -.yf35{bottom:432.146000px;} -.ya7{bottom:432.156000px;} -.y155c{bottom:432.213000px;} -.yeb7{bottom:432.364000px;} -.y1375{bottom:432.419000px;} -.y13ea{bottom:432.486000px;} -.y522{bottom:432.604000px;} -.y105b{bottom:432.629000px;} -.y15c1{bottom:432.659000px;} -.ya14{bottom:432.864000px;} -.y894{bottom:433.048000px;} -.yf4{bottom:433.152000px;} -.y49e{bottom:433.252000px;} -.yba3{bottom:433.400000px;} +.y14db{bottom:429.714000px;} +.yce6{bottom:429.807000px;} +.y10f0{bottom:430.055000px;} +.ya0{bottom:430.164000px;} +.yf75{bottom:430.335000px;} +.ya0d{bottom:430.363000px;} +.yd64{bottom:430.441000px;} +.y8b3{bottom:430.510000px;} +.y79c{bottom:430.600000px;} +.y74f{bottom:430.667000px;} +.y11d9{bottom:430.958000px;} +.y11d{bottom:431.212000px;} +.y134d{bottom:431.257000px;} +.y1472{bottom:431.318000px;} +.ycc{bottom:431.406000px;} +.yd3f{bottom:431.758000px;} +.yef3{bottom:432.146000px;} +.yc55{bottom:432.156000px;} +.y14ff{bottom:432.213000px;} +.ye78{bottom:432.364000px;} +.y131f{bottom:432.419000px;} +.y1391{bottom:432.486000px;} +.y512{bottom:432.604000px;} +.y1013{bottom:432.629000px;} +.y1563{bottom:432.659000px;} +.y9ea{bottom:432.864000px;} +.y872{bottom:433.048000px;} +.yf7{bottom:433.152000px;} +.y490{bottom:433.252000px;} +.yb70{bottom:433.400000px;} .y3c{bottom:433.650000px;} -.y101e{bottom:434.011000px;} -.yd9f{bottom:434.057000px;} -.y8b9{bottom:434.281000px;} -.yee2{bottom:434.329000px;} -.yd48{bottom:434.410000px;} -.ya5f{bottom:434.431000px;} -.y9ea{bottom:434.557000px;} -.yadb{bottom:434.723000px;} -.y13bd{bottom:434.912000px;} -.y54f{bottom:434.973000px;} -.y86e{bottom:435.048000px;} -.ycfc{bottom:435.081000px;} -.y14a3{bottom:435.173000px;} -.y5a0{bottom:435.201000px;} -.y970{bottom:435.242000px;} -.y134d{bottom:435.262000px;} -.y5ea{bottom:435.336000px;} -.ycd9{bottom:435.543000px;} -.yb53{bottom:435.603000px;} -.y2e8{bottom:435.621000px;} -.y3a1{bottom:435.692000px;} -.ydb3{bottom:435.712000px;} -.y422{bottom:435.882000px;} -.y23c{bottom:435.922000px;} -.ya82{bottom:435.970000px;} -.yb29{bottom:436.021000px;} +.yfd7{bottom:434.011000px;} +.yd65{bottom:434.057000px;} +.y896{bottom:434.281000px;} +.yea2{bottom:434.329000px;} +.yd0f{bottom:434.410000px;} +.ya33{bottom:434.431000px;} +.y9c0{bottom:434.557000px;} +.yaad{bottom:434.723000px;} +.y1365{bottom:434.912000px;} +.y53e{bottom:434.973000px;} +.y84c{bottom:435.048000px;} +.ycc3{bottom:435.081000px;} +.y1448{bottom:435.173000px;} +.y58e{bottom:435.201000px;} +.y949{bottom:435.242000px;} +.y12f8{bottom:435.262000px;} +.y5d7{bottom:435.336000px;} +.yca0{bottom:435.543000px;} +.yb22{bottom:435.603000px;} +.y2e1{bottom:435.621000px;} +.y398{bottom:435.692000px;} +.yd78{bottom:435.712000px;} +.y417{bottom:435.882000px;} +.y236{bottom:435.922000px;} +.ya55{bottom:435.970000px;} +.yaf9{bottom:436.021000px;} .y2a{bottom:436.141000px;} -.y4f1{bottom:436.241000px;} -.ye05{bottom:436.361000px;} -.yddb{bottom:436.480000px;} -.y14f0{bottom:436.540000px;} -.yff9{bottom:436.626000px;} -.ye51{bottom:436.669000px;} -.y59f{bottom:436.695000px;} -.yab2{bottom:436.756000px;} -.y1513{bottom:436.785000px;} -.y15c2{bottom:436.793000px;} -.yc5f{bottom:436.845000px;} -.y140d{bottom:436.988000px;} -.y10e3{bottom:437.006000px;} -.yca9{bottom:437.214000px;} -.y11c6{bottom:437.257000px;} -.y816{bottom:437.456000px;} -.y791{bottom:437.504000px;} -.y1076{bottom:437.694000px;} -.y4f0{bottom:437.735000px;} -.yc7d{bottom:437.793000px;} -.y9c8{bottom:437.798000px;} -.y847{bottom:438.014000px;} +.y4e2{bottom:436.241000px;} +.ydc9{bottom:436.361000px;} +.yd9f{bottom:436.480000px;} +.y1494{bottom:436.540000px;} +.yfb3{bottom:436.626000px;} +.ye13{bottom:436.669000px;} +.y58d{bottom:436.695000px;} +.ya85{bottom:436.756000px;} +.y14b7{bottom:436.785000px;} +.y1564{bottom:436.793000px;} +.yc28{bottom:436.845000px;} +.y13b4{bottom:436.988000px;} +.y1099{bottom:437.006000px;} +.yc71{bottom:437.214000px;} +.y1178{bottom:437.257000px;} +.y7f7{bottom:437.456000px;} +.y776{bottom:437.504000px;} +.y102e{bottom:437.694000px;} +.y4e1{bottom:437.735000px;} +.yc45{bottom:437.793000px;} +.y99f{bottom:437.798000px;} +.y826{bottom:438.014000px;} .y94{bottom:438.134000px;} -.y674{bottom:438.161000px;} -.y11f9{bottom:438.230000px;} -.y1325{bottom:438.496000px;} -.y109e{bottom:438.618000px;} -.yb78{bottom:438.771000px;} -.ye2b{bottom:438.833000px;} -.yf0e{bottom:438.857000px;} -.y1194{bottom:439.130000px;} -.ycda{bottom:439.159000px;} -.ybfa{bottom:439.161000px;} -.y1304{bottom:439.247000px;} -.yc3d{bottom:439.287000px;} -.y6fa{bottom:439.393000px;} -.y114f{bottom:439.449000px;} -.y1439{bottom:439.739000px;} -.y3ec{bottom:439.825000px;} -.ybc2{bottom:439.871000px;} -.y5d0{bottom:439.899000px;} -.yf8c{bottom:439.940000px;} -.y69a{bottom:440.022000px;} -.y745{bottom:440.126000px;} -.y155b{bottom:440.184000px;} -.yf00{bottom:440.334000px;} -.y103e{bottom:440.543000px;} -.y1ff{bottom:440.781000px;} +.y65f{bottom:438.161000px;} +.y11aa{bottom:438.230000px;} +.y12d1{bottom:438.496000px;} +.y1055{bottom:438.618000px;} +.yb46{bottom:438.771000px;} +.ydee{bottom:438.833000px;} +.yecc{bottom:438.857000px;} +.y1147{bottom:439.130000px;} +.yca1{bottom:439.159000px;} +.ybc6{bottom:439.161000px;} +.y12b1{bottom:439.247000px;} +.yc07{bottom:439.287000px;} +.y6e3{bottom:439.393000px;} +.y1104{bottom:439.449000px;} +.y13e0{bottom:439.739000px;} +.y3e2{bottom:439.825000px;} +.yb8e{bottom:439.871000px;} +.y5be{bottom:439.899000px;} +.yf49{bottom:439.940000px;} +.y684{bottom:440.022000px;} +.ya6{bottom:440.126000px;} +.y14fe{bottom:440.184000px;} +.yebf{bottom:440.334000px;} +.yff6{bottom:440.543000px;} +.y1f9{bottom:440.781000px;} .ya{bottom:440.796000px;} -.yb06{bottom:440.943000px;} -.y117d{bottom:441.012000px;} -.y3eb{bottom:441.319000px;} -.y110a{bottom:441.442000px;} -.y12d4{bottom:441.585000px;} +.yad7{bottom:440.943000px;} +.y1131{bottom:441.012000px;} +.y3e1{bottom:441.319000px;} +.y10c0{bottom:441.442000px;} +.y1283{bottom:441.585000px;} .y6a{bottom:441.620000px;} -.y1537{bottom:441.669000px;} -.yd1e{bottom:441.762000px;} -.ya0{bottom:442.119000px;} -.y109f{bottom:442.234000px;} -.y1fe{bottom:442.276000px;} -.yfb7{bottom:442.290000px;} -.y10c1{bottom:442.327000px;} -.yd9d{bottom:442.396000px;} -.y8fb{bottom:442.465000px;} -.y7b7{bottom:442.555000px;} -.y768{bottom:442.623000px;} -.ya37{bottom:442.717000px;} -.y1227{bottom:442.913000px;} -.y11b{bottom:443.167000px;} -.y13a3{bottom:443.212000px;} -.y727{bottom:443.434000px;} -.yd78{bottom:443.713000px;} -.y746{bottom:443.742000px;} -.ycb{bottom:443.838000px;} -.y363{bottom:443.967000px;} -.yf34{bottom:444.101000px;} -.y1168{bottom:444.111000px;} -.y99c{bottom:444.120000px;} -.yeb6{bottom:444.319000px;} -.y13e9{bottom:444.442000px;} -.y521{bottom:444.559000px;} -.y105a{bottom:444.584000px;} +.y14da{bottom:441.669000px;} +.yce5{bottom:441.762000px;} +.y1056{bottom:442.234000px;} +.y1f8{bottom:442.276000px;} +.yf74{bottom:442.290000px;} +.y1078{bottom:442.327000px;} +.yd63{bottom:442.396000px;} +.y8d6{bottom:442.465000px;} +.y79b{bottom:442.555000px;} +.y74e{bottom:442.623000px;} +.ya0c{bottom:442.717000px;} +.y11d8{bottom:442.913000px;} +.y11c{bottom:443.167000px;} +.y134c{bottom:443.212000px;} +.ycb{bottom:443.361000px;} +.y70f{bottom:443.434000px;} +.yd3e{bottom:443.713000px;} +.y72c{bottom:443.742000px;} +.y35b{bottom:443.967000px;} +.yef2{bottom:444.101000px;} +.y111c{bottom:444.111000px;} +.y974{bottom:444.120000px;} +.ye77{bottom:444.319000px;} +.y1390{bottom:444.442000px;} +.y511{bottom:444.559000px;} +.y1012{bottom:444.584000px;} .y1b{bottom:444.800000px;} -.ya13{bottom:444.819000px;} -.yf3{bottom:445.108000px;} -.y15bf{bottom:445.162000px;} -.y49d{bottom:445.207000px;} -.yba0{bottom:445.256000px;} -.y15c0{bottom:445.311000px;} -.yba2{bottom:445.355000px;} -.y1a5{bottom:445.405000px;} +.y9e9{bottom:444.819000px;} +.yf6{bottom:445.108000px;} +.y1561{bottom:445.162000px;} +.y48f{bottom:445.207000px;} +.yb6d{bottom:445.256000px;} +.y1562{bottom:445.311000px;} +.yb6f{bottom:445.355000px;} +.y1a2{bottom:445.405000px;} .y3b{bottom:445.606000px;} -.y101d{bottom:445.966000px;} -.y2e7{bottom:446.082000px;} -.y8b8{bottom:446.236000px;} -.yee1{bottom:446.284000px;} -.yd47{bottom:446.365000px;} -.y9e9{bottom:446.513000px;} -.yada{bottom:446.678000px;} -.ya5e{bottom:446.785000px;} -.y13bc{bottom:446.868000px;} -.y54e{bottom:446.928000px;} -.y86d{bottom:447.004000px;} -.ycfb{bottom:447.036000px;} -.y14a2{bottom:447.128000px;} -.yf0d{bottom:447.197000px;} -.y134c{bottom:447.217000px;} -.ycd8{bottom:447.499000px;} -.yb52{bottom:447.558000px;} -.y2e6{bottom:447.576000px;} -.y126a{bottom:447.623000px;} -.y3a0{bottom:447.647000px;} -.ydb2{bottom:447.668000px;} -.y23b{bottom:447.877000px;} -.y1c1{bottom:448.027000px;} +.yfd6{bottom:445.966000px;} +.y2e0{bottom:446.082000px;} +.y895{bottom:446.236000px;} +.yea1{bottom:446.284000px;} +.yd0e{bottom:446.365000px;} +.y9bf{bottom:446.513000px;} +.yaac{bottom:446.678000px;} +.ya32{bottom:446.785000px;} +.y1364{bottom:446.868000px;} +.y53d{bottom:446.928000px;} +.y84b{bottom:447.004000px;} +.ycc2{bottom:447.036000px;} +.y1447{bottom:447.128000px;} +.yecb{bottom:447.197000px;} +.y12f7{bottom:447.217000px;} +.yc9f{bottom:447.499000px;} +.yb21{bottom:447.558000px;} +.y2df{bottom:447.576000px;} +.y121a{bottom:447.623000px;} +.y397{bottom:447.647000px;} +.yd77{bottom:447.668000px;} +.y235{bottom:447.877000px;} +.y1bc{bottom:448.027000px;} .y29{bottom:448.096000px;} -.y155a{bottom:448.154000px;} -.y4ef{bottom:448.196000px;} -.ydda{bottom:448.435000px;} -.yff8{bottom:448.581000px;} -.ye50{bottom:448.624000px;} -.yab1{bottom:448.711000px;} -.y1512{bottom:448.740000px;} -.y14ef{bottom:448.894000px;} -.y10e2{bottom:448.962000px;} -.y288{bottom:448.993000px;} -.y11c5{bottom:449.212000px;} -.yf63{bottom:449.274000px;} -.y815{bottom:449.411000px;} -.y790{bottom:449.459000px;} -.y1075{bottom:449.649000px;} -.y4ee{bottom:449.690000px;} -.y9c7{bottom:449.753000px;} +.y14fd{bottom:448.154000px;} +.y4e0{bottom:448.196000px;} +.yd9e{bottom:448.435000px;} +.yfb2{bottom:448.581000px;} +.ye12{bottom:448.624000px;} +.ya84{bottom:448.711000px;} +.y14b6{bottom:448.740000px;} +.y1493{bottom:448.894000px;} +.y1098{bottom:448.962000px;} +.y282{bottom:448.993000px;} +.y1177{bottom:449.212000px;} +.yf21{bottom:449.274000px;} +.y7f6{bottom:449.411000px;} +.y775{bottom:449.459000px;} +.y102d{bottom:449.649000px;} +.y4df{bottom:449.690000px;} +.y99e{bottom:449.753000px;} .y93{bottom:450.089000px;} -.y673{bottom:450.117000px;} -.y11f8{bottom:450.186000px;} -.y1324{bottom:450.451000px;} -.y287{bottom:450.488000px;} -.y109c{bottom:450.574000px;} -.yb77{bottom:450.726000px;} -.y1554{bottom:450.749000px;} -.ye2a{bottom:450.788000px;} -.y1193{bottom:451.085000px;} -.ybf9{bottom:451.116000px;} -.yc7c{bottom:451.242000px;} -.y6f9{bottom:451.348000px;} -.y114e{bottom:451.404000px;} -.y1438{bottom:451.694000px;} -.ybc1{bottom:451.826000px;} -.y5cf{bottom:451.854000px;} -.yf8b{bottom:451.895000px;} -.y699{bottom:451.977000px;} -.ya6{bottom:452.081000px;} -.y3ea{bottom:452.178000px;} -.yeff{bottom:452.289000px;} -.y8d6{bottom:452.331000px;} -.y103d{bottom:452.499000px;} -.yb05{bottom:452.898000px;} -.y140c{bottom:452.928000px;} -.y117c{bottom:452.967000px;} -.ye76{bottom:453.203000px;} -.y1109{bottom:453.397000px;} -.y12d3{bottom:453.540000px;} +.y65e{bottom:450.117000px;} +.y11a9{bottom:450.186000px;} +.y12d0{bottom:450.451000px;} +.y281{bottom:450.488000px;} +.y1053{bottom:450.574000px;} +.yb45{bottom:450.726000px;} +.y14f7{bottom:450.749000px;} +.yded{bottom:450.788000px;} +.y1146{bottom:451.085000px;} +.ybc5{bottom:451.116000px;} +.yc44{bottom:451.242000px;} +.y6e2{bottom:451.348000px;} +.y1103{bottom:451.404000px;} +.y13df{bottom:451.694000px;} +.yb8d{bottom:451.826000px;} +.y5bd{bottom:451.854000px;} +.yf48{bottom:451.895000px;} +.y683{bottom:451.977000px;} +.ya5{bottom:452.081000px;} +.y3e0{bottom:452.178000px;} +.yebe{bottom:452.289000px;} +.y8b2{bottom:452.331000px;} +.yff5{bottom:452.499000px;} +.yad6{bottom:452.898000px;} +.y13b3{bottom:452.928000px;} +.y1130{bottom:452.967000px;} +.ye37{bottom:453.203000px;} +.y10bf{bottom:453.397000px;} +.y1282{bottom:453.540000px;} .y69{bottom:453.576000px;} -.y1536{bottom:453.624000px;} -.y3e9{bottom:453.673000px;} -.y15bd{bottom:453.680000px;} -.yd1d{bottom:453.717000px;} -.ye97{bottom:453.747000px;} -.y15be{bottom:453.829000px;} -.y109d{bottom:454.189000px;} -.yfb6{bottom:454.245000px;} -.y10c0{bottom:454.282000px;} -.yd9c{bottom:454.352000px;} -.yb28{bottom:454.411000px;} -.y8fa{bottom:454.420000px;} -.y6d1{bottom:454.493000px;} -.y1139{bottom:454.724000px;} -.y1226{bottom:454.868000px;} -.y11a{bottom:455.122000px;} -.y13a1{bottom:455.167000px;} -.y59d{bottom:455.307000px;} -.y726{bottom:455.389000px;} -.yca{bottom:455.793000px;} -.yfd4{bottom:456.066000px;} -.yeb5{bottom:456.274000px;} -.y13e8{bottom:456.397000px;} +.y14d9{bottom:453.624000px;} +.y3df{bottom:453.673000px;} +.y155f{bottom:453.680000px;} +.yce4{bottom:453.717000px;} +.ye58{bottom:453.747000px;} +.y1560{bottom:453.829000px;} +.y1054{bottom:454.189000px;} +.yf73{bottom:454.245000px;} +.y1077{bottom:454.282000px;} +.yd62{bottom:454.352000px;} +.yaf8{bottom:454.411000px;} +.y8d5{bottom:454.420000px;} +.y6ba{bottom:454.493000px;} +.y10ef{bottom:454.724000px;} +.y11d7{bottom:454.868000px;} +.y11b{bottom:455.122000px;} +.y134a{bottom:455.167000px;} +.y58b{bottom:455.307000px;} +.y70e{bottom:455.389000px;} +.yea{bottom:456.066000px;} +.ye76{bottom:456.274000px;} +.y138f{bottom:456.397000px;} .y1a{bottom:456.755000px;} -.yc5e{bottom:456.770000px;} -.ya12{bottom:456.774000px;} -.y2e5{bottom:457.058000px;} -.yf2{bottom:457.063000px;} -.y49c{bottom:457.162000px;} -.yba1{bottom:457.311000px;} -.y1559{bottom:457.502391px;} +.yc27{bottom:456.770000px;} +.y9e8{bottom:456.774000px;} +.y2de{bottom:457.058000px;} +.yf5{bottom:457.063000px;} +.y48e{bottom:457.162000px;} +.yb6e{bottom:457.311000px;} +.y14fc{bottom:457.502391px;} .y3a{bottom:457.561000px;} -.y14cc{bottom:457.722000px;} -.y846{bottom:457.744000px;} -.ya81{bottom:457.791000px;} -.y101c{bottom:457.921000px;} -.y154{bottom:458.059000px;} -.yee0{bottom:458.239000px;} -.y1474{bottom:458.260000px;} -.yd46{bottom:458.320000px;} -.y9e8{bottom:458.468000px;} -.y13a2{bottom:458.782000px;} -.y1374{bottom:458.823000px;} -.y54d{bottom:458.883000px;} -.y59e{bottom:458.923000px;} -.y86c{bottom:458.959000px;} -.ycfa{bottom:458.991000px;} -.y14a1{bottom:459.083000px;} -.ya5d{bottom:459.138000px;} -.yf0c{bottom:459.152000px;} -.y134b{bottom:459.172000px;} -.ycd7{bottom:459.454000px;} -.y2e3{bottom:459.531000px;} -.y82e{bottom:459.551000px;} -.y1269{bottom:459.579000px;} -.y39f{bottom:459.602000px;} -.y23a{bottom:459.832000px;} +.y1471{bottom:457.722000px;} +.y825{bottom:457.744000px;} +.ya54{bottom:457.791000px;} +.yfd5{bottom:457.921000px;} +.y152{bottom:458.059000px;} +.yea0{bottom:458.239000px;} +.y141a{bottom:458.260000px;} +.yd0d{bottom:458.320000px;} +.y9be{bottom:458.468000px;} +.y134b{bottom:458.782000px;} +.y131e{bottom:458.823000px;} +.y53c{bottom:458.883000px;} +.y58c{bottom:458.923000px;} +.y84a{bottom:458.959000px;} +.ycc1{bottom:458.991000px;} +.y1446{bottom:459.083000px;} +.ya31{bottom:459.138000px;} +.yeca{bottom:459.152000px;} +.y12f6{bottom:459.172000px;} +.yc9e{bottom:459.454000px;} +.y2dc{bottom:459.531000px;} +.y80d{bottom:459.551000px;} +.y1219{bottom:459.579000px;} +.y396{bottom:459.602000px;} +.y234{bottom:459.832000px;} .y28{bottom:460.051000px;} -.yff6{bottom:460.536000px;} -.ye4f{bottom:460.579000px;} -.yab0{bottom:460.666000px;} -.y1511{bottom:460.695000px;} -.y10e1{bottom:460.917000px;} -.y11c4{bottom:461.167000px;} -.y14ee{bottom:461.247000px;} -.y286{bottom:461.347000px;} -.y814{bottom:461.366000px;} -.y1fd{bottom:461.506000px;} -.y1074{bottom:461.604000px;} -.y4ed{bottom:461.646000px;} -.y824{bottom:462.000000px;} +.yfb0{bottom:460.536000px;} +.ye11{bottom:460.579000px;} +.ya83{bottom:460.666000px;} +.y14b5{bottom:460.695000px;} +.y1097{bottom:460.917000px;} +.y1176{bottom:461.167000px;} +.y1492{bottom:461.247000px;} +.y280{bottom:461.347000px;} +.y7f5{bottom:461.366000px;} +.y1f7{bottom:461.506000px;} +.y102c{bottom:461.604000px;} +.y4de{bottom:461.646000px;} .y92{bottom:462.044000px;} -.y672{bottom:462.072000px;} -.y11f7{bottom:462.141000px;} -.y15bb{bottom:462.198000px;} -.y893{bottom:462.318000px;} -.y15bc{bottom:462.348000px;} -.y1323{bottom:462.407000px;} -.y109b{bottom:462.529000px;} -.yb76{bottom:462.681000px;} -.y1553{bottom:462.704000px;} -.ye29{bottom:462.743000px;} -.y285{bottom:462.841000px;} -.yf52{bottom:462.923000px;} -.y96f{bottom:462.930000px;} -.ya35{bottom:463.040000px;} -.ybf8{bottom:463.071000px;} -.y2e4{bottom:463.147000px;} -.yc7b{bottom:463.197000px;} -.y6f8{bottom:463.303000px;} -.yca8{bottom:463.419000px;} -.y1437{bottom:463.649000px;} -.y174{bottom:463.737000px;} -.ybc0{bottom:463.781000px;} -.y5ce{bottom:463.809000px;} -.yf8a{bottom:463.850000px;} -.y698{bottom:463.932000px;} -.y1059{bottom:463.986000px;} -.ya5{bottom:464.037000px;} -.yff7{bottom:464.152000px;} -.ye04{bottom:464.238000px;} -.yefe{bottom:464.245000px;} -.y103c{bottom:464.454000px;} -.y3e8{bottom:464.532000px;} -.y1303{bottom:464.806000px;} -.y140b{bottom:464.883000px;} -.y117b{bottom:464.922000px;} -.ye75{bottom:465.158000px;} -.y1108{bottom:465.352000px;} -.y1558{bottom:465.425368px;} -.y12d2{bottom:465.495000px;} +.y65d{bottom:462.072000px;} +.y11a8{bottom:462.141000px;} +.y155d{bottom:462.198000px;} +.y871{bottom:462.318000px;} +.y155e{bottom:462.348000px;} +.y12cf{bottom:462.407000px;} +.y1052{bottom:462.529000px;} +.yb44{bottom:462.681000px;} +.y14f6{bottom:462.704000px;} +.ydec{bottom:462.743000px;} +.y27f{bottom:462.841000px;} +.yf10{bottom:462.923000px;} +.y948{bottom:462.930000px;} +.ya0a{bottom:463.040000px;} +.ybc4{bottom:463.071000px;} +.y2dd{bottom:463.147000px;} +.yc43{bottom:463.197000px;} +.y6e1{bottom:463.303000px;} +.yc70{bottom:463.419000px;} +.y13de{bottom:463.649000px;} +.y171{bottom:463.737000px;} +.yb8c{bottom:463.781000px;} +.y5bc{bottom:463.809000px;} +.yf47{bottom:463.850000px;} +.y682{bottom:463.932000px;} +.y1011{bottom:463.986000px;} +.yfb1{bottom:464.152000px;} +.ydc8{bottom:464.238000px;} +.yebd{bottom:464.245000px;} +.yff4{bottom:464.454000px;} +.y3de{bottom:464.532000px;} +.y12b0{bottom:464.806000px;} +.y13b2{bottom:464.883000px;} +.y112f{bottom:464.922000px;} +.ye36{bottom:465.158000px;} +.y10be{bottom:465.352000px;} +.y14fb{bottom:465.425368px;} +.y1281{bottom:465.495000px;} .y68{bottom:465.531000px;} -.y1535{bottom:465.579000px;} -.yd1c{bottom:465.672000px;} -.ye96{bottom:465.702000px;} -.y3e7{bottom:466.026000px;} -.ydb1{bottom:466.057000px;} -.ye9{bottom:466.199000px;} -.yfb5{bottom:466.200000px;} -.y10bf{bottom:466.237000px;} -.yd9b{bottom:466.307000px;} -.y8f9{bottom:466.376000px;} -.y767{bottom:466.533000px;} -.yad9{bottom:466.603000px;} -.ya36{bottom:466.656000px;} -.y1138{bottom:466.679000px;} -.yc3c{bottom:466.784000px;} -.y1225{bottom:466.823000px;} -.y119{bottom:467.077000px;} -.y13a0{bottom:467.122000px;} -.y725{bottom:467.344000px;} -.yfd3{bottom:468.022000px;} -.y8b7{bottom:468.057000px;} -.yeb4{bottom:468.230000px;} -.y13e7{bottom:468.352000px;} -.yf33{bottom:468.708000px;} -.y462{bottom:468.719000px;} -.ya11{bottom:468.729000px;} -.y2e2{bottom:469.014000px;} -.yf1{bottom:469.018000px;} -.yd77{bottom:469.273000px;} +.y14d8{bottom:465.579000px;} +.yce3{bottom:465.672000px;} +.ye57{bottom:465.702000px;} +.y3dd{bottom:466.026000px;} +.yd76{bottom:466.057000px;} +.yec{bottom:466.199000px;} +.yf72{bottom:466.200000px;} +.y1076{bottom:466.237000px;} +.yd61{bottom:466.307000px;} +.y8d4{bottom:466.376000px;} +.y74d{bottom:466.533000px;} +.yaab{bottom:466.603000px;} +.ya0b{bottom:466.656000px;} +.y10ee{bottom:466.679000px;} +.yc06{bottom:466.784000px;} +.y11d6{bottom:466.823000px;} +.y11a{bottom:467.077000px;} +.y1349{bottom:467.122000px;} +.y70d{bottom:467.344000px;} +.yf8f{bottom:468.022000px;} +.y894{bottom:468.057000px;} +.ye75{bottom:468.230000px;} +.yca{bottom:468.313000px;} +.y138e{bottom:468.352000px;} +.yef1{bottom:468.708000px;} +.y456{bottom:468.719000px;} +.y9e7{bottom:468.729000px;} +.y2db{bottom:469.014000px;} +.yf4{bottom:469.018000px;} +.yd3d{bottom:469.273000px;} .y39{bottom:469.516000px;} -.yb9f{bottom:469.664000px;} -.y14cb{bottom:469.677000px;} -.y845{bottom:469.700000px;} -.y361{bottom:469.939000px;} -.y153{bottom:470.014000px;} -.y78f{bottom:470.040000px;} -.yd44{bottom:470.276000px;} -.y15b9{bottom:470.716000px;} -.y1373{bottom:470.778000px;} -.y15ba{bottom:470.866000px;} -.y86b{bottom:470.914000px;} -.ycf8{bottom:470.946000px;} -.yf0b{bottom:471.107000px;} -.y134a{bottom:471.127000px;} -.y360{bottom:471.162000px;} -.ycd6{bottom:471.409000px;} -.y35e{bottom:471.433000px;} -.y2e0{bottom:471.486000px;} -.ya5c{bottom:471.492000px;} -.y82d{bottom:471.506000px;} -.y39e{bottom:471.557000px;} -.y239{bottom:471.787000px;} -.y421{bottom:471.877000px;} +.yb6c{bottom:469.664000px;} +.y1470{bottom:469.677000px;} +.y824{bottom:469.700000px;} +.y359{bottom:469.939000px;} +.y151{bottom:470.014000px;} +.y774{bottom:470.040000px;} +.yd0b{bottom:470.276000px;} +.y155b{bottom:470.716000px;} +.y131d{bottom:470.778000px;} +.y155c{bottom:470.866000px;} +.y849{bottom:470.914000px;} +.ycbf{bottom:470.946000px;} +.yec9{bottom:471.107000px;} +.y12f5{bottom:471.127000px;} +.y358{bottom:471.162000px;} +.yc9d{bottom:471.409000px;} +.y356{bottom:471.433000px;} +.y2d9{bottom:471.486000px;} +.ya30{bottom:471.492000px;} +.y80c{bottom:471.506000px;} +.y395{bottom:471.557000px;} +.y233{bottom:471.787000px;} +.y416{bottom:471.877000px;} .y27{bottom:472.007000px;} -.y35f{bottom:472.158000px;} -.y35d{bottom:472.429000px;} -.yff5{bottom:472.491000px;} -.ye4e{bottom:472.534000px;} -.y1510{bottom:472.651000px;} -.y6b8{bottom:472.825000px;} -.y10e0{bottom:472.872000px;} -.y59c{bottom:473.082000px;} -.y813{bottom:473.322000px;} -.y114c{bottom:473.500000px;} -.y7b6{bottom:473.550000px;} -.y14ed{bottom:473.601000px;} -.y284{bottom:473.701000px;} -.y520{bottom:473.844000px;} -.yd45{bottom:473.891000px;} +.y357{bottom:472.158000px;} +.y355{bottom:472.429000px;} +.yfaf{bottom:472.491000px;} +.ye10{bottom:472.534000px;} +.y14b4{bottom:472.651000px;} +.y6a1{bottom:472.825000px;} +.y1096{bottom:472.872000px;} +.y58a{bottom:473.082000px;} +.y7f4{bottom:473.322000px;} +.y79a{bottom:473.550000px;} +.y1491{bottom:473.601000px;} +.y27e{bottom:473.701000px;} +.y510{bottom:473.844000px;} +.yd0c{bottom:473.891000px;} .y91{bottom:473.999000px;} -.y11f5{bottom:474.096000px;} -.y892{bottom:474.273000px;} -.y1322{bottom:474.362000px;} -.y109a{bottom:474.484000px;} -.ycf9{bottom:474.561000px;} -.y59b{bottom:474.576000px;} -.yb74{bottom:474.637000px;} -.ye28{bottom:474.698000px;} -.y96e{bottom:474.885000px;} -.ya34{bottom:474.995000px;} -.ybf7{bottom:475.026000px;} -.y2e1{bottom:475.102000px;} -.yc7a{bottom:475.152000px;} -.y283{bottom:475.195000px;} -.y9c6{bottom:475.227000px;} -.y6f7{bottom:475.259000px;} -.yca7{bottom:475.374000px;} -.ybbf{bottom:475.736000px;} -.y5cd{bottom:475.764000px;} -.yf89{bottom:475.805000px;} -.y697{bottom:475.887000px;} -.y1058{bottom:475.941000px;} -.y1557{bottom:476.120890px;} -.ye03{bottom:476.193000px;} -.yefd{bottom:476.200000px;} -.yb51{bottom:476.560000px;} -.y1436{bottom:476.601000px;} -.yc5d{bottom:476.695000px;} -.y9e7{bottom:476.857000px;} -.y114d{bottom:476.877000px;} -.y3e6{bottom:476.886000px;} -.ye74{bottom:477.114000px;} -.y54c{bottom:477.272000px;} -.y12d1{bottom:477.451000px;} +.y11a6{bottom:474.096000px;} +.y870{bottom:474.273000px;} +.y12ce{bottom:474.362000px;} +.y1051{bottom:474.484000px;} +.ycc0{bottom:474.561000px;} +.y589{bottom:474.576000px;} +.yb42{bottom:474.637000px;} +.ydeb{bottom:474.698000px;} +.y947{bottom:474.885000px;} +.ya09{bottom:474.995000px;} +.ybc3{bottom:475.026000px;} +.y2da{bottom:475.102000px;} +.yc42{bottom:475.152000px;} +.y27d{bottom:475.195000px;} +.y99d{bottom:475.227000px;} +.y6e0{bottom:475.259000px;} +.yc6f{bottom:475.374000px;} +.yb8b{bottom:475.736000px;} +.y5bb{bottom:475.764000px;} +.yf46{bottom:475.805000px;} +.y681{bottom:475.887000px;} +.y1010{bottom:475.941000px;} +.ye9{bottom:475.992000px;} +.y14fa{bottom:476.120890px;} +.ydc7{bottom:476.193000px;} +.yebc{bottom:476.200000px;} +.yb20{bottom:476.560000px;} +.y13dd{bottom:476.601000px;} +.yc26{bottom:476.695000px;} +.y9bd{bottom:476.857000px;} +.y1102{bottom:476.877000px;} +.y3dc{bottom:476.886000px;} +.ye35{bottom:477.114000px;} +.y53b{bottom:477.272000px;} +.y1280{bottom:477.451000px;} .y67{bottom:477.486000px;} -.y49b{bottom:477.586000px;} -.yd1b{bottom:477.627000px;} -.ye95{bottom:477.657000px;} -.y11f6{bottom:477.711000px;} -.y1242{bottom:477.910000px;} -.yfb4{bottom:478.156000px;} -.y10be{bottom:478.192000px;} -.yb75{bottom:478.252000px;} -.yd9a{bottom:478.262000px;} -.y8f8{bottom:478.331000px;} -.y3e5{bottom:478.380000px;} -.y766{bottom:478.488000px;} -.y1137{bottom:478.634000px;} -.yc3b{bottom:478.739000px;} -.y1224{bottom:478.779000px;} -.y14a0{bottom:479.008000px;} -.y118{bottom:479.033000px;} -.y139e{bottom:479.077000px;} -.y49a{bottom:479.080000px;} -.yc27{bottom:479.138000px;} -.y15b7{bottom:479.234000px;} -.y724{bottom:479.299000px;} -.y15b8{bottom:479.384000px;} -.yfd2{bottom:479.977000px;} -.y1fc{bottom:480.041000px;} -.ydd9{bottom:480.260000px;} -.yc9{bottom:480.659000px;} -.yf32{bottom:480.663000px;} -.y461{bottom:480.674000px;} -.ya10{bottom:480.685000px;} -.y2df{bottom:480.969000px;} -.yf0{bottom:480.973000px;} +.y48d{bottom:477.586000px;} +.yce2{bottom:477.627000px;} +.ye56{bottom:477.657000px;} +.y11a7{bottom:477.711000px;} +.y11f2{bottom:477.910000px;} +.ya4{bottom:477.984000px;} +.yf71{bottom:478.156000px;} +.y1075{bottom:478.192000px;} +.yb43{bottom:478.252000px;} +.yd60{bottom:478.262000px;} +.y8d3{bottom:478.331000px;} +.y3db{bottom:478.380000px;} +.y74c{bottom:478.488000px;} +.y10ed{bottom:478.634000px;} +.yc05{bottom:478.739000px;} +.y11d5{bottom:478.779000px;} +.y1445{bottom:479.008000px;} +.y119{bottom:479.033000px;} +.y1347{bottom:479.077000px;} +.y48c{bottom:479.080000px;} +.ybf2{bottom:479.138000px;} +.y1559{bottom:479.234000px;} +.y70c{bottom:479.299000px;} +.y155a{bottom:479.384000px;} +.yf8e{bottom:479.977000px;} +.y1f6{bottom:480.041000px;} +.yd9d{bottom:480.260000px;} +.yc9{bottom:480.268000px;} +.yef0{bottom:480.663000px;} +.y455{bottom:480.674000px;} +.y9e6{bottom:480.685000px;} +.y2d8{bottom:480.969000px;} +.yf3{bottom:480.973000px;} .y38{bottom:481.471000px;} -.y32b{bottom:481.500000px;} -.yb9c{bottom:481.520000px;} -.y35c{bottom:481.573000px;} -.yb9e{bottom:481.619000px;} -.y14ca{bottom:481.632000px;} -.y844{bottom:481.655000px;} -.yb03{bottom:481.901000px;} -.y152{bottom:481.969000px;} -.y78e{bottom:481.995000px;} -.yd43{bottom:482.231000px;} -.y1552{bottom:482.629000px;} -.y139f{bottom:482.693000px;} -.y1372{bottom:482.733000px;} -.y86a{bottom:482.869000px;} -.ycf7{bottom:482.901000px;} -.yf0a{bottom:483.062000px;} -.y1349{bottom:483.082000px;} -.y12ee{bottom:483.138000px;} -.ycd5{bottom:483.364000px;} -.y2dd{bottom:483.442000px;} -.y82c{bottom:483.461000px;} -.y39d{bottom:483.512000px;} -.y238{bottom:483.743000px;} -.y420{bottom:483.832000px;} -.y671{bottom:483.893000px;} +.yb69{bottom:481.520000px;} +.y354{bottom:481.573000px;} +.yb6b{bottom:481.619000px;} +.y146f{bottom:481.632000px;} +.y823{bottom:481.655000px;} +.yad4{bottom:481.901000px;} +.y150{bottom:481.969000px;} +.y773{bottom:481.995000px;} +.yd0a{bottom:482.231000px;} +.y14f5{bottom:482.629000px;} +.y1348{bottom:482.693000px;} +.y131c{bottom:482.733000px;} +.y848{bottom:482.869000px;} +.ycbe{bottom:482.901000px;} +.yec8{bottom:483.062000px;} +.y12f4{bottom:483.082000px;} +.y129b{bottom:483.138000px;} +.yc9c{bottom:483.364000px;} +.y2d6{bottom:483.442000px;} +.y80b{bottom:483.461000px;} +.y394{bottom:483.512000px;} +.y232{bottom:483.743000px;} +.y415{bottom:483.832000px;} +.y65c{bottom:483.893000px;} .y26{bottom:483.962000px;} -.y1534{bottom:483.969000px;} -.y1556{bottom:484.043867px;} -.y362{bottom:484.263000px;} -.yff4{bottom:484.447000px;} -.ye4d{bottom:484.490000px;} -.y150f{bottom:484.606000px;} -.y99b{bottom:484.642000px;} -.y140a{bottom:484.809000px;} -.y10df{bottom:484.827000px;} -.y812{bottom:485.277000px;} -.y7b5{bottom:485.505000px;} -.yb04{bottom:485.516000px;} -.y35b{bottom:485.757000px;} -.y51f{bottom:485.799000px;} +.y14d7{bottom:483.969000px;} +.y14f9{bottom:484.043867px;} +.y35a{bottom:484.263000px;} +.yfae{bottom:484.447000px;} +.ye0f{bottom:484.490000px;} +.y14b3{bottom:484.606000px;} +.y973{bottom:484.642000px;} +.y13b1{bottom:484.809000px;} +.y1095{bottom:484.827000px;} +.y7f3{bottom:485.277000px;} +.y799{bottom:485.505000px;} +.yad5{bottom:485.516000px;} +.y353{bottom:485.757000px;} +.y50f{bottom:485.799000px;} .y90{bottom:485.954000px;} -.y14ec{bottom:485.955000px;} -.y11f4{bottom:486.051000px;} -.y282{bottom:486.054000px;} -.ya5b{bottom:486.237000px;} -.y1098{bottom:486.439000px;} -.yad8{bottom:486.529000px;} -.yb73{bottom:486.592000px;} -.ye27{bottom:486.654000px;} -.yaaf{bottom:486.683000px;} -.y96d{bottom:486.840000px;} -.ya33{bottom:486.951000px;} -.ybf6{bottom:486.982000px;} -.y2de{bottom:487.057000px;} -.yc79{bottom:487.108000px;} -.y9c5{bottom:487.182000px;} -.y6f6{bottom:487.214000px;} -.yb27{bottom:487.239000px;} -.y281{bottom:487.549000px;} -.y15b5{bottom:487.752000px;} -.yf88{bottom:487.761000px;} -.y696{bottom:487.843000px;} -.y15b6{bottom:487.902000px;} -.ye7{bottom:487.947000px;} -.ye02{bottom:488.148000px;} -.yefc{bottom:488.155000px;} -.yb50{bottom:488.515000px;} -.y1435{bottom:488.556000px;} -.yc5c{bottom:488.651000px;} -.y8d5{bottom:488.832000px;} -.y1454{bottom:488.833000px;} -.y101b{bottom:488.916000px;} -.ye73{bottom:489.069000px;} -.y12d0{bottom:489.406000px;} +.y1490{bottom:485.955000px;} +.y11a5{bottom:486.051000px;} +.y27c{bottom:486.054000px;} +.ya2f{bottom:486.237000px;} +.y104f{bottom:486.439000px;} +.yaaa{bottom:486.529000px;} +.yb41{bottom:486.592000px;} +.ydea{bottom:486.654000px;} +.ya82{bottom:486.683000px;} +.y946{bottom:486.840000px;} +.ya08{bottom:486.951000px;} +.ybc2{bottom:486.982000px;} +.y2d7{bottom:487.057000px;} +.yc41{bottom:487.108000px;} +.y99c{bottom:487.182000px;} +.y6df{bottom:487.214000px;} +.yaf7{bottom:487.239000px;} +.y27b{bottom:487.549000px;} +.y1557{bottom:487.752000px;} +.yf45{bottom:487.761000px;} +.y680{bottom:487.843000px;} +.y1558{bottom:487.902000px;} +.y9f{bottom:487.947000px;} +.ydc6{bottom:488.148000px;} +.yebb{bottom:488.155000px;} +.yb1f{bottom:488.515000px;} +.y13dc{bottom:488.556000px;} +.yc25{bottom:488.651000px;} +.y8b1{bottom:488.832000px;} +.y13fb{bottom:488.833000px;} +.yfd4{bottom:488.916000px;} +.ye34{bottom:489.069000px;} +.y127f{bottom:489.406000px;} .y66{bottom:489.441000px;} -.y499{bottom:489.541000px;} -.yd1a{bottom:489.582000px;} -.yc26{bottom:489.598000px;} -.y1107{bottom:489.829000px;} -.ydb0{bottom:489.870000px;} -.y1473{bottom:489.926000px;} -.ya4{bottom:489.939000px;} -.y1099{bottom:490.055000px;} -.yfb3{bottom:490.111000px;} -.y10bd{bottom:490.147000px;} -.yd99{bottom:490.217000px;} -.y13e6{bottom:490.270000px;} -.y765{bottom:490.443000px;} -.y1136{bottom:490.589000px;} -.y3e4{bottom:490.734000px;} -.y149f{bottom:490.963000px;} -.y139d{bottom:491.033000px;} -.y498{bottom:491.035000px;} -.yc25{bottom:491.093000px;} -.y723{bottom:491.254000px;} -.yd76{bottom:491.589000px;} -.y1321{bottom:491.642000px;} -.yfd1{bottom:491.932000px;} -.y1fb{bottom:491.997000px;} -.ydd8{bottom:492.216000px;} -.y59a{bottom:492.350000px;} -.y1555{bottom:492.363490px;} -.yc8{bottom:492.614000px;} -.yf31{bottom:492.618000px;} -.y460{bottom:492.629000px;} -.ya0f{bottom:492.640000px;} -.y2dc{bottom:492.924000px;} -.yef{bottom:492.928000px;} -.y103b{bottom:493.072000px;} -.y1073{bottom:493.429000px;} -.yb9d{bottom:493.575000px;} -.y14c9{bottom:493.587000px;} -.y843{bottom:493.610000px;} -.yedf{bottom:493.620000px;} -.y599{bottom:493.845000px;} -.yb02{bottom:493.856000px;} -.y151{bottom:493.924000px;} -.y78d{bottom:493.950000px;} -.yd42{bottom:494.186000px;} -.y1057{bottom:494.330000px;} -.y1551{bottom:494.584000px;} -.y11c3{bottom:494.641000px;} -.y1371{bottom:494.688000px;} -.y869{bottom:494.824000px;} -.ycf6{bottom:494.856000px;} -.yf09{bottom:495.018000px;} -.y1348{bottom:495.038000px;} -.y4ec{bottom:495.120000px;} -.ycd4{bottom:495.319000px;} -.y2da{bottom:495.397000px;} -.y82b{bottom:495.416000px;} -.y39c{bottom:495.467000px;} -.y237{bottom:495.698000px;} +.y48b{bottom:489.541000px;} +.yce1{bottom:489.582000px;} +.ybf1{bottom:489.598000px;} +.y10bd{bottom:489.829000px;} +.yd75{bottom:489.870000px;} +.y1419{bottom:489.926000px;} +.ya3{bottom:489.939000px;} +.y1050{bottom:490.055000px;} +.yf70{bottom:490.111000px;} +.y1074{bottom:490.147000px;} +.yd5f{bottom:490.217000px;} +.y138d{bottom:490.270000px;} +.y74b{bottom:490.443000px;} +.y10ec{bottom:490.589000px;} +.y3da{bottom:490.734000px;} +.y1444{bottom:490.963000px;} +.y1346{bottom:491.033000px;} +.y48a{bottom:491.035000px;} +.ybf0{bottom:491.093000px;} +.y70b{bottom:491.254000px;} +.yd3c{bottom:491.589000px;} +.y12cd{bottom:491.642000px;} +.yf8d{bottom:491.932000px;} +.y1f5{bottom:491.997000px;} +.yd9c{bottom:492.216000px;} +.yc8{bottom:492.224000px;} +.y588{bottom:492.350000px;} +.y14f8{bottom:492.363490px;} +.yeef{bottom:492.618000px;} +.y454{bottom:492.629000px;} +.y9e5{bottom:492.640000px;} +.y2d5{bottom:492.924000px;} +.yf2{bottom:492.928000px;} +.yff3{bottom:493.072000px;} +.y102b{bottom:493.429000px;} +.yb6a{bottom:493.575000px;} +.y146e{bottom:493.587000px;} +.y822{bottom:493.610000px;} +.ye9f{bottom:493.620000px;} +.y587{bottom:493.845000px;} +.yad3{bottom:493.856000px;} +.y14f{bottom:493.924000px;} +.y772{bottom:493.950000px;} +.yd09{bottom:494.186000px;} +.y100f{bottom:494.330000px;} +.y14f4{bottom:494.584000px;} +.y1175{bottom:494.641000px;} +.y131b{bottom:494.688000px;} +.y847{bottom:494.824000px;} +.ycbd{bottom:494.856000px;} +.yec7{bottom:495.018000px;} +.y12f3{bottom:495.038000px;} +.y4dd{bottom:495.120000px;} +.yc9b{bottom:495.319000px;} +.y2d3{bottom:495.397000px;} +.y80a{bottom:495.416000px;} +.y393{bottom:495.467000px;} +.y231{bottom:495.698000px;} .y25{bottom:495.917000px;} -.ye94{bottom:496.046000px;} -.y15b3{bottom:496.270000px;} -.y15b4{bottom:496.420000px;} -.y150e{bottom:496.561000px;} -.y3e3{bottom:496.711000px;} -.y1409{bottom:496.764000px;} -.y10de{bottom:496.782000px;} +.ye55{bottom:496.046000px;} +.y1555{bottom:496.270000px;} +.y1556{bottom:496.420000px;} +.y14b2{bottom:496.561000px;} +.y3d9{bottom:496.711000px;} +.y13b0{bottom:496.764000px;} +.y1094{bottom:496.782000px;} .y19{bottom:497.056000px;} -.yc3a{bottom:497.070000px;} -.y811{bottom:497.232000px;} -.y117{bottom:497.422000px;} -.y7b4{bottom:497.460000px;} -.yd74{bottom:497.467000px;} -.ybbe{bottom:497.557000px;} -.y51e{bottom:497.754000px;} +.yc04{bottom:497.070000px;} +.y7f2{bottom:497.232000px;} +.y118{bottom:497.422000px;} +.y798{bottom:497.460000px;} +.yd3a{bottom:497.467000px;} +.yb8a{bottom:497.557000px;} +.y50e{bottom:497.754000px;} .y8f{bottom:497.909000px;} -.y744{bottom:497.910000px;} -.y11f3{bottom:498.006000px;} -.ya5a{bottom:498.192000px;} -.y14eb{bottom:498.308000px;} -.y1097{bottom:498.394000px;} -.y280{bottom:498.408000px;} -.yb72{bottom:498.547000px;} -.ye26{bottom:498.609000px;} -.yaae{bottom:498.638000px;} -.y96c{bottom:498.795000px;} -.ya32{bottom:498.906000px;} -.y2db{bottom:499.012000px;} -.yc78{bottom:499.063000px;} -.y9c4{bottom:499.137000px;} -.y6f5{bottom:499.169000px;} -.yb26{bottom:499.194000px;} -.yeb3{bottom:499.225000px;} -.y891{bottom:499.405000px;} -.y695{bottom:499.798000px;} -.y9f{bottom:499.902000px;} -.ye01{bottom:500.104000px;} -.yefb{bottom:500.110000px;} -.y8f7{bottom:500.152000px;} -.yb4e{bottom:500.471000px;} -.y8b6{bottom:500.509000px;} -.y1434{bottom:500.511000px;} -.y8d4{bottom:500.788000px;} -.y101a{bottom:500.872000px;} -.ye72{bottom:501.024000px;} -.y12cf{bottom:501.361000px;} -.y497{bottom:501.496000px;} -.yd19{bottom:501.538000px;} -.y1106{bottom:501.784000px;} -.y1472{bottom:501.881000px;} -.ya3{bottom:501.895000px;} -.yfb2{bottom:502.066000px;} -.y10bc{bottom:502.103000px;} -.y5cc{bottom:502.168000px;} -.y13e5{bottom:502.225000px;} -.y764{bottom:502.399000px;} -.y1135{bottom:502.544000px;} -.y3e1{bottom:502.689000px;} -.y149e{bottom:502.919000px;} -.y995{bottom:502.973000px;} -.y496{bottom:502.991000px;} -.yc24{bottom:503.048000px;} +.y72b{bottom:497.910000px;} +.y11a4{bottom:498.006000px;} +.ya2e{bottom:498.192000px;} +.y148f{bottom:498.308000px;} +.y104e{bottom:498.394000px;} +.y27a{bottom:498.408000px;} +.yb40{bottom:498.547000px;} +.yde9{bottom:498.609000px;} +.ya81{bottom:498.638000px;} +.y945{bottom:498.795000px;} +.ya07{bottom:498.906000px;} +.y2d4{bottom:499.012000px;} +.yc40{bottom:499.063000px;} +.y99b{bottom:499.137000px;} +.y6de{bottom:499.169000px;} +.yaf6{bottom:499.194000px;} +.ye74{bottom:499.225000px;} +.y86f{bottom:499.405000px;} +.y67f{bottom:499.798000px;} +.y279{bottom:499.902000px;} +.ydc5{bottom:500.104000px;} +.yeba{bottom:500.110000px;} +.y8d2{bottom:500.152000px;} +.yb1d{bottom:500.471000px;} +.y893{bottom:500.509000px;} +.y13db{bottom:500.511000px;} +.y8b0{bottom:500.788000px;} +.yfd3{bottom:500.872000px;} +.ye33{bottom:501.024000px;} +.y127e{bottom:501.361000px;} +.y489{bottom:501.496000px;} +.yce0{bottom:501.538000px;} +.y10bc{bottom:501.784000px;} +.y1418{bottom:501.881000px;} +.yf6f{bottom:502.066000px;} +.y1073{bottom:502.103000px;} +.y5ba{bottom:502.168000px;} +.y138c{bottom:502.225000px;} +.y74a{bottom:502.399000px;} +.y10eb{bottom:502.544000px;} +.y3d7{bottom:502.689000px;} +.y1443{bottom:502.919000px;} +.y96d{bottom:502.973000px;} +.y488{bottom:502.991000px;} +.ybef{bottom:503.048000px;} .y37{bottom:503.389000px;} -.yd75{bottom:503.544000px;} -.y1fa{bottom:503.952000px;} -.ya80{bottom:504.064000px;} -.yb4f{bottom:504.086000px;} -.ydd7{bottom:504.171000px;} -.yf30{bottom:504.574000px;} -.y45f{bottom:504.585000px;} -.y1320{bottom:504.593000px;} -.ya0e{bottom:504.595000px;} -.y359{bottom:504.686000px;} -.y9e6{bottom:504.745000px;} -.y2d9{bottom:504.879000px;} -.yee{bottom:504.883000px;} -.y103a{bottom:505.027000px;} -.y1072{bottom:505.385000px;} -.y14c8{bottom:505.542000px;} -.yede{bottom:505.575000px;} -.yb01{bottom:505.811000px;} -.y150{bottom:505.880000px;} -.y78c{bottom:505.905000px;} -.yb9a{bottom:505.928000px;} -.yb9b{bottom:506.028000px;} -.yd41{bottom:506.141000px;} -.yf87{bottom:506.150000px;} -.y358{bottom:506.181000px;} -.yad7{bottom:506.454000px;} -.y13b5{bottom:506.500000px;} -.ybf5{bottom:506.578000px;} -.y1370{bottom:506.644000px;} -.y868{bottom:506.780000px;} -.ycf5{bottom:506.812000px;} -.yf08{bottom:506.973000px;} -.yc5b{bottom:507.040000px;} -.y4eb{bottom:507.075000px;} +.yd3b{bottom:503.544000px;} +.y1f4{bottom:503.952000px;} +.ya53{bottom:504.064000px;} +.yb1e{bottom:504.086000px;} +.yd9b{bottom:504.171000px;} +.yeee{bottom:504.574000px;} +.y453{bottom:504.585000px;} +.y12cc{bottom:504.593000px;} +.y9e4{bottom:504.595000px;} +.y351{bottom:504.686000px;} +.y9bc{bottom:504.745000px;} +.y2d2{bottom:504.879000px;} +.yf1{bottom:504.883000px;} +.yff2{bottom:505.027000px;} +.y102a{bottom:505.385000px;} +.y146d{bottom:505.542000px;} +.ye9e{bottom:505.575000px;} +.yad2{bottom:505.811000px;} +.y14e{bottom:505.880000px;} +.y771{bottom:505.905000px;} +.yb67{bottom:505.928000px;} +.yb68{bottom:506.028000px;} +.yd08{bottom:506.141000px;} +.yf44{bottom:506.150000px;} +.y350{bottom:506.181000px;} +.yaa9{bottom:506.454000px;} +.ybc1{bottom:506.578000px;} +.y131a{bottom:506.644000px;} +.y846{bottom:506.780000px;} +.ycbc{bottom:506.812000px;} +.yec6{bottom:506.973000px;} +.yc24{bottom:507.040000px;} +.y4dc{bottom:507.075000px;} .y18{bottom:507.081000px;} -.y357{bottom:507.177000px;} -.y15b2{bottom:507.179000px;} -.y2d7{bottom:507.352000px;} -.y82a{bottom:507.371000px;} +.y34f{bottom:507.177000px;} +.y1554{bottom:507.179000px;} +.y2d0{bottom:507.352000px;} +.y809{bottom:507.371000px;} .y24{bottom:507.872000px;} -.y236{bottom:508.051000px;} -.y150d{bottom:508.516000px;} -.y1408{bottom:508.719000px;} -.y10dd{bottom:508.738000px;} +.y230{bottom:508.051000px;} +.y14b1{bottom:508.516000px;} +.y13af{bottom:508.719000px;} +.y1093{bottom:508.738000px;} .y17{bottom:509.012000px;} -.y810{bottom:509.187000px;} -.y7b3{bottom:509.415000px;} -.y139c{bottom:509.422000px;} -.y51d{bottom:509.710000px;} +.y7f1{bottom:509.187000px;} +.y797{bottom:509.415000px;} +.y1345{bottom:509.422000px;} +.y50d{bottom:509.710000px;} .y8e{bottom:509.865000px;} -.yff3{bottom:509.920000px;} -.y11f2{bottom:509.962000px;} -.yca6{bottom:510.050000px;} -.y41e{bottom:510.236000px;} -.yb71{bottom:510.502000px;} -.ye25{bottom:510.564000px;} -.yaad{bottom:510.593000px;} -.y14ea{bottom:510.662000px;} -.y96b{bottom:510.750000px;} -.y27f{bottom:510.762000px;} -.ya31{bottom:510.861000px;} -.y2d8{bottom:510.967000px;} -.yc77{bottom:511.018000px;} -.y9c3{bottom:511.092000px;} -.y6f4{bottom:511.124000px;} -.yb25{bottom:511.149000px;} -.yeb2{bottom:511.180000px;} +.yfad{bottom:509.920000px;} +.y11a3{bottom:509.962000px;} +.yc6e{bottom:510.050000px;} +.y413{bottom:510.236000px;} +.yb3f{bottom:510.502000px;} +.yde8{bottom:510.564000px;} +.ya80{bottom:510.593000px;} +.y148e{bottom:510.662000px;} +.y944{bottom:510.750000px;} +.y278{bottom:510.762000px;} +.ya06{bottom:510.861000px;} +.y2d1{bottom:510.967000px;} +.yc3f{bottom:511.018000px;} +.y99a{bottom:511.092000px;} +.y6dd{bottom:511.124000px;} +.yaf5{bottom:511.149000px;} +.ye73{bottom:511.180000px;} .y65{bottom:511.359000px;} -.y890{bottom:511.360000px;} -.yc8d{bottom:511.488000px;} -.y694{bottom:511.753000px;} -.y1533{bottom:511.857000px;} -.yc7{bottom:512.021000px;} -.yd98{bottom:512.038000px;} -.ye00{bottom:512.059000px;} -.yefa{bottom:512.065000px;} -.y27e{bottom:512.256000px;} -.yb4d{bottom:512.426000px;} -.y598{bottom:512.457000px;} -.y8b5{bottom:512.464000px;} -.y1433{bottom:512.466000px;} -.y8d3{bottom:512.743000px;} -.y129e{bottom:512.881000px;} -.y11b1{bottom:512.973000px;} -.ye71{bottom:512.979000px;} -.y722{bottom:513.172000px;} -.y12ce{bottom:513.316000px;} -.y842{bottom:513.340000px;} -.yd18{bottom:513.493000px;} -.yc23{bottom:513.509000px;} -.y1105{bottom:513.739000px;} -.y1471{bottom:513.836000px;} -.yfd0{bottom:513.850000px;} -.y41f{bottom:513.851000px;} -.y39b{bottom:513.857000px;} -.yfb1{bottom:514.021000px;} -.y10bb{bottom:514.058000px;} -.y5cb{bottom:514.123000px;} -.y1550{bottom:514.510000px;} -.y3e2{bottom:514.644000px;} -.ye4c{bottom:514.696000px;} -.y149d{bottom:514.874000px;} -.y495{bottom:514.946000px;} -.yc22{bottom:515.003000px;} -.yd73{bottom:515.898000px;} -.y1f9{bottom:515.907000px;} -.ye8{bottom:516.013000px;} -.ydd6{bottom:516.126000px;} -.y356{bottom:516.320000px;} -.yf2f{bottom:516.529000px;} -.y45e{bottom:516.540000px;} -.y131f{bottom:516.548000px;} -.ya0d{bottom:516.550000px;} -.y2d6{bottom:516.834000px;} -.yed{bottom:516.839000px;} +.y86e{bottom:511.360000px;} +.yc54{bottom:511.488000px;} +.yc7{bottom:511.674000px;} +.y67e{bottom:511.753000px;} +.y14d6{bottom:511.857000px;} +.yd5e{bottom:512.038000px;} +.ydc4{bottom:512.059000px;} +.yeb9{bottom:512.065000px;} +.y277{bottom:512.256000px;} +.yb1c{bottom:512.426000px;} +.y586{bottom:512.457000px;} +.y892{bottom:512.464000px;} +.y13da{bottom:512.466000px;} +.y8af{bottom:512.743000px;} +.y124e{bottom:512.881000px;} +.y1163{bottom:512.973000px;} +.ye32{bottom:512.979000px;} +.y70a{bottom:513.172000px;} +.y127d{bottom:513.316000px;} +.y821{bottom:513.340000px;} +.ycdf{bottom:513.493000px;} +.ybee{bottom:513.509000px;} +.y10bb{bottom:513.739000px;} +.y1417{bottom:513.836000px;} +.yf8c{bottom:513.850000px;} +.y414{bottom:513.851000px;} +.y392{bottom:513.857000px;} +.yf6e{bottom:514.021000px;} +.y1072{bottom:514.058000px;} +.y5b9{bottom:514.123000px;} +.y14f3{bottom:514.510000px;} +.y3d8{bottom:514.644000px;} +.ye0e{bottom:514.696000px;} +.y1442{bottom:514.874000px;} +.y487{bottom:514.946000px;} +.ybed{bottom:515.003000px;} +.yd39{bottom:515.898000px;} +.y1f3{bottom:515.907000px;} +.yeb{bottom:516.013000px;} +.yd9a{bottom:516.126000px;} +.y34e{bottom:516.320000px;} +.yeed{bottom:516.529000px;} +.y452{bottom:516.540000px;} +.y12cb{bottom:516.548000px;} +.y9e3{bottom:516.550000px;} +.y2cf{bottom:516.834000px;} +.yf0{bottom:516.839000px;} .y4{bottom:516.846288px;} -.y1039{bottom:516.982000px;} -.y1071{bottom:517.340000px;} -.y14c7{bottom:517.498000px;} -.yedd{bottom:517.530000px;} -.yb00{bottom:517.766000px;} -.y14f{bottom:517.835000px;} -.y78b{bottom:517.861000px;} -.y54b{bottom:518.049000px;} -.yd40{bottom:518.096000px;} -.yb99{bottom:518.382000px;} -.y136f{bottom:518.599000px;} -.ycf4{bottom:518.767000px;} -.yf07{bottom:518.928000px;} -.ya2e{bottom:519.000000px;} -.y35a{bottom:519.010000px;} -.y4ea{bottom:519.031000px;} -.y2d4{bottom:519.307000px;} -.y15b1{bottom:519.778000px;} +.yff1{bottom:516.982000px;} +.y1029{bottom:517.340000px;} +.y146c{bottom:517.498000px;} +.ye9d{bottom:517.530000px;} +.yad1{bottom:517.766000px;} +.y14d{bottom:517.835000px;} +.y770{bottom:517.861000px;} +.y53a{bottom:518.049000px;} +.yd07{bottom:518.096000px;} +.yb66{bottom:518.382000px;} +.y1319{bottom:518.599000px;} +.ycbb{bottom:518.767000px;} +.yec5{bottom:518.928000px;} +.y352{bottom:519.010000px;} +.y4db{bottom:519.031000px;} +.y2cd{bottom:519.307000px;} +.y1553{bottom:519.778000px;} .y23{bottom:519.827000px;} -.y235{bottom:520.007000px;} -.y355{bottom:520.505000px;} -.y1347{bottom:520.597000px;} -.y10dc{bottom:520.693000px;} -.ya59{bottom:520.851000px;} +.y22f{bottom:520.007000px;} +.y34d{bottom:520.505000px;} +.y12f2{bottom:520.597000px;} +.y1092{bottom:520.693000px;} +.ya2d{bottom:520.851000px;} .y16{bottom:520.967000px;} -.y80f{bottom:521.142000px;} -.y7b2{bottom:521.370000px;} -.y51c{bottom:521.665000px;} -.yd71{bottom:521.776000px;} +.y7f0{bottom:521.142000px;} +.y796{bottom:521.370000px;} +.y50c{bottom:521.665000px;} +.yd37{bottom:521.776000px;} .y8d{bottom:521.820000px;} -.yff2{bottom:521.875000px;} -.y11f1{bottom:521.917000px;} -.yca5{bottom:522.005000px;} -.y41d{bottom:522.191000px;} -.yb70{bottom:522.457000px;} -.ya30{bottom:522.816000px;} -.y2d5{bottom:522.922000px;} -.yc76{bottom:522.973000px;} -.y14e9{bottom:523.016000px;} -.y9c2{bottom:523.047000px;} -.y27d{bottom:523.115000px;} -.yeb1{bottom:523.135000px;} -.y88f{bottom:523.315000px;} -.y693{bottom:523.708000px;} -.y1532{bottom:523.812000px;} -.yc6{bottom:523.976000px;} -.ydfe{bottom:524.014000px;} -.yef9{bottom:524.020000px;} -.y13e4{bottom:524.143000px;} -.yb97{bottom:524.259000px;} -.yb4c{bottom:524.381000px;} -.y8b4{bottom:524.419000px;} -.y1432{bottom:524.421000px;} -.y27c{bottom:524.610000px;} -.y8d2{bottom:524.698000px;} -.y129d{bottom:524.836000px;} -.ye70{bottom:524.934000px;} -.y721{bottom:525.127000px;} -.y12cd{bottom:525.271000px;} -.y841{bottom:525.296000px;} -.yd17{bottom:525.448000px;} -.y1056{bottom:525.662000px;} -.y1104{bottom:525.694000px;} -.yfcf{bottom:525.805000px;} -.y5ca{bottom:526.079000px;} -.ybf4{bottom:526.175000px;} -.y763{bottom:526.309000px;} -.y1019{bottom:526.345000px;} -.yad6{bottom:526.379000px;} -.ya7f{bottom:526.381000px;} -.y154f{bottom:526.465000px;} -.y1223{bottom:526.599000px;} -.ye4b{bottom:526.651000px;} -.y150c{bottom:526.905000px;} -.yc21{bottom:526.958000px;} -.y15ae{bottom:527.598000px;} -.ydff{bottom:527.629000px;} -.y15b0{bottom:527.748000px;} -.yd72{bottom:527.853000px;} -.y1f8{bottom:527.862000px;} -.ydd5{bottom:528.081000px;} -.yf2e{bottom:528.484000px;} -.y45d{bottom:528.495000px;} -.ya0c{bottom:528.505000px;} -.y54a{bottom:528.509000px;} -.y2d3{bottom:528.789000px;} -.ycd3{bottom:528.794000px;} -.y1038{bottom:528.937000px;} -.ye93{bottom:528.969000px;} -.y14c5{bottom:529.453000px;} -.yedc{bottom:529.486000px;} -.y131e{bottom:529.500000px;} -.yaff{bottom:529.721000px;} -.y14e{bottom:529.790000px;} -.y78a{bottom:529.816000px;} -.y549{bottom:530.004000px;} -.yd3f{bottom:530.051000px;} -.y9e5{bottom:530.219000px;} -.yb98{bottom:530.337000px;} -.y136e{bottom:530.554000px;} -.y2d1{bottom:531.262000px;} -.y631{bottom:531.782000px;} +.yfac{bottom:521.875000px;} +.y11a2{bottom:521.917000px;} +.yc6d{bottom:522.005000px;} +.y412{bottom:522.191000px;} +.yb3e{bottom:522.457000px;} +.ya05{bottom:522.816000px;} +.y2ce{bottom:522.922000px;} +.yc3e{bottom:522.973000px;} +.y148d{bottom:523.016000px;} +.y999{bottom:523.047000px;} +.y276{bottom:523.115000px;} +.ye72{bottom:523.135000px;} +.y86d{bottom:523.315000px;} +.yc6{bottom:523.629000px;} +.y67d{bottom:523.708000px;} +.y14d5{bottom:523.812000px;} +.ydc2{bottom:524.014000px;} +.yeb8{bottom:524.020000px;} +.y138b{bottom:524.143000px;} +.yb64{bottom:524.259000px;} +.yb1b{bottom:524.381000px;} +.y891{bottom:524.419000px;} +.y13d9{bottom:524.421000px;} +.y275{bottom:524.610000px;} +.y8ae{bottom:524.698000px;} +.y124d{bottom:524.836000px;} +.ye31{bottom:524.934000px;} +.y709{bottom:525.127000px;} +.y127c{bottom:525.271000px;} +.y820{bottom:525.296000px;} +.ycde{bottom:525.448000px;} +.y100e{bottom:525.662000px;} +.y10ba{bottom:525.694000px;} +.yf8b{bottom:525.805000px;} +.y5b8{bottom:526.079000px;} +.ybc0{bottom:526.175000px;} +.y749{bottom:526.309000px;} +.yfd2{bottom:526.345000px;} +.yaa8{bottom:526.379000px;} +.ya52{bottom:526.381000px;} +.y14f2{bottom:526.465000px;} +.y11d4{bottom:526.599000px;} +.ye0d{bottom:526.651000px;} +.y14b0{bottom:526.905000px;} +.ybec{bottom:526.958000px;} +.y1550{bottom:527.598000px;} +.ydc3{bottom:527.629000px;} +.y1552{bottom:527.748000px;} +.ye8{bottom:527.797000px;} +.yd38{bottom:527.853000px;} +.y1f2{bottom:527.862000px;} +.yd99{bottom:528.081000px;} +.yeec{bottom:528.484000px;} +.y451{bottom:528.495000px;} +.y9e2{bottom:528.505000px;} +.y539{bottom:528.509000px;} +.y2cc{bottom:528.789000px;} +.yc9a{bottom:528.794000px;} +.yff0{bottom:528.937000px;} +.ye54{bottom:528.969000px;} +.y146a{bottom:529.453000px;} +.ye9c{bottom:529.486000px;} +.y12ca{bottom:529.500000px;} +.yad0{bottom:529.721000px;} +.y14c{bottom:529.790000px;} +.y76f{bottom:529.816000px;} +.y538{bottom:530.004000px;} +.yd06{bottom:530.051000px;} +.y9bb{bottom:530.219000px;} +.yb65{bottom:530.337000px;} +.y1318{bottom:530.554000px;} +.y2ca{bottom:531.262000px;} +.y61d{bottom:531.782000px;} .y22{bottom:531.783000px;} -.yf86{bottom:532.046000px;} -.yfb0{bottom:532.170000px;} -.y10db{bottom:532.648000px;} -.y92a{bottom:532.663000px;} -.ya58{bottom:532.807000px;} +.yf43{bottom:532.046000px;} +.yf6d{bottom:532.170000px;} +.y1091{bottom:532.648000px;} +.y904{bottom:532.663000px;} +.ya2c{bottom:532.807000px;} .y15{bottom:532.922000px;} -.y14c6{bottom:533.068000px;} -.y80e{bottom:533.097000px;} -.y7b1{bottom:533.325000px;} -.y51b{bottom:533.620000px;} +.y146b{bottom:533.068000px;} +.y7ef{bottom:533.097000px;} +.y795{bottom:533.325000px;} +.y50b{bottom:533.620000px;} .y8c{bottom:533.775000px;} -.yff1{bottom:533.830000px;} -.y11f0{bottom:533.872000px;} -.yb6f{bottom:534.412000px;} -.y867{bottom:534.467000px;} -.y234{bottom:534.751000px;} -.ya2f{bottom:534.771000px;} -.ybbd{bottom:534.779000px;} -.y2d2{bottom:534.878000px;} -.yc5a{bottom:534.928000px;} -.y9c1{bottom:535.002000px;} -.yeaf{bottom:535.090000px;} -.y139b{bottom:535.318000px;} -.yc8c{bottom:535.398000px;} -.y27b{bottom:535.469000px;} -.y15af{bottom:535.718000px;} -.y14e8{bottom:535.768000px;} -.y13bb{bottom:535.878000px;} -.ydfd{bottom:535.969000px;} -.yef8{bottom:535.976000px;} -.y13e3{bottom:536.098000px;} -.y8b3{bottom:536.374000px;} -.y1431{bottom:536.376000px;} -.y8d1{bottom:536.653000px;} -.y129c{bottom:536.792000px;} -.ye6f{bottom:536.889000px;} -.y1407{bottom:536.916000px;} -.y27a{bottom:536.963000px;} -.y720{bottom:537.083000px;} -.y116{bottom:537.153000px;} -.ycf3{bottom:537.156000px;} -.y12cc{bottom:537.226000px;} -.y3e0{bottom:537.303000px;} -.y829{bottom:537.390000px;} -.y1055{bottom:537.617000px;} -.y1103{bottom:537.650000px;} +.yfab{bottom:533.830000px;} +.y11a1{bottom:533.872000px;} +.yb3d{bottom:534.412000px;} +.y845{bottom:534.467000px;} +.y22e{bottom:534.751000px;} +.ya04{bottom:534.771000px;} +.yb89{bottom:534.779000px;} +.y2cb{bottom:534.878000px;} +.yc23{bottom:534.928000px;} +.y998{bottom:535.002000px;} +.ye70{bottom:535.090000px;} +.y1344{bottom:535.318000px;} +.yc53{bottom:535.398000px;} +.y274{bottom:535.469000px;} +.y1551{bottom:535.718000px;} +.y148c{bottom:535.768000px;} +.y1363{bottom:535.878000px;} +.ydc1{bottom:535.969000px;} +.yeb7{bottom:535.976000px;} +.y138a{bottom:536.098000px;} +.y890{bottom:536.374000px;} +.y13d8{bottom:536.376000px;} +.y8ad{bottom:536.653000px;} +.y124c{bottom:536.792000px;} +.ye30{bottom:536.889000px;} +.y13ae{bottom:536.916000px;} +.y273{bottom:536.963000px;} +.y708{bottom:537.083000px;} +.y117{bottom:537.153000px;} +.ycba{bottom:537.156000px;} +.y127b{bottom:537.226000px;} +.y3d6{bottom:537.303000px;} +.y808{bottom:537.390000px;} +.y100d{bottom:537.617000px;} +.y10b9{bottom:537.650000px;} .y36{bottom:537.760000px;} -.y5c9{bottom:538.034000px;} -.ybf3{bottom:538.130000px;} -.y1018{bottom:538.300000px;} -.yad4{bottom:538.334000px;} -.y1221{bottom:538.555000px;} -.ye4a{bottom:538.606000px;} -.yeb0{bottom:538.705000px;} -.ya7e{bottom:538.734000px;} -.yc20{bottom:538.913000px;} -.y1340{bottom:538.928000px;} -.ye6{bottom:539.753000px;} -.y1f7{bottom:539.817000px;} -.y4e9{bottom:539.852000px;} -.ydd4{bottom:540.036000px;} -.yd70{bottom:540.207000px;} -.y6f3{bottom:540.320000px;} -.yf2d{bottom:540.439000px;} -.y45c{bottom:540.450000px;} -.y232{bottom:540.729000px;} -.y2d0{bottom:540.745000px;} -.yf06{bottom:540.749000px;} -.ye92{bottom:540.924000px;} -.y4e8{bottom:541.347000px;} -.y14c4{bottom:541.408000px;} -.yedb{bottom:541.441000px;} -.y1070{bottom:541.607000px;} -.yafe{bottom:541.676000px;} -.y14d{bottom:541.745000px;} -.y789{bottom:541.771000px;} -.yad5{bottom:541.950000px;} -.yd3e{bottom:542.007000px;} -.y1222{bottom:542.170000px;} -.y9e4{bottom:542.174000px;} -.ye24{bottom:542.389000px;} -.y131d{bottom:542.451000px;} -.y136d{bottom:542.509000px;} -.yb96{bottom:542.690000px;} -.y2ce{bottom:543.217000px;} +.y5b7{bottom:538.034000px;} +.ybbf{bottom:538.130000px;} +.yfd1{bottom:538.300000px;} +.yaa6{bottom:538.334000px;} +.y11d2{bottom:538.555000px;} +.ye0c{bottom:538.606000px;} +.ye71{bottom:538.705000px;} +.ya51{bottom:538.734000px;} +.ybeb{bottom:538.913000px;} +.y12eb{bottom:538.928000px;} +.ye7{bottom:539.753000px;} +.y1f1{bottom:539.817000px;} +.y4da{bottom:539.852000px;} +.yd98{bottom:540.036000px;} +.yd36{bottom:540.207000px;} +.y6dc{bottom:540.320000px;} +.yeeb{bottom:540.439000px;} +.y450{bottom:540.450000px;} +.y22c{bottom:540.729000px;} +.y2c9{bottom:540.745000px;} +.yec4{bottom:540.749000px;} +.ye53{bottom:540.924000px;} +.y4d9{bottom:541.347000px;} +.y1469{bottom:541.408000px;} +.ye9b{bottom:541.441000px;} +.y1028{bottom:541.607000px;} +.yacf{bottom:541.676000px;} +.y14b{bottom:541.745000px;} +.y76e{bottom:541.771000px;} +.yaa7{bottom:541.950000px;} +.yd05{bottom:542.007000px;} +.y11d3{bottom:542.170000px;} +.y9ba{bottom:542.174000px;} +.yde7{bottom:542.389000px;} +.y12c9{bottom:542.451000px;} +.y1317{bottom:542.509000px;} +.yb63{bottom:542.690000px;} +.y2c7{bottom:543.217000px;} .y21{bottom:543.738000px;} -.yd16{bottom:543.837000px;} -.yf85{bottom:544.001000px;} -.y15ad{bottom:544.086000px;} -.y354{bottom:544.415000px;} -.y597{bottom:544.618000px;} -.y1470{bottom:544.831000px;} +.ycdd{bottom:543.837000px;} +.yf42{bottom:544.001000px;} +.y154f{bottom:544.086000px;} +.y34c{bottom:544.415000px;} +.y585{bottom:544.618000px;} +.y1416{bottom:544.831000px;} .y14{bottom:544.877000px;} -.y10ba{bottom:545.053000px;} -.y7b0{bottom:545.281000px;} -.y51a{bottom:545.575000px;} +.y1071{bottom:545.053000px;} +.y794{bottom:545.281000px;} +.y50a{bottom:545.575000px;} .y64{bottom:545.730000px;} -.yff0{bottom:545.786000px;} -.y11ef{bottom:545.827000px;} -.yd6e{bottom:546.085000px;} -.yb6e{bottom:546.368000px;} -.y154e{bottom:546.390000px;} -.y866{bottom:546.422000px;} -.y233{bottom:546.706000px;} -.y840{bottom:546.727000px;} -.ybbc{bottom:546.734000px;} -.y2cf{bottom:546.833000px;} -.y9c0{bottom:546.958000px;} -.yeae{bottom:547.045000px;} -.y139a{bottom:547.273000px;} -.y41c{bottom:547.366000px;} -.y1531{bottom:547.723000px;} -.y279{bottom:547.823000px;} -.yb4b{bottom:547.862000px;} -.ydfc{bottom:547.924000px;} -.yc75{bottom:547.979000px;} -.y14e7{bottom:548.121000px;} -.y8b2{bottom:548.329000px;} -.y1430{bottom:548.332000px;} -.yca4{bottom:548.409000px;} -.y5c8{bottom:548.495000px;} -.yd97{bottom:548.540000px;} -.yb94{bottom:548.568000px;} -.y8d0{bottom:548.608000px;} -.y129b{bottom:548.747000px;} -.y13ba{bottom:548.830000px;} -.yc5{bottom:548.842000px;} -.ye6e{bottom:548.845000px;} -.y1406{bottom:548.871000px;} -.y71f{bottom:549.038000px;} -.y692{bottom:549.182000px;} -.y3df{bottom:549.259000px;} -.y278{bottom:549.317000px;} -.y1054{bottom:549.572000px;} -.y1102{bottom:549.605000px;} -.y494{bottom:549.715000px;} -.y5c7{bottom:549.989000px;} -.y762{bottom:550.219000px;} -.y1017{bottom:550.255000px;} -.yad3{bottom:550.290000px;} -.yfaf{bottom:550.319000px;} -.y1220{bottom:550.510000px;} -.ye49{bottom:550.561000px;} -.y1037{bottom:550.758000px;} -.yc1f{bottom:550.869000px;} -.y10da{bottom:551.037000px;} -.ya7d{bottom:551.088000px;} -.ycd2{bottom:551.110000px;} +.yfaa{bottom:545.786000px;} +.y11a0{bottom:545.827000px;} +.yd34{bottom:546.085000px;} +.yb3c{bottom:546.368000px;} +.y14f1{bottom:546.390000px;} +.y844{bottom:546.422000px;} +.y22d{bottom:546.706000px;} +.y81f{bottom:546.727000px;} +.yb88{bottom:546.734000px;} +.y2c8{bottom:546.833000px;} +.y997{bottom:546.958000px;} +.ye6f{bottom:547.045000px;} +.y1343{bottom:547.273000px;} +.y411{bottom:547.366000px;} +.y14d4{bottom:547.723000px;} +.y272{bottom:547.823000px;} +.yb1a{bottom:547.862000px;} +.ydc0{bottom:547.924000px;} +.yc3d{bottom:547.979000px;} +.y148b{bottom:548.121000px;} +.y88f{bottom:548.329000px;} +.y13d7{bottom:548.332000px;} +.yc6c{bottom:548.409000px;} +.y5b6{bottom:548.495000px;} +.yd5d{bottom:548.540000px;} +.yb61{bottom:548.568000px;} +.yc5{bottom:548.581000px;} +.y8ac{bottom:548.608000px;} +.y124b{bottom:548.747000px;} +.y1362{bottom:548.830000px;} +.ye2f{bottom:548.845000px;} +.y13ad{bottom:548.871000px;} +.y707{bottom:549.038000px;} +.y67c{bottom:549.182000px;} +.y3d5{bottom:549.259000px;} +.y271{bottom:549.317000px;} +.y100c{bottom:549.572000px;} +.y10b8{bottom:549.605000px;} +.y486{bottom:549.715000px;} +.y5b5{bottom:549.989000px;} +.y748{bottom:550.219000px;} +.yfd0{bottom:550.255000px;} +.yaa5{bottom:550.290000px;} +.yf6c{bottom:550.319000px;} +.y11d1{bottom:550.510000px;} +.ye0b{bottom:550.561000px;} +.yfef{bottom:550.758000px;} +.ybea{bottom:550.869000px;} +.y1090{bottom:551.037000px;} +.ya50{bottom:551.088000px;} +.yc99{bottom:551.110000px;} .y3{bottom:551.364911px;} -.y548{bottom:551.623000px;} -.y1f6{bottom:551.772000px;} -.y4e7{bottom:551.808000px;} -.y15aa{bottom:551.907000px;} -.ydd3{bottom:551.991000px;} -.y15ac{bottom:552.057000px;} -.yd6f{bottom:552.162000px;} -.y6f2{bottom:552.275000px;} -.yf2c{bottom:552.394000px;} -.y45b{bottom:552.405000px;} -.y88e{bottom:552.585000px;} -.y4d6{bottom:552.605000px;} -.ye91{bottom:552.879000px;} -.y4e6{bottom:553.302000px;} -.y14c3{bottom:553.363000px;} -.yeda{bottom:553.396000px;} -.y106f{bottom:553.562000px;} -.yafd{bottom:553.632000px;} -.y14c{bottom:553.700000px;} -.yd3d{bottom:553.962000px;} -.y4d5{bottom:554.099000px;} -.y9e3{bottom:554.129000px;} -.ye23{bottom:554.344000px;} -.y131c{bottom:554.406000px;} -.y13e2{bottom:554.487000px;} -.ya57{bottom:554.627000px;} -.yb95{bottom:554.646000px;} -.y353{bottom:554.876000px;} -.y2cd{bottom:555.173000px;} -.y10e{bottom:555.484000px;} +.y537{bottom:551.623000px;} +.y1f0{bottom:551.772000px;} +.y4d8{bottom:551.808000px;} +.y154c{bottom:551.907000px;} +.yd97{bottom:551.991000px;} +.y154e{bottom:552.057000px;} +.yd35{bottom:552.162000px;} +.y6db{bottom:552.275000px;} +.yeea{bottom:552.394000px;} +.y44f{bottom:552.405000px;} +.y86c{bottom:552.585000px;} +.y4c7{bottom:552.605000px;} +.ye52{bottom:552.879000px;} +.y4d7{bottom:553.302000px;} +.y1468{bottom:553.363000px;} +.ye9a{bottom:553.396000px;} +.y1027{bottom:553.562000px;} +.yace{bottom:553.632000px;} +.y14a{bottom:553.700000px;} +.yd04{bottom:553.962000px;} +.y4c6{bottom:554.099000px;} +.y9b9{bottom:554.129000px;} +.yde6{bottom:554.344000px;} +.y12c8{bottom:554.406000px;} +.y1389{bottom:554.487000px;} +.ya2b{bottom:554.627000px;} +.yb62{bottom:554.646000px;} +.y34b{bottom:554.876000px;} +.y2c6{bottom:555.173000px;} +.y10f{bottom:555.484000px;} .y20{bottom:555.693000px;} -.yf84{bottom:555.956000px;} -.y352{bottom:556.370000px;} -.ybf2{bottom:556.520000px;} -.y146f{bottom:556.786000px;} +.yf41{bottom:555.956000px;} +.y34a{bottom:556.370000px;} +.ybbe{bottom:556.520000px;} +.y1415{bottom:556.786000px;} .y13{bottom:556.832000px;} -.ycd0{bottom:556.988000px;} -.y10b9{bottom:557.008000px;} -.y7af{bottom:557.236000px;} -.y39a{bottom:557.287000px;} -.y519{bottom:557.530000px;} +.yc97{bottom:556.988000px;} +.y1070{bottom:557.008000px;} +.y793{bottom:557.236000px;} +.y391{bottom:557.287000px;} +.y509{bottom:557.530000px;} .y63{bottom:557.685000px;} -.yfef{bottom:557.741000px;} -.y11ee{bottom:557.782000px;} -.ya0b{bottom:558.254000px;} -.yb6d{bottom:558.323000px;} -.y154d{bottom:558.345000px;} -.y865{bottom:558.377000px;} -.y80d{bottom:558.571000px;} -.ybbb{bottom:558.689000px;} -.yead{bottom:559.000000px;} -.y1399{bottom:559.228000px;} -.y41b{bottom:559.321000px;} +.yfa9{bottom:557.741000px;} +.y119f{bottom:557.782000px;} +.y9e1{bottom:558.254000px;} +.yb3b{bottom:558.323000px;} +.y14f0{bottom:558.345000px;} +.y843{bottom:558.377000px;} +.y7ee{bottom:558.571000px;} +.yb87{bottom:558.689000px;} +.ye6e{bottom:559.000000px;} +.y1342{bottom:559.228000px;} +.y410{bottom:559.321000px;} .y35{bottom:559.678000px;} -.y150b{bottom:559.733000px;} -.y136c{bottom:559.789000px;} -.ydfb{bottom:559.879000px;} -.y15ab{bottom:560.027000px;} -.y277{bottom:560.176000px;} -.y142f{bottom:560.287000px;} -.yca3{bottom:560.364000px;} -.yc59{bottom:560.488000px;} -.yd96{bottom:560.495000px;} -.y8f6{bottom:560.563000px;} -.y8cf{bottom:560.564000px;} -.y129a{bottom:560.702000px;} -.y13b9{bottom:560.785000px;} -.yc4{bottom:560.797000px;} -.y1405{bottom:560.826000px;} -.y14e6{bottom:560.874000px;} -.y691{bottom:561.137000px;} -.y3de{bottom:561.214000px;} -.y1053{bottom:561.527000px;} -.y1101{bottom:561.560000px;} -.y493{bottom:561.670000px;} -.y276{bottom:561.671000px;} -.yad2{bottom:562.245000px;} -.yfae{bottom:562.274000px;} -.y788{bottom:562.352000px;} -.ye48{bottom:562.516000px;} -.yc1e{bottom:562.824000px;} -.y56b{bottom:562.949000px;} -.ycd1{bottom:563.065000px;} -.ya7c{bottom:563.442000px;} -.y1f5{bottom:563.728000px;} -.y4e5{bottom:563.763000px;} -.y6f1{bottom:564.230000px;} -.yf2b{bottom:564.350000px;} -.y45a{bottom:564.360000px;} -.y2ca{bottom:564.471000px;} -.y5c6{bottom:564.473000px;} -.yd6d{bottom:564.515000px;} -.y88d{bottom:564.540000px;} -.y4d4{bottom:564.560000px;} -.y2cc{bottom:564.655000px;} -.ye90{bottom:564.834000px;} -.y5c4{bottom:564.916000px;} -.y4e4{bottom:565.257000px;} -.y14c2{bottom:565.318000px;} -.yed9{bottom:565.351000px;} -.y106e{bottom:565.517000px;} +.y14af{bottom:559.733000px;} +.y1316{bottom:559.789000px;} +.ydbf{bottom:559.879000px;} +.y154d{bottom:560.027000px;} +.y270{bottom:560.176000px;} +.y13d6{bottom:560.287000px;} +.yc6b{bottom:560.364000px;} +.yc22{bottom:560.488000px;} +.yd5c{bottom:560.495000px;} +.yc4{bottom:560.537000px;} +.y8d1{bottom:560.563000px;} +.y8ab{bottom:560.564000px;} +.y124a{bottom:560.702000px;} +.y1361{bottom:560.785000px;} +.y13ac{bottom:560.826000px;} +.y148a{bottom:560.874000px;} +.y67b{bottom:561.137000px;} +.y3d4{bottom:561.214000px;} +.y100b{bottom:561.527000px;} +.y10b7{bottom:561.560000px;} +.y485{bottom:561.670000px;} +.y26f{bottom:561.671000px;} +.yaa4{bottom:562.245000px;} +.yf6b{bottom:562.274000px;} +.y76d{bottom:562.352000px;} +.ye0a{bottom:562.516000px;} +.ybe9{bottom:562.824000px;} +.y559{bottom:562.949000px;} +.yc98{bottom:563.065000px;} +.ya4f{bottom:563.442000px;} +.y1ef{bottom:563.728000px;} +.y4d6{bottom:563.763000px;} +.y6da{bottom:564.230000px;} +.yee9{bottom:564.350000px;} +.y44e{bottom:564.360000px;} +.y2c3{bottom:564.471000px;} +.y5b4{bottom:564.473000px;} +.yd33{bottom:564.515000px;} +.y86b{bottom:564.540000px;} +.y4c5{bottom:564.560000px;} +.y2c5{bottom:564.655000px;} +.ye51{bottom:564.834000px;} +.y5b2{bottom:564.916000px;} +.y4d5{bottom:565.257000px;} +.y1467{bottom:565.318000px;} +.ye99{bottom:565.351000px;} +.y1026{bottom:565.517000px;} .ya2{bottom:565.656000px;} -.yd3c{bottom:565.917000px;} -.y4d3{bottom:566.054000px;} -.y9e2{bottom:566.084000px;} -.ye22{bottom:566.299000px;} -.yc74{bottom:566.311000px;} -.y131b{bottom:566.361000px;} -.yb92{bottom:566.999000px;} -.yb93{bottom:567.099000px;} -.y8b1{bottom:567.107000px;} -.y2c8{bottom:567.128000px;} -.y547{bottom:567.364000px;} +.yd03{bottom:565.917000px;} +.y4c4{bottom:566.054000px;} +.y9b8{bottom:566.084000px;} +.yde5{bottom:566.299000px;} +.yc3c{bottom:566.311000px;} +.y12c7{bottom:566.361000px;} +.yb5f{bottom:566.999000px;} +.yb60{bottom:567.099000px;} +.y88e{bottom:567.107000px;} +.y2c1{bottom:567.128000px;} +.y536{bottom:567.364000px;} .y1f{bottom:567.648000px;} -.yf83{bottom:567.911000px;} -.y351{bottom:568.325000px;} -.y15a9{bottom:568.395000px;} -.yec{bottom:568.644000px;} -.y146e{bottom:568.742000px;} +.yf40{bottom:567.911000px;} +.y349{bottom:568.325000px;} +.y154b{bottom:568.395000px;} +.yef{bottom:568.644000px;} +.y1414{bottom:568.742000px;} .y12{bottom:568.787000px;} -.y546{bottom:568.858000px;} -.y121f{bottom:568.899000px;} -.y10b8{bottom:568.963000px;} -.y7ae{bottom:569.191000px;} -.y518{bottom:569.485000px;} +.y535{bottom:568.858000px;} +.y11d0{bottom:568.899000px;} +.y106f{bottom:568.963000px;} +.y792{bottom:569.191000px;} +.y508{bottom:569.485000px;} .y62{bottom:569.641000px;} -.yfee{bottom:569.696000px;} -.y11ed{bottom:569.737000px;} -.ya0a{bottom:570.209000px;} -.y864{bottom:570.332000px;} -.ydd2{bottom:570.381000px;} -.yd6b{bottom:570.393000px;} -.y80c{bottom:570.526000px;} -.ycf2{bottom:570.676000px;} -.y2cb{bottom:570.743000px;} -.yc58{bottom:570.949000px;} -.y71e{bottom:570.956000px;} -.y1398{bottom:571.183000px;} -.y2c9{bottom:571.390000px;} +.yfa8{bottom:569.696000px;} +.y119e{bottom:569.737000px;} +.y9e0{bottom:570.209000px;} +.y842{bottom:570.332000px;} +.yd96{bottom:570.381000px;} +.yd31{bottom:570.393000px;} +.y7ed{bottom:570.526000px;} +.ycb9{bottom:570.676000px;} +.y2c4{bottom:570.743000px;} +.yc21{bottom:570.949000px;} +.y706{bottom:570.956000px;} +.y1341{bottom:571.183000px;} +.y2c2{bottom:571.390000px;} .y9e{bottom:571.633000px;} -.y150a{bottom:571.688000px;} -.ydfa{bottom:571.835000px;} -.y15a7{bottom:572.231000px;} -.y142e{bottom:572.242000px;} -.yca2{bottom:572.319000px;} -.yc57{bottom:572.443000px;} -.yd95{bottom:572.450000px;} -.y8ce{bottom:572.519000px;} -.y275{bottom:572.530000px;} -.y1299{bottom:572.657000px;} -.y136b{bottom:572.740000px;} -.y690{bottom:573.092000px;} -.y3dc{bottom:573.169000px;} -.y14e5{bottom:573.227000px;} -.y1052{bottom:573.482000px;} -.y1100{bottom:573.515000px;} -.yafc{bottom:573.557000px;} -.y492{bottom:573.626000px;} -.y5c5{bottom:573.966000px;} -.y274{bottom:574.024000px;} -.ye6d{bottom:574.110000px;} -.y761{bottom:574.130000px;} -.yad1{bottom:574.200000px;} -.yfad{bottom:574.229000px;} -.y787{bottom:574.307000px;} -.y5c3{bottom:574.408000px;} -.ye47{bottom:574.472000px;} -.yc1d{bottom:574.779000px;} -.yaac{bottom:575.319000px;} -.yccf{bottom:575.419000px;} -.y96a{bottom:575.618000px;} -.y1f4{bottom:575.683000px;} -.ya7b{bottom:575.795000px;} -.yb24{bottom:576.017000px;} -.y6f0{bottom:576.186000px;} -.yf2a{bottom:576.305000px;} -.y15a8{bottom:576.365000px;} -.yd6c{bottom:576.471000px;} -.y3dd{bottom:576.784000px;} -.ye8f{bottom:576.790000px;} -.yb4a{bottom:576.864000px;} -.yfce{bottom:577.241000px;} -.y14c1{bottom:577.274000px;} -.yed8{bottom:577.306000px;} -.yd15{bottom:577.312000px;} -.y106d{bottom:577.473000px;} -.y14b{bottom:577.611000px;} -.yd3b{bottom:577.872000px;} -.y9bf{bottom:577.952000px;} -.y9e1{bottom:578.040000px;} -.y399{bottom:578.109000px;} -.ye21{bottom:578.255000px;} -.y154c{bottom:578.270000px;} -.y131a{bottom:578.316000px;} -.y4d2{bottom:578.408000px;} -.y5c2{bottom:578.593000px;} -.y10d9{bottom:579.000000px;} -.y8b0{bottom:579.062000px;} -.y545{bottom:579.319000px;} +.y14ae{bottom:571.688000px;} +.ydbe{bottom:571.835000px;} +.y1549{bottom:572.231000px;} +.y13d5{bottom:572.242000px;} +.yc6a{bottom:572.319000px;} +.yc20{bottom:572.443000px;} +.yd5b{bottom:572.450000px;} +.y8aa{bottom:572.519000px;} +.y26e{bottom:572.530000px;} +.y1249{bottom:572.657000px;} +.y1315{bottom:572.740000px;} +.y67a{bottom:573.092000px;} +.y3d2{bottom:573.169000px;} +.y1489{bottom:573.227000px;} +.y100a{bottom:573.482000px;} +.y10b6{bottom:573.515000px;} +.yacd{bottom:573.557000px;} +.y484{bottom:573.626000px;} +.y5b3{bottom:573.966000px;} +.y26d{bottom:574.024000px;} +.ye2e{bottom:574.110000px;} +.y747{bottom:574.130000px;} +.yaa3{bottom:574.200000px;} +.yf6a{bottom:574.229000px;} +.y76c{bottom:574.307000px;} +.y5b1{bottom:574.408000px;} +.ye09{bottom:574.472000px;} +.ybe8{bottom:574.779000px;} +.ya7f{bottom:575.319000px;} +.yc96{bottom:575.419000px;} +.y943{bottom:575.618000px;} +.y1ee{bottom:575.683000px;} +.ya4e{bottom:575.795000px;} +.yaf4{bottom:576.017000px;} +.y6d9{bottom:576.186000px;} +.yee8{bottom:576.305000px;} +.y154a{bottom:576.365000px;} +.yd32{bottom:576.471000px;} +.y3d3{bottom:576.784000px;} +.ye50{bottom:576.790000px;} +.yb19{bottom:576.864000px;} +.yf8a{bottom:577.241000px;} +.y1466{bottom:577.274000px;} +.ye98{bottom:577.306000px;} +.ycdc{bottom:577.312000px;} +.y1025{bottom:577.473000px;} +.y149{bottom:577.611000px;} +.yd02{bottom:577.872000px;} +.y996{bottom:577.952000px;} +.y9b7{bottom:578.040000px;} +.y390{bottom:578.109000px;} +.yde4{bottom:578.255000px;} +.y14ef{bottom:578.270000px;} +.y12c6{bottom:578.316000px;} +.y4c3{bottom:578.408000px;} +.y5b0{bottom:578.593000px;} +.y88d{bottom:579.062000px;} +.y534{bottom:579.319000px;} .y1e{bottom:579.603000px;} -.y41a{bottom:579.744000px;} -.yf82{bottom:579.867000px;} -.y5c1{bottom:580.087000px;} -.yc3{bottom:580.204000px;} -.y146d{bottom:580.697000px;} -.y544{bottom:580.813000px;} -.y10b7{bottom:580.918000px;} -.y7ad{bottom:581.146000px;} -.y419{bottom:581.239000px;} -.y1016{bottom:581.250000px;} -.yccd{bottom:581.297000px;} -.y517{bottom:581.441000px;} +.y40f{bottom:579.744000px;} +.yf3f{bottom:579.867000px;} +.yc3{bottom:579.987000px;} +.y5af{bottom:580.087000px;} +.y1413{bottom:580.697000px;} +.y533{bottom:580.813000px;} +.y106e{bottom:580.918000px;} +.y791{bottom:581.146000px;} +.y40e{bottom:581.239000px;} +.yfcf{bottom:581.250000px;} +.yc94{bottom:581.297000px;} +.y507{bottom:581.441000px;} .y34{bottom:581.596000px;} -.yfed{bottom:581.651000px;} -.y11ec{bottom:581.693000px;} -.yb6c{bottom:581.804000px;} -.yb91{bottom:581.844000px;} -.yb23{bottom:581.895000px;} -.ya09{bottom:582.164000px;} -.y863{bottom:582.288000px;} -.y13e1{bottom:582.376000px;} -.y80b{bottom:582.481000px;} -.ycf1{bottom:582.631000px;} -.y71d{bottom:582.911000px;} -.y1397{bottom:583.139000px;} -.y1036{bottom:583.295000px;} -.y1530{bottom:583.588000px;} -.y1509{bottom:583.644000px;} -.ydf9{bottom:583.790000px;} -.y142d{bottom:584.197000px;} -.yca1{bottom:584.274000px;} -.yd94{bottom:584.405000px;} -.y8f5{bottom:584.474000px;} -.ybba{bottom:584.609000px;} -.y1298{bottom:584.612000px;} -.y136a{bottom:584.695000px;} -.y15a6{bottom:584.734000px;} -.y273{bottom:584.884000px;} -.y68f{bottom:585.047000px;} -.y3db{bottom:585.124000px;} -.y1051{bottom:585.438000px;} -.y10ff{bottom:585.470000px;} -.yafb{bottom:585.512000px;} -.y491{bottom:585.581000px;} +.yfa7{bottom:581.651000px;} +.y119d{bottom:581.693000px;} +.yb3a{bottom:581.804000px;} +.yb5e{bottom:581.844000px;} +.yaf3{bottom:581.895000px;} +.y9df{bottom:582.164000px;} +.y841{bottom:582.288000px;} +.y1388{bottom:582.376000px;} +.y7ec{bottom:582.481000px;} +.ycb8{bottom:582.631000px;} +.y705{bottom:582.911000px;} +.y1340{bottom:583.139000px;} +.yfee{bottom:583.295000px;} +.y14d3{bottom:583.588000px;} +.y14ad{bottom:583.644000px;} +.ydbd{bottom:583.790000px;} +.y13d4{bottom:584.197000px;} +.yc69{bottom:584.274000px;} +.yd5a{bottom:584.405000px;} +.y8d0{bottom:584.474000px;} +.yb86{bottom:584.609000px;} +.y1248{bottom:584.612000px;} +.y1314{bottom:584.695000px;} +.y1548{bottom:584.734000px;} +.y26c{bottom:584.884000px;} +.y679{bottom:585.047000px;} +.y3d1{bottom:585.124000px;} +.y1009{bottom:585.438000px;} +.y10b5{bottom:585.470000px;} +.yacc{bottom:585.512000px;} +.y483{bottom:585.581000px;} .y2{bottom:585.883533px;} -.ye6c{bottom:586.065000px;} -.y760{bottom:586.085000px;} -.yad0{bottom:586.155000px;} -.yfac{bottom:586.185000px;} -.y2c7{bottom:586.245000px;} -.y786{bottom:586.262000px;} -.y272{bottom:586.378000px;} -.ye46{bottom:586.427000px;} -.yaab{bottom:586.677000px;} -.yc1c{bottom:586.734000px;} -.ycce{bottom:587.374000px;} -.ya56{bottom:587.573000px;} -.y1f3{bottom:587.638000px;} -.y969{bottom:587.972000px;} -.y6ef{bottom:588.141000px;} -.ya7a{bottom:588.149000px;} -.yf29{bottom:588.260000px;} -.y88c{bottom:588.288000px;} -.y4e3{bottom:588.470000px;} -.y15a4{bottom:588.570000px;} -.ye8e{bottom:588.745000px;} -.yb49{bottom:588.819000px;} -.yd6a{bottom:588.824000px;} -.y14c0{bottom:589.229000px;} -.yed7{bottom:589.261000px;} -.y4d1{bottom:589.267000px;} -.ybf1{bottom:589.665000px;} -.yd3a{bottom:589.827000px;} -.y9be{bottom:589.908000px;} -.y4e2{bottom:589.964000px;} -.y9e0{bottom:589.995000px;} -.ye20{bottom:590.210000px;} -.y154b{bottom:590.226000px;} -.y1319{bottom:590.272000px;} -.y398{bottom:590.463000px;} -.y4d0{bottom:590.761000px;} -.yc56{bottom:590.774000px;} -.y1404{bottom:591.189000px;} -.y543{bottom:591.274000px;} +.ye2d{bottom:586.065000px;} +.y746{bottom:586.085000px;} +.yaa2{bottom:586.155000px;} +.yf69{bottom:586.185000px;} +.y2c0{bottom:586.245000px;} +.y76b{bottom:586.262000px;} +.y26b{bottom:586.378000px;} +.ye08{bottom:586.427000px;} +.ya7e{bottom:586.677000px;} +.ybe7{bottom:586.734000px;} +.yc95{bottom:587.374000px;} +.ya2a{bottom:587.573000px;} +.y1ed{bottom:587.638000px;} +.y942{bottom:587.972000px;} +.y6d8{bottom:588.141000px;} +.ya4d{bottom:588.149000px;} +.yee7{bottom:588.260000px;} +.y86a{bottom:588.288000px;} +.y4d4{bottom:588.470000px;} +.y1546{bottom:588.570000px;} +.ye4f{bottom:588.745000px;} +.yb18{bottom:588.819000px;} +.yd30{bottom:588.824000px;} +.y1465{bottom:589.229000px;} +.ye97{bottom:589.261000px;} +.y4c2{bottom:589.267000px;} +.ybbd{bottom:589.665000px;} +.yd01{bottom:589.827000px;} +.y995{bottom:589.908000px;} +.y4d3{bottom:589.964000px;} +.y9b6{bottom:589.995000px;} +.yde3{bottom:590.210000px;} +.y14ee{bottom:590.226000px;} +.y12c5{bottom:590.272000px;} +.y38f{bottom:590.463000px;} +.y4c1{bottom:590.761000px;} +.yc1f{bottom:590.774000px;} +.y13ab{bottom:591.189000px;} +.y532{bottom:591.274000px;} .y1d{bottom:591.558000px;} -.y418{bottom:591.700000px;} -.y397{bottom:591.957000px;} -.y146c{bottom:592.652000px;} -.y15a5{bottom:592.704000px;} -.y542{bottom:592.768000px;} -.y10b6{bottom:592.873000px;} -.y7ac{bottom:593.101000px;} -.y417{bottom:593.194000px;} -.y1015{bottom:593.205000px;} -.y516{bottom:593.396000px;} +.y40d{bottom:591.700000px;} +.y38e{bottom:591.957000px;} +.y1412{bottom:592.652000px;} +.y1547{bottom:592.704000px;} +.y531{bottom:592.768000px;} +.y106d{bottom:592.873000px;} +.y790{bottom:593.101000px;} +.y40c{bottom:593.194000px;} +.yfce{bottom:593.205000px;} +.y506{bottom:593.396000px;} .y61{bottom:593.551000px;} -.yfec{bottom:593.606000px;} -.y11eb{bottom:593.648000px;} -.ya08{bottom:594.120000px;} -.y862{bottom:594.243000px;} -.y13e0{bottom:594.331000px;} -.y3da{bottom:594.423000px;} -.y80a{bottom:594.436000px;} -.y149c{bottom:594.478000px;} -.yd68{bottom:594.702000px;} -.yeac{bottom:594.866000px;} -.y1396{bottom:595.094000px;} -.y1035{bottom:595.250000px;} -.yc8b{bottom:595.543000px;} -.y1508{bottom:595.599000px;} -.y142c{bottom:596.152000px;} -.yca0{bottom:596.229000px;} -.yd93{bottom:596.360000px;} -.y8f4{bottom:596.429000px;} -.ybb9{bottom:596.565000px;} -.y1297{bottom:596.567000px;} -.y1369{bottom:596.650000px;} -.y68e{bottom:597.002000px;} -.y3d8{bottom:597.079000px;} -.y271{bottom:597.237000px;} -.y10fe{bottom:597.426000px;} -.yafa{bottom:597.467000px;} -.y48f{bottom:597.536000px;} -.y459{bottom:597.835000px;} -.y8af{bottom:597.839000px;} -.y14e4{bottom:597.935000px;} -.ye6b{bottom:598.021000px;} -.yaaa{bottom:598.034000px;} -.yfab{bottom:598.140000px;} -.yeb{bottom:598.532000px;} -.y270{bottom:598.732000px;} -.y2c6{bottom:599.196000px;} -.y34f{bottom:599.327000px;} -.y14a{bottom:599.528000px;} -.y1f2{bottom:599.593000px;} -.yd14{bottom:599.628000px;} -.yccc{bottom:599.728000px;} -.y968{bottom:599.927000px;} -.y148f{bottom:600.000000px;} -.y6ee{bottom:600.096000px;} -.yf28{bottom:600.215000px;} -.y88b{bottom:600.244000px;} -.y350{bottom:600.305000px;} -.yb22{bottom:600.326000px;} -.y4e1{bottom:600.425000px;} -.ya79{bottom:600.503000px;} -.ye8d{bottom:600.700000px;} -.yd69{bottom:600.779000px;} -.y15a3{bottom:601.073000px;} -.y490{bottom:601.151000px;} -.y121e{bottom:601.170000px;} -.y14bf{bottom:601.184000px;} -.yed6{bottom:601.217000px;} -.y4cf{bottom:601.222000px;} -.y3d9{bottom:601.341000px;} -.yd39{bottom:601.782000px;} -.y34d{bottom:601.800000px;} -.y9bd{bottom:601.863000px;} -.y4e0{bottom:601.920000px;} -.y9df{bottom:601.950000px;} -.yf7c{bottom:602.000000px;} -.y630{bottom:602.019000px;} -.y4ce{bottom:602.717000px;} -.y396{bottom:602.816000px;} -.y541{bottom:603.229000px;} -.ye5{bottom:603.514000px;} -.y416{bottom:603.655000px;} -.y5c0{bottom:603.997000px;} -.y395{bottom:604.311000px;} -.yacf{bottom:604.545000px;} -.y146b{bottom:604.607000px;} -.y540{bottom:604.724000px;} -.ye45{bottom:604.816000px;} -.y10b5{bottom:604.828000px;} -.y15a1{bottom:604.908000px;} -.y7ab{bottom:605.056000px;} -.yc2{bottom:605.069000px;} -.y415{bottom:605.149000px;} -.y1014{bottom:605.161000px;} -.y515{bottom:605.351000px;} -.y1318{bottom:605.359000px;} -.y34e{bottom:605.415000px;} +.yfa6{bottom:593.606000px;} +.y119c{bottom:593.648000px;} +.y9de{bottom:594.120000px;} +.y840{bottom:594.243000px;} +.y1387{bottom:594.331000px;} +.y3d0{bottom:594.423000px;} +.y7eb{bottom:594.436000px;} +.y1441{bottom:594.478000px;} +.yd2e{bottom:594.702000px;} +.ye6d{bottom:594.866000px;} +.y133f{bottom:595.094000px;} +.yfed{bottom:595.250000px;} +.yc52{bottom:595.543000px;} +.y14ac{bottom:595.599000px;} +.y13d3{bottom:596.152000px;} +.yc68{bottom:596.229000px;} +.yd59{bottom:596.360000px;} +.y8cf{bottom:596.429000px;} +.yb85{bottom:596.565000px;} +.y1247{bottom:596.567000px;} +.y1313{bottom:596.650000px;} +.y678{bottom:597.002000px;} +.y3ce{bottom:597.079000px;} +.y26a{bottom:597.237000px;} +.y10b4{bottom:597.426000px;} +.yacb{bottom:597.467000px;} +.ye6{bottom:597.536000px;} +.y44d{bottom:597.835000px;} +.y88c{bottom:597.839000px;} +.y1488{bottom:597.935000px;} +.ye2c{bottom:598.021000px;} +.ya7d{bottom:598.034000px;} +.yf68{bottom:598.140000px;} +.yee{bottom:598.532000px;} +.y269{bottom:598.732000px;} +.y2bf{bottom:599.196000px;} +.y347{bottom:599.327000px;} +.y148{bottom:599.528000px;} +.y1ec{bottom:599.593000px;} +.ycdb{bottom:599.628000px;} +.yc93{bottom:599.728000px;} +.y941{bottom:599.927000px;} +.y6d7{bottom:600.096000px;} +.yee6{bottom:600.215000px;} +.y869{bottom:600.244000px;} +.y348{bottom:600.305000px;} +.yaf2{bottom:600.326000px;} +.y4d2{bottom:600.425000px;} +.ya4c{bottom:600.503000px;} +.ye4e{bottom:600.700000px;} +.yd2f{bottom:600.779000px;} +.y1545{bottom:601.073000px;} +.y482{bottom:601.151000px;} +.y11cf{bottom:601.170000px;} +.y1464{bottom:601.184000px;} +.ye96{bottom:601.217000px;} +.y4c0{bottom:601.222000px;} +.y3cf{bottom:601.341000px;} +.yd00{bottom:601.782000px;} +.y345{bottom:601.800000px;} +.y994{bottom:601.863000px;} +.y4d1{bottom:601.920000px;} +.y9b5{bottom:601.950000px;} +.y61c{bottom:602.019000px;} +.y4bf{bottom:602.717000px;} +.y38d{bottom:602.816000px;} +.y530{bottom:603.229000px;} +.y22b{bottom:603.514000px;} +.y40b{bottom:603.655000px;} +.y5ae{bottom:603.997000px;} +.y38c{bottom:604.311000px;} +.yaa1{bottom:604.545000px;} +.y1411{bottom:604.607000px;} +.y52f{bottom:604.724000px;} +.ye07{bottom:604.816000px;} +.y106c{bottom:604.828000px;} +.y1543{bottom:604.908000px;} +.yc2{bottom:604.939000px;} +.y78f{bottom:605.056000px;} +.y40a{bottom:605.149000px;} +.yfcd{bottom:605.161000px;} +.y505{bottom:605.351000px;} +.y12c4{bottom:605.359000px;} +.y346{bottom:605.415000px;} .y60{bottom:605.506000px;} -.yfeb{bottom:605.561000px;} -.y11ea{bottom:605.603000px;} -.ycca{bottom:605.606000px;} -.ydf8{bottom:605.607000px;} -.ya07{bottom:606.075000px;} -.yb21{bottom:606.204000px;} -.y809{bottom:606.392000px;} -.ydd1{bottom:606.541000px;} -.y75f{bottom:606.754000px;} -.y1395{bottom:607.049000px;} -.y1034{bottom:607.205000px;} -.ya55{bottom:607.499000px;} -.yf81{bottom:607.554000px;} -.y142b{bottom:608.108000px;} -.yd92{bottom:608.315000px;} -.y71c{bottom:608.384000px;} -.ybb8{bottom:608.520000px;} -.ye1f{bottom:608.599000px;} -.y1368{bottom:608.606000px;} -.y68d{bottom:608.957000px;} -.y3d7{bottom:609.035000px;} -.y15a2{bottom:609.043000px;} +.yfa5{bottom:605.561000px;} +.y119b{bottom:605.603000px;} +.yc91{bottom:605.606000px;} +.ydbc{bottom:605.607000px;} +.y9dd{bottom:606.075000px;} +.yaf1{bottom:606.204000px;} +.y7ea{bottom:606.392000px;} +.yd95{bottom:606.541000px;} +.y745{bottom:606.754000px;} +.y133e{bottom:607.049000px;} +.yfec{bottom:607.205000px;} +.ya29{bottom:607.499000px;} +.yf3e{bottom:607.554000px;} +.y13d2{bottom:608.108000px;} +.yd58{bottom:608.315000px;} +.y704{bottom:608.384000px;} +.yb84{bottom:608.520000px;} +.yde2{bottom:608.599000px;} +.y1312{bottom:608.606000px;} +.y677{bottom:608.957000px;} +.y3cd{bottom:609.035000px;} +.y1544{bottom:609.043000px;} .y11{bottom:609.089000px;} -.y10fd{bottom:609.381000px;} -.yaa9{bottom:609.392000px;} -.yaf9{bottom:609.422000px;} -.y48e{bottom:609.491000px;} -.y26f{bottom:609.591000px;} -.y13b8{bottom:609.602000px;} -.y458{bottom:609.790000px;} -.y8ae{bottom:609.794000px;} -.ye6a{bottom:609.976000px;} -.yfaa{bottom:610.095000px;} -.y785{bottom:610.172000px;} -.y14e3{bottom:610.687000px;} -.yb6b{bottom:610.806000px;} -.y26e{bottom:611.085000px;} -.y2c5{bottom:611.152000px;} -.y34c{bottom:611.282000px;} -.y149{bottom:611.484000px;} -.y1f0{bottom:611.548000px;} -.yd13{bottom:611.583000px;} -.yccb{bottom:611.683000px;} -.ybf0{bottom:611.982000px;} -.y6ed{bottom:612.051000px;} -.yf27{bottom:612.170000px;} -.y88a{bottom:612.199000px;} -.y967{bottom:612.281000px;} -.yb48{bottom:612.300000px;} -.ye8c{bottom:612.655000px;} -.ya78{bottom:612.856000px;} -.yd67{bottom:613.133000px;} -.y14be{bottom:613.139000px;} -.yed5{bottom:613.172000px;} -.y4cd{bottom:613.177000px;} -.yd38{bottom:613.738000px;} -.y34a{bottom:613.755000px;} -.y9bc{bottom:613.818000px;} -.y9de{bottom:613.905000px;} -.y62f{bottom:613.974000px;} -.y4df{bottom:614.273000px;} -.y5bf{bottom:614.458000px;} -.yc9f{bottom:614.619000px;} -.y4cc{bottom:614.672000px;} -.y1f1{bottom:615.164000px;} -.y394{bottom:615.170000px;} -.y231{bottom:615.469000px;} -.y1050{bottom:615.778000px;} -.y5be{bottom:615.953000px;} -.y11b0{bottom:616.389000px;} -.yf51{bottom:616.464000px;} -.y393{bottom:616.664000px;} -.y53f{bottom:616.679000px;} -.y10b4{bottom:616.784000px;} -.y7aa{bottom:617.012000px;} -.y1013{bottom:617.116000px;} -.y514{bottom:617.306000px;} -.y34b{bottom:617.370000px;} -.y15a0{bottom:617.411000px;} +.y10b3{bottom:609.381000px;} +.ya7c{bottom:609.392000px;} +.yaca{bottom:609.422000px;} +.y481{bottom:609.491000px;} +.y268{bottom:609.591000px;} +.y1360{bottom:609.602000px;} +.y44c{bottom:609.790000px;} +.y88b{bottom:609.794000px;} +.ye2b{bottom:609.976000px;} +.yf67{bottom:610.095000px;} +.y76a{bottom:610.172000px;} +.y1487{bottom:610.687000px;} +.yb39{bottom:610.806000px;} +.y267{bottom:611.085000px;} +.y2be{bottom:611.152000px;} +.y344{bottom:611.282000px;} +.y147{bottom:611.484000px;} +.y1ea{bottom:611.548000px;} +.ycda{bottom:611.583000px;} +.yc92{bottom:611.683000px;} +.ybbc{bottom:611.982000px;} +.y6d6{bottom:612.051000px;} +.yee5{bottom:612.170000px;} +.y868{bottom:612.199000px;} +.y940{bottom:612.281000px;} +.yb17{bottom:612.300000px;} +.ye4d{bottom:612.655000px;} +.ya4b{bottom:612.856000px;} +.yd2d{bottom:613.133000px;} +.y1463{bottom:613.139000px;} +.ye95{bottom:613.172000px;} +.y4be{bottom:613.177000px;} +.ycff{bottom:613.738000px;} +.y342{bottom:613.755000px;} +.y993{bottom:613.818000px;} +.y9b4{bottom:613.905000px;} +.y61b{bottom:613.974000px;} +.y4d0{bottom:614.273000px;} +.y5ad{bottom:614.458000px;} +.yc67{bottom:614.619000px;} +.y4bd{bottom:614.672000px;} +.y1eb{bottom:615.164000px;} +.y38b{bottom:615.170000px;} +.y22a{bottom:615.469000px;} +.y1008{bottom:615.778000px;} +.y5ac{bottom:615.953000px;} +.y1162{bottom:616.389000px;} +.yf0f{bottom:616.464000px;} +.y38a{bottom:616.664000px;} +.y52e{bottom:616.679000px;} +.y106b{bottom:616.784000px;} +.y78e{bottom:617.012000px;} +.yfcc{bottom:617.116000px;} +.y504{bottom:617.306000px;} +.y343{bottom:617.370000px;} +.y1542{bottom:617.411000px;} .y5f{bottom:617.461000px;} -.y414{bottom:617.503000px;} -.yfea{bottom:617.517000px;} -.y11e9{bottom:617.558000px;} -.ydf7{bottom:617.562000px;} -.ya06{bottom:618.030000px;} -.y808{bottom:618.347000px;} -.y1296{bottom:618.388000px;} -.ydd0{bottom:618.496000px;} -.y75e{bottom:618.709000px;} -.y1394{bottom:619.004000px;} -.yd65{bottom:619.011000px;} -.ya54{bottom:619.454000px;} -.yf80{bottom:619.509000px;} -.y142a{bottom:620.063000px;} -.yc1b{bottom:620.209000px;} -.yd91{bottom:620.271000px;} -.y2c4{bottom:620.285000px;} -.y71b{bottom:620.339000px;} -.ybb7{bottom:620.475000px;} -.y1367{bottom:620.561000px;} -.yaa8{bottom:620.749000px;} -.y68c{bottom:620.913000px;} -.y3d5{bottom:620.990000px;} +.y409{bottom:617.503000px;} +.yfa4{bottom:617.517000px;} +.y119a{bottom:617.558000px;} +.ydbb{bottom:617.562000px;} +.y9dc{bottom:618.030000px;} +.y7e9{bottom:618.347000px;} +.y1246{bottom:618.388000px;} +.yd94{bottom:618.496000px;} +.y744{bottom:618.709000px;} +.y133d{bottom:619.004000px;} +.yd2b{bottom:619.011000px;} +.ya28{bottom:619.454000px;} +.yf3d{bottom:619.509000px;} +.y13d1{bottom:620.063000px;} +.ybe6{bottom:620.209000px;} +.yd57{bottom:620.271000px;} +.y2bd{bottom:620.285000px;} +.y703{bottom:620.339000px;} +.yb83{bottom:620.475000px;} +.y1311{bottom:620.561000px;} +.ya7b{bottom:620.749000px;} +.y676{bottom:620.913000px;} +.y3cb{bottom:620.990000px;} .y10{bottom:621.044000px;} -.y159e{bottom:621.247000px;} -.y10fc{bottom:621.336000px;} -.y48d{bottom:621.446000px;} -.y13b7{bottom:621.557000px;} -.y8ad{bottom:621.750000px;} -.ye69{bottom:621.931000px;} -.y26d{bottom:621.945000px;} -.yfa9{bottom:622.050000px;} -.yb6a{bottom:622.761000px;} -.y14e2{bottom:623.040000px;} -.y347{bottom:623.054000px;} -.y2c2{bottom:623.107000px;} -.y349{bottom:623.237000px;} -.y148{bottom:623.439000px;} -.y1ee{bottom:623.503000px;} -.ybed{bottom:623.837000px;} -.ybef{bottom:623.937000px;} -.y6ec{bottom:624.006000px;} -.ycc9{bottom:624.037000px;} -.yf26{bottom:624.125000px;} -.y889{bottom:624.154000px;} -.yc1{bottom:624.476000px;} -.y3d6{bottom:624.605000px;} -.y966{bottom:624.634000px;} -.yd66{bottom:625.088000px;} -.y14bd{bottom:625.094000px;} -.yed4{bottom:625.127000px;} -.y4cb{bottom:625.133000px;} -.ya77{bottom:625.210000px;} -.y159f{bottom:625.382000px;} -.yd37{bottom:625.693000px;} -.y345{bottom:625.710000px;} -.y9bb{bottom:625.773000px;} -.y4ca{bottom:626.627000px;} -.y2c3{bottom:626.722000px;} -.y1192{bottom:627.000000px;} -.y1ef{bottom:627.119000px;} -.y230{bottom:627.424000px;} -.y392{bottom:627.524000px;} -.y104f{bottom:627.733000px;} -.y13df{bottom:627.805000px;} -.y44b{bottom:628.121000px;} -.yf50{bottom:628.419000px;} -.y10b3{bottom:628.739000px;} -.y7a9{bottom:628.967000px;} -.y391{bottom:629.018000px;} -.y513{bottom:629.261000px;} -.y348{bottom:629.326000px;} -.yaf8{bottom:629.348000px;} +.y1540{bottom:621.247000px;} +.y10b2{bottom:621.336000px;} +.y480{bottom:621.446000px;} +.y135f{bottom:621.557000px;} +.y88a{bottom:621.750000px;} +.ye2a{bottom:621.931000px;} +.y266{bottom:621.945000px;} +.yf66{bottom:622.050000px;} +.yb38{bottom:622.761000px;} +.y1486{bottom:623.040000px;} +.y33f{bottom:623.054000px;} +.y2bb{bottom:623.107000px;} +.y341{bottom:623.237000px;} +.y146{bottom:623.439000px;} +.y1e8{bottom:623.503000px;} +.ybb9{bottom:623.837000px;} +.ybbb{bottom:623.937000px;} +.y6d5{bottom:624.006000px;} +.yc90{bottom:624.037000px;} +.yee4{bottom:624.125000px;} +.y867{bottom:624.154000px;} +.yc1{bottom:624.389000px;} +.y3cc{bottom:624.605000px;} +.y93f{bottom:624.634000px;} +.yd2c{bottom:625.088000px;} +.y1462{bottom:625.094000px;} +.ye94{bottom:625.127000px;} +.y4bc{bottom:625.133000px;} +.ya4a{bottom:625.210000px;} +.y1541{bottom:625.382000px;} +.ycfe{bottom:625.693000px;} +.y33d{bottom:625.710000px;} +.y992{bottom:625.773000px;} +.y4bb{bottom:626.627000px;} +.y2bc{bottom:626.722000px;} +.y1e9{bottom:627.119000px;} +.y229{bottom:627.424000px;} +.y389{bottom:627.524000px;} +.y1007{bottom:627.733000px;} +.y1386{bottom:627.805000px;} +.y43f{bottom:628.121000px;} +.yf0e{bottom:628.419000px;} +.y106a{bottom:628.739000px;} +.y78d{bottom:628.967000px;} +.y388{bottom:629.018000px;} +.y503{bottom:629.261000px;} +.y340{bottom:629.326000px;} +.yac9{bottom:629.348000px;} .y5e{bottom:629.416000px;} -.y413{bottom:629.458000px;} -.yfe9{bottom:629.472000px;} -.y11e8{bottom:629.513000px;} -.ydf6{bottom:629.517000px;} -.y121d{bottom:629.760000px;} -.ycc7{bottom:629.915000px;} -.y346{bottom:629.972000px;} -.ya05{bottom:629.985000px;} -.y807{bottom:630.302000px;} -.ydcf{bottom:630.451000px;} -.yb20{bottom:630.512000px;} -.y75d{bottom:630.665000px;} -.y1393{bottom:630.959000px;} -.y1167{bottom:631.409000px;} -.yf7f{bottom:631.464000px;} -.y1429{bottom:632.018000px;} -.yaa7{bottom:632.106000px;} -.yd90{bottom:632.226000px;} -.y71a{bottom:632.295000px;} -.yace{bottom:632.433000px;} -.ye44{bottom:632.569000px;} -.y68b{bottom:632.868000px;} -.y3d4{bottom:632.945000px;} -.y10fb{bottom:633.291000px;} -.y1366{bottom:633.512000px;} -.y8ac{bottom:633.705000px;} -.y159d{bottom:633.750000px;} -.ye68{bottom:633.886000px;} -.y784{bottom:634.083000px;} -.y26c{bottom:634.298000px;} -.y5bd{bottom:634.601000px;} -.y11af{bottom:634.720000px;} -.y2c1{bottom:635.062000px;} -.y147{bottom:635.394000px;} -.yb90{bottom:635.401000px;} -.y1ec{bottom:635.459000px;} -.yd11{bottom:635.792000px;} -.y26b{bottom:635.793000px;} -.ybee{bottom:635.892000px;} -.ycc8{bottom:635.992000px;} -.yc0{bottom:636.431000px;} -.y965{bottom:636.590000px;} -.yed3{bottom:637.082000px;} -.y4c9{bottom:637.088000px;} -.yd64{bottom:637.442000px;} -.ya76{bottom:637.564000px;} -.y159b{bottom:637.586000px;} -.yd36{bottom:637.648000px;} -.y9ba{bottom:637.728000px;} -.y53e{bottom:637.885000px;} -.yc1a{bottom:638.540000px;} -.y4c8{bottom:638.582000px;} -.y1ed{bottom:639.074000px;} -.y22f{bottom:639.379000px;} -.y390{bottom:639.877000px;} -.yf4f{bottom:640.374000px;} -.y7a8{bottom:640.922000px;} -.y511{bottom:641.216000px;} -.yaf7{bottom:641.303000px;} +.y408{bottom:629.458000px;} +.yfa3{bottom:629.472000px;} +.y1199{bottom:629.513000px;} +.ydba{bottom:629.517000px;} +.y11ce{bottom:629.760000px;} +.yc8e{bottom:629.915000px;} +.y33e{bottom:629.972000px;} +.y9db{bottom:629.985000px;} +.y7e8{bottom:630.302000px;} +.yd93{bottom:630.451000px;} +.yaf0{bottom:630.512000px;} +.y743{bottom:630.665000px;} +.y133c{bottom:630.959000px;} +.y111b{bottom:631.409000px;} +.yf3c{bottom:631.464000px;} +.y13d0{bottom:632.018000px;} +.ya7a{bottom:632.106000px;} +.yd56{bottom:632.226000px;} +.y702{bottom:632.295000px;} +.yaa0{bottom:632.433000px;} +.ye06{bottom:632.569000px;} +.y675{bottom:632.868000px;} +.y3ca{bottom:632.945000px;} +.y10b1{bottom:633.291000px;} +.y1310{bottom:633.512000px;} +.y889{bottom:633.705000px;} +.y153f{bottom:633.750000px;} +.ye29{bottom:633.886000px;} +.y769{bottom:634.083000px;} +.y265{bottom:634.298000px;} +.y5ab{bottom:634.601000px;} +.y1161{bottom:634.720000px;} +.y2ba{bottom:635.062000px;} +.y145{bottom:635.394000px;} +.yb5d{bottom:635.401000px;} +.y1e6{bottom:635.459000px;} +.ycd8{bottom:635.792000px;} +.y264{bottom:635.793000px;} +.ybba{bottom:635.892000px;} +.yc8f{bottom:635.992000px;} +.yc0{bottom:636.344000px;} +.y93e{bottom:636.590000px;} +.ye93{bottom:637.082000px;} +.y4ba{bottom:637.088000px;} +.yd2a{bottom:637.442000px;} +.ya49{bottom:637.564000px;} +.y153d{bottom:637.586000px;} +.ycfd{bottom:637.648000px;} +.y991{bottom:637.728000px;} +.y52d{bottom:637.885000px;} +.ybe5{bottom:638.540000px;} +.y4b9{bottom:638.582000px;} +.y1e7{bottom:639.074000px;} +.y228{bottom:639.379000px;} +.y387{bottom:639.877000px;} +.yf0d{bottom:640.374000px;} +.y78c{bottom:640.922000px;} +.y501{bottom:641.216000px;} +.yac8{bottom:641.303000px;} .y5d{bottom:641.372000px;} -.yfe8{bottom:641.427000px;} -.y11e7{bottom:641.468000px;} -.ydf5{bottom:641.472000px;} -.y121c{bottom:641.715000px;} -.y159c{bottom:641.720000px;} -.yc9e{bottom:642.163000px;} -.y3d3{bottom:642.243000px;} -.y806{bottom:642.257000px;} -.y6eb{bottom:642.396000px;} -.ydce{bottom:642.407000px;} -.y1391{bottom:642.914000px;} -.y14bb{bottom:643.139000px;} -.yd62{bottom:643.320000px;} +.yfa2{bottom:641.427000px;} +.y1198{bottom:641.468000px;} +.ydb9{bottom:641.472000px;} +.y11cd{bottom:641.715000px;} +.y153e{bottom:641.720000px;} +.yc66{bottom:642.163000px;} +.y3c9{bottom:642.243000px;} +.y7e7{bottom:642.257000px;} +.y6d4{bottom:642.396000px;} +.yd92{bottom:642.407000px;} +.y133a{bottom:642.914000px;} +.y1460{bottom:643.139000px;} +.yd28{bottom:643.320000px;} .y1c{bottom:643.364000px;} -.y1012{bottom:643.419000px;} -.yf7e{bottom:643.420000px;} -.yaa6{bottom:643.464000px;} -.yfa8{bottom:643.871000px;} -.y1428{bottom:643.973000px;} -.y719{bottom:644.250000px;} -.yacd{bottom:644.388000px;} -.y32c{bottom:644.429000px;} -.ye43{bottom:644.524000px;} -.y68a{bottom:644.823000px;} -.y512{bottom:644.832000px;} -.y3d1{bottom:644.900000px;} -.y10fa{bottom:645.246000px;} -.y1365{bottom:645.467000px;} -.y13d6{bottom:646.136000px;} -.yb69{bottom:646.242000px;} -.y1392{bottom:646.530000px;} -.y26a{bottom:646.652000px;} -.y14bc{bottom:646.755000px;} -.y2c0{bottom:647.017000px;} -.yc8a{bottom:647.349000px;} -.y1eb{bottom:647.414000px;} -.y14e1{bottom:647.748000px;} -.yd12{bottom:647.847000px;} -.y269{bottom:648.146000px;} -.ybec{bottom:648.246000px;} -.yea{bottom:648.345000px;} -.ybf{bottom:648.386000px;} -.y964{bottom:648.943000px;} -.y4c7{bottom:649.043000px;} -.y3d2{bottom:649.162000px;} -.ye4{bottom:649.342000px;} -.yd63{bottom:649.397000px;} -.yd35{bottom:649.603000px;} -.y53d{bottom:649.840000px;} -.y159a{bottom:650.089000px;} -.y4c6{bottom:650.537000px;} -.y4de{bottom:650.936000px;} +.yfcb{bottom:643.419000px;} +.yf3b{bottom:643.420000px;} +.ya79{bottom:643.464000px;} +.yf65{bottom:643.871000px;} +.y13cf{bottom:643.973000px;} +.y701{bottom:644.250000px;} +.ya9f{bottom:644.388000px;} +.y324{bottom:644.429000px;} +.ye05{bottom:644.524000px;} +.y674{bottom:644.823000px;} +.y502{bottom:644.832000px;} +.y3c7{bottom:644.900000px;} +.y10b0{bottom:645.246000px;} +.y130f{bottom:645.467000px;} +.y137d{bottom:646.136000px;} +.yb37{bottom:646.242000px;} +.y133b{bottom:646.530000px;} +.y263{bottom:646.652000px;} +.y1461{bottom:646.755000px;} +.y2b9{bottom:647.017000px;} +.yc51{bottom:647.349000px;} +.y1e5{bottom:647.414000px;} +.y1485{bottom:647.748000px;} +.ycd9{bottom:647.847000px;} +.y262{bottom:648.146000px;} +.ybb8{bottom:648.246000px;} +.ybf{bottom:648.300000px;} +.yed{bottom:648.345000px;} +.y93d{bottom:648.943000px;} +.y4b8{bottom:649.043000px;} +.y3c8{bottom:649.162000px;} +.yd29{bottom:649.397000px;} +.ycfc{bottom:649.603000px;} +.y52c{bottom:649.840000px;} +.y153c{bottom:650.089000px;} +.y4b7{bottom:650.537000px;} +.y4cf{bottom:650.936000px;} .y8b{bottom:651.334000px;} -.y38f{bottom:652.231000px;} -.ya75{bottom:652.308000px;} -.y5bc{bottom:652.394000px;} -.y7a7{bottom:652.877000px;} -.y510{bottom:653.172000px;} -.yaf6{bottom:653.258000px;} +.y386{bottom:652.231000px;} +.ya48{bottom:652.308000px;} +.y5aa{bottom:652.394000px;} +.y78b{bottom:652.877000px;} +.y500{bottom:653.172000px;} +.yac7{bottom:653.258000px;} .y5c{bottom:653.327000px;} -.yfe7{bottom:653.382000px;} -.y888{bottom:653.424000px;} -.y121b{bottom:653.670000px;} -.y38e{bottom:653.725000px;} -.y5bb{bottom:653.888000px;} -.y1598{bottom:653.925000px;} -.yc9d{bottom:654.118000px;} -.y805{bottom:654.212000px;} -.ycc5{bottom:654.223000px;} -.y783{bottom:654.664000px;} -.ya04{bottom:654.786000px;} -.yaa5{bottom:654.821000px;} -.y1390{bottom:654.870000px;} -.y48c{bottom:654.921000px;} -.y117a{bottom:654.950000px;} -.y146{bottom:655.319000px;} -.yf7d{bottom:655.375000px;} -.y9b9{bottom:656.118000px;} -.y8f3{bottom:656.205000px;} -.y689{bottom:656.778000px;} -.y3d0{bottom:656.855000px;} -.y10f9{bottom:657.201000px;} -.y1364{bottom:657.423000px;} -.y1599{bottom:658.059000px;} -.y2bf{bottom:658.972000px;} -.y268{bottom:659.006000px;} -.y1427{bottom:659.061000px;} -.ya53{bottom:659.304000px;} -.y1e9{bottom:659.369000px;} -.ybe9{bottom:660.101000px;} -.ybeb{bottom:660.201000px;} -.ycc6{bottom:660.301000px;} -.ybe{bottom:660.342000px;} -.y267{bottom:660.500000px;} -.y963{bottom:660.898000px;} -.y4c5{bottom:660.998000px;} -.ye3{bottom:661.297000px;} +.yfa1{bottom:653.382000px;} +.y866{bottom:653.424000px;} +.y11cc{bottom:653.670000px;} +.y385{bottom:653.725000px;} +.y5a9{bottom:653.888000px;} +.y153a{bottom:653.925000px;} +.yc65{bottom:654.118000px;} +.y7e6{bottom:654.212000px;} +.yc8c{bottom:654.223000px;} +.y768{bottom:654.664000px;} +.y9da{bottom:654.786000px;} +.ya78{bottom:654.821000px;} +.y1339{bottom:654.870000px;} +.y47f{bottom:654.921000px;} +.y112e{bottom:654.950000px;} +.y144{bottom:655.319000px;} +.yf3a{bottom:655.375000px;} +.y990{bottom:656.118000px;} +.y8ce{bottom:656.205000px;} +.y673{bottom:656.778000px;} +.y3c6{bottom:656.855000px;} +.y10af{bottom:657.201000px;} +.y130e{bottom:657.423000px;} +.y153b{bottom:658.059000px;} +.y2b8{bottom:658.972000px;} +.y261{bottom:659.006000px;} +.y13ce{bottom:659.061000px;} +.ya27{bottom:659.304000px;} +.y1e3{bottom:659.369000px;} +.ybb5{bottom:660.101000px;} +.ybb7{bottom:660.201000px;} +.ybe{bottom:660.255000px;} +.yc8d{bottom:660.301000px;} +.y260{bottom:660.500000px;} +.y93c{bottom:660.898000px;} +.y4b6{bottom:660.998000px;} .yf{bottom:661.346000px;} -.yd61{bottom:661.751000px;} -.y4dd{bottom:661.795000px;} -.y14ba{bottom:662.125000px;} -.y4c4{bottom:662.492000px;} -.y1ea{bottom:662.984000px;} -.yd8f{bottom:663.221000px;} +.yd27{bottom:661.751000px;} +.y4ce{bottom:661.795000px;} +.y145f{bottom:662.125000px;} +.y4b5{bottom:662.492000px;} +.y1e4{bottom:662.984000px;} +.yd55{bottom:663.221000px;} .y8a{bottom:663.289000px;} -.ya74{bottom:664.264000px;} -.y38d{bottom:664.585000px;} -.y50f{bottom:665.127000px;} -.yaf5{bottom:665.213000px;} +.ya47{bottom:664.264000px;} +.y384{bottom:664.585000px;} +.y4ff{bottom:665.127000px;} +.yac6{bottom:665.213000px;} .y5b{bottom:665.282000px;} -.yfe6{bottom:665.337000px;} -.y887{bottom:665.379000px;} -.y121a{bottom:665.625000px;} -.yc9c{bottom:666.073000px;} -.y38c{bottom:666.079000px;} -.y804{bottom:666.167000px;} -.yaa4{bottom:666.179000px;} -.y6ea{bottom:666.209000px;} -.ye42{bottom:666.345000px;} -.y1597{bottom:666.428000px;} -.y782{bottom:666.619000px;} -.ya03{bottom:666.741000px;} -.y138f{bottom:666.825000px;} -.y48b{bottom:666.876000px;} -.yb8f{bottom:666.905000px;} -.y145{bottom:667.274000px;} -.y1011{bottom:667.330000px;} -.y10d{bottom:667.394000px;} -.yd5f{bottom:667.629000px;} -.yf4e{bottom:667.696000px;} -.yd34{bottom:667.993000px;} -.y8f2{bottom:668.160000px;} -.y688{bottom:668.733000px;} -.y3cf{bottom:668.810000px;} -.yed2{bottom:668.907000px;} -.y1363{bottom:669.378000px;} -.y1595{bottom:670.263000px;} -.y2be{bottom:670.927000px;} -.y7d2{bottom:671.260000px;} -.y7a6{bottom:671.266000px;} -.y266{bottom:671.359000px;} -.y5ba{bottom:671.680000px;} -.ybea{bottom:672.156000px;} -.ycc4{bottom:672.654000px;} -.y265{bottom:672.854000px;} -.y5b9{bottom:673.175000px;} -.ye2{bottom:673.252000px;} +.yfa0{bottom:665.337000px;} +.y865{bottom:665.379000px;} +.y11cb{bottom:665.625000px;} +.yc64{bottom:666.073000px;} +.y383{bottom:666.079000px;} +.y7e5{bottom:666.167000px;} +.ya77{bottom:666.179000px;} +.y6d3{bottom:666.209000px;} +.ye04{bottom:666.345000px;} +.y1539{bottom:666.428000px;} +.y767{bottom:666.619000px;} +.y9d9{bottom:666.741000px;} +.y1338{bottom:666.825000px;} +.y47e{bottom:666.876000px;} +.yb5c{bottom:666.905000px;} +.ye5{bottom:667.274000px;} +.yfca{bottom:667.330000px;} +.y10e{bottom:667.394000px;} +.yd25{bottom:667.629000px;} +.yf0c{bottom:667.696000px;} +.ycfb{bottom:667.993000px;} +.y8cd{bottom:668.160000px;} +.y672{bottom:668.733000px;} +.y3c5{bottom:668.810000px;} +.ye92{bottom:668.907000px;} +.y130d{bottom:669.378000px;} +.y1537{bottom:670.263000px;} +.y2b7{bottom:670.927000px;} +.y7b4{bottom:671.260000px;} +.y78a{bottom:671.266000px;} +.y25f{bottom:671.359000px;} +.y5a8{bottom:671.680000px;} +.ybb6{bottom:672.156000px;} +.yc8b{bottom:672.654000px;} +.y25e{bottom:672.854000px;} +.y5a7{bottom:673.175000px;} +.y93b{bottom:673.252000px;} .ye{bottom:673.301000px;} -.yd60{bottom:673.706000px;} -.y4dc{bottom:673.750000px;} -.y1596{bottom:674.398000px;} -.y4c3{bottom:674.846000px;} +.yd26{bottom:673.706000px;} +.y4cd{bottom:673.750000px;} +.y1538{bottom:674.398000px;} +.y4b4{bottom:674.846000px;} .y89{bottom:675.245000px;} -.y1e8{bottom:675.883000px;} -.y50e{bottom:677.082000px;} +.y1e2{bottom:675.883000px;} +.y4fe{bottom:677.082000px;} .y5a{bottom:677.237000px;} -.yfe5{bottom:677.292000px;} -.y886{bottom:677.334000px;} -.yaa3{bottom:677.536000px;} -.y1219{bottom:677.581000px;} -.y3ce{bottom:678.109000px;} -.y803{bottom:678.123000px;} -.y38b{bottom:678.433000px;} -.ycc3{bottom:678.532000px;} -.y781{bottom:678.574000px;} -.ya02{bottom:678.696000px;} -.y743{bottom:678.860000px;} -.yb1f{bottom:679.130000px;} -.y144{bottom:679.230000px;} -.y1010{bottom:679.285000px;} -.y10c{bottom:679.349000px;} -.yf4d{bottom:679.651000px;} -.ybd{bottom:679.748000px;} -.y2bb{bottom:679.877000px;} -.y2bd{bottom:680.061000px;} -.y8f1{bottom:680.115000px;} -.y1e5{bottom:680.295000px;} -.y3cc{bottom:680.766000px;} -.yed1{bottom:680.862000px;} -.y14b9{bottom:681.110000px;} -.y1362{bottom:681.333000px;} -.y1594{bottom:682.766000px;} -.y2b9{bottom:682.883000px;} -.y861{bottom:683.215000px;} -.y264{bottom:683.713000px;} -.y389{bottom:684.410000px;} -.ybe7{bottom:684.510000px;} -.ybe8{bottom:684.609000px;} -.yfa7{bottom:684.706000px;} -.y3cd{bottom:685.027000px;} -.y263{bottom:685.207000px;} -.y138e{bottom:685.214000px;} +.yf9f{bottom:677.292000px;} +.y864{bottom:677.334000px;} +.ya76{bottom:677.536000px;} +.y11ca{bottom:677.581000px;} +.y3c4{bottom:678.109000px;} +.y7e4{bottom:678.123000px;} +.y382{bottom:678.433000px;} +.yc8a{bottom:678.532000px;} +.y766{bottom:678.574000px;} +.y9d8{bottom:678.696000px;} +.y72a{bottom:678.860000px;} +.yaef{bottom:679.130000px;} +.ye4{bottom:679.230000px;} +.yfc9{bottom:679.285000px;} +.y10d{bottom:679.349000px;} +.yf0b{bottom:679.651000px;} +.ybd{bottom:679.705000px;} +.y2b4{bottom:679.877000px;} +.y2b6{bottom:680.061000px;} +.y8cc{bottom:680.115000px;} +.y1df{bottom:680.295000px;} +.y3c2{bottom:680.766000px;} +.ye91{bottom:680.862000px;} +.y145e{bottom:681.110000px;} +.y130c{bottom:681.333000px;} +.y1536{bottom:682.766000px;} +.y2b2{bottom:682.883000px;} +.y83f{bottom:683.215000px;} +.y25d{bottom:683.713000px;} +.y380{bottom:684.410000px;} +.ybb3{bottom:684.510000px;} +.ybb4{bottom:684.609000px;} +.yf64{bottom:684.706000px;} +.y3c3{bottom:685.027000px;} +.y25c{bottom:685.207000px;} +.y1337{bottom:685.214000px;} .yd{bottom:685.256000px;} -.y1e7{bottom:685.375000px;} -.y22d{bottom:685.705000px;} -.y2bc{bottom:686.498000px;} -.y1592{bottom:686.602000px;} -.y2ba{bottom:687.144000px;} +.y1e1{bottom:685.375000px;} +.y226{bottom:685.705000px;} +.y2b5{bottom:686.498000px;} +.y1534{bottom:686.602000px;} +.y2b3{bottom:687.144000px;} .y88{bottom:687.200000px;} -.y48a{bottom:687.299000px;} -.y4db{bottom:687.598000px;} -.yd5e{bottom:688.451000px;} -.y489{bottom:688.794000px;} -.yaa2{bottom:688.893000px;} +.y47d{bottom:687.299000px;} +.y4cc{bottom:687.598000px;} +.yd24{bottom:688.451000px;} +.y47c{bottom:688.794000px;} +.ya75{bottom:688.893000px;} .y59{bottom:689.192000px;} -.yfe4{bottom:689.248000px;} -.y885{bottom:689.289000px;} -.y1218{bottom:689.536000px;} -.y802{bottom:690.078000px;} -.y38a{bottom:690.388000px;} -.y1e2{bottom:690.555000px;} -.ya01{bottom:690.651000px;} -.y1593{bottom:690.736000px;} -.y22e{bottom:690.815000px;} -.y7d1{bottom:691.185000px;} -.ybc{bottom:691.703000px;} -.y1e1{bottom:692.050000px;} -.y9b8{bottom:692.278000px;} -.y5b8{bottom:692.462000px;} -.y3cb{bottom:692.721000px;} -.y1361{bottom:693.288000px;} -.y2b8{bottom:694.838000px;} -.y50d{bottom:695.471000px;} -.y262{bottom:696.067000px;} -.y1e6{bottom:696.163000px;} -.ybe5{bottom:696.963000px;} -.ybe6{bottom:697.063000px;} -.y261{bottom:697.561000px;} -.y4c2{bottom:697.661000px;} -.y4da{bottom:698.458000px;} -.y1591{bottom:699.105000px;} +.yf9e{bottom:689.248000px;} +.y863{bottom:689.289000px;} +.y11c9{bottom:689.536000px;} +.y7e3{bottom:690.078000px;} +.y381{bottom:690.388000px;} +.y1dc{bottom:690.555000px;} +.y9d7{bottom:690.651000px;} +.y1535{bottom:690.736000px;} +.y227{bottom:690.815000px;} +.ye3{bottom:691.185000px;} +.ybc{bottom:691.660000px;} +.y1db{bottom:692.050000px;} +.y98f{bottom:692.278000px;} +.y5a6{bottom:692.462000px;} +.y3c1{bottom:692.721000px;} +.y130b{bottom:693.288000px;} +.y2b1{bottom:694.838000px;} +.y4fd{bottom:695.471000px;} +.y25b{bottom:696.067000px;} +.y1e0{bottom:696.163000px;} +.ybb1{bottom:696.963000px;} +.ybb2{bottom:697.063000px;} +.y25a{bottom:697.561000px;} +.y4b3{bottom:697.661000px;} +.y4cb{bottom:698.458000px;} +.y1533{bottom:699.105000px;} .y87{bottom:699.155000px;} -.yed0{bottom:699.252000px;} -.y488{bottom:699.255000px;} -.y4d9{bottom:699.952000px;} -.yaa1{bottom:700.251000px;} -.y487{bottom:700.749000px;} +.ye90{bottom:699.252000px;} +.y47b{bottom:699.255000px;} +.y4ca{bottom:699.952000px;} +.ya74{bottom:700.251000px;} +.y47a{bottom:700.749000px;} .y58{bottom:701.147000px;} -.yfe3{bottom:701.203000px;} -.y884{bottom:701.244000px;} -.y1e4{bottom:701.514000px;} -.y801{bottom:702.033000px;} -.ya00{bottom:702.606000px;} -.y412{bottom:702.770000px;} -.y7d0{bottom:703.140000px;} -.yb1e{bottom:703.439000px;} -.y9b7{bottom:704.233000px;} -.y5b7{bottom:704.417000px;} -.y1e3{bottom:704.503000px;} -.y3ca{bottom:704.676000px;} -.y1360{bottom:705.243000px;} -.y2b7{bottom:706.538000px;} -.y158f{bottom:707.623000px;} -.y1590{bottom:707.773000px;} -.y13b6{bottom:708.376000px;} -.ybe4{bottom:709.416000px;} -.y962{bottom:709.516000px;} -.y4d8{bottom:710.413000px;} +.yf9d{bottom:701.203000px;} +.y862{bottom:701.244000px;} +.y1de{bottom:701.514000px;} +.y7e2{bottom:702.033000px;} +.y9d6{bottom:702.606000px;} +.y407{bottom:702.770000px;} +.y7b3{bottom:703.140000px;} +.yaee{bottom:703.439000px;} +.y98e{bottom:704.233000px;} +.y5a5{bottom:704.417000px;} +.y1dd{bottom:704.503000px;} +.y3c0{bottom:704.676000px;} +.y130a{bottom:705.243000px;} +.y2b0{bottom:706.538000px;} +.y1531{bottom:707.623000px;} +.y1532{bottom:707.773000px;} +.y135e{bottom:708.376000px;} +.ybb0{bottom:709.416000px;} +.y93a{bottom:709.516000px;} +.y4c9{bottom:710.413000px;} .y86{bottom:711.110000px;} -.y486{bottom:711.210000px;} -.y4c1{bottom:711.509000px;} -.y4d7{bottom:711.907000px;} -.y260{bottom:712.306000px;} -.y485{bottom:712.704000px;} -.yfe2{bottom:713.158000px;} -.y800{bottom:713.988000px;} -.yaa0{bottom:713.999000px;} -.y9ff{bottom:714.561000px;} -.y1166{bottom:714.725000px;} -.y2b4{bottom:715.488000px;} -.y2b6{bottom:715.672000px;} -.y158d{bottom:716.141000px;} -.y9b6{bottom:716.188000px;} -.y158e{bottom:716.291000px;} -.y25e{bottom:718.283000px;} -.y2b2{bottom:718.494000px;} -.ya9e{bottom:719.479000px;} -.y135f{bottom:720.331000px;} -.y62e{bottom:721.571000px;} -.y2b5{bottom:722.109000px;} -.y2b3{bottom:722.755000px;} +.y479{bottom:711.210000px;} +.y4b2{bottom:711.509000px;} +.y4c8{bottom:711.907000px;} +.y259{bottom:712.306000px;} +.y478{bottom:712.704000px;} +.yf9c{bottom:713.158000px;} +.y7e1{bottom:713.988000px;} +.ya73{bottom:713.999000px;} +.y9d5{bottom:714.561000px;} +.y111a{bottom:714.725000px;} +.y2ad{bottom:715.488000px;} +.y2af{bottom:715.672000px;} +.y152f{bottom:716.141000px;} +.y98d{bottom:716.188000px;} +.y1530{bottom:716.291000px;} +.y257{bottom:718.283000px;} +.y2ab{bottom:718.494000px;} +.ya71{bottom:719.479000px;} +.y1309{bottom:720.331000px;} +.y61a{bottom:721.571000px;} +.y2ae{bottom:722.109000px;} +.y2ac{bottom:722.755000px;} .y57{bottom:723.065000px;} -.y4c0{bottom:723.862000px;} -.y25f{bottom:724.261000px;} -.y484{bottom:724.659000px;} -.ya9f{bottom:724.958000px;} +.y4b1{bottom:723.862000px;} +.y258{bottom:724.261000px;} +.y477{bottom:724.659000px;} +.ya72{bottom:724.958000px;} .yc{bottom:725.558000px;} -.y718{bottom:726.681000px;} -.y158c{bottom:727.050000px;} -.y1bf{bottom:757.500000px;} -.y10b{bottom:761.521000px;} -.h27{height:0.500000px;} -.h2e{height:11.138187px;} -.h2a{height:13.310034px;} -.h39{height:13.489360px;} -.h8a{height:14.102815px;} -.h8f{height:14.691723px;} -.h54{height:15.279280px;} -.h1e{height:16.163430px;} -.h2c{height:16.580667px;} -.h52{height:16.976978px;} -.h38{height:17.112559px;} -.h65{height:17.182501px;} -.h8e{height:17.246805px;} -.h86{height:17.387497px;} -.h33{height:17.571774px;} -.h26{height:17.744265px;} -.h1d{height:17.806888px;} -.he1{height:18.137651px;} -.h44{height:18.197416px;} -.h59{height:18.445267px;} -.h41{height:18.754477px;} -.ha0{height:19.099331px;} -.hda{height:19.132928px;} -.hf7{height:19.137349px;} -.hfe{height:19.245049px;} +.y700{bottom:726.681000px;} +.y152e{bottom:727.050000px;} +.y10c{bottom:761.521000px;} +.h26{height:11.138187px;} +.h24{height:13.310034px;} +.h2f{height:13.489360px;} +.h64{height:14.102815px;} +.h67{height:14.691723px;} +.h41{height:15.279280px;} +.h1d{height:16.163430px;} +.h25{height:16.580667px;} +.h3f{height:16.976978px;} +.h2e{height:17.112559px;} +.h50{height:17.182501px;} +.h66{height:17.246805px;} +.h61{height:17.387497px;} +.h2a{height:17.571774px;} +.h23{height:17.744265px;} +.h1c{height:17.806888px;} +.h90{height:18.137651px;} +.h36{height:18.197416px;} +.h45{height:18.445267px;} +.h33{height:18.754477px;} +.h6b{height:19.099331px;} +.h89{height:19.132928px;} +.h9d{height:19.137349px;} +.h9f{height:19.245049px;} .hc{height:19.359269px;} -.h5d{height:19.637673px;} -.hb7{height:19.666131px;} -.hea{height:19.678395px;} -.ha2{height:19.800445px;} -.hb3{height:19.877176px;} -.h28{height:20.500000px;} -.h1c{height:20.774703px;} -.hfd{height:20.797964px;} -.h12{height:20.921400px;} -.h6f{height:20.925961px;} -.hf6{height:21.051085px;} -.h88{height:21.079429px;} -.h87{height:21.154221px;} -.h85{height:21.251385px;} -.h8d{height:21.510666px;} -.h83{height:22.037584px;} -.he3{height:22.044222px;} -.h47{height:22.124998px;} -.h14{height:22.129667px;} -.h76{height:22.180663px;} -.h84{height:22.217356px;} -.h5f{height:22.620611px;} -.h53{height:22.918919px;} -.hc8{height:23.087447px;} -.h4a{height:23.228999px;} -.hdc{height:23.253866px;} -.hee{height:23.277691px;} -.hcd{height:23.402398px;} -.hc0{height:23.425426px;} -.h5e{height:23.565208px;} -.h1f{height:23.910300px;} -.hec{height:23.916818px;} -.hc9{height:24.207724px;} -.hdd{height:24.382218px;} -.hb4{height:24.535888px;} -.hcf{height:24.537958px;} -.hd8{height:24.574160px;} -.hd5{height:24.899628px;} -.h5a{height:24.901109px;} -.he4{height:25.193302px;} -.he2{height:25.193398px;} -.h6e{height:25.313380px;} -.h78{height:25.349331px;} -.h51{height:25.465465px;} -.h23{height:25.549494px;} -.h37{height:25.668837px;} -.h64{height:25.773750px;} -.h77{height:25.776463px;} -.h6d{height:25.933448px;} -.h66{height:25.984000px;} -.hd7{height:26.210133px;} -.h36{height:26.297612px;} -.hb6{height:26.340884px;} -.ha1{height:26.357076px;} -.h32{height:26.357659px;} -.hc7{height:26.385656px;} -.h79{height:26.407875px;} -.h61{height:26.510858px;} -.hdb{height:26.575849px;} -.h24{height:26.616396px;} -.h45{height:26.624278px;} -.h6c{height:26.633040px;} -.hd4{height:26.651769px;} -.hce{height:26.745600px;} -.h11{height:26.801147px;} -.h25{height:26.833520px;} -.h4e{height:26.899200px;} -.h31{height:27.022777px;} -.h43{height:27.296123px;} -.hd6{height:27.304622px;} -.h4b{height:27.328235px;} -.heb{height:27.333508px;} -.h40{height:27.379953px;} -.h9e{height:27.500617px;} +.h49{height:19.637673px;} +.h73{height:19.666131px;} +.h96{height:19.678395px;} +.h6d{height:19.800445px;} +.h6f{height:19.877176px;} +.h1b{height:20.774703px;} +.h9e{height:20.797964px;} +.h11{height:20.921400px;} +.h57{height:20.925961px;} +.h9c{height:21.051085px;} +.h63{height:21.079429px;} +.h62{height:21.154221px;} +.h60{height:21.251385px;} +.h65{height:21.510666px;} +.h5e{height:22.037584px;} +.h92{height:22.044222px;} +.h38{height:22.124998px;} +.h13{height:22.129667px;} +.h59{height:22.180663px;} +.h5f{height:22.217356px;} +.h4b{height:22.620611px;} +.h40{height:22.918919px;} +.h79{height:23.087447px;} +.h3a{height:23.228999px;} +.h8b{height:23.253866px;} +.h9a{height:23.277691px;} +.h7e{height:23.402398px;} +.h75{height:23.425426px;} +.h4a{height:23.565208px;} +.h1e{height:23.910300px;} +.h98{height:23.916818px;} +.h7a{height:24.207724px;} +.h8c{height:24.382218px;} +.h70{height:24.535888px;} +.h80{height:24.537958px;} +.h87{height:24.574160px;} +.h84{height:24.899628px;} +.h46{height:24.901109px;} +.h93{height:25.193302px;} +.h91{height:25.193398px;} +.h56{height:25.313380px;} +.h5b{height:25.349331px;} +.h3e{height:25.465465px;} +.h20{height:25.549494px;} +.h2d{height:25.668837px;} +.h4f{height:25.773750px;} +.h5a{height:25.776463px;} +.h55{height:25.933448px;} +.h51{height:25.984000px;} +.h86{height:26.210133px;} +.h2c{height:26.297612px;} +.h72{height:26.340884px;} +.h6c{height:26.357076px;} +.h29{height:26.357659px;} +.h78{height:26.385656px;} +.h5c{height:26.407875px;} +.h4d{height:26.510858px;} +.h8a{height:26.575849px;} +.h21{height:26.616396px;} +.h37{height:26.624278px;} +.h54{height:26.633040px;} +.h83{height:26.651769px;} +.h7f{height:26.745600px;} +.h10{height:26.801147px;} +.h22{height:26.833520px;} +.h3c{height:26.899200px;} +.h28{height:27.022777px;} +.h35{height:27.296123px;} +.h85{height:27.304622px;} +.h3b{height:27.328235px;} +.h97{height:27.333508px;} +.h32{height:27.379953px;} +.h69{height:27.500617px;} .h9{height:27.656178px;} -.h57{height:27.667899px;} -.h58{height:27.893600px;} -.h3f{height:28.131715px;} -.h60{height:28.275762px;} -.he0{height:28.342572px;} -.h9f{height:28.648995px;} -.hcc{height:28.882708px;} -.h5c{height:29.456508px;} -.hca{height:29.683862px;} +.h43{height:27.667899px;} +.h44{height:27.893600px;} +.h31{height:28.131715px;} +.h4c{height:28.275762px;} +.h8f{height:28.342572px;} +.h6a{height:28.648995px;} +.h7d{height:28.882708px;} +.h48{height:29.456508px;} +.h7b{height:29.683862px;} .h8{height:29.887800px;} -.hde{height:29.897829px;} -.hd0{height:30.088799px;} -.he5{height:30.614761px;} +.h8d{height:29.897829px;} +.h81{height:30.088799px;} +.h94{height:30.614761px;} .h7{height:30.804359px;} -.h6b{height:31.120138px;} -.hc1{height:31.376098px;} -.hed{height:33.215401px;} +.h53{height:31.120138px;} +.h76{height:31.376098px;} +.h99{height:33.215401px;} .h6{height:35.865500px;} .hb{height:35.865600px;} .h5{height:42.679277px;} -.h1b{height:42.750060px;} +.h1a{height:42.750060px;} .he{height:43.038600px;} -.h49{height:44.387200px;} -.h1a{height:53.572860px;} -.h13{height:54.925710px;} +.h39{height:44.387200px;} +.h19{height:53.572860px;} +.h12{height:54.925710px;} .hd{height:61.987500px;} .h4{height:64.018912px;} -.h19{height:64.666230px;} -.h16{height:65.748510px;} -.h18{height:66.019080px;} -.h17{height:66.289650px;} +.h18{height:64.666230px;} +.h15{height:65.748510px;} +.h17{height:66.019080px;} +.h16{height:66.289650px;} .ha{height:74.361300px;} .h3{height:77.356189px;} -.hf5{height:86.892120px;} -.hcb{height:87.873020px;} -.hc6{height:87.877960px;} -.h35{height:88.599230px;} -.h9d{height:94.487690px;} -.h10{height:98.308560px;} -.hdf{height:99.214500px;} -.he7{height:100.500000px;} -.h3e{height:104.907500px;} -.h5b{height:110.832700px;} -.h15{height:119.050800px;} -.h30{height:129.266280px;} -.he9{height:130.401200px;} -.hc4{height:131.000000px;} -.hb2{height:141.732900px;} -.hb5{height:141.736100px;} -.hd9{height:141.737850px;} -.h56{height:155.905300px;} -.hb8{height:156.000000px;} -.hf9{height:158.000000px;} -.h82{height:170.080070px;} -.h50{height:170.084950px;} -.hbf{height:170.085020px;} -.h42{height:178.310540px;} -.hbe{height:179.000000px;} -.hb1{height:182.500000px;} -.h67{height:208.500000px;} -.haa{height:236.000000px;} -.h92{height:239.000000px;} -.hf3{height:251.500000px;} -.hd3{height:255.119640px;} -.h6a{height:260.205000px;} -.h22{height:269.293540px;} -.h34{height:276.500000px;} -.h75{height:283.466790px;} -.hc2{height:284.500000px;} -.h7b{height:296.000000px;} -.hfc{height:299.000000px;} -.h93{height:312.500000px;} -.h63{height:314.592000px;} -.hf1{height:349.500000px;} -.hb0{height:369.000000px;} -.h3b{height:370.000000px;} -.h73{height:381.000000px;} -.he6{height:391.500000px;} -.h89{height:399.500000px;} -.ha6{height:428.500000px;} -.hf2{height:443.000000px;} -.hb9{height:454.000000px;} -.h7a{height:456.500000px;} -.h81{height:465.500000px;} -.hc5{height:471.500000px;} -.h91{height:477.500000px;} -.h2f{height:478.000000px;} -.h3d{height:482.500000px;} -.hfa{height:486.000000px;} -.h9b{height:501.500000px;} -.h7f{height:505.500000px;} -.hf0{height:509.000000px;} -.hba{height:511.000000px;} -.h74{height:522.000000px;} -.h7d{height:523.500000px;} -.h4f{height:528.000000px;} -.h98{height:531.000000px;} -.hbc{height:541.000000px;} -.h2d{height:549.500000px;} -.h94{height:553.000000px;} -.h71{height:553.500000px;} -.haf{height:554.500000px;} -.h72{height:555.000000px;} -.ha5{height:562.000000px;} -.hfb{height:568.000000px;} -.h3a{height:575.500000px;} -.hc3{height:578.500000px;} -.hbd{height:579.000000px;} -.h62{height:579.500000px;} -.ha4{height:583.000000px;} -.h95{height:588.500000px;} -.h7e{height:590.000000px;} -.h55{height:590.500000px;} -.ha9{height:595.000000px;} -.ha7{height:596.000000px;} -.had{height:598.000000px;} -.h3c{height:599.500000px;} -.ha3{height:600.000000px;} -.h8c{height:603.500000px;} -.h46{height:604.000000px;} -.h70{height:605.000000px;} -.h29{height:606.000000px;} -.hbb{height:609.500000px;} -.hf8{height:610.000000px;} -.ha8{height:611.500000px;} -.h7c{height:618.500000px;} -.hae{height:623.500000px;} -.h9c{height:624.000000px;} -.hd1{height:625.500000px;} -.h20{height:626.000000px;} -.h96{height:627.000000px;} -.h4d{height:628.000000px;} -.h90{height:629.000000px;} -.hff{height:632.000000px;} -.he8{height:635.000000px;} -.h21{height:635.500000px;} -.hf4{height:636.000000px;} -.h69{height:637.000000px;} -.h4c{height:637.500000px;} -.h8b{height:638.500000px;} -.hab{height:640.500000px;} -.h48{height:641.000000px;} -.h9a{height:642.000000px;} -.h68{height:643.000000px;} -.hef{height:644.500000px;} -.h80{height:645.500000px;} -.h97{height:646.000000px;} -.hf{height:647.000000px;} -.h99{height:653.500000px;} -.hac{height:654.000000px;} -.h2b{height:656.000000px;} -.hd2{height:704.500000px;} +.h9b{height:86.892120px;} +.h7c{height:87.873020px;} +.h77{height:87.877960px;} +.h2b{height:88.599230px;} +.h68{height:94.487690px;} +.hf{height:98.308560px;} +.h8e{height:99.214500px;} +.h30{height:104.907500px;} +.h47{height:110.832700px;} +.h14{height:119.050800px;} +.h27{height:129.266280px;} +.h95{height:130.401200px;} +.h6e{height:141.732900px;} +.h71{height:141.736100px;} +.h88{height:141.737850px;} +.h42{height:155.905300px;} +.h5d{height:170.080070px;} +.h3d{height:170.084950px;} +.h74{height:170.085020px;} +.h34{height:178.310540px;} +.h82{height:255.119640px;} +.h52{height:260.205000px;} +.h1f{height:269.293540px;} +.h58{height:283.466790px;} +.h4e{height:314.592000px;} .h2{height:841.453928px;} .h0{height:841.890000px;} .h1{height:842.000000px;} -.w19{width:21.104460px;} -.w4{width:22.727880px;} -.w17{width:48.432030px;} -.wd{width:143.953300px;} -.w1c{width:149.030800px;} -.w1d{width:152.801000px;} -.w12{width:153.321660px;} -.we{width:158.395800px;} -.w18{width:161.259720px;} -.w1e{width:166.319300px;} -.w13{width:180.500000px;} -.w5{width:186.422730px;} -.w21{width:193.674640px;} -.w7{width:254.000000px;} -.w6{width:270.731050px;} -.w25{width:271.874200px;} -.w1a{width:283.463070px;} -.w3{width:283.466400px;} -.wc{width:283.472800px;} -.w23{width:290.840220px;} -.w24{width:292.000000px;} -.wb{width:297.652240px;} -.w15{width:299.106330px;} -.w1b{width:301.000000px;} -.w26{width:302.014100px;} -.w10{width:311.808000px;} -.wf{width:311.816400px;} -.wa{width:311.828500px;} -.w20{width:337.047200px;} -.w9{width:345.604630px;} -.w8{width:359.999640px;} -.w11{width:368.520000px;} -.w1f{width:372.293790px;} -.w27{width:374.413200px;} -.w22{width:375.575400px;} -.w16{width:383.000000px;} -.w2{width:451.500000px;} -.w14{width:452.000000px;} +.w14{width:21.104460px;} +.w3{width:22.727880px;} +.w12{width:48.432030px;} +.wb{width:143.953300px;} +.w16{width:149.030800px;} +.w17{width:152.801000px;} +.w10{width:153.321660px;} +.wc{width:158.395800px;} +.w13{width:161.259720px;} +.w18{width:166.319300px;} +.w4{width:186.422730px;} +.w1b{width:193.674640px;} +.w5{width:270.731050px;} +.w1e{width:271.874200px;} +.w15{width:283.463070px;} +.w2{width:283.466400px;} +.wa{width:283.472800px;} +.w1d{width:290.840220px;} +.w9{width:297.652240px;} +.w11{width:299.106330px;} +.w1f{width:302.014100px;} +.we{width:311.808000px;} +.wd{width:311.816400px;} +.w8{width:311.828500px;} +.w1a{width:337.047200px;} +.w7{width:345.604630px;} +.w6{width:359.999640px;} +.wf{width:368.520000px;} +.w19{width:372.293790px;} +.w20{width:374.413200px;} +.w1c{width:375.575400px;} .w0{width:595.276000px;} .w1{width:595.500000px;} .x0{left:0.000000px;} -.x3d{left:2.156265px;} +.x3c{left:2.156265px;} .x112{left:4.152063px;} -.x3e{left:6.231111px;} +.x3d{left:6.231111px;} .x27{left:7.308042px;} .x1d{left:8.319751px;} .x129{left:10.262524px;} @@ -6442,27 +6246,27 @@ .x1c{left:15.548360px;} .x124{left:18.058721px;} .x14b{left:20.830256px;} -.xd6{left:22.814788px;} +.xd5{left:22.814788px;} .x110{left:24.694439px;} .x115{left:25.992577px;} -.xd3{left:28.841607px;} +.xd2{left:28.841607px;} .x137{left:31.542030px;} -.xd7{left:33.346271px;} +.xd6{left:33.346271px;} .x132{left:35.064887px;} .x139{left:36.302049px;} -.xe5{left:37.329884px;} +.xe4{left:37.329884px;} .x12f{left:40.402877px;} .x10f{left:42.058440px;} .x146{left:43.703476px;} .x135{left:45.809375px;} -.xf3{left:47.499034px;} -.xd4{left:49.691007px;} -.xd5{left:50.946928px;} +.xf2{left:47.499034px;} +.xd3{left:49.691007px;} +.xd4{left:50.946928px;} .x12c{left:52.222120px;} -.xf2{left:53.374318px;} +.xf1{left:53.374318px;} .x11c{left:54.777729px;} .x12d{left:56.513819px;} -.xf4{left:58.790613px;} +.xf3{left:58.790613px;} .x116{left:60.301195px;} .x14e{left:62.418326px;} .x113{left:65.114991px;} @@ -6473,8 +6277,8 @@ .x114{left:73.547819px;} .x20{left:74.555936px;} .x1b{left:77.202725px;} -.x3f{left:78.266000px;} -.x40{left:79.472000px;} +.x3e{left:78.266000px;} +.x3f{left:79.472000px;} .x142{left:80.770429px;} .x14f{left:82.021522px;} .x2b{left:83.092000px;} @@ -6485,287 +6289,287 @@ .xfa{left:89.891000px;} .x10b{left:91.372000px;} .x141{left:92.753000px;} -.xf1{left:93.766000px;} +.xf0{left:93.766000px;} .x125{left:94.788523px;} .x13{left:96.907000px;} .xff{left:98.272000px;} -.xde{left:99.383553px;} -.x72{left:100.432000px;} -.x41{left:102.286000px;} -.x45{left:105.155000px;} +.xdd{left:99.383553px;} +.x70{left:100.432000px;} +.x40{left:102.286000px;} +.x43{left:105.155000px;} .x149{left:106.316000px;} -.xbe{left:107.472000px;} -.x49{left:108.730000px;} +.xbd{left:107.472000px;} +.x47{left:108.730000px;} .x11{left:109.858000px;} .x21{left:111.851000px;} .x2a{left:113.041000px;} -.xbf{left:114.794000px;} -.xdf{left:116.133525px;} -.x46{left:117.536000px;} +.xbe{left:114.794000px;} +.xde{left:116.133525px;} +.x44{left:117.536000px;} .x136{left:118.551120px;} .x22{left:119.641000px;} -.x76{left:120.795000px;} -.xcf{left:122.891917px;} -.x75{left:124.339000px;} +.x74{left:120.795000px;} +.xce{left:122.891917px;} +.x73{left:124.339000px;} .x11d{left:125.576591px;} .x138{left:126.713000px;} -.x44{left:128.000000px;} +.xf4{left:127.888324px;} .x1e{left:129.356952px;} -.x4e{left:130.746000px;} +.x4c{left:130.746000px;} .x1f{left:132.612368px;} -.xe0{left:133.741551px;} +.xdf{left:133.741551px;} .x119{left:135.506144px;} -.xc8{left:136.777000px;} +.xc7{left:136.777000px;} .x144{left:138.677000px;} -.xe1{left:140.224300px;} -.xc9{left:141.246000px;} -.x4f{left:142.508000px;} -.xd2{left:145.047058px;} +.xe0{left:140.224300px;} +.xc8{left:141.246000px;} +.x4d{left:142.508000px;} +.xd1{left:145.047058px;} .xa{left:146.062000px;} .x29{left:147.563927px;} .x10c{left:148.901000px;} -.x7b{left:149.930000px;} -.xce{left:151.024049px;} +.x79{left:149.930000px;} +.xcd{left:151.024049px;} .x118{left:152.354374px;} -.x77{left:153.984000px;} +.x75{left:153.984000px;} .x1a{left:155.906000px;} -.xb7{left:156.997000px;} -.xb3{left:158.401000px;} +.xb6{left:156.997000px;} +.xb2{left:158.401000px;} .x13c{left:159.580000px;} .x19{left:161.820000px;} .x14c{left:163.265662px;} -.x5f{left:164.449000px;} +.x5d{left:164.449000px;} .x121{left:166.233000px;} -.x60{left:167.766000px;} +.x5e{left:167.766000px;} .x145{left:168.813000px;} .x11a{left:169.814759px;} .x108{left:171.062000px;} -.xd1{left:173.179195px;} -.x8e{left:174.532000px;} +.xd0{left:173.179195px;} +.x8c{left:174.532000px;} .x2d{left:175.610000px;} -.xd0{left:177.655919px;} +.xcf{left:177.655919px;} .x2c{left:179.843000px;} .xd{left:181.090000px;} -.x38{left:183.073165px;} -.x3b{left:184.140062px;} +.x37{left:183.073165px;} +.x3a{left:184.140062px;} .xe{left:186.320000px;} -.xab{left:187.681000px;} -.x6d{left:188.710000px;} -.xa6{left:189.881000px;} -.x34{left:191.142965px;} -.x5b{left:193.142000px;} -.x63{left:195.017000px;} -.x9e{left:196.736000px;} +.xaa{left:187.681000px;} +.x6b{left:188.710000px;} +.xa5{left:189.881000px;} +.x33{left:191.142965px;} +.x59{left:193.142000px;} +.x61{left:195.017000px;} +.x9d{left:196.736000px;} .x14a{left:197.785000px;} -.x85{left:198.917000px;} -.x36{left:200.058408px;} -.x92{left:203.058000px;} +.x83{left:198.917000px;} +.x35{left:200.058408px;} +.x91{left:203.058000px;} .x26{left:204.427000px;} -.xe2{left:205.806807px;} -.xca{left:207.211000px;} +.xe1{left:205.806807px;} +.xc9{left:207.211000px;} .x127{left:209.264000px;} -.x30{left:210.542000px;} -.x95{left:211.775000px;} -.xbc{left:213.784000px;} -.x31{left:215.011000px;} -.xc6{left:216.508000px;} -.x8f{left:218.299000px;} -.x3c{left:219.969264px;} -.x39{left:221.036163px;} -.x90{left:222.768000px;} -.xb1{left:224.339000px;} -.x2e{left:225.485000px;} -.x50{left:227.793000px;} +.x2f{left:210.542000px;} +.x94{left:211.775000px;} +.xbb{left:213.784000px;} +.x30{left:215.011000px;} +.xc5{left:216.508000px;} +.x8d{left:218.299000px;} +.x3b{left:219.969264px;} +.x38{left:221.036163px;} +.x8e{left:222.768000px;} +.xb0{left:224.339000px;} +.x8f{left:226.034000px;} +.x4e{left:227.793000px;} .x10d{left:229.380000px;} .x143{left:230.532000px;} -.xbd{left:231.550000px;} +.xbc{left:231.550000px;} .x11e{left:232.753890px;} .x2{left:233.913095px;} -.x32{left:235.498000px;} -.x35{left:237.245601px;} -.xb0{left:238.586000px;} -.x33{left:239.968000px;} -.x3a{left:241.447964px;} -.xb5{left:242.583000px;} -.x37{left:244.321852px;} +.x31{left:235.498000px;} +.x34{left:237.245601px;} +.xaf{left:238.586000px;} +.x32{left:239.968000px;} +.x39{left:241.447964px;} +.xb4{left:242.583000px;} +.x36{left:244.321852px;} .x133{left:245.773699px;} -.x6e{left:247.469000px;} +.x6c{left:247.469000px;} .xb{left:249.414000px;} -.x6b{left:250.791000px;} +.x69{left:250.791000px;} .xf5{left:252.248864px;} .x25{left:253.670740px;} -.x6f{left:255.139000px;} -.x64{left:256.695000px;} -.x80{left:258.130000px;} -.xd8{left:259.440932px;} -.x86{left:260.595000px;} -.x51{left:261.632000px;} +.x6d{left:255.139000px;} +.x62{left:256.695000px;} +.x7e{left:258.130000px;} +.xd7{left:259.440932px;} +.x84{left:260.595000px;} +.x4f{left:261.632000px;} .x123{left:262.930000px;} -.xda{left:263.995424px;} +.xd9{left:263.995424px;} .x5{left:265.047112px;} .x18{left:266.901000px;} .x1{left:268.728142px;} -.xe3{left:271.666834px;} -.x52{left:272.840000px;} +.xe2{left:271.666834px;} +.x50{left:272.840000px;} .x13b{left:274.129000px;} -.x81{left:275.287000px;} -.x82{left:276.892000px;} -.x9d{left:278.647000px;} -.xdb{left:280.045966px;} -.x5c{left:281.083000px;} -.x65{left:282.293000px;} -.x66{left:283.898000px;} -.xc5{left:285.029000px;} -.xd9{left:286.072802px;} +.x7f{left:275.287000px;} +.x80{left:276.892000px;} +.x9c{left:278.647000px;} +.xda{left:280.045966px;} +.x5a{left:281.083000px;} +.x63{left:282.293000px;} +.x64{left:283.898000px;} +.xc4{left:285.029000px;} +.xd8{left:286.072802px;} .x11b{left:287.510698px;} -.x53{left:288.542000px;} +.x51{left:288.542000px;} .x105{left:289.555000px;} .x15{left:290.858000px;} .x14{left:292.241000px;} .x100{left:293.641000px;} .x12{left:294.870000px;} .x10{left:296.254000px;} -.xe4{left:297.544144px;} -.x9f{left:298.989000px;} -.x67{left:300.069000px;} -.xa0{left:302.761000px;} +.xe3{left:297.544144px;} +.x9e{left:298.989000px;} +.x65{left:300.069000px;} +.x9f{left:302.761000px;} .x106{left:304.503000px;} -.x54{left:306.307000px;} -.xdc{left:307.870470px;} +.x52{left:306.307000px;} +.xdb{left:307.870470px;} .x134{left:309.052000px;} -.xaa{left:310.105000px;} -.x55{left:311.493000px;} -.xa1{left:312.596000px;} -.xcb{left:314.789000px;} -.xa2{left:317.577000px;} -.x8c{left:318.810000px;} -.x94{left:320.287000px;} +.xa9{left:310.105000px;} +.x53{left:311.493000px;} +.xa0{left:312.596000px;} +.xca{left:314.789000px;} +.xa1{left:317.577000px;} +.x8a{left:318.810000px;} +.x93{left:320.287000px;} .xfd{left:321.388000px;} .xf9{left:323.883000px;} -.x7c{left:325.222000px;} +.x7a{left:325.222000px;} .x11f{left:326.474000px;} -.x93{left:327.831000px;} -.x89{left:329.875000px;} -.x56{left:330.919000px;} -.xb6{left:332.864000px;} +.x92{left:327.831000px;} +.x87{left:329.875000px;} +.x54{left:330.919000px;} +.xb5{left:332.864000px;} .x130{left:334.462000px;} -.x84{left:335.572000px;} +.x82{left:335.572000px;} .x4{left:337.097702px;} .x23{left:338.930000px;} .xfb{left:340.927000px;} .x147{left:342.191000px;} .x24{left:343.400000px;} -.x5d{left:344.425000px;} -.xcd{left:345.629000px;} -.xdd{left:347.626266px;} -.x57{left:349.388000px;} -.x5e{left:351.662000px;} -.x58{left:353.857000px;} +.x5b{left:344.425000px;} +.xcc{left:345.629000px;} +.xdc{left:347.626266px;} +.x55{left:349.388000px;} +.x5c{left:351.662000px;} +.x56{left:353.857000px;} .xfe{left:355.373000px;} -.x61{left:356.818000px;} -.x59{left:359.042000px;} -.x62{left:360.135000px;} -.xa3{left:361.458000px;} -.x8d{left:362.801000px;} -.x7d{left:364.739000px;} -.x70{left:366.079000px;} -.x68{left:367.611000px;} -.x7e{left:369.364000px;} -.x69{left:370.928000px;} -.x87{left:372.009000px;} -.x71{left:374.129000px;} +.x5f{left:356.818000px;} +.x57{left:359.042000px;} +.x60{left:360.135000px;} +.xa2{left:361.458000px;} +.x8b{left:362.801000px;} +.x7b{left:364.739000px;} +.x6e{left:366.079000px;} +.x66{left:367.611000px;} +.x7c{left:369.364000px;} +.x67{left:370.928000px;} +.x85{left:372.009000px;} +.x6f{left:374.129000px;} .x107{left:375.390000px;} -.x83{left:376.468000px;} +.x81{left:376.468000px;} .x102{left:377.595000px;} .x10e{left:379.830000px;} -.xae{left:381.667000px;} -.xcc{left:382.857000px;} +.xad{left:381.667000px;} +.xcb{left:382.857000px;} .x13d{left:384.225000px;} -.x7f{left:385.227000px;} -.xa8{left:388.009000px;} +.x7d{left:385.227000px;} +.xa7{left:388.009000px;} .x122{left:389.231000px;} .x3{left:390.580815px;} .x13f{left:391.595000px;} -.x88{left:393.041000px;} -.xa4{left:395.481000px;} -.x6a{left:396.941000px;} +.x86{left:393.041000px;} +.xa3{left:395.481000px;} +.x68{left:396.941000px;} .x128{left:398.440000px;} -.x91{left:400.228000px;} +.x90{left:400.228000px;} .xfc{left:401.256000px;} -.xa5{left:402.953000px;} -.xb2{left:404.228000px;} -.xa7{left:405.443000px;} -.xaf{left:406.463000px;} -.xa9{left:407.934000px;} +.xa4{left:402.953000px;} +.xb1{left:404.228000px;} +.xa6{left:405.443000px;} +.xae{left:406.463000px;} +.xa8{left:407.934000px;} .x148{left:410.023000px;} -.x47{left:411.372000px;} -.xc0{left:412.726000px;} -.xb9{left:413.938000px;} +.x45{left:411.372000px;} +.xbf{left:412.726000px;} +.xb8{left:413.938000px;} .x109{left:416.700000px;} -.xba{left:418.407000px;} +.xb9{left:418.407000px;} .x12b{left:420.619000px;} -.x6c{left:422.467000px;} -.x48{left:423.613000px;} +.x6a{left:422.467000px;} +.x46{left:423.613000px;} .x10a{left:425.556000px;} -.xe6{left:426.793000px;} +.xe5{left:426.793000px;} .x140{left:428.440000px;} -.x4a{left:429.864000px;} -.xbb{left:431.750000px;} +.x48{left:429.864000px;} +.xba{left:431.750000px;} .x7{left:433.169767px;} .x16{left:434.588000px;} -.x4b{left:435.948000px;} +.x49{left:435.948000px;} .x120{left:437.607000px;} -.xc1{left:439.472000px;} +.xc0{left:439.472000px;} .x17{left:441.716000px;} -.xef{left:443.530000px;} -.xe7{left:444.558000px;} +.xee{left:443.530000px;} +.xe6{left:444.558000px;} .x8{left:447.579885px;} -.xe8{left:449.744000px;} -.xac{left:451.802000px;} -.x4c{left:453.606000px;} +.xe7{left:449.744000px;} +.xab{left:451.802000px;} +.x4a{left:453.606000px;} .x103{left:456.133000px;} .xf6{left:458.129000px;} -.xc2{left:461.033000px;} -.x4d{left:462.046000px;} +.xc1{left:461.033000px;} +.x4b{left:462.046000px;} .xf7{left:463.314000px;} -.xb4{left:464.755000px;} +.xb3{left:464.755000px;} .x9{left:466.788696px;} -.x78{left:468.357000px;} -.xe9{left:469.588000px;} -.xad{left:470.986000px;} -.xea{left:474.057000px;} -.x73{left:476.135000px;} +.x76{left:468.357000px;} +.xe8{left:469.588000px;} +.xac{left:470.986000px;} +.xe9{left:474.057000px;} +.x71{left:476.135000px;} .x13a{left:477.148000px;} -.xeb{left:480.035000px;} +.xea{left:480.035000px;} .x6{left:481.198877px;} -.x74{left:482.476000px;} -.x96{left:485.293000px;} -.x79{left:486.988000px;} +.x72{left:482.476000px;} +.x95{left:485.293000px;} +.x77{left:486.988000px;} .x13e{left:488.617000px;} -.x97{left:490.479000px;} -.xc3{left:491.561000px;} -.xc7{left:493.965000px;} -.xc4{left:496.746000px;} +.x96{left:490.479000px;} +.xc2{left:491.561000px;} +.xc6{left:493.965000px;} +.xc3{left:496.746000px;} .x101{left:497.815000px;} .x104{left:500.006000px;} .xf8{left:501.209000px;} -.x5a{left:502.797000px;} -.x7a{left:504.645000px;} -.x9c{left:507.694000px;} -.x98{left:509.905000px;} -.xf0{left:511.233000px;} -.xb8{left:513.313000px;} -.x8a{left:514.932000px;} -.x42{left:516.039000px;} -.x2f{left:518.294000px;} -.x8b{left:519.401000px;} -.x43{left:520.508000px;} -.xec{left:523.116000px;} -.x99{left:528.374000px;} -.xed{left:531.556000px;} -.xee{left:536.742000px;} -.x9a{left:544.237000px;} -.x9b{left:549.422000px;} +.x58{left:502.797000px;} +.x78{left:504.645000px;} +.x9b{left:507.694000px;} +.x97{left:509.905000px;} +.xef{left:511.233000px;} +.xb7{left:513.313000px;} +.x88{left:514.932000px;} +.x41{left:516.039000px;} +.x2e{left:518.294000px;} +.x89{left:519.401000px;} +.x42{left:520.508000px;} +.xeb{left:523.116000px;} +.x98{left:528.374000px;} +.xec{left:531.556000px;} +.xed{left:536.742000px;} +.x99{left:544.237000px;} +.x9a{left:549.422000px;} @media print{ .v0{vertical-align:0.000000pt;} .ls1{letter-spacing:-0.577505pt;} @@ -7088,5932 +6892,5735 @@ .fs0{font-size:154.750158pt;} .y0{bottom:0.000000pt;} .y1{bottom:0.294667pt;} -.y503{bottom:0.654527pt;} -.y590{bottom:2.740402pt;} -.y608{bottom:3.143453pt;} -.y471{bottom:3.281665pt;} -.y30d{bottom:3.991274pt;} -.yf13{bottom:4.301455pt;} -.y33c{bottom:4.322659pt;} -.y13d8{bottom:4.505706pt;} -.y62a{bottom:4.821079pt;} -.y662{bottom:5.202570pt;} -.y450{bottom:5.657880pt;} -.y922{bottom:5.722088pt;} -.y629{bottom:5.851059pt;} -.yc06{bottom:6.229837pt;} -.yf60{bottom:6.279132pt;} -.y58e{bottom:6.408002pt;} -.y12aa{bottom:6.939295pt;} -.y606{bottom:7.128252pt;} -.y11d6{bottom:7.321393pt;} -.y58f{bottom:7.324902pt;} -.y1261{bottom:7.336146pt;} -.y11d7{bottom:7.370541pt;} -.y7f7{bottom:7.740411pt;} -.y607{bottom:8.124452pt;} -.y1130{bottom:8.466443pt;} -.y114{bottom:8.562993pt;} -.y12f5{bottom:8.687256pt;} -.y11bd{bottom:8.806248pt;} -.y11be{bottom:8.854735pt;} -.y663{bottom:8.914570pt;} -.y1292{bottom:8.914871pt;} -.y12fa{bottom:9.014160pt;} -.y11b6{bottom:9.642773pt;} -.y1260{bottom:9.738219pt;} -.y131{bottom:9.740520pt;} -.y661{bottom:9.842569pt;} -.y19f{bottom:9.964256pt;} -.yc0c{bottom:10.317394pt;} -.yc07{bottom:10.349116pt;} -.y997{bottom:10.406649pt;} -.y7f4{bottom:10.725046pt;} -.y19e{bottom:10.922595pt;} -.yc05{bottom:11.387461pt;} -.y6cd{bottom:12.724839pt;} -.yf15{bottom:13.289676pt;} -.y6d0{bottom:14.629557pt;} -.y110{bottom:16.784651pt;} -.y1267{bottom:17.139134pt;} -.y60b{bottom:17.201122pt;} -.y30c{bottom:18.248936pt;} +.y4f4{bottom:0.654527pt;} +.y57e{bottom:2.740402pt;} +.y5f5{bottom:3.143453pt;} +.y465{bottom:3.281665pt;} +.y306{bottom:3.991274pt;} +.yed1{bottom:4.301455pt;} +.y334{bottom:4.322659pt;} +.y137f{bottom:4.505706pt;} +.y617{bottom:4.821079pt;} +.y64e{bottom:5.202570pt;} +.y444{bottom:5.657880pt;} +.y8fc{bottom:5.722088pt;} +.y616{bottom:5.851059pt;} +.ybd2{bottom:6.229837pt;} +.yf1e{bottom:6.279132pt;} +.y57c{bottom:6.408002pt;} +.y125a{bottom:6.939295pt;} +.y5f3{bottom:7.128252pt;} +.y1188{bottom:7.321393pt;} +.y57d{bottom:7.324902pt;} +.y1211{bottom:7.336146pt;} +.y1189{bottom:7.370541pt;} +.y7d9{bottom:7.740411pt;} +.y5f4{bottom:8.124452pt;} +.y10e6{bottom:8.466443pt;} +.y115{bottom:8.562993pt;} +.y12a2{bottom:8.687256pt;} +.y116f{bottom:8.806248pt;} +.y1170{bottom:8.854735pt;} +.y64f{bottom:8.914570pt;} +.y1242{bottom:8.914871pt;} +.y12a7{bottom:9.014160pt;} +.y1168{bottom:9.642773pt;} +.y1210{bottom:9.738219pt;} +.y132{bottom:9.740520pt;} +.y64d{bottom:9.842569pt;} +.y19c{bottom:9.964256pt;} +.ybd8{bottom:10.317394pt;} +.ybd3{bottom:10.349116pt;} +.y96f{bottom:10.406649pt;} +.y7d6{bottom:10.725046pt;} +.y19b{bottom:10.922595pt;} +.ybd1{bottom:11.387461pt;} +.y6b6{bottom:12.724839pt;} +.yed3{bottom:13.289676pt;} +.y6b9{bottom:14.629557pt;} +.y111{bottom:16.784651pt;} +.y1217{bottom:17.139134pt;} +.y5f8{bottom:17.201122pt;} +.y305{bottom:18.248936pt;} .y8{bottom:18.389628pt;} -.y920{bottom:18.842996pt;} -.y58d{bottom:20.314327pt;} -.y501{bottom:21.191340pt;} -.y13d7{bottom:21.630854pt;} -.y605{bottom:22.237280pt;} -.y30a{bottom:23.113796pt;} -.y7f6{bottom:23.191432pt;} -.y2fd{bottom:23.695237pt;} -.y7f3{bottom:23.798987pt;} -.y58b{bottom:23.981926pt;} -.y130{bottom:24.170920pt;} -.y11cf{bottom:24.172928pt;} -.y113{bottom:24.244115pt;} -.y12af{bottom:24.517499pt;} -.yf61{bottom:24.594693pt;} -.y58c{bottom:24.898826pt;} -.y12b2{bottom:25.144929pt;} -.y921{bottom:25.225312pt;} -.y125f{bottom:25.468140pt;} -.y993{bottom:25.695256pt;} -.y125e{bottom:26.179263pt;} -.y603{bottom:26.222079pt;} -.y948{bottom:26.356478pt;} -.y1291{bottom:26.553542pt;} -.y11d9{bottom:26.729124pt;} -.y11b5{bottom:27.155205pt;} -.y92c{bottom:27.159950pt;} -.y604{bottom:27.218279pt;} -.y6cc{bottom:27.664838pt;} -.y65f{bottom:27.735186pt;} -.y11c0{bottom:27.952788pt;} -.y30b{bottom:27.978656pt;} -.y335{bottom:28.117957pt;} -.y6cf{bottom:28.324559pt;} -.y12f9{bottom:28.438909pt;} -.y12f8{bottom:28.439246pt;} -.y12fd{bottom:28.439863pt;} -.y622{bottom:28.917912pt;} -.y130c{bottom:28.971603pt;} -.y596{bottom:29.128124pt;} -.y19c{bottom:29.400206pt;} -.y61b{bottom:29.947893pt;} -.y1294{bottom:30.031968pt;} -.y12b0{bottom:30.186529pt;} -.y1131{bottom:30.283137pt;} +.y8fa{bottom:18.842996pt;} +.y57b{bottom:20.314327pt;} +.y4f2{bottom:21.191340pt;} +.y137e{bottom:21.630854pt;} +.y5f2{bottom:22.237280pt;} +.y303{bottom:23.113796pt;} +.y7d8{bottom:23.191432pt;} +.y2f6{bottom:23.695237pt;} +.y7d5{bottom:23.798987pt;} +.y579{bottom:23.981926pt;} +.y131{bottom:24.170920pt;} +.y1181{bottom:24.172928pt;} +.y114{bottom:24.244115pt;} +.y125f{bottom:24.517499pt;} +.yf1f{bottom:24.594693pt;} +.y57a{bottom:24.898826pt;} +.y1262{bottom:25.144929pt;} +.y8fb{bottom:25.225312pt;} +.y120f{bottom:25.468140pt;} +.y96b{bottom:25.695256pt;} +.y120e{bottom:26.179263pt;} +.y5f0{bottom:26.222079pt;} +.y921{bottom:26.356478pt;} +.y1241{bottom:26.553542pt;} +.y118b{bottom:26.729124pt;} +.y1167{bottom:27.155205pt;} +.y906{bottom:27.159950pt;} +.y5f1{bottom:27.218279pt;} +.y6b5{bottom:27.664838pt;} +.y64b{bottom:27.735186pt;} +.y1172{bottom:27.952788pt;} +.y304{bottom:27.978656pt;} +.y32d{bottom:28.117957pt;} +.y6b8{bottom:28.324559pt;} +.y12a6{bottom:28.438909pt;} +.y12a5{bottom:28.439246pt;} +.y12aa{bottom:28.439863pt;} +.y60f{bottom:28.917912pt;} +.y12b9{bottom:28.971603pt;} +.y584{bottom:29.128124pt;} +.y199{bottom:29.400206pt;} +.y608{bottom:29.947893pt;} +.y1244{bottom:30.031968pt;} +.y1260{bottom:30.186529pt;} +.y10e7{bottom:30.283137pt;} .y9{bottom:30.396106pt;} -.y344{bottom:31.016761pt;} -.y473{bottom:31.306776pt;} -.y660{bottom:31.447186pt;} -.y91f{bottom:31.607627pt;} -.y65e{bottom:32.375185pt;} -.y11c2{bottom:33.151001pt;} -.y19d{bottom:33.233566pt;} -.y595{bottom:33.254174pt;} -.y12fb{bottom:33.909986pt;} -.yc0d{bottom:34.087956pt;} -.y128f{bottom:34.160145pt;} -.y19b{bottom:34.191905pt;} -.y33b{bottom:34.429645pt;} -.y343{bottom:35.751072pt;} -.y472{bottom:36.220846pt;} -.y46d{bottom:36.221379pt;} -.y7f2{bottom:36.872927pt;} -.y11d3{bottom:36.931373pt;} -.y11d4{bottom:37.334014pt;} -.y12b1{bottom:37.617609pt;} -.y58a{bottom:37.888243pt;} -.y11ba{bottom:38.017735pt;} -.y13d9{bottom:38.414827pt;} -.y11bb{bottom:38.414958pt;} -.y12a1{bottom:38.456325pt;} -.y7f5{bottom:38.642451pt;} -.y12f{bottom:38.962080pt;} -.y339{bottom:39.163955pt;} -.y333{bottom:39.165024pt;} -.y1290{bottom:39.710643pt;} -.y11b4{bottom:40.218145pt;} -.y452{bottom:40.328912pt;} -.y309{bottom:40.488296pt;} -.y12d{bottom:40.765880pt;} -.y121{bottom:41.126640pt;} -.y602{bottom:41.331122pt;} -.y98d{bottom:41.383328pt;} -.y588{bottom:41.555842pt;} -.y12fc{bottom:41.972064pt;} -.y923{bottom:42.174268pt;} -.y589{bottom:42.472742pt;} -.yf5f{bottom:42.899131pt;} -.y92e{bottom:43.211379pt;} -.yf16{bottom:43.352306pt;} -.yc08{bottom:43.850993pt;} -.y33a{bottom:43.898265pt;} -.y92d{bottom:44.231076pt;} -.y11dc{bottom:44.274778pt;} -.y502{bottom:44.411394pt;} -.y504{bottom:44.411560pt;} -.y125c{bottom:44.884794pt;} -.y2fb{bottom:44.981321pt;} -.y600{bottom:45.315922pt;} -.y307{bottom:45.353156pt;} -.y451{bottom:45.393412pt;} -.y44c{bottom:45.393965pt;} -.y60d{bottom:45.446704pt;} -.y125d{bottom:45.867914pt;} -.y2fa{bottom:45.934598pt;} -.y11da{bottom:45.977138pt;} -.y12ae{bottom:46.237592pt;} -.y12ad{bottom:46.237969pt;} -.y601{bottom:46.312122pt;} -.yc09{bottom:47.151873pt;} -.y1295{bottom:48.001333pt;} -.y12f7{bottom:48.218574pt;} -.yc0b{bottom:48.797415pt;} -.y334{bottom:49.196019pt;} -.y11b3{bottom:49.389937pt;} -.y999{bottom:49.538045pt;} -.y130d{bottom:49.772852pt;} -.y308{bottom:50.218017pt;} -.yc0a{bottom:50.246448pt;} -.y65c{bottom:50.267829pt;} -.y11c1{bottom:50.370332pt;} -.y112f{bottom:52.086574pt;} -.y199{bottom:52.669493pt;} -.y91e{bottom:52.815450pt;} -.y12e{bottom:53.392480pt;} -.y998{bottom:53.505430pt;} -.yf5e{bottom:53.612468pt;} -.y475{bottom:53.771103pt;} -.y12a9{bottom:53.883549pt;} -.y65d{bottom:53.979829pt;} -.y12a0{bottom:54.897585pt;} -.y65b{bottom:54.907828pt;} -.y587{bottom:55.462154pt;} -.y338{bottom:56.072204pt;} -.y19a{bottom:56.502853pt;} -.y198{bottom:57.461192pt;} -.y11db{bottom:57.515919pt;} -.y12a7{bottom:57.742804pt;} -.y474{bottom:58.685174pt;} -.y46e{bottom:58.685707pt;} -.y628{bottom:58.994298pt;} -.y624{bottom:59.001259pt;} -.y585{bottom:59.129753pt;} -.y12f4{bottom:59.619757pt;} -.y12a2{bottom:59.665811pt;} -.y331{bottom:59.879890pt;} -.y586{bottom:60.046653pt;} -.y61f{bottom:60.429699pt;} -.y10f{bottom:60.460990pt;} -.y6ce{bottom:60.553687pt;} -.y342{bottom:60.775282pt;} -.y336{bottom:60.806514pt;} -.y330{bottom:60.807589pt;} -.y11ce{bottom:61.556192pt;} -.y306{bottom:62.727657pt;} -.y7db{bottom:62.768962pt;} -.y133{bottom:63.133000pt;} -.y454{bottom:63.480913pt;} -.y125b{bottom:63.865548pt;} -.y387{bottom:64.118667pt;} -.y142{bottom:64.120000pt;} -.yf5d{bottom:64.325800pt;} -.yf65{bottom:64.334104pt;} -.y5fe{bottom:64.409754pt;} -.yf14{bottom:64.688113pt;} -.y112e{bottom:64.847822pt;} -.yf64{bottom:65.237216pt;} -.y5ff{bottom:65.405954pt;} -.y340{bottom:65.509593pt;} -.y337{bottom:65.540824pt;} -.y1346{bottom:65.803162pt;} -.y12ef{bottom:65.893520pt;} -.y11d5{bottom:66.223775pt;} -.y951{bottom:66.291339pt;} -.y12a8{bottom:66.356230pt;} -.y2fc{bottom:66.744037pt;} -.y11bc{bottom:66.915919pt;} -.y11cc{bottom:66.929618pt;} -.y2f7{bottom:67.220682pt;} -.y304{bottom:67.592517pt;} -.y2f6{bottom:67.593622pt;} -.y12f6{bottom:67.643667pt;} -.y2f9{bottom:68.173965pt;} -.y12b{bottom:68.183640pt;} -.y12ac{bottom:68.354526pt;} -.yf1b{bottom:68.442801pt;} -.y453{bottom:68.545413pt;} -.y44d{bottom:68.545966pt;} -.yf1d{bottom:69.527059pt;} -.y91d{bottom:69.568744pt;} -.y341{bottom:70.243903pt;} -.yc04{bottom:70.258032pt;} -.y950{bottom:70.258724pt;} -.y135{bottom:70.708960pt;} -.y1241{bottom:71.333333pt;} -.y13dc{bottom:72.323953pt;} -.y13dd{bottom:72.323955pt;} -.y127c{bottom:72.442667pt;} -.y305{bottom:72.457377pt;} -.y627{bottom:72.782097pt;} -.y623{bottom:72.789058pt;} -.y659{bottom:72.800412pt;} -.y584{bottom:73.036079pt;} -.y12f3{bottom:73.151957pt;} -.y1266{bottom:73.176961pt;} -.y125a{bottom:74.132596pt;} -.y61e{bottom:74.217499pt;} -.y11cd{bottom:74.797333pt;} -.y11d8{bottom:74.878725pt;} -.yf5c{bottom:75.010510pt;} -.y132{bottom:75.398840pt;} -.y11bf{bottom:75.454390pt;} -.y11d0{bottom:75.719481pt;} -.y7da{bottom:75.842903pt;} -.y196{bottom:75.938803pt;} -.y11d1{bottom:76.122119pt;} -.y477{bottom:76.235424pt;} -.y11b7{bottom:76.283831pt;} -.yf62{bottom:76.441729pt;} -.y65a{bottom:76.512412pt;} -.y11b8{bottom:76.681050pt;} -.y582{bottom:76.703678pt;} -.y926{bottom:76.930993pt;} -.y658{bottom:77.440411pt;} -.y112d{bottom:77.609081pt;} -.y583{bottom:77.620578pt;} -.y2f3{bottom:78.481287pt;} -.y12f2{bottom:78.704876pt;} -.y5fd{bottom:79.518787pt;} -.y197{bottom:79.772163pt;} -.y128b{bottom:79.838325pt;} -.y128c{bottom:79.887161pt;} -.y141{bottom:80.060000pt;} -.y1284{bottom:80.680880pt;} -.y195{bottom:80.730503pt;} -.y332{bottom:81.058604pt;} -.y476{bottom:81.149494pt;} -.y46f{bottom:81.150028pt;} -.y32e{bottom:81.522452pt;} -.y1345{bottom:81.795764pt;} -.y32f{bottom:82.450150pt;} -.y1259{bottom:82.708680pt;} -.y129{bottom:82.974800pt;} -.y94f{bottom:83.044640pt;} -.y5fb{bottom:83.503586pt;} -.y60c{bottom:83.665649pt;} -.yf1c{bottom:83.738758pt;} -.y1343{bottom:84.263580pt;} -.y5fc{bottom:84.499786pt;} -.y303{bottom:84.967025pt;} -.y1293{bottom:85.693690pt;} -.yf5b{bottom:85.723847pt;} -.y91c{bottom:86.322046pt;} -.y456{bottom:86.632914pt;} -.y94e{bottom:87.012026pt;} -.y2f4{bottom:88.879707pt;} -.y7d9{bottom:88.916843pt;} -.y2f8{bottom:88.983398pt;} -.y925{bottom:89.005643pt;} -.y13da{bottom:89.449100pt;} -.y13db{bottom:89.646904pt;} -.y301{bottom:89.831885pt;} -.y2f1{bottom:89.832990pt;} -.y12ab{bottom:90.074991pt;} -.y1122{bottom:90.336230pt;} -.y11b2{bottom:90.475184pt;} -.y33f{bottom:90.533806pt;} -.y581{bottom:90.609995pt;} -.y1125{bottom:91.351876pt;} -.y455{bottom:91.697414pt;} -.y44e{bottom:91.697970pt;} -.y618{bottom:92.556697pt;} -.y57f{bottom:94.277594pt;} -.y2f2{bottom:94.580749pt;} -.y302{bottom:94.696745pt;} -.y580{bottom:95.194494pt;} -.y33d{bottom:95.268116pt;} -.y656{bottom:95.333042pt;} +.y33c{bottom:31.016761pt;} +.y467{bottom:31.306776pt;} +.y64c{bottom:31.447186pt;} +.y8f9{bottom:31.607627pt;} +.y64a{bottom:32.375185pt;} +.y1174{bottom:33.151001pt;} +.y19a{bottom:33.233566pt;} +.y583{bottom:33.254174pt;} +.y12a8{bottom:33.909986pt;} +.ybd9{bottom:34.087956pt;} +.y123f{bottom:34.160145pt;} +.y198{bottom:34.191905pt;} +.y333{bottom:34.429645pt;} +.y33b{bottom:35.751072pt;} +.y466{bottom:36.220846pt;} +.y461{bottom:36.221379pt;} +.y7d4{bottom:36.872927pt;} +.y1185{bottom:36.931373pt;} +.y1186{bottom:37.334014pt;} +.y1261{bottom:37.617609pt;} +.y578{bottom:37.888243pt;} +.y116c{bottom:38.017735pt;} +.y1380{bottom:38.414827pt;} +.y116d{bottom:38.414958pt;} +.y1251{bottom:38.456325pt;} +.y7d7{bottom:38.642451pt;} +.y130{bottom:38.962080pt;} +.y331{bottom:39.163955pt;} +.y32b{bottom:39.165024pt;} +.y1240{bottom:39.710643pt;} +.y1166{bottom:40.218145pt;} +.y446{bottom:40.328912pt;} +.y302{bottom:40.488296pt;} +.y12e{bottom:40.765880pt;} +.y122{bottom:41.126640pt;} +.y5ef{bottom:41.331122pt;} +.y965{bottom:41.383328pt;} +.y576{bottom:41.555842pt;} +.y12a9{bottom:41.972064pt;} +.y8fd{bottom:42.174268pt;} +.y577{bottom:42.472742pt;} +.yf1d{bottom:42.899131pt;} +.y908{bottom:43.211379pt;} +.yed4{bottom:43.352306pt;} +.ybd4{bottom:43.850993pt;} +.y332{bottom:43.898265pt;} +.y907{bottom:44.231076pt;} +.y118e{bottom:44.274778pt;} +.y4f3{bottom:44.411394pt;} +.y4f5{bottom:44.411560pt;} +.y120c{bottom:44.884794pt;} +.y2f4{bottom:44.981321pt;} +.y5ed{bottom:45.315922pt;} +.y300{bottom:45.353156pt;} +.y445{bottom:45.393412pt;} +.y440{bottom:45.393965pt;} +.y5fa{bottom:45.446704pt;} +.y120d{bottom:45.867914pt;} +.y2f3{bottom:45.934598pt;} +.y118c{bottom:45.977138pt;} +.y125e{bottom:46.237592pt;} +.y125d{bottom:46.237969pt;} +.y5ee{bottom:46.312122pt;} +.ybd5{bottom:47.151873pt;} +.y1245{bottom:48.001333pt;} +.y12a4{bottom:48.218574pt;} +.ybd7{bottom:48.797415pt;} +.y32c{bottom:49.196019pt;} +.y1165{bottom:49.389937pt;} +.y971{bottom:49.538045pt;} +.y12ba{bottom:49.772852pt;} +.y301{bottom:50.218017pt;} +.ybd6{bottom:50.246448pt;} +.y648{bottom:50.267829pt;} +.y1173{bottom:50.370332pt;} +.y10e5{bottom:52.086574pt;} +.y196{bottom:52.669493pt;} +.y8f8{bottom:52.815450pt;} +.y12f{bottom:53.392480pt;} +.y970{bottom:53.505430pt;} +.yf1c{bottom:53.612468pt;} +.y469{bottom:53.771103pt;} +.y1259{bottom:53.883549pt;} +.y649{bottom:53.979829pt;} +.y1250{bottom:54.897585pt;} +.y647{bottom:54.907828pt;} +.y575{bottom:55.462154pt;} +.y330{bottom:56.072204pt;} +.y197{bottom:56.502853pt;} +.y195{bottom:57.461192pt;} +.y118d{bottom:57.515919pt;} +.y1257{bottom:57.742804pt;} +.y468{bottom:58.685174pt;} +.y462{bottom:58.685707pt;} +.y615{bottom:58.994298pt;} +.y611{bottom:59.001259pt;} +.y573{bottom:59.129753pt;} +.y12a1{bottom:59.619757pt;} +.y1252{bottom:59.665811pt;} +.y329{bottom:59.879890pt;} +.y574{bottom:60.046653pt;} +.y60c{bottom:60.429699pt;} +.y110{bottom:60.460990pt;} +.y6b7{bottom:60.553687pt;} +.y33a{bottom:60.775282pt;} +.y32e{bottom:60.806514pt;} +.y328{bottom:60.807589pt;} +.y1180{bottom:61.556192pt;} +.y2ff{bottom:62.727657pt;} +.y7bd{bottom:62.768962pt;} +.y134{bottom:63.133000pt;} +.y448{bottom:63.480913pt;} +.y120b{bottom:63.865548pt;} +.y37f{bottom:64.118667pt;} +.y143{bottom:64.120000pt;} +.yf1b{bottom:64.325800pt;} +.yf23{bottom:64.334104pt;} +.y5eb{bottom:64.409754pt;} +.yed2{bottom:64.688113pt;} +.y10e4{bottom:64.847822pt;} +.yf22{bottom:65.237216pt;} +.y5ec{bottom:65.405954pt;} +.y338{bottom:65.509593pt;} +.y32f{bottom:65.540824pt;} +.y12f1{bottom:65.803162pt;} +.y129c{bottom:65.893520pt;} +.y1187{bottom:66.223775pt;} +.y92a{bottom:66.291339pt;} +.y1258{bottom:66.356230pt;} +.y2f5{bottom:66.744037pt;} +.y116e{bottom:66.915919pt;} +.y117e{bottom:66.929618pt;} +.y2f0{bottom:67.220682pt;} +.y2fd{bottom:67.592517pt;} +.y2ef{bottom:67.593622pt;} +.y12a3{bottom:67.643667pt;} +.y2f2{bottom:68.173965pt;} +.y12c{bottom:68.183640pt;} +.y125c{bottom:68.354526pt;} +.yed9{bottom:68.442801pt;} +.y447{bottom:68.545413pt;} +.y441{bottom:68.545966pt;} +.yedb{bottom:69.527059pt;} +.y8f7{bottom:69.568744pt;} +.y339{bottom:70.243903pt;} +.ybd0{bottom:70.258032pt;} +.y929{bottom:70.258724pt;} +.y136{bottom:70.708960pt;} +.y1383{bottom:72.323953pt;} +.y1384{bottom:72.323955pt;} +.y122c{bottom:72.442667pt;} +.y2fe{bottom:72.457377pt;} +.y614{bottom:72.782097pt;} +.y610{bottom:72.789058pt;} +.y645{bottom:72.800412pt;} +.y572{bottom:73.036079pt;} +.y12a0{bottom:73.151957pt;} +.y1216{bottom:73.176961pt;} +.y120a{bottom:74.132596pt;} +.y60b{bottom:74.217499pt;} +.y117f{bottom:74.797333pt;} +.y118a{bottom:74.878725pt;} +.yf1a{bottom:75.010510pt;} +.y133{bottom:75.398840pt;} +.y1171{bottom:75.454390pt;} +.y1182{bottom:75.719481pt;} +.y7bc{bottom:75.842903pt;} +.y193{bottom:75.938803pt;} +.y1183{bottom:76.122119pt;} +.y46b{bottom:76.235424pt;} +.y1169{bottom:76.283831pt;} +.yf20{bottom:76.441729pt;} +.y646{bottom:76.512412pt;} +.y116a{bottom:76.681050pt;} +.y570{bottom:76.703678pt;} +.y900{bottom:76.930993pt;} +.y644{bottom:77.440411pt;} +.y10e3{bottom:77.609081pt;} +.y571{bottom:77.620578pt;} +.y2ec{bottom:78.481287pt;} +.y129f{bottom:78.704876pt;} +.y5ea{bottom:79.518787pt;} +.y194{bottom:79.772163pt;} +.y123b{bottom:79.838325pt;} +.y123c{bottom:79.887161pt;} +.y142{bottom:80.060000pt;} +.y1234{bottom:80.680880pt;} +.y192{bottom:80.730503pt;} +.y32a{bottom:81.058604pt;} +.y46a{bottom:81.149494pt;} +.y463{bottom:81.150028pt;} +.y326{bottom:81.522452pt;} +.y12f0{bottom:81.795764pt;} +.y327{bottom:82.450150pt;} +.y1209{bottom:82.708680pt;} +.y12a{bottom:82.974800pt;} +.y928{bottom:83.044640pt;} +.y5e8{bottom:83.503586pt;} +.y5f9{bottom:83.665649pt;} +.yeda{bottom:83.738758pt;} +.y12ee{bottom:84.263580pt;} +.y5e9{bottom:84.499786pt;} +.y2fc{bottom:84.967025pt;} +.y1243{bottom:85.693690pt;} +.yf19{bottom:85.723847pt;} +.y8f6{bottom:86.322046pt;} +.y44a{bottom:86.632914pt;} +.y927{bottom:87.012026pt;} +.y2ed{bottom:88.879707pt;} +.y7bb{bottom:88.916843pt;} +.y2f1{bottom:88.983398pt;} +.y8ff{bottom:89.005643pt;} +.y1381{bottom:89.449100pt;} +.y1382{bottom:89.646904pt;} +.y2fa{bottom:89.831885pt;} +.y2ea{bottom:89.832990pt;} +.y125b{bottom:90.074991pt;} +.y10d8{bottom:90.336230pt;} +.y1164{bottom:90.475184pt;} +.y337{bottom:90.533806pt;} +.y56f{bottom:90.609995pt;} +.y10db{bottom:91.351876pt;} +.y449{bottom:91.697414pt;} +.y442{bottom:91.697970pt;} +.y605{bottom:92.556697pt;} +.y56d{bottom:94.277594pt;} +.y2eb{bottom:94.580749pt;} +.y2fb{bottom:94.696745pt;} +.y56e{bottom:95.194494pt;} +.y335{bottom:95.268116pt;} +.y642{bottom:95.333042pt;} .y33{bottom:96.000000pt;} -.yf5a{bottom:96.437179pt;} -.y112{bottom:96.743168pt;} -.y127{bottom:97.405200pt;} -.y1344{bottom:97.788365pt;} -.y617{bottom:97.859698pt;} -.y470{bottom:97.998268pt;} -.y1283{bottom:98.319544pt;} -.y5fa{bottom:98.612619pt;} -.y657{bottom:99.045042pt;} -.y128e{bottom:99.122877pt;} -.yf1e{bottom:99.166776pt;} -.y193{bottom:99.208104pt;} -.y594{bottom:99.425001pt;} -.y12a4{bottom:99.426603pt;} -.y12a6{bottom:99.743465pt;} -.y94d{bottom:99.797935pt;} -.y655{bottom:99.973041pt;} -.y33e{bottom:100.002426pt;} -.y7e4{bottom:100.115113pt;} -.y1134{bottom:100.922045pt;} -.y924{bottom:101.080294pt;} -.y1257{bottom:101.414171pt;} -.y7d8{bottom:101.990784pt;} -.y115{bottom:102.031155pt;} -.y6be{bottom:102.325635pt;} -.y1258{bottom:102.397291pt;} -.y5f8{bottom:102.597418pt;} -.y32d{bottom:102.701164pt;} -.y194{bottom:103.041464pt;} -.y91b{bottom:103.075340pt;} -.y112c{bottom:103.097490pt;} -.y60a{bottom:103.124110pt;} -.y6bc{bottom:103.290654pt;} -.y593{bottom:103.551051pt;} -.y5f9{bottom:103.593618pt;} -.y94c{bottom:103.765320pt;} -.y192{bottom:103.999803pt;} -.y11d2{bottom:105.011882pt;} -.y11b9{bottom:105.182012pt;} -.y127d{bottom:105.926147pt;} -.y13de{bottom:106.233074pt;} -.y1302{bottom:106.793868pt;} -.yf59{bottom:107.121889pt;} -.y300{bottom:107.206385pt;} -.y57e{bottom:108.183910pt;} -.y928{bottom:108.345376pt;} -.y1288{bottom:109.260374pt;} -.y1289{bottom:109.660460pt;} -.y2f5{bottom:110.642432pt;} -.y130e{bottom:111.110060pt;} -.y2ef{bottom:111.119067pt;} -.y1282{bottom:111.476645pt;} -.y57c{bottom:111.851509pt;} -.y2fe{bottom:112.071246pt;} -.y2ee{bottom:112.072351pt;} -.y125{bottom:112.196360pt;} -.y111{bottom:112.424290pt;} -.y57d{bottom:112.768409pt;} -.y12a5{bottom:113.032538pt;} -.yf1a{bottom:114.090730pt;} -.y12a3{bottom:114.167044pt;} -.y457{bottom:114.849417pt;} -.y44f{bottom:114.849970pt;} -.y7d7{bottom:115.064724pt;} -.y7e3{bottom:115.566133pt;} -.y112b{bottom:115.858737pt;} -.y94b{bottom:116.551229pt;} -.y2ff{bottom:116.936106pt;} -.y6bb{bottom:116.985655pt;} -.y927{bottom:117.084163pt;} -.y6bd{bottom:117.265636pt;} -.y5f7{bottom:117.706457pt;} -.yf58{bottom:117.806599pt;} -.y653{bottom:117.865685pt;} -.y91a{bottom:119.828635pt;} -.y1256{bottom:120.394949pt;} -.y94a{bottom:120.518615pt;} -.y621{bottom:121.149360pt;} -.y626{bottom:121.391543pt;} -.y654{bottom:121.577685pt;} -.y5f5{bottom:121.691256pt;} -.y190{bottom:122.477405pt;} -.y652{bottom:122.505684pt;} -.y5f6{bottom:122.687456pt;} -.y991{bottom:122.815209pt;} -.y61a{bottom:123.024199pt;} -.y61d{bottom:123.512743pt;} -.y1301{bottom:124.205557pt;} -.y1342{bottom:124.497399pt;} -.y12f1{bottom:124.497748pt;} -.y57b{bottom:125.757826pt;} -.y191{bottom:126.310765pt;} -.y1268{bottom:126.456487pt;} -.y123{bottom:126.626760pt;} -.y18f{bottom:127.269104pt;} -.y7d6{bottom:128.138664pt;} -.yf19{bottom:128.302429pt;} -.yf57{bottom:128.519931pt;} -.y112a{bottom:128.585892pt;} -.y579{bottom:129.425425pt;} -.y1265{bottom:129.706362pt;} -.y57a{bottom:130.342325pt;} -.y1255{bottom:130.661997pt;} -.y12ff{bottom:132.049874pt;} -.y25c{bottom:132.153333pt;} -.y466{bottom:132.451499pt;} -.y2f0{bottom:132.881793pt;} -.y946{bottom:133.144334pt;} -.y945{bottom:133.304524pt;} -.y2ec{bottom:133.358430pt;} -.y1133{bottom:133.367206pt;} -.y2ed{bottom:134.311711pt;} -.y620{bottom:134.937160pt;} -.y625{bottom:135.179343pt;} -.ye1{bottom:135.850667pt;} -.y83f{bottom:135.862667pt;} -.ydae{bottom:135.868000pt;} -.y952{bottom:135.904254pt;} -.y22c{bottom:136.000000pt;} -.yb1c{bottom:136.414667pt;} -.y919{bottom:136.581929pt;} -.y5f4{bottom:136.800289pt;} -.y619{bottom:136.811999pt;} -.y482{bottom:136.881333pt;} -.yc38{bottom:137.152000pt;} +.yf18{bottom:96.437179pt;} +.y113{bottom:96.743168pt;} +.y128{bottom:97.405200pt;} +.y12ef{bottom:97.788365pt;} +.y604{bottom:97.859698pt;} +.y464{bottom:97.998268pt;} +.y1233{bottom:98.319544pt;} +.y5e7{bottom:98.612619pt;} +.y643{bottom:99.045042pt;} +.y123e{bottom:99.122877pt;} +.yedc{bottom:99.166776pt;} +.y190{bottom:99.208104pt;} +.y582{bottom:99.425001pt;} +.y1254{bottom:99.426603pt;} +.y1256{bottom:99.743465pt;} +.y926{bottom:99.797935pt;} +.y641{bottom:99.973041pt;} +.y336{bottom:100.002426pt;} +.y7c6{bottom:100.115113pt;} +.y10ea{bottom:100.922045pt;} +.y8fe{bottom:101.080294pt;} +.y1207{bottom:101.414171pt;} +.y7ba{bottom:101.990784pt;} +.y116{bottom:102.031155pt;} +.y6a7{bottom:102.325635pt;} +.y1208{bottom:102.397291pt;} +.y5e5{bottom:102.597418pt;} +.y325{bottom:102.701164pt;} +.y191{bottom:103.041464pt;} +.y8f5{bottom:103.075340pt;} +.y10e2{bottom:103.097490pt;} +.y5f7{bottom:103.124110pt;} +.y6a5{bottom:103.290654pt;} +.y581{bottom:103.551051pt;} +.y5e6{bottom:103.593618pt;} +.y925{bottom:103.765320pt;} +.y18f{bottom:103.999803pt;} +.y1184{bottom:105.011882pt;} +.y116b{bottom:105.182012pt;} +.y122d{bottom:105.926147pt;} +.y1385{bottom:106.233074pt;} +.y12af{bottom:106.793868pt;} +.yf17{bottom:107.121889pt;} +.y2f9{bottom:107.206385pt;} +.y56c{bottom:108.183910pt;} +.y902{bottom:108.345376pt;} +.y1238{bottom:109.260374pt;} +.y1239{bottom:109.660460pt;} +.y2ee{bottom:110.642432pt;} +.y12bb{bottom:111.110060pt;} +.y2e8{bottom:111.119067pt;} +.y1232{bottom:111.476645pt;} +.y56a{bottom:111.851509pt;} +.y2f7{bottom:112.071246pt;} +.y2e7{bottom:112.072351pt;} +.y126{bottom:112.196360pt;} +.y112{bottom:112.424290pt;} +.y56b{bottom:112.768409pt;} +.y1255{bottom:113.032538pt;} +.yed8{bottom:114.090730pt;} +.y1253{bottom:114.167044pt;} +.y44b{bottom:114.849417pt;} +.y443{bottom:114.849970pt;} +.y7b9{bottom:115.064724pt;} +.y7c5{bottom:115.566133pt;} +.y10e1{bottom:115.858737pt;} +.y924{bottom:116.551229pt;} +.y2f8{bottom:116.936106pt;} +.y6a4{bottom:116.985655pt;} +.y901{bottom:117.084163pt;} +.y6a6{bottom:117.265636pt;} +.y5e4{bottom:117.706457pt;} +.yf16{bottom:117.806599pt;} +.y63f{bottom:117.865685pt;} +.y8f4{bottom:119.828635pt;} +.y1206{bottom:120.394949pt;} +.y923{bottom:120.518615pt;} +.y60e{bottom:121.149360pt;} +.y613{bottom:121.391543pt;} +.y640{bottom:121.577685pt;} +.y5e2{bottom:121.691256pt;} +.y18d{bottom:122.477405pt;} +.y63e{bottom:122.505684pt;} +.y5e3{bottom:122.687456pt;} +.y969{bottom:122.815209pt;} +.y607{bottom:123.024199pt;} +.y60a{bottom:123.512743pt;} +.y12ae{bottom:124.205557pt;} +.y12ed{bottom:124.497399pt;} +.y129e{bottom:124.497748pt;} +.y569{bottom:125.757826pt;} +.y18e{bottom:126.310765pt;} +.y1218{bottom:126.456487pt;} +.y124{bottom:126.626760pt;} +.y18c{bottom:127.269104pt;} +.y7b8{bottom:128.138664pt;} +.yed7{bottom:128.302429pt;} +.yf15{bottom:128.519931pt;} +.y10e0{bottom:128.585892pt;} +.y567{bottom:129.425425pt;} +.y1215{bottom:129.706362pt;} +.y568{bottom:130.342325pt;} +.y1205{bottom:130.661997pt;} +.y12ac{bottom:132.049874pt;} +.y256{bottom:132.153333pt;} +.y45a{bottom:132.451499pt;} +.y2e9{bottom:132.881793pt;} +.y91f{bottom:133.144334pt;} +.y91e{bottom:133.304524pt;} +.y2e5{bottom:133.358430pt;} +.y10e9{bottom:133.367206pt;} +.y2e6{bottom:134.311711pt;} +.y60d{bottom:134.937160pt;} +.y612{bottom:135.179343pt;} +.ye2{bottom:135.850667pt;} +.y81e{bottom:135.862667pt;} +.yd74{bottom:135.868000pt;} +.y92b{bottom:135.904254pt;} +.yaed{bottom:136.414667pt;} +.y8f3{bottom:136.581929pt;} +.y5e1{bottom:136.800289pt;} +.y606{bottom:136.811999pt;} +.y476{bottom:136.881333pt;} +.yc03{bottom:137.152000pt;} .y56{bottom:137.188000pt;} -.y944{bottom:137.271909pt;} -.y61c{bottom:137.300544pt;} -.y1403{bottom:137.633333pt;} -.y1300{bottom:137.737758pt;} -.y1be{bottom:138.329333pt;} -.y128a{bottom:138.366861pt;} -.ye40{bottom:138.509333pt;} -.y716{bottom:138.522667pt;} -.ye1e{bottom:138.666667pt;} -.y1426{bottom:138.793333pt;} -.y152e{bottom:138.892000pt;} -.y1453{bottom:138.904000pt;} -.y1217{bottom:139.089333pt;} -.y133e{bottom:139.212000pt;} -.yf56{bottom:139.233268pt;} -.y1254{bottom:139.238082pt;} -.yb47{bottom:139.333333pt;} -.y140{bottom:139.601333pt;} -.y32a{bottom:139.630667pt;} -.yb1b{bottom:140.165333pt;} -.yc72{bottom:140.328000pt;} -.y650{bottom:140.398301pt;} -.yd8e{bottom:140.440000pt;} -.y1341{bottom:140.490001pt;} -.y12f0{bottom:140.490349pt;} -.y386{bottom:140.509333pt;} -.y22b{bottom:140.670667pt;} -.y6b6{bottom:140.781333pt;} -.y5f2{bottom:140.785088pt;} -.y741{bottom:141.192000pt;} -.y7d5{bottom:141.212608pt;} -.y1129{bottom:141.313047pt;} -.y1507{bottom:141.494667pt;} -.y5e8{bottom:141.698667pt;} -.y5f3{bottom:141.781288pt;} -.y138c{bottom:141.914667pt;} -.y4be{bottom:142.200000pt;} -.y13d4{bottom:142.293333pt;} -.yfa6{bottom:142.317333pt;} -.y385{bottom:142.502667pt;} -.yb8d{bottom:142.602667pt;} -.y1452{bottom:142.654667pt;} -.y1216{bottom:142.840000pt;} -.y133d{bottom:142.962667pt;} -.y578{bottom:143.331746pt;} -.yf7b{bottom:143.544000pt;} -.yc54{bottom:143.584000pt;} -.y50b{bottom:143.750667pt;} -.ya51{bottom:143.976000pt;} -.yb67{bottom:144.017333pt;} -.y651{bottom:144.110301pt;} -.y953{bottom:144.148556pt;} -.ya72{bottom:144.396000pt;} -.y996{bottom:144.414858pt;} -.y6b5{bottom:144.532000pt;} -.ydf4{bottom:144.584000pt;} -.y410{bottom:144.613333pt;} -.y93d{bottom:144.932343pt;} -.y64f{bottom:145.038300pt;} +.y91d{bottom:137.271909pt;} +.y609{bottom:137.300544pt;} +.y13aa{bottom:137.633333pt;} +.y12ad{bottom:137.737758pt;} +.y1bb{bottom:138.329333pt;} +.y123a{bottom:138.366861pt;} +.ye03{bottom:138.509333pt;} +.y6ff{bottom:138.522667pt;} +.y13cd{bottom:138.793333pt;} +.y14d2{bottom:138.892000pt;} +.y13fa{bottom:138.904000pt;} +.y11c8{bottom:139.089333pt;} +.y12ea{bottom:139.212000pt;} +.yf14{bottom:139.233268pt;} +.y1204{bottom:139.238082pt;} +.y141{bottom:139.601333pt;} +.y323{bottom:139.630667pt;} +.yaec{bottom:140.165333pt;} +.yc3b{bottom:140.328000pt;} +.y63c{bottom:140.398301pt;} +.yd54{bottom:140.440000pt;} +.y12ec{bottom:140.490001pt;} +.y129d{bottom:140.490349pt;} +.y37e{bottom:140.509333pt;} +.y225{bottom:140.670667pt;} +.y6a0{bottom:140.781333pt;} +.y5df{bottom:140.785088pt;} +.y729{bottom:141.192000pt;} +.y7b7{bottom:141.212608pt;} +.y10df{bottom:141.313047pt;} +.y14ab{bottom:141.494667pt;} +.y5d6{bottom:141.698667pt;} +.y5e0{bottom:141.781288pt;} +.y1336{bottom:141.914667pt;} +.y4b0{bottom:142.200000pt;} +.y137c{bottom:142.293333pt;} +.yf63{bottom:142.317333pt;} +.y37d{bottom:142.502667pt;} +.yb5b{bottom:142.602667pt;} +.y13f9{bottom:142.654667pt;} +.y11c7{bottom:142.840000pt;} +.y12e9{bottom:142.962667pt;} +.ybb{bottom:143.165333pt;} +.y566{bottom:143.331746pt;} +.yf39{bottom:143.544000pt;} +.yc1e{bottom:143.584000pt;} +.y4fc{bottom:143.750667pt;} +.ya26{bottom:143.976000pt;} +.yb36{bottom:144.017333pt;} +.y63d{bottom:144.110301pt;} +.y92c{bottom:144.148556pt;} +.ya46{bottom:144.396000pt;} +.y96e{bottom:144.414858pt;} +.y69f{bottom:144.532000pt;} +.ydb8{bottom:144.584000pt;} +.y406{bottom:144.613333pt;} +.y916{bottom:144.932343pt;} +.y63b{bottom:145.038300pt;} .y85{bottom:145.157333pt;} -.yf17{bottom:145.258781pt;} -.y1164{bottom:145.684000pt;} -.y18d{bottom:145.746701pt;} -.y11ad{bottom:145.858667pt;} -.y4bd{bottom:145.950667pt;} -.y1179{bottom:146.126667pt;} -.y100e{bottom:146.330667pt;} -.y1a3{bottom:146.332216pt;} -.yb8c{bottom:146.352000pt;} -.y98a{bottom:146.862667pt;} -.y128d{bottom:146.966878pt;} -.y576{bottom:146.999345pt;} -.y7ce{bottom:147.186667pt;} -.y25b{bottom:147.190667pt;} -.y50a{bottom:147.501333pt;} -.y66b{bottom:147.603013pt;} -.y1285{bottom:147.802298pt;} -.y12ec{bottom:147.832000pt;} -.y134{bottom:147.911600pt;} -.y577{bottom:147.916245pt;} -.y10a{bottom:148.000000pt;} -.y8ef{bottom:148.037333pt;} -.y1286{bottom:148.202381pt;} -.y12ca{bottom:148.225333pt;} -.ydf3{bottom:148.334667pt;} -.y990{bottom:148.382243pt;} -.y449{bottom:148.469333pt;} -.y83e{bottom:148.482667pt;} -.ydad{bottom:148.488000pt;} -.y53b{bottom:148.522667pt;} -.y25a{bottom:148.666667pt;} -.y14b8{bottom:149.038667pt;} -.y6e9{bottom:149.086667pt;} -.yaf4{bottom:149.333333pt;} -.y18e{bottom:149.580062pt;} -.yf55{bottom:149.917978pt;} -.y8f0{bottom:150.000000pt;} -.y943{bottom:150.057815pt;} -.y1402{bottom:150.253333pt;} -.y18c{bottom:150.538401pt;} -.y989{bottom:150.613333pt;} -.y609{bottom:150.855349pt;} -.y172{bottom:150.941333pt;} -.y1bd{bottom:150.948000pt;} -.y715{bottom:151.142667pt;} -.y1317{bottom:151.333333pt;} -.y1425{bottom:151.412000pt;} -.y152d{bottom:151.510667pt;} -.y1215{bottom:151.761333pt;} -.ye0{bottom:151.790667pt;} -.y1316{bottom:151.932000pt;} -.y12c9{bottom:151.974667pt;} -.y77f{bottom:152.220000pt;} -.ydac{bottom:152.238667pt;} -.y53a{bottom:152.273333pt;} -.y259{bottom:152.417333pt;} -.ydcc{bottom:152.584000pt;} -.y14b7{bottom:152.789333pt;} -.y1032{bottom:152.817333pt;} -.y481{bottom:152.822667pt;} -.y6e8{bottom:152.837333pt;} +.yed5{bottom:145.258781pt;} +.y1119{bottom:145.684000pt;} +.y18a{bottom:145.746701pt;} +.y1160{bottom:145.858667pt;} +.y4af{bottom:145.950667pt;} +.y112d{bottom:146.126667pt;} +.yfc8{bottom:146.330667pt;} +.y1a0{bottom:146.332216pt;} +.yb5a{bottom:146.352000pt;} +.y963{bottom:146.862667pt;} +.y123d{bottom:146.966878pt;} +.y564{bottom:146.999345pt;} +.y7b2{bottom:147.186667pt;} +.y255{bottom:147.190667pt;} +.y4fb{bottom:147.501333pt;} +.y657{bottom:147.603013pt;} +.y1235{bottom:147.802298pt;} +.y129a{bottom:147.832000pt;} +.y135{bottom:147.911600pt;} +.y565{bottom:147.916245pt;} +.y8cb{bottom:148.037333pt;} +.y1236{bottom:148.202381pt;} +.y127a{bottom:148.225333pt;} +.ydb7{bottom:148.334667pt;} +.y968{bottom:148.382243pt;} +.y43e{bottom:148.469333pt;} +.y81d{bottom:148.482667pt;} +.yd73{bottom:148.488000pt;} +.y52b{bottom:148.522667pt;} +.y254{bottom:148.666667pt;} +.y145d{bottom:149.038667pt;} +.y6d2{bottom:149.086667pt;} +.y18b{bottom:149.580062pt;} +.yf13{bottom:149.917978pt;} +.y91c{bottom:150.057815pt;} +.y13a9{bottom:150.253333pt;} +.y189{bottom:150.538401pt;} +.y962{bottom:150.613333pt;} +.y5f6{bottom:150.855349pt;} +.y170{bottom:150.941333pt;} +.y1ba{bottom:150.948000pt;} +.y6fe{bottom:151.142667pt;} +.y13cc{bottom:151.412000pt;} +.y14d1{bottom:151.510667pt;} +.y11c6{bottom:151.761333pt;} +.ye1{bottom:151.790667pt;} +.y12c3{bottom:151.932000pt;} +.y1279{bottom:151.974667pt;} +.y765{bottom:152.220000pt;} +.yd72{bottom:152.238667pt;} +.y52a{bottom:152.273333pt;} +.y253{bottom:152.417333pt;} +.yd91{bottom:152.584000pt;} +.y145c{bottom:152.789333pt;} +.yfeb{bottom:152.817333pt;} +.y475{bottom:152.822667pt;} +.y6d1{bottom:152.837333pt;} .y55{bottom:153.128000pt;} -.y687{bottom:153.333333pt;} -.y918{bottom:153.335220pt;} -.y913{bottom:153.350667pt;} -.y329{bottom:153.578667pt;} -.y740{bottom:153.810667pt;} -.y1401{bottom:154.004000pt;} -.y942{bottom:154.025200pt;} -.y1128{bottom:154.074294pt;} -.y6b9{bottom:154.175231pt;} -.y7d4{bottom:154.286549pt;} -.y127f{bottom:154.321292pt;} -.y10f8{bottom:154.346667pt;} -.ye3f{bottom:154.449333pt;} -.y1469{bottom:154.462667pt;} -.ybe3{bottom:154.517333pt;} -.y1281{bottom:154.655541pt;} -.yb68{bottom:154.666667pt;} -.y171{bottom:154.690667pt;} -.y1bc{bottom:154.698667pt;} -.y4bc{bottom:154.873333pt;} -.y714{bottom:154.892000pt;} -.y2eb{bottom:155.121153pt;} -.y1424{bottom:155.162667pt;} -.y152c{bottom:155.261333pt;} -.y1214{bottom:155.512000pt;} -.y328{bottom:155.570667pt;} -.y1315{bottom:155.682667pt;} -.y5f1{bottom:155.894126pt;} -.y4bf{bottom:156.000000pt;} -.y883{bottom:156.100000pt;} -.y93c{bottom:156.139535pt;} -.y686{bottom:156.141333pt;} -.yc71{bottom:156.268000pt;} -.ydcb{bottom:156.334667pt;} -.yd8d{bottom:156.380000pt;} -.ya50{bottom:156.594667pt;} -.y22a{bottom:156.610667pt;} -.ydcd{bottom:156.666667pt;} -.y1506{bottom:157.434667pt;} -.yc53{bottom:157.532000pt;} -.y5e7{bottom:157.638667pt;} -.yc18{bottom:157.801333pt;} -.y138b{bottom:157.854667pt;} -.y1252{bottom:157.943573pt;} -.yfcc{bottom:158.090667pt;} -.y13e{bottom:158.149333pt;} -.y13d3{bottom:158.233333pt;} -.yfa5{bottom:158.257333pt;} -.y8a9{bottom:158.354667pt;} -.y4bb{bottom:158.622667pt;} -.yd5c{bottom:158.666667pt;} -.yacb{bottom:158.826667pt;} -.ya2d{bottom:158.916000pt;} -.y1253{bottom:158.926693pt;} -.y85e{bottom:159.016000pt;} -.ybb{bottom:159.105333pt;} -.y961{bottom:159.333333pt;} -.y12fe{bottom:159.348011pt;} -.yf7a{bottom:159.484000pt;} -.yc52{bottom:159.524000pt;} -.y98f{bottom:159.589435pt;} -.yc17{bottom:159.794667pt;} -.y148e{bottom:159.834667pt;} -.y5ef{bottom:159.878925pt;} -.y685{bottom:159.892000pt;} -.y7e1{bottom:160.317899pt;} -.ya71{bottom:160.336000pt;} -.ya4f{bottom:160.345333pt;} -.y40f{bottom:160.554667pt;} -.y50c{bottom:160.666667pt;} -.y5f0{bottom:160.875125pt;} -.yb1a{bottom:160.888000pt;} -.y575{bottom:160.905662pt;} -.y448{bottom:161.089333pt;} +.y8f2{bottom:153.335220pt;} +.y8ee{bottom:153.350667pt;} +.y322{bottom:153.578667pt;} +.y728{bottom:153.810667pt;} +.y13a8{bottom:154.004000pt;} +.y91b{bottom:154.025200pt;} +.y10de{bottom:154.074294pt;} +.y6a2{bottom:154.175231pt;} +.y7b6{bottom:154.286549pt;} +.y122f{bottom:154.321292pt;} +.y10ae{bottom:154.346667pt;} +.ye02{bottom:154.449333pt;} +.y1410{bottom:154.462667pt;} +.ybaf{bottom:154.517333pt;} +.y1231{bottom:154.655541pt;} +.y16f{bottom:154.690667pt;} +.y1b9{bottom:154.698667pt;} +.y4ae{bottom:154.873333pt;} +.y6fd{bottom:154.892000pt;} +.y2e4{bottom:155.121153pt;} +.y13cb{bottom:155.162667pt;} +.y14d0{bottom:155.261333pt;} +.y11c5{bottom:155.512000pt;} +.y321{bottom:155.570667pt;} +.y12c2{bottom:155.682667pt;} +.y5de{bottom:155.894126pt;} +.y861{bottom:156.100000pt;} +.y915{bottom:156.139535pt;} +.y671{bottom:156.141333pt;} +.yc3a{bottom:156.268000pt;} +.yd90{bottom:156.334667pt;} +.yd53{bottom:156.380000pt;} +.ya25{bottom:156.594667pt;} +.y224{bottom:156.610667pt;} +.y14aa{bottom:157.434667pt;} +.yc1d{bottom:157.532000pt;} +.y5d5{bottom:157.638667pt;} +.ybe4{bottom:157.801333pt;} +.y1335{bottom:157.854667pt;} +.y1202{bottom:157.943573pt;} +.yf89{bottom:158.090667pt;} +.y13f{bottom:158.149333pt;} +.y137b{bottom:158.233333pt;} +.yf62{bottom:158.257333pt;} +.y887{bottom:158.354667pt;} +.y4ad{bottom:158.622667pt;} +.yd23{bottom:158.666667pt;} +.ya9e{bottom:158.826667pt;} +.ya03{bottom:158.916000pt;} +.y1203{bottom:158.926693pt;} +.y83d{bottom:159.016000pt;} +.yba{bottom:159.105333pt;} +.y12ab{bottom:159.348011pt;} +.yf38{bottom:159.484000pt;} +.yc1c{bottom:159.524000pt;} +.y967{bottom:159.589435pt;} +.ybe3{bottom:159.794667pt;} +.y1434{bottom:159.834667pt;} +.y5dc{bottom:159.878925pt;} +.y670{bottom:159.892000pt;} +.y7c3{bottom:160.317899pt;} +.ya45{bottom:160.336000pt;} +.ya24{bottom:160.345333pt;} +.y405{bottom:160.554667pt;} +.y5dd{bottom:160.875125pt;} +.yaeb{bottom:160.888000pt;} +.y563{bottom:160.905662pt;} +.y43d{bottom:161.089333pt;} .y84{bottom:161.097333pt;} -.y83d{bottom:161.101333pt;} -.y569{bottom:161.142667pt;} -.y6b7{bottom:161.333333pt;} -.yc88{bottom:161.581333pt;} -.y6b4{bottom:161.622667pt;} -.y1163{bottom:161.625333pt;} -.y1a2{bottom:161.665657pt;} -.y10d8{bottom:161.708000pt;} -.y11ac{bottom:161.798667pt;} -.y1df{bottom:161.800000pt;} -.y1c0{bottom:162.000000pt;} -.y1178{bottom:162.068000pt;} -.yb46{bottom:162.133333pt;} -.y99a{bottom:162.202781pt;} -.y100d{bottom:162.270667pt;} -.yaf3{bottom:162.322667pt;} -.y1451{bottom:162.329333pt;} -.yf54{bottom:162.380605pt;} -.y66a{bottom:162.451013pt;} -.y133b{bottom:162.637333pt;} -.y13d5{bottom:162.666667pt;} -.y64d{bottom:162.930907pt;} -.y13f{bottom:162.969333pt;} -.yece{bottom:163.072000pt;} -.y7cd{bottom:163.128000pt;} -.y8aa{bottom:163.176000pt;} -.y1095{bottom:163.312000pt;} -.y173{bottom:163.333333pt;} -.y148d{bottom:163.585333pt;} -.y170{bottom:163.613333pt;} -.y12eb{bottom:163.772000pt;} -.y85f{bottom:163.836000pt;} -.y8ee{bottom:163.977333pt;} -.y12ed{bottom:164.000000pt;} -.y1213{bottom:164.434667pt;} -.y573{bottom:164.573261pt;} -.y1240{bottom:164.840000pt;} -.y568{bottom:164.893333pt;} -.y992{bottom:164.962701pt;} -.ydca{bottom:165.256000pt;} -.y46b{bottom:165.391230pt;} -.y574{bottom:165.490161pt;} -.yc9b{bottom:165.553333pt;} -.y1132{bottom:165.818948pt;} -.yb8b{bottom:166.026667pt;} -.yaf2{bottom:166.073333pt;} -.y73f{bottom:166.430667pt;} -.y64e{bottom:166.642907pt;} -.y941{bottom:166.811110pt;} -.y1127{bottom:166.835548pt;} -.y1468{bottom:167.082667pt;} -.y149b{bottom:167.112000pt;} -.y509{bottom:167.174667pt;} -.y258{bottom:167.218667pt;} -.y16f{bottom:167.364000pt;} -.y133c{bottom:167.457333pt;} -.y4ba{bottom:167.545333pt;} -.y64c{bottom:167.570906pt;} -.y109{bottom:167.730667pt;} -.y158b{bottom:168.000000pt;} -.y1212{bottom:168.185333pt;} -.y3c8{bottom:168.533333pt;} -.y670{bottom:168.666667pt;} -.y1280{bottom:168.673833pt;} -.ydf2{bottom:168.746667pt;} -.y1031{bottom:168.757333pt;} -.y480{bottom:168.762667pt;} -.y947{bottom:168.987837pt;} -.y18a{bottom:169.015998pt;} +.y81c{bottom:161.101333pt;} +.y558{bottom:161.142667pt;} +.yc50{bottom:161.581333pt;} +.y69e{bottom:161.622667pt;} +.y1118{bottom:161.625333pt;} +.y19f{bottom:161.665657pt;} +.y108f{bottom:161.708000pt;} +.y115f{bottom:161.798667pt;} +.y1da{bottom:161.800000pt;} +.y112c{bottom:162.068000pt;} +.yb16{bottom:162.133333pt;} +.y972{bottom:162.202781pt;} +.yfc7{bottom:162.270667pt;} +.yac5{bottom:162.322667pt;} +.y13f8{bottom:162.329333pt;} +.yf12{bottom:162.380605pt;} +.y656{bottom:162.451013pt;} +.y12e7{bottom:162.637333pt;} +.y639{bottom:162.930907pt;} +.y140{bottom:162.969333pt;} +.ye8f{bottom:163.072000pt;} +.y7b1{bottom:163.128000pt;} +.y888{bottom:163.176000pt;} +.y104d{bottom:163.312000pt;} +.y1433{bottom:163.585333pt;} +.y16e{bottom:163.613333pt;} +.y1299{bottom:163.772000pt;} +.y83e{bottom:163.836000pt;} +.y8ca{bottom:163.977333pt;} +.y11c4{bottom:164.434667pt;} +.y561{bottom:164.573261pt;} +.y11f1{bottom:164.840000pt;} +.y557{bottom:164.893333pt;} +.y96a{bottom:164.962701pt;} +.yd8f{bottom:165.256000pt;} +.y45f{bottom:165.391230pt;} +.y562{bottom:165.490161pt;} +.yc63{bottom:165.553333pt;} +.y10e8{bottom:165.818948pt;} +.yb59{bottom:166.026667pt;} +.yac4{bottom:166.073333pt;} +.y727{bottom:166.430667pt;} +.y63a{bottom:166.642907pt;} +.y91a{bottom:166.811110pt;} +.y10dd{bottom:166.835548pt;} +.y140f{bottom:167.082667pt;} +.y1440{bottom:167.112000pt;} +.y4fa{bottom:167.174667pt;} +.y252{bottom:167.218667pt;} +.y16d{bottom:167.364000pt;} +.y12e8{bottom:167.457333pt;} +.y4ac{bottom:167.545333pt;} +.y638{bottom:167.570906pt;} +.ye0{bottom:167.730667pt;} +.y11c3{bottom:168.185333pt;} +.y3bf{bottom:168.533333pt;} +.y1230{bottom:168.673833pt;} +.ydb6{bottom:168.746667pt;} +.yfea{bottom:168.757333pt;} +.y474{bottom:168.762667pt;} +.y920{bottom:168.987837pt;} +.y187{bottom:169.015998pt;} .y54{bottom:169.068000pt;} -.y912{bottom:169.290667pt;} -.y592{bottom:169.715854pt;} -.y127e{bottom:169.870593pt;} -.yd10{bottom:169.886667pt;} -.y917{bottom:170.088515pt;} -.ycf0{bottom:170.118667pt;} -.y73e{bottom:170.180000pt;} -.y988{bottom:170.286667pt;} -.ye3e{bottom:170.389333pt;} -.y940{bottom:170.778495pt;} -.y1467{bottom:170.833333pt;} -.y256{bottom:170.980000pt;} -.y539{bottom:171.036000pt;} -.y77e{bottom:171.229333pt;} -.yc37{bottom:171.230667pt;} -.y327{bottom:171.510667pt;} -.y12c8{bottom:171.649333pt;} -.y383{bottom:171.725333pt;} -.y15fb{bottom:171.737333pt;} -.y713{bottom:171.984000pt;} -.y9b5{bottom:172.000000pt;} -.y882{bottom:172.040000pt;} -.y1120{bottom:172.101333pt;} -.yc70{bottom:172.208000pt;} -.yd8c{bottom:172.320000pt;} -.y14b6{bottom:172.462667pt;} -.y148c{bottom:172.508000pt;} -.y229{bottom:172.552000pt;} -.y18b{bottom:172.849358pt;} -.y6e7{bottom:172.880000pt;} -.y53c{bottom:173.333333pt;} -.y1505{bottom:173.374667pt;} -.y5e6{bottom:173.578667pt;} -.y447{bottom:173.708000pt;} -.y83c{bottom:173.721333pt;} -.ye1d{bottom:173.761333pt;} -.y138a{bottom:173.794667pt;} -.y189{bottom:173.807697pt;} -.y591{bottom:173.841904pt;} -.yfcb{bottom:174.030667pt;} -.y13d{bottom:174.089333pt;} -.y13d2{bottom:174.173333pt;} -.yfa4{bottom:174.197333pt;} -.y8a8{bottom:174.296000pt;} -.y1bb{bottom:174.373333pt;} -.y1400{bottom:174.416000pt;} -.yd5b{bottom:174.606667pt;} -.yacc{bottom:174.666667pt;} -.yaca{bottom:174.766667pt;} -.ya2b{bottom:174.856000pt;} -.y85d{bottom:174.956000pt;} -.y5ee{bottom:174.987956pt;} -.yba{bottom:175.045333pt;} -.y152b{bottom:175.305333pt;} -.y1314{bottom:175.357333pt;} -.yf79{bottom:175.424000pt;} -.y1423{bottom:175.574667pt;} -.yecd{bottom:175.692000pt;} -.yc16{bottom:175.734667pt;} -.y257{bottom:175.801333pt;} -.y1094{bottom:175.930667pt;} -.ycc1{bottom:175.992000pt;} -.y143{bottom:176.000000pt;} -.ya70{bottom:176.276000pt;} -.ye66{bottom:176.309333pt;} -.y40e{bottom:176.494667pt;} -.y384{bottom:176.546667pt;} -.y9b4{bottom:176.612000pt;} -.y11e6{bottom:176.666667pt;} -.yb19{bottom:176.828000pt;} -.y15f9{bottom:176.850667pt;} -.y1287{bottom:176.908783pt;} -.y1121{bottom:176.921333pt;} -.y1251{bottom:176.924351pt;} -.y1a1{bottom:176.999097pt;} -.y7fe{bottom:177.001333pt;} -.yf18{bottom:177.002982pt;} +.y8ed{bottom:169.290667pt;} +.y580{bottom:169.715854pt;} +.y122e{bottom:169.870593pt;} +.ycd7{bottom:169.886667pt;} +.y8f1{bottom:170.088515pt;} +.ycb7{bottom:170.118667pt;} +.y726{bottom:170.180000pt;} +.y961{bottom:170.286667pt;} +.ye01{bottom:170.389333pt;} +.y919{bottom:170.778495pt;} +.y140e{bottom:170.833333pt;} +.y250{bottom:170.980000pt;} +.y529{bottom:171.036000pt;} +.y764{bottom:171.229333pt;} +.yc02{bottom:171.230667pt;} +.y320{bottom:171.510667pt;} +.y1278{bottom:171.649333pt;} +.y37b{bottom:171.725333pt;} +.y159d{bottom:171.737333pt;} +.y6fc{bottom:171.984000pt;} +.y860{bottom:172.040000pt;} +.y10d6{bottom:172.101333pt;} +.yc39{bottom:172.208000pt;} +.yd52{bottom:172.320000pt;} +.y145b{bottom:172.462667pt;} +.y1432{bottom:172.508000pt;} +.y223{bottom:172.552000pt;} +.y188{bottom:172.849358pt;} +.y6d0{bottom:172.880000pt;} +.y14a9{bottom:173.374667pt;} +.y5d4{bottom:173.578667pt;} +.y43c{bottom:173.708000pt;} +.y81b{bottom:173.721333pt;} +.yde1{bottom:173.761333pt;} +.y1334{bottom:173.794667pt;} +.y186{bottom:173.807697pt;} +.y57f{bottom:173.841904pt;} +.yf88{bottom:174.030667pt;} +.y13e{bottom:174.089333pt;} +.y137a{bottom:174.173333pt;} +.yf61{bottom:174.197333pt;} +.y886{bottom:174.296000pt;} +.y1b8{bottom:174.373333pt;} +.y13a7{bottom:174.416000pt;} +.yd22{bottom:174.606667pt;} +.ya9d{bottom:174.766667pt;} +.ya01{bottom:174.856000pt;} +.y83c{bottom:174.956000pt;} +.y5db{bottom:174.987956pt;} +.yb9{bottom:175.045333pt;} +.y14cf{bottom:175.305333pt;} +.y12c1{bottom:175.357333pt;} +.yf37{bottom:175.424000pt;} +.y13ca{bottom:175.574667pt;} +.ye8e{bottom:175.692000pt;} +.ybe2{bottom:175.734667pt;} +.y251{bottom:175.801333pt;} +.y104c{bottom:175.930667pt;} +.yc89{bottom:175.992000pt;} +.ya44{bottom:176.276000pt;} +.ye28{bottom:176.309333pt;} +.y404{bottom:176.494667pt;} +.y37c{bottom:176.546667pt;} +.y98c{bottom:176.612000pt;} +.yaea{bottom:176.828000pt;} +.y159b{bottom:176.850667pt;} +.y1237{bottom:176.908783pt;} +.y10d7{bottom:176.921333pt;} +.y1201{bottom:176.924351pt;} +.y19e{bottom:176.999097pt;} +.y7e0{bottom:177.001333pt;} +.yed6{bottom:177.002982pt;} .y83{bottom:177.037333pt;} .y9d{bottom:177.038667pt;} -.y669{bottom:177.299014pt;} -.y446{bottom:177.458667pt;} -.y83b{bottom:177.472000pt;} -.ye1c{bottom:177.512000pt;} -.y6b3{bottom:177.562667pt;} -.y1162{bottom:177.565333pt;} -.y10d7{bottom:177.649333pt;} -.yf53{bottom:177.660706pt;} -.y11ab{bottom:177.740000pt;} -.ydc9{bottom:177.876000pt;} -.y1177{bottom:178.008000pt;} -.yb45{bottom:178.074667pt;} -.yc9a{bottom:178.172000pt;} -.y1450{bottom:178.269333pt;} -.y572{bottom:178.479582pt;} -.y7e8{bottom:178.558045pt;} -.ybb6{bottom:178.666667pt;} -.y5ec{bottom:178.972756pt;} -.y7cc{bottom:179.068000pt;} -.y73d{bottom:179.102667pt;} -.ye67{bottom:179.333333pt;} -.yecc{bottom:179.441333pt;} -.y1126{bottom:179.562701pt;} -.ya2c{bottom:179.677333pt;} -.y1093{bottom:179.681333pt;} -.y12ea{bottom:179.712000pt;} -.y8ed{bottom:179.917333pt;} -.y684{bottom:179.936000pt;} -.y5ed{bottom:179.968956pt;} -.y4b9{bottom:180.164000pt;} -.y8cc{bottom:180.885333pt;} +.y655{bottom:177.299014pt;} +.y43b{bottom:177.458667pt;} +.y81a{bottom:177.472000pt;} +.yde0{bottom:177.512000pt;} +.y69d{bottom:177.562667pt;} +.y1117{bottom:177.565333pt;} +.y108e{bottom:177.649333pt;} +.yf11{bottom:177.660706pt;} +.y115e{bottom:177.740000pt;} +.yd8e{bottom:177.876000pt;} +.y112b{bottom:178.008000pt;} +.yb15{bottom:178.074667pt;} +.yc62{bottom:178.172000pt;} +.y13f7{bottom:178.269333pt;} +.y560{bottom:178.479582pt;} +.y7ca{bottom:178.558045pt;} +.y5d9{bottom:178.972756pt;} +.y7b0{bottom:179.068000pt;} +.y725{bottom:179.102667pt;} +.ye8d{bottom:179.441333pt;} +.y10dc{bottom:179.562701pt;} +.ya02{bottom:179.677333pt;} +.y104b{bottom:179.681333pt;} +.y1298{bottom:179.712000pt;} +.y8c9{bottom:179.917333pt;} +.y66f{bottom:179.936000pt;} +.y5da{bottom:179.968956pt;} +.y4ab{bottom:180.164000pt;} +.y8a9{bottom:180.885333pt;} .y7{bottom:181.322929pt;} -.ydc8{bottom:181.626667pt;} -.yc99{bottom:181.922667pt;} -.yb8a{bottom:181.966667pt;} -.y570{bottom:182.147181pt;} -.ya4e{bottom:182.218667pt;} -.y994{bottom:182.286667pt;} -.y15fa{bottom:182.364000pt;} -.yb66{bottom:182.686667pt;} -.ycef{bottom:182.738667pt;} -.y253{bottom:182.913333pt;} -.y468{bottom:182.940945pt;} -.y149a{bottom:183.053333pt;} -.y571{bottom:183.064081pt;} -.y508{bottom:183.116000pt;} -.y255{bottom:183.158667pt;} -.y123f{bottom:183.526667pt;} -.y93f{bottom:183.564404pt;} -.y5b6{bottom:183.670667pt;} -.y62c{bottom:183.710667pt;} -.y4b8{bottom:183.914667pt;} -.ybe2{bottom:184.273333pt;} -.y567{bottom:184.414667pt;} -.y3c6{bottom:184.473333pt;} -.ydf1{bottom:184.686667pt;} -.y47f{bottom:184.702667pt;} -.ye8b{bottom:184.740000pt;} -.ydf{bottom:184.945333pt;} +.yd8d{bottom:181.626667pt;} +.yc61{bottom:181.922667pt;} +.yb58{bottom:181.966667pt;} +.y55e{bottom:182.147181pt;} +.ya23{bottom:182.218667pt;} +.y96c{bottom:182.286667pt;} +.y159c{bottom:182.364000pt;} +.yb35{bottom:182.686667pt;} +.ycb6{bottom:182.738667pt;} +.y24d{bottom:182.913333pt;} +.y45c{bottom:182.940945pt;} +.y143f{bottom:183.053333pt;} +.y55f{bottom:183.064081pt;} +.y4f9{bottom:183.116000pt;} +.y24f{bottom:183.158667pt;} +.y11f0{bottom:183.526667pt;} +.y918{bottom:183.564404pt;} +.y5a4{bottom:183.670667pt;} +.y619{bottom:183.710667pt;} +.y4aa{bottom:183.914667pt;} +.ybae{bottom:184.273333pt;} +.y556{bottom:184.414667pt;} +.y3bd{bottom:184.473333pt;} +.ydb5{bottom:184.686667pt;} +.y473{bottom:184.702667pt;} +.ye4c{bottom:184.740000pt;} .y53{bottom:185.008000pt;} -.y148b{bottom:185.126667pt;} -.yc36{bottom:185.178667pt;} -.y911{bottom:185.230667pt;} -.y64a{bottom:185.463527pt;} -.y9dc{bottom:185.484000pt;} -.yaf1{bottom:185.746667pt;} -.yd0f{bottom:185.826667pt;} -.y828{bottom:186.000000pt;} -.y987{bottom:186.226667pt;} -.y445{bottom:186.381333pt;} -.yf4c{bottom:186.445333pt;} -.ycee{bottom:186.488000pt;} -.y916{bottom:186.841809pt;} -.y251{bottom:186.921333pt;} -.y538{bottom:186.976000pt;} -.y16e{bottom:187.037333pt;} -.y77d{bottom:187.169333pt;} -.yc35{bottom:187.172000pt;} -.y1250{bottom:187.191399pt;} -.y1264{bottom:187.218884pt;} -.y326{bottom:187.450667pt;} -.y93e{bottom:187.531789pt;} -.y12c7{bottom:187.589333pt;} -.y467{bottom:187.855016pt;} -.y464{bottom:187.855553pt;} -.y1211{bottom:187.858667pt;} -.yd33{bottom:187.905333pt;} -.y712{bottom:187.924000pt;} -.y881{bottom:187.980000pt;} -.y111f{bottom:188.041333pt;} -.yc6f{bottom:188.148000pt;} -.yd8b{bottom:188.260000pt;} -.yecb{bottom:188.364000pt;} -.y1dd{bottom:188.366667pt;} -.y14b4{bottom:188.402667pt;} -.ya9d{bottom:188.517333pt;} -.y1092{bottom:188.602667pt;} -.y6e6{bottom:188.820000pt;} -.y148a{bottom:188.877333pt;} -.y64b{bottom:189.175527pt;} -.y133a{bottom:189.204000pt;} -.y3c7{bottom:189.294667pt;} -.y1504{bottom:189.314667pt;} -.y7ea{bottom:189.413240pt;} -.y5e5{bottom:189.518667pt;} -.y228{bottom:189.589333pt;} -.y1389{bottom:189.734667pt;} -.yfca{bottom:189.972000pt;} -.ydaf{bottom:190.000000pt;} -.y13c{bottom:190.029333pt;} -.y649{bottom:190.103527pt;} -.y13d1{bottom:190.113333pt;} -.yfa3{bottom:190.137333pt;} -.y8a7{bottom:190.236000pt;} -.y1ba{bottom:190.313333pt;} -.y13ff{bottom:190.356000pt;} -.yac9{bottom:190.706667pt;} -.yc98{bottom:190.844000pt;} -.yb9{bottom:190.986667pt;} -.y1466{bottom:191.245333pt;} -.y1313{bottom:191.297333pt;} -.y6c2{bottom:191.341053pt;} -.yf78{bottom:191.364000pt;} -.y100c{bottom:191.365333pt;} -.y1422{bottom:191.516000pt;} -.y7e7{bottom:191.631986pt;} -.yc15{bottom:191.674667pt;} -.y73c{bottom:191.721333pt;} -.y254{bottom:191.741333pt;} -.ycc0{bottom:191.932000pt;} -.y668{bottom:192.147014pt;} -.ya9c{bottom:192.268000pt;} -.y187{bottom:192.285308pt;} -.y1a0{bottom:192.332539pt;} -.y1091{bottom:192.353333pt;} -.y108{bottom:192.401333pt;} -.y40d{bottom:192.434667pt;} -.y9b3{bottom:192.552000pt;} -.y252{bottom:192.602667pt;} -.y4b7{bottom:192.837333pt;} -.ye1b{bottom:192.940000pt;} -.y7fd{bottom:192.942667pt;} +.y1431{bottom:185.126667pt;} +.yc01{bottom:185.178667pt;} +.y8ec{bottom:185.230667pt;} +.y636{bottom:185.463527pt;} +.y9b3{bottom:185.484000pt;} +.yac3{bottom:185.746667pt;} +.ycd6{bottom:185.826667pt;} +.y960{bottom:186.226667pt;} +.y43a{bottom:186.381333pt;} +.yf0a{bottom:186.445333pt;} +.ycb5{bottom:186.488000pt;} +.y8f0{bottom:186.841809pt;} +.y24b{bottom:186.921333pt;} +.y528{bottom:186.976000pt;} +.y16c{bottom:187.037333pt;} +.y763{bottom:187.169333pt;} +.yc00{bottom:187.172000pt;} +.y1200{bottom:187.191399pt;} +.y1214{bottom:187.218884pt;} +.y31f{bottom:187.450667pt;} +.y917{bottom:187.531789pt;} +.y1277{bottom:187.589333pt;} +.y45b{bottom:187.855016pt;} +.y458{bottom:187.855553pt;} +.y11c2{bottom:187.858667pt;} +.ycfa{bottom:187.905333pt;} +.y6fb{bottom:187.924000pt;} +.y85f{bottom:187.980000pt;} +.y10d5{bottom:188.041333pt;} +.yc38{bottom:188.148000pt;} +.yd51{bottom:188.260000pt;} +.ye8c{bottom:188.364000pt;} +.y1d8{bottom:188.366667pt;} +.y1459{bottom:188.402667pt;} +.ya70{bottom:188.517333pt;} +.y104a{bottom:188.602667pt;} +.y6cf{bottom:188.820000pt;} +.y1430{bottom:188.877333pt;} +.y637{bottom:189.175527pt;} +.y12e6{bottom:189.204000pt;} +.y3be{bottom:189.294667pt;} +.y14a8{bottom:189.314667pt;} +.y7cc{bottom:189.413240pt;} +.y5d3{bottom:189.518667pt;} +.y222{bottom:189.589333pt;} +.y1333{bottom:189.734667pt;} +.yf87{bottom:189.972000pt;} +.y13d{bottom:190.029333pt;} +.y635{bottom:190.103527pt;} +.y1379{bottom:190.113333pt;} +.yf60{bottom:190.137333pt;} +.y885{bottom:190.236000pt;} +.y1b7{bottom:190.313333pt;} +.y13a6{bottom:190.356000pt;} +.ya9c{bottom:190.706667pt;} +.yc60{bottom:190.844000pt;} +.y140d{bottom:191.245333pt;} +.y12c0{bottom:191.297333pt;} +.y6ab{bottom:191.341053pt;} +.yf36{bottom:191.364000pt;} +.yfc6{bottom:191.365333pt;} +.y13c9{bottom:191.516000pt;} +.y7c9{bottom:191.631986pt;} +.ybe1{bottom:191.674667pt;} +.y724{bottom:191.721333pt;} +.y24e{bottom:191.741333pt;} +.yc88{bottom:191.932000pt;} +.y654{bottom:192.147014pt;} +.ya6f{bottom:192.268000pt;} +.y184{bottom:192.285308pt;} +.y19d{bottom:192.332539pt;} +.y1049{bottom:192.353333pt;} +.y10b{bottom:192.401333pt;} +.y403{bottom:192.434667pt;} +.y98b{bottom:192.552000pt;} +.y24c{bottom:192.602667pt;} +.y4a9{bottom:192.837333pt;} +.yddf{bottom:192.940000pt;} +.y7df{bottom:192.942667pt;} .y82{bottom:192.978667pt;} -.y93a{bottom:193.104000pt;} -.y1de{bottom:193.186667pt;} -.y14b5{bottom:193.224000pt;} -.y6b2{bottom:193.504000pt;} -.y1161{bottom:193.505333pt;} -.y15f8{bottom:193.521333pt;} -.y10d6{bottom:193.589333pt;} -.yc51{bottom:193.604000pt;} -.y11aa{bottom:193.680000pt;} -.y1176{bottom:193.948000pt;} -.yb44{bottom:194.014667pt;} -.y1124{bottom:194.064320pt;} -.y144f{bottom:194.209333pt;} -.y7cb{bottom:195.008000pt;} -.ycc2{bottom:195.333333pt;} -.y224{bottom:195.472000pt;} -.y12e9{bottom:195.652000pt;} -.y124f{bottom:195.767484pt;} -.y8ec{bottom:195.857333pt;} -.y14df{bottom:195.933333pt;} -.y56f{bottom:196.053496pt;} -.y188{bottom:196.118668pt;} -.y4b6{bottom:196.588000pt;} -.y5eb{bottom:196.871018pt;} -.y186{bottom:197.077007pt;} -.y6c4{bottom:197.177632pt;} -.y146a{bottom:197.333333pt;} -.y100f{bottom:198.000000pt;} -.yb65{bottom:198.628000pt;} -.y15f6{bottom:198.636000pt;} -.y1191{bottom:198.954667pt;} -.y382{bottom:198.957333pt;} -.y1499{bottom:198.993333pt;} -.y444{bottom:199.000000pt;} -.y123e{bottom:199.466667pt;} -.y5b5{bottom:199.612000pt;} -.y62b{bottom:199.650667pt;} -.y56d{bottom:199.721095pt;} -.ybdf{bottom:200.080000pt;} -.ybe1{bottom:200.213333pt;} -.y566{bottom:200.354667pt;} -.ydf0{bottom:200.626667pt;} -.y56e{bottom:200.637995pt;} -.y47e{bottom:200.642667pt;} -.y9fe{bottom:200.654667pt;} -.ye8a{bottom:200.680000pt;} -.yde{bottom:200.885333pt;} +.y914{bottom:193.104000pt;} +.y1d9{bottom:193.186667pt;} +.y145a{bottom:193.224000pt;} +.y69c{bottom:193.504000pt;} +.y1116{bottom:193.505333pt;} +.y159a{bottom:193.521333pt;} +.y108d{bottom:193.589333pt;} +.yc1b{bottom:193.604000pt;} +.ydf{bottom:193.664000pt;} +.y115d{bottom:193.680000pt;} +.y112a{bottom:193.948000pt;} +.yb14{bottom:194.014667pt;} +.y10da{bottom:194.064320pt;} +.y13f6{bottom:194.209333pt;} +.y7af{bottom:195.008000pt;} +.y21e{bottom:195.472000pt;} +.y1297{bottom:195.652000pt;} +.y11ff{bottom:195.767484pt;} +.y8c8{bottom:195.857333pt;} +.y1484{bottom:195.933333pt;} +.y55d{bottom:196.053496pt;} +.y185{bottom:196.118668pt;} +.y4a8{bottom:196.588000pt;} +.y5d8{bottom:196.871018pt;} +.y183{bottom:197.077007pt;} +.y6ad{bottom:197.177632pt;} +.yb34{bottom:198.628000pt;} +.y1598{bottom:198.636000pt;} +.y1145{bottom:198.954667pt;} +.y37a{bottom:198.957333pt;} +.y143e{bottom:198.993333pt;} +.y439{bottom:199.000000pt;} +.y11ef{bottom:199.466667pt;} +.y5a3{bottom:199.612000pt;} +.y618{bottom:199.650667pt;} +.y55b{bottom:199.721095pt;} +.ybab{bottom:200.080000pt;} +.ybad{bottom:200.213333pt;} +.y555{bottom:200.354667pt;} +.ydb4{bottom:200.626667pt;} +.y55c{bottom:200.637995pt;} +.y472{bottom:200.642667pt;} +.y9d4{bottom:200.654667pt;} +.ye4b{bottom:200.680000pt;} .y52{bottom:200.948000pt;} -.y381{bottom:200.949333pt;} -.yeca{bottom:200.982667pt;} -.y85c{bottom:201.004000pt;} -.y910{bottom:201.170667pt;} -.ya9b{bottom:201.189333pt;} -.y1090{bottom:201.276000pt;} -.y9db{bottom:201.424000pt;} -.yaef{bottom:201.688000pt;} -.yd0e{bottom:201.768000pt;} -.y152a{bottom:201.872000pt;} -.ydc7{bottom:202.038667pt;} -.y10f7{bottom:202.166667pt;} -.y986{bottom:202.168000pt;} -.y227{bottom:202.245333pt;} -.yf4b{bottom:202.385333pt;} -.y6c1{bottom:202.546053pt;} -.y915{bottom:202.546100pt;} -.y1e0{bottom:202.666667pt;} -.y1030{bottom:202.722667pt;} -.y443{bottom:202.750667pt;} -.y250{bottom:202.861333pt;} -.y537{bottom:202.916000pt;} -.y16d{bottom:202.977333pt;} -.y77c{bottom:203.109333pt;} -.y325{bottom:203.390667pt;} -.yc97{bottom:203.464000pt;} -.y12c6{bottom:203.529333pt;} -.yd5a{bottom:203.701333pt;} -.y98c{bottom:203.703393pt;} -.y1210{bottom:203.798667pt;} -.yd32{bottom:203.845333pt;} -.y711{bottom:203.864000pt;} -.y880{bottom:203.921333pt;} -.y111e{bottom:203.981333pt;} -.y717{bottom:204.000000pt;} -.yc6e{bottom:204.089333pt;} -.y15f7{bottom:204.149333pt;} -.y14b3{bottom:204.344000pt;} -.yf25{bottom:204.406667pt;} -.y7e6{bottom:204.705926pt;} -.yec9{bottom:204.733333pt;} -.y6e5{bottom:204.760000pt;} -.y7e9{bottom:204.864260pt;} -.ya9a{bottom:204.940000pt;} -.y108f{bottom:205.026667pt;} -.y1339{bottom:205.144000pt;} -.y1503{bottom:205.254667pt;} -.y483{bottom:205.333333pt;} -.y46a{bottom:205.405266pt;} -.y5e4{bottom:205.458667pt;} -.y1388{bottom:205.676000pt;} -.y98b{bottom:206.000000pt;} -.y13d0{bottom:206.053333pt;} -.yfa2{bottom:206.078667pt;} -.y8a6{bottom:206.176000pt;} -.y1b9{bottom:206.253333pt;} -.y13fe{bottom:206.296000pt;} -.yaf0{bottom:206.508000pt;} -.yac8{bottom:206.648000pt;} -.y98e{bottom:206.728000pt;} -.y667{bottom:206.995015pt;} -.y1465{bottom:207.185333pt;} -.yc96{bottom:207.214667pt;} -.y1312{bottom:207.237333pt;} -.yf77{bottom:207.304000pt;} -.ye3d{bottom:207.306667pt;} -.y1421{bottom:207.456000pt;} -.yc50{bottom:207.552000pt;} -.yc14{bottom:207.614667pt;} -.y226{bottom:207.861333pt;} -.ycbf{bottom:207.872000pt;} -.ya2a{bottom:207.924000pt;} -.y647{bottom:207.996161pt;} -.yf24{bottom:208.157333pt;} -.y107{bottom:208.341333pt;} -.y40c{bottom:208.374667pt;} -.y9b2{bottom:208.492000pt;} -.y1489{bottom:208.552000pt;} -.ye1a{bottom:208.881333pt;} -.y7fc{bottom:208.882667pt;} +.y379{bottom:200.949333pt;} +.ye8b{bottom:200.982667pt;} +.y83b{bottom:201.004000pt;} +.y8eb{bottom:201.170667pt;} +.ya6e{bottom:201.189333pt;} +.y1048{bottom:201.276000pt;} +.y9b2{bottom:201.424000pt;} +.yb8{bottom:201.613333pt;} +.yac1{bottom:201.688000pt;} +.ycd5{bottom:201.768000pt;} +.y14ce{bottom:201.872000pt;} +.yd8c{bottom:202.038667pt;} +.y10ad{bottom:202.166667pt;} +.y95f{bottom:202.168000pt;} +.y221{bottom:202.245333pt;} +.yf09{bottom:202.385333pt;} +.y6aa{bottom:202.546053pt;} +.y8ef{bottom:202.546100pt;} +.yfe9{bottom:202.722667pt;} +.y438{bottom:202.750667pt;} +.y24a{bottom:202.861333pt;} +.y527{bottom:202.916000pt;} +.y16b{bottom:202.977333pt;} +.y762{bottom:203.109333pt;} +.y31e{bottom:203.390667pt;} +.yc5f{bottom:203.464000pt;} +.y1276{bottom:203.529333pt;} +.yd21{bottom:203.701333pt;} +.y964{bottom:203.703393pt;} +.y11c1{bottom:203.798667pt;} +.ycf9{bottom:203.845333pt;} +.y6fa{bottom:203.864000pt;} +.y85e{bottom:203.921333pt;} +.y10d4{bottom:203.981333pt;} +.yc37{bottom:204.089333pt;} +.y1599{bottom:204.149333pt;} +.y1458{bottom:204.344000pt;} +.yee3{bottom:204.406667pt;} +.y7c8{bottom:204.705926pt;} +.ye8a{bottom:204.733333pt;} +.y6ce{bottom:204.760000pt;} +.y7cb{bottom:204.864260pt;} +.ya6d{bottom:204.940000pt;} +.y1047{bottom:205.026667pt;} +.y12e5{bottom:205.144000pt;} +.y14a7{bottom:205.254667pt;} +.y45e{bottom:205.405266pt;} +.y5d2{bottom:205.458667pt;} +.y1332{bottom:205.676000pt;} +.y1378{bottom:206.053333pt;} +.yf5f{bottom:206.078667pt;} +.y884{bottom:206.176000pt;} +.y1b6{bottom:206.253333pt;} +.y13a5{bottom:206.296000pt;} +.yac2{bottom:206.508000pt;} +.ya9b{bottom:206.648000pt;} +.y966{bottom:206.728000pt;} +.y653{bottom:206.995015pt;} +.y140c{bottom:207.185333pt;} +.yc5e{bottom:207.214667pt;} +.y12bf{bottom:207.237333pt;} +.yf35{bottom:207.304000pt;} +.ye00{bottom:207.306667pt;} +.y13c8{bottom:207.456000pt;} +.yc1a{bottom:207.552000pt;} +.ybe0{bottom:207.614667pt;} +.y220{bottom:207.861333pt;} +.yc87{bottom:207.872000pt;} +.ya00{bottom:207.924000pt;} +.y633{bottom:207.996161pt;} +.yee2{bottom:208.157333pt;} +.y10a{bottom:208.341333pt;} +.y402{bottom:208.374667pt;} +.y98a{bottom:208.492000pt;} +.y142f{bottom:208.552000pt;} +.ydde{bottom:208.881333pt;} +.y7de{bottom:208.882667pt;} .y81{bottom:208.918667pt;} -.y939{bottom:209.045333pt;} -.y221{bottom:209.152000pt;} -.y683{bottom:209.160000pt;} -.y6b1{bottom:209.444000pt;} -.y10d5{bottom:209.529333pt;} -.yc4f{bottom:209.544000pt;} -.y11a9{bottom:209.620000pt;} -.y1175{bottom:209.888000pt;} -.yb43{bottom:209.954667pt;} -.yb18{bottom:209.981333pt;} -.y144e{bottom:210.149333pt;} -.y469{bottom:210.319336pt;} -.y465{bottom:210.319873pt;} -.ya6f{bottom:210.356000pt;} -.yc19{bottom:210.666667pt;} -.y7a4{bottom:211.112000pt;} -.y220{bottom:211.145333pt;} -.y411{bottom:211.333333pt;} -.y1a4{bottom:211.340887pt;} -.y1190{bottom:211.573333pt;} -.y12e8{bottom:211.592000pt;} -.yc34{bottom:211.613333pt;} -.y648{bottom:211.708162pt;} -.y8eb{bottom:211.798667pt;} -.y14de{bottom:211.873333pt;} -.ya4d{bottom:211.974667pt;} -.y6c3{bottom:212.117632pt;} -.y507{bottom:212.210667pt;} -.y1123{bottom:212.265301pt;} -.y646{bottom:212.636161pt;} -.y10b2{bottom:213.062667pt;} -.yb89{bottom:213.274667pt;} -.ye41{bottom:213.333333pt;} -.y11e5{bottom:213.456000pt;} -.y6c0{bottom:213.751054pt;} -.ya99{bottom:213.862667pt;} -.y108e{bottom:213.948000pt;} -.y124d{bottom:214.472980pt;} -.yfc9{bottom:214.490667pt;} -.y66f{bottom:214.738667pt;} -.y1dc{bottom:214.933333pt;} -.y73b{bottom:215.146667pt;} -.y15f4{bottom:215.306667pt;} -.y118f{bottom:215.324000pt;} -.y123d{bottom:215.406667pt;} -.y322{bottom:215.428000pt;} -.y124e{bottom:215.456100pt;} -.y15f5{bottom:215.506667pt;} -.y5b4{bottom:215.552000pt;} -.y184{bottom:215.554599pt;} -.y324{bottom:215.673333pt;} -.yc89{bottom:216.000000pt;} -.ybe0{bottom:216.153333pt;} -.y56c{bottom:216.194611pt;} -.y4b5{bottom:216.261333pt;} -.y565{bottom:216.294667pt;} -.y13b{bottom:216.437333pt;} -.y9fd{bottom:216.594667pt;} -.ye89{bottom:216.621333pt;} -.y225{bottom:216.629333pt;} -.yced{bottom:216.808000pt;} -.ydd{bottom:216.825333pt;} +.y913{bottom:209.045333pt;} +.y21b{bottom:209.152000pt;} +.y66e{bottom:209.160000pt;} +.y69b{bottom:209.444000pt;} +.y108c{bottom:209.529333pt;} +.yc19{bottom:209.544000pt;} +.yde{bottom:209.604000pt;} +.y115c{bottom:209.620000pt;} +.y1129{bottom:209.888000pt;} +.yb13{bottom:209.954667pt;} +.yae9{bottom:209.981333pt;} +.y13f5{bottom:210.149333pt;} +.y45d{bottom:210.319336pt;} +.y459{bottom:210.319873pt;} +.ya43{bottom:210.356000pt;} +.y789{bottom:211.112000pt;} +.y21a{bottom:211.145333pt;} +.y1a1{bottom:211.340887pt;} +.y1144{bottom:211.573333pt;} +.y1296{bottom:211.592000pt;} +.ybff{bottom:211.613333pt;} +.y634{bottom:211.708162pt;} +.y8c7{bottom:211.798667pt;} +.y1483{bottom:211.873333pt;} +.ya22{bottom:211.974667pt;} +.y6ac{bottom:212.117632pt;} +.y4f8{bottom:212.210667pt;} +.y10d9{bottom:212.265301pt;} +.y632{bottom:212.636161pt;} +.y1069{bottom:213.062667pt;} +.yb57{bottom:213.274667pt;} +.y1197{bottom:213.456000pt;} +.y6a9{bottom:213.751054pt;} +.ya6c{bottom:213.862667pt;} +.y1046{bottom:213.948000pt;} +.y11fd{bottom:214.472980pt;} +.yf86{bottom:214.490667pt;} +.y65b{bottom:214.738667pt;} +.y1d7{bottom:214.933333pt;} +.y723{bottom:215.146667pt;} +.y1596{bottom:215.306667pt;} +.y1143{bottom:215.324000pt;} +.y11ee{bottom:215.406667pt;} +.y31b{bottom:215.428000pt;} +.y11fe{bottom:215.456100pt;} +.y1597{bottom:215.506667pt;} +.y5a2{bottom:215.552000pt;} +.y181{bottom:215.554599pt;} +.y31d{bottom:215.673333pt;} +.ybac{bottom:216.153333pt;} +.y55a{bottom:216.194611pt;} +.y4a7{bottom:216.261333pt;} +.y554{bottom:216.294667pt;} +.y13c{bottom:216.437333pt;} +.y9d3{bottom:216.594667pt;} +.ye4a{bottom:216.621333pt;} +.y21f{bottom:216.629333pt;} +.ycb4{bottom:216.808000pt;} .y51{bottom:216.888000pt;} -.y85b{bottom:216.944000pt;} -.yf23{bottom:217.080000pt;} -.y90f{bottom:217.112000pt;} -.yd5d{bottom:217.333333pt;} -.y9da{bottom:217.364000pt;} -.yb8{bottom:217.553333pt;} -.ya98{bottom:217.612000pt;} -.yaed{bottom:217.628000pt;} -.yd0d{bottom:217.708000pt;} -.y7e5{bottom:217.779867pt;} -.y1529{bottom:217.812000pt;} -.y929{bottom:217.920368pt;} -.ydc6{bottom:217.978667pt;} -.y10f6{bottom:218.106667pt;} -.y985{bottom:218.108000pt;} -.y3c5{bottom:218.553333pt;} -.y102f{bottom:218.662667pt;} -.y24f{bottom:218.801333pt;} -.y536{bottom:218.856000pt;} -.y16c{bottom:218.918667pt;} -.y77b{bottom:219.049333pt;} -.y320{bottom:219.332000pt;} +.y83a{bottom:216.944000pt;} +.yee1{bottom:217.080000pt;} +.y8ea{bottom:217.112000pt;} +.y9b1{bottom:217.364000pt;} +.yb7{bottom:217.553333pt;} +.ya6b{bottom:217.612000pt;} +.yabf{bottom:217.628000pt;} +.ycd4{bottom:217.708000pt;} +.y7c7{bottom:217.779867pt;} +.y14cd{bottom:217.812000pt;} +.y903{bottom:217.920368pt;} +.yd8b{bottom:217.978667pt;} +.y10ac{bottom:218.106667pt;} +.y95e{bottom:218.108000pt;} +.y3bc{bottom:218.553333pt;} +.yfe8{bottom:218.662667pt;} +.y249{bottom:218.801333pt;} +.y526{bottom:218.856000pt;} +.y16a{bottom:218.918667pt;} +.y761{bottom:219.049333pt;} +.y319{bottom:219.332000pt;} .y6{bottom:219.343441pt;} -.y185{bottom:219.387960pt;} -.y12c5{bottom:219.470667pt;} -.y120f{bottom:219.738667pt;} -.ybb5{bottom:219.784000pt;} -.yd31{bottom:219.785333pt;} -.y710{bottom:219.804000pt;} -.y87f{bottom:219.861333pt;} -.y111d{bottom:219.921333pt;} -.yc87{bottom:220.029333pt;} -.y1160{bottom:220.072000pt;} -.y183{bottom:220.346299pt;} -.y6e4{bottom:220.701333pt;} -.y40b{bottom:220.773333pt;} -.ye65{bottom:221.006667pt;} -.y1338{bottom:221.084000pt;} -.y1502{bottom:221.196000pt;} -.y5e3{bottom:221.400000pt;} -.y1387{bottom:221.616000pt;} -.y666{bottom:221.843015pt;} -.y442{bottom:221.912000pt;} -.y13cf{bottom:221.993333pt;} -.yfa1{bottom:222.018667pt;} -.y8a5{bottom:222.116000pt;} -.y1b8{bottom:222.193333pt;} -.yd8a{bottom:222.225333pt;} -.y13fd{bottom:222.236000pt;} -.yaee{bottom:222.448000pt;} -.yac7{bottom:222.588000pt;} -.y1311{bottom:223.177333pt;} -.ye3c{bottom:223.246667pt;} -.y5e9{bottom:223.333333pt;} -.y1420{bottom:223.396000pt;} -.yc13{bottom:223.554667pt;} -.y223{bottom:223.764000pt;} -.ycbe{bottom:223.812000pt;} -.ya29{bottom:223.864000pt;} -.y8ab{bottom:224.000000pt;} -.y616{bottom:224.092000pt;} -.y7ca{bottom:224.102667pt;} -.y323{bottom:224.152000pt;} -.y106{bottom:224.282667pt;} -.y409{bottom:224.314667pt;} -.yec8{bottom:224.408000pt;} -.y9b1{bottom:224.432000pt;} -.y1488{bottom:224.492000pt;} -.ye19{bottom:224.821333pt;} -.y7fb{bottom:224.822667pt;} +.y182{bottom:219.387960pt;} +.y1275{bottom:219.470667pt;} +.y11c0{bottom:219.738667pt;} +.yb82{bottom:219.784000pt;} +.ycf8{bottom:219.785333pt;} +.y6f9{bottom:219.804000pt;} +.y85d{bottom:219.861333pt;} +.y10d3{bottom:219.921333pt;} +.yc4f{bottom:220.029333pt;} +.y1115{bottom:220.072000pt;} +.y180{bottom:220.346299pt;} +.y6cd{bottom:220.701333pt;} +.y401{bottom:220.773333pt;} +.ye27{bottom:221.006667pt;} +.y12e4{bottom:221.084000pt;} +.y14a6{bottom:221.196000pt;} +.y5d1{bottom:221.400000pt;} +.y1331{bottom:221.616000pt;} +.y652{bottom:221.843015pt;} +.y437{bottom:221.912000pt;} +.y1377{bottom:221.993333pt;} +.yf5e{bottom:222.018667pt;} +.y883{bottom:222.116000pt;} +.y1b5{bottom:222.193333pt;} +.yd50{bottom:222.225333pt;} +.y13a4{bottom:222.236000pt;} +.yac0{bottom:222.448000pt;} +.ya9a{bottom:222.588000pt;} +.y12be{bottom:223.177333pt;} +.ydff{bottom:223.246667pt;} +.y13c7{bottom:223.396000pt;} +.ybdf{bottom:223.554667pt;} +.y21d{bottom:223.764000pt;} +.yc86{bottom:223.812000pt;} +.y9ff{bottom:223.864000pt;} +.y603{bottom:224.092000pt;} +.y7ae{bottom:224.102667pt;} +.y31c{bottom:224.152000pt;} +.y109{bottom:224.282667pt;} +.y3ff{bottom:224.314667pt;} +.ye89{bottom:224.408000pt;} +.y989{bottom:224.432000pt;} +.y142e{bottom:224.492000pt;} +.yddd{bottom:224.821333pt;} +.y7dd{bottom:224.822667pt;} .y80{bottom:224.858667pt;} -.y6bf{bottom:224.956054pt;} -.y938{bottom:224.985333pt;} -.y321{bottom:225.013333pt;} -.y682{bottom:225.100000pt;} -.y47d{bottom:225.161333pt;} -.y6b0{bottom:225.384000pt;} -.y11a8{bottom:225.560000pt;} -.y960{bottom:225.668000pt;} -.y10b1{bottom:225.682667pt;} -.yb42{bottom:225.894667pt;} -.yb17{bottom:225.921333pt;} -.ya73{bottom:226.000000pt;} -.y144d{bottom:226.089333pt;} -.ya6e{bottom:226.296000pt;} -.y108d{bottom:226.568000pt;} -.y15f2{bottom:226.664000pt;} -.y15f3{bottom:226.864000pt;} -.yc95{bottom:226.888000pt;} -.y7a3{bottom:227.052000pt;} -.y46c{bottom:227.168114pt;} -.y12e7{bottom:227.532000pt;} -.y8ea{bottom:227.738667pt;} -.y222{bottom:227.749333pt;} -.ya4c{bottom:228.445333pt;} -.y11e4{bottom:229.396000pt;} -.y10b0{bottom:229.433333pt;} -.yf22{bottom:229.698667pt;} -.yb64{bottom:229.936000pt;} -.y40a{bottom:229.997333pt;} -.y37f{bottom:230.173333pt;} -.y108c{bottom:230.317333pt;} -.y644{bottom:230.528772pt;} -.y1da{bottom:230.873333pt;} -.y73a{bottom:231.086667pt;} -.y123c{bottom:231.346667pt;} -.y5b3{bottom:231.492000pt;} -.yeab{bottom:231.525333pt;} -.y1464{bottom:231.704000pt;} -.y8cb{bottom:231.846667pt;} -.y4b4{bottom:232.201333pt;} -.y564{bottom:232.236000pt;} -.y13a{bottom:232.377333pt;} -.y9fc{bottom:232.534667pt;} -.ye88{bottom:232.561333pt;} -.ybde{bottom:232.625333pt;} -.ycec{bottom:232.748000pt;} +.y6a8{bottom:224.956054pt;} +.y912{bottom:224.985333pt;} +.y31a{bottom:225.013333pt;} +.y66d{bottom:225.100000pt;} +.y471{bottom:225.161333pt;} +.y69a{bottom:225.384000pt;} +.ydd{bottom:225.545333pt;} +.y115b{bottom:225.560000pt;} +.y939{bottom:225.668000pt;} +.y1068{bottom:225.682667pt;} +.yb12{bottom:225.894667pt;} +.yae8{bottom:225.921333pt;} +.y13f4{bottom:226.089333pt;} +.ya42{bottom:226.296000pt;} +.y1045{bottom:226.568000pt;} +.y1594{bottom:226.664000pt;} +.y1595{bottom:226.864000pt;} +.yc5d{bottom:226.888000pt;} +.y788{bottom:227.052000pt;} +.y460{bottom:227.168114pt;} +.y1295{bottom:227.532000pt;} +.y8c6{bottom:227.738667pt;} +.y21c{bottom:227.749333pt;} +.ya21{bottom:228.445333pt;} +.y1196{bottom:229.396000pt;} +.y1067{bottom:229.433333pt;} +.yee0{bottom:229.698667pt;} +.yb33{bottom:229.936000pt;} +.y400{bottom:229.997333pt;} +.y377{bottom:230.173333pt;} +.y1044{bottom:230.317333pt;} +.y630{bottom:230.528772pt;} +.y1d5{bottom:230.873333pt;} +.y722{bottom:231.086667pt;} +.y11ed{bottom:231.346667pt;} +.y5a1{bottom:231.492000pt;} +.ye6c{bottom:231.525333pt;} +.y140b{bottom:231.704000pt;} +.y8a8{bottom:231.846667pt;} +.y4a6{bottom:232.201333pt;} +.y553{bottom:232.236000pt;} +.y13b{bottom:232.377333pt;} +.y9d2{bottom:232.534667pt;} +.ye49{bottom:232.561333pt;} +.ybaa{bottom:232.625333pt;} +.ycb3{bottom:232.748000pt;} .y50{bottom:232.829333pt;} -.y85a{bottom:232.884000pt;} -.y90e{bottom:233.052000pt;} -.yc39{bottom:233.333333pt;} -.y14b2{bottom:233.437333pt;} -.y124c{bottom:233.453748pt;} -.yb7{bottom:233.493333pt;} -.yaec{bottom:233.568000pt;} -.y1528{bottom:233.752000pt;} -.y106c{bottom:233.810667pt;} -.yc4e{bottom:233.985333pt;} -.y984{bottom:234.048000pt;} -.y645{bottom:234.240773pt;} -.ydef{bottom:234.592000pt;} -.y102e{bottom:234.602667pt;} -.y24e{bottom:234.741333pt;} -.y16b{bottom:234.858667pt;} -.y380{bottom:234.993333pt;} -.y118e{bottom:234.998667pt;} -.y643{bottom:235.168772pt;} -.y75c{bottom:235.201333pt;} -.y31f{bottom:235.272000pt;} -.y100b{bottom:235.293333pt;} -.y12c4{bottom:235.410667pt;} -.y120d{bottom:235.680000pt;} -.y1db{bottom:235.694667pt;} -.ybb4{bottom:235.724000pt;} -.yd30{bottom:235.726667pt;} -.y87e{bottom:235.801333pt;} -.y111c{bottom:235.861333pt;} -.yc86{bottom:235.969333pt;} -.y115f{bottom:236.012000pt;} -.y665{bottom:236.691016pt;} -.ye64{bottom:236.946667pt;} -.y1337{bottom:237.024000pt;} -.y1501{bottom:237.136000pt;} -.ya97{bottom:237.286667pt;} -.y5e2{bottom:237.340000pt;} -.yc6d{bottom:237.430667pt;} -.y1386{bottom:237.556000pt;} -.y441{bottom:237.852000pt;} -.y13ce{bottom:237.934667pt;} -.yfa0{bottom:237.958667pt;} -.y62d{bottom:238.000000pt;} -.y15f1{bottom:238.021333pt;} -.y8a4{bottom:238.056000pt;} -.y1b7{bottom:238.133333pt;} -.yd89{bottom:238.165333pt;} -.y13fc{bottom:238.177333pt;} -.y10af{bottom:238.354667pt;} -.yac5{bottom:238.528000pt;} -.y1096{bottom:238.666667pt;} -.y181{bottom:238.823905pt;} -.y75b{bottom:238.952000pt;} -.y1310{bottom:239.118667pt;} -.y632{bottom:239.181333pt;} -.ye3b{bottom:239.186667pt;} -.y1165{bottom:239.333333pt;} -.y141f{bottom:239.336000pt;} -.yc12{bottom:239.496000pt;} -.ycbd{bottom:239.752000pt;} -.ya28{bottom:239.804000pt;} -.y408{bottom:240.254667pt;} -.yec7{bottom:240.348000pt;} -.y9b0{bottom:240.372000pt;} -.y1487{bottom:240.432000pt;} -.y120e{bottom:240.500000pt;} -.ye18{bottom:240.761333pt;} -.y7fa{bottom:240.762667pt;} +.y839{bottom:232.884000pt;} +.y8e9{bottom:233.052000pt;} +.y1457{bottom:233.437333pt;} +.y11fc{bottom:233.453748pt;} +.yabe{bottom:233.568000pt;} +.y14cc{bottom:233.752000pt;} +.y1024{bottom:233.810667pt;} +.yc18{bottom:233.985333pt;} +.y95d{bottom:234.048000pt;} +.y631{bottom:234.240773pt;} +.ydb3{bottom:234.592000pt;} +.yfe7{bottom:234.602667pt;} +.y248{bottom:234.741333pt;} +.y169{bottom:234.858667pt;} +.y378{bottom:234.993333pt;} +.y1142{bottom:234.998667pt;} +.y62f{bottom:235.168772pt;} +.y742{bottom:235.201333pt;} +.y318{bottom:235.272000pt;} +.yfc5{bottom:235.293333pt;} +.y1274{bottom:235.410667pt;} +.y11be{bottom:235.680000pt;} +.y1d6{bottom:235.694667pt;} +.yb81{bottom:235.724000pt;} +.ycf7{bottom:235.726667pt;} +.y85c{bottom:235.801333pt;} +.y10d2{bottom:235.861333pt;} +.yc4e{bottom:235.969333pt;} +.y1114{bottom:236.012000pt;} +.y651{bottom:236.691016pt;} +.ye26{bottom:236.946667pt;} +.y12e3{bottom:237.024000pt;} +.y14a5{bottom:237.136000pt;} +.ya6a{bottom:237.286667pt;} +.y5d0{bottom:237.340000pt;} +.yc36{bottom:237.430667pt;} +.y1330{bottom:237.556000pt;} +.y436{bottom:237.852000pt;} +.y1376{bottom:237.934667pt;} +.yf5d{bottom:237.958667pt;} +.y1593{bottom:238.021333pt;} +.y882{bottom:238.056000pt;} +.y1b4{bottom:238.133333pt;} +.yd4f{bottom:238.165333pt;} +.y13a3{bottom:238.177333pt;} +.y1066{bottom:238.354667pt;} +.ya98{bottom:238.528000pt;} +.y17e{bottom:238.823905pt;} +.y741{bottom:238.952000pt;} +.y12bd{bottom:239.118667pt;} +.y61e{bottom:239.181333pt;} +.ydfe{bottom:239.186667pt;} +.y13c6{bottom:239.336000pt;} +.ybde{bottom:239.496000pt;} +.yc85{bottom:239.752000pt;} +.y9fe{bottom:239.804000pt;} +.y3fe{bottom:240.254667pt;} +.ye88{bottom:240.348000pt;} +.y988{bottom:240.372000pt;} +.y142d{bottom:240.432000pt;} +.y11bf{bottom:240.500000pt;} +.yddc{bottom:240.761333pt;} +.y7dc{bottom:240.762667pt;} .y7f{bottom:240.798667pt;} -.y937{bottom:240.925333pt;} -.y14dd{bottom:240.968000pt;} -.y681{bottom:241.040000pt;} -.y6af{bottom:241.324000pt;} -.yf4a{bottom:241.449333pt;} -.y11a7{bottom:241.500000pt;} -.y95f{bottom:241.608000pt;} -.yb41{bottom:241.834667pt;} -.yb16{bottom:241.861333pt;} -.y144c{bottom:242.029333pt;} -.y7e0{bottom:242.073360pt;} -.y10ae{bottom:242.105333pt;} -.yef6{bottom:242.276000pt;} -.yf21{bottom:242.318667pt;} -.y182{bottom:242.657265pt;} -.ydc{bottom:242.701333pt;} -.yc94{bottom:242.829333pt;} -.y7a2{bottom:242.993333pt;} -.y15ef{bottom:243.136000pt;} -.y1263{bottom:243.256731pt;} -.y388{bottom:243.333333pt;} -.yac6{bottom:243.348000pt;} -.y535{bottom:243.376000pt;} -.y12e6{bottom:243.473333pt;} -.y10d4{bottom:243.493333pt;} -.y180{bottom:243.615604pt;} -.y8e9{bottom:243.678667pt;} -.y124b{bottom:243.720801pt;} -.ya4b{bottom:244.917333pt;} -.y1174{bottom:244.960000pt;} -.y6e3{bottom:245.220000pt;} -.y11e3{bottom:245.337333pt;} -.yf20{bottom:246.069333pt;} -.y37e{bottom:246.113333pt;} -.yfc8{bottom:246.241333pt;} -.y3c4{bottom:246.316000pt;} -.y1d9{bottom:246.813333pt;} -.y739{bottom:247.026667pt;} -.y123b{bottom:247.286667pt;} -.y5b2{bottom:247.432000pt;} -.yeaa{bottom:247.465333pt;} -.y8ca{bottom:247.786667pt;} -.y75a{bottom:247.873333pt;} -.y4b3{bottom:248.142667pt;} -.y563{bottom:248.176000pt;} -.y3c3{bottom:248.308000pt;} -.y139{bottom:248.318667pt;} -.ybdb{bottom:248.432000pt;} -.y9fb{bottom:248.476000pt;} -.ybdd{bottom:248.565333pt;} -.y15f0{bottom:248.648000pt;} -.yceb{bottom:248.688000pt;} +.y911{bottom:240.925333pt;} +.y1482{bottom:240.968000pt;} +.y66c{bottom:241.040000pt;} +.y699{bottom:241.324000pt;} +.yf08{bottom:241.449333pt;} +.ydc{bottom:241.485333pt;} +.y115a{bottom:241.500000pt;} +.y938{bottom:241.608000pt;} +.yb11{bottom:241.834667pt;} +.yae7{bottom:241.861333pt;} +.y13f3{bottom:242.029333pt;} +.y7c2{bottom:242.073360pt;} +.y1065{bottom:242.105333pt;} +.yeb6{bottom:242.276000pt;} +.yedf{bottom:242.318667pt;} +.y17f{bottom:242.657265pt;} +.yc5c{bottom:242.829333pt;} +.y787{bottom:242.993333pt;} +.y1591{bottom:243.136000pt;} +.y1213{bottom:243.256731pt;} +.ya99{bottom:243.348000pt;} +.y525{bottom:243.376000pt;} +.y1294{bottom:243.473333pt;} +.y108b{bottom:243.493333pt;} +.y17d{bottom:243.615604pt;} +.y8c5{bottom:243.678667pt;} +.y11fb{bottom:243.720801pt;} +.ya20{bottom:244.917333pt;} +.y1128{bottom:244.960000pt;} +.y6cc{bottom:245.220000pt;} +.y1195{bottom:245.337333pt;} +.yede{bottom:246.069333pt;} +.y376{bottom:246.113333pt;} +.yf85{bottom:246.241333pt;} +.y3bb{bottom:246.316000pt;} +.y1d4{bottom:246.813333pt;} +.y721{bottom:247.026667pt;} +.y11ec{bottom:247.286667pt;} +.y5a0{bottom:247.432000pt;} +.ye6b{bottom:247.465333pt;} +.y8a7{bottom:247.786667pt;} +.y740{bottom:247.873333pt;} +.y4a5{bottom:248.142667pt;} +.y552{bottom:248.176000pt;} +.y3ba{bottom:248.308000pt;} +.y13a{bottom:248.318667pt;} +.yba7{bottom:248.432000pt;} +.y9d1{bottom:248.476000pt;} +.yba9{bottom:248.565333pt;} +.y1592{bottom:248.648000pt;} +.ycb2{bottom:248.688000pt;} .y4f{bottom:248.769333pt;} -.y105{bottom:248.953333pt;} -.y90d{bottom:248.992000pt;} -.y70f{bottom:249.028000pt;} -.yf76{bottom:249.249333pt;} -.yaeb{bottom:249.508000pt;} -.y1527{bottom:249.692000pt;} -.y106b{bottom:249.750667pt;} -.y983{bottom:249.988000pt;} -.ydee{bottom:250.532000pt;} -.y102d{bottom:250.542667pt;} -.y24d{bottom:250.681333pt;} -.y16a{bottom:250.798667pt;} -.y118d{bottom:250.938667pt;} -.y10ad{bottom:251.028000pt;} -.y31e{bottom:251.212000pt;} -.y100a{bottom:251.233333pt;} -.y12c3{bottom:251.350667pt;} -.y664{bottom:251.539017pt;} -.y120c{bottom:251.620000pt;} -.y759{bottom:251.624000pt;} -.ybb3{bottom:251.665333pt;} -.y87d{bottom:251.741333pt;} -.yc85{bottom:251.909333pt;} -.yb88{bottom:251.945333pt;} -.y108b{bottom:252.150667pt;} -.y124a{bottom:252.296885pt;} -.y21f{bottom:252.498667pt;} -.yd0c{bottom:252.646667pt;} -.ye63{bottom:252.886667pt;} -.y641{bottom:253.061402pt;} -.y1500{bottom:253.076000pt;} -.ya96{bottom:253.226667pt;} -.y5e1{bottom:253.280000pt;} -.y152f{bottom:253.333333pt;} -.y1385{bottom:253.496000pt;} -.y440{bottom:253.792000pt;} -.y13cd{bottom:253.874667pt;} -.yf9f{bottom:253.898667pt;} -.y8a3{bottom:253.996000pt;} -.y1b5{bottom:254.074667pt;} -.yd88{bottom:254.105333pt;} -.y13fb{bottom:254.117333pt;} -.y77a{bottom:254.301333pt;} -.yac4{bottom:254.468000pt;} -.yf05{bottom:254.666667pt;} -.y10ac{bottom:254.777333pt;} -.ydc5{bottom:254.894667pt;} -.ya6d{bottom:255.121333pt;} -.ye3a{bottom:255.126667pt;} -.y7df{bottom:255.147301pt;} -.y141e{bottom:255.276000pt;} -.yc10{bottom:255.436000pt;} -.ya27{bottom:255.744000pt;} -.y406{bottom:256.196000pt;} -.yec6{bottom:256.288000pt;} -.y9af{bottom:256.313333pt;} -.y1486{bottom:256.372000pt;} -.ye17{bottom:256.701333pt;} -.y7f9{bottom:256.702667pt;} +.y108{bottom:248.953333pt;} +.y8e8{bottom:248.992000pt;} +.y6f8{bottom:249.028000pt;} +.yf34{bottom:249.249333pt;} +.yabd{bottom:249.508000pt;} +.y14cb{bottom:249.692000pt;} +.y1023{bottom:249.750667pt;} +.y95c{bottom:249.988000pt;} +.ydb2{bottom:250.532000pt;} +.yfe6{bottom:250.542667pt;} +.y247{bottom:250.681333pt;} +.y168{bottom:250.798667pt;} +.y1141{bottom:250.938667pt;} +.y1064{bottom:251.028000pt;} +.y317{bottom:251.212000pt;} +.yfc4{bottom:251.233333pt;} +.y1273{bottom:251.350667pt;} +.y650{bottom:251.539017pt;} +.y11bd{bottom:251.620000pt;} +.y73f{bottom:251.624000pt;} +.yb80{bottom:251.665333pt;} +.y85b{bottom:251.741333pt;} +.yc4d{bottom:251.909333pt;} +.yb56{bottom:251.945333pt;} +.yb6{bottom:252.090667pt;} +.y1043{bottom:252.150667pt;} +.y11fa{bottom:252.296885pt;} +.y219{bottom:252.498667pt;} +.ycd3{bottom:252.646667pt;} +.ye25{bottom:252.886667pt;} +.y62d{bottom:253.061402pt;} +.y14a4{bottom:253.076000pt;} +.ya69{bottom:253.226667pt;} +.y5cf{bottom:253.280000pt;} +.y132f{bottom:253.496000pt;} +.y435{bottom:253.792000pt;} +.y1375{bottom:253.874667pt;} +.yf5c{bottom:253.898667pt;} +.y881{bottom:253.996000pt;} +.y1b2{bottom:254.074667pt;} +.yd4e{bottom:254.105333pt;} +.y13a2{bottom:254.117333pt;} +.y760{bottom:254.301333pt;} +.ya97{bottom:254.468000pt;} +.y1063{bottom:254.777333pt;} +.yd8a{bottom:254.894667pt;} +.ya41{bottom:255.121333pt;} +.ydfd{bottom:255.126667pt;} +.y7c1{bottom:255.147301pt;} +.y13c5{bottom:255.276000pt;} +.ybdc{bottom:255.436000pt;} +.y9fd{bottom:255.744000pt;} +.y3fc{bottom:256.196000pt;} +.ye87{bottom:256.288000pt;} +.y987{bottom:256.313333pt;} +.y142c{bottom:256.372000pt;} +.yddb{bottom:256.701333pt;} +.y7db{bottom:256.702667pt;} .y7e{bottom:256.738667pt;} -.y642{bottom:256.773402pt;} -.y936{bottom:256.865333pt;} -.y680{bottom:256.980000pt;} -.y6ae{bottom:257.264000pt;} +.y62e{bottom:256.773402pt;} +.y910{bottom:256.865333pt;} +.y66b{bottom:256.980000pt;} +.y698{bottom:257.264000pt;} .y5{bottom:257.363950pt;} -.yf49{bottom:257.389333pt;} -.y11a6{bottom:257.440000pt;} -.y95e{bottom:257.548000pt;} -.y640{bottom:257.701401pt;} -.yb15{bottom:257.801333pt;} -.y144b{bottom:257.970667pt;} -.y2ae{bottom:258.170667pt;} -.y158a{bottom:258.349333pt;} -.yd59{bottom:258.396000pt;} -.y2b0{bottom:258.414667pt;} -.ydb{bottom:258.641333pt;} -.y6ba{bottom:258.755237pt;} -.yc93{bottom:258.769333pt;} -.y1b6{bottom:258.894667pt;} -.y12e5{bottom:259.413333pt;} -.y10d3{bottom:259.434667pt;} -.y7ec{bottom:259.453589pt;} -.y8e8{bottom:259.618667pt;} -.y15ee{bottom:259.806667pt;} -.yc11{bottom:260.256000pt;} -.y111b{bottom:260.381333pt;} -.y758{bottom:260.546667pt;} -.y154a{bottom:260.641333pt;} -.y9d9{bottom:260.793333pt;} -.y1173{bottom:260.900000pt;} -.y407{bottom:261.016000pt;} -.y11e2{bottom:261.277333pt;} -.yc55{bottom:261.333333pt;} -.ya4a{bottom:261.389333pt;} -.y859{bottom:261.458667pt;} -.yc6c{bottom:261.872000pt;} -.y37d{bottom:262.053333pt;} -.y17e{bottom:262.093206pt;} -.y2ac{bottom:262.177333pt;} -.y115e{bottom:262.580000pt;} -.y1498{bottom:262.753333pt;} -.y3c2{bottom:262.788000pt;} -.y738{bottom:262.968000pt;} -.y123a{bottom:263.228000pt;} -.y5b1{bottom:263.372000pt;} -.yea9{bottom:263.405333pt;} -.y8c9{bottom:263.728000pt;} -.y4b2{bottom:264.082667pt;} -.y562{bottom:264.116000pt;} -.y757{bottom:264.296000pt;} -.y9fa{bottom:264.416000pt;} -.ybdc{bottom:264.505333pt;} -.ycea{bottom:264.629333pt;} +.yf07{bottom:257.389333pt;} +.y1159{bottom:257.440000pt;} +.y937{bottom:257.548000pt;} +.y62c{bottom:257.701401pt;} +.yae6{bottom:257.801333pt;} +.y13f2{bottom:257.970667pt;} +.y2a8{bottom:258.170667pt;} +.y152d{bottom:258.349333pt;} +.yd20{bottom:258.396000pt;} +.y2aa{bottom:258.414667pt;} +.y6a3{bottom:258.755237pt;} +.yc5b{bottom:258.769333pt;} +.y1b3{bottom:258.894667pt;} +.y1293{bottom:259.413333pt;} +.y108a{bottom:259.434667pt;} +.y7ce{bottom:259.453589pt;} +.y8c4{bottom:259.618667pt;} +.y1590{bottom:259.806667pt;} +.ybdd{bottom:260.256000pt;} +.y10d1{bottom:260.381333pt;} +.y73e{bottom:260.546667pt;} +.y14ed{bottom:260.641333pt;} +.y9b0{bottom:260.793333pt;} +.y1127{bottom:260.900000pt;} +.y3fd{bottom:261.016000pt;} +.y1194{bottom:261.277333pt;} +.ya1f{bottom:261.389333pt;} +.y838{bottom:261.458667pt;} +.yc35{bottom:261.872000pt;} +.y375{bottom:262.053333pt;} +.y17b{bottom:262.093206pt;} +.y2a6{bottom:262.177333pt;} +.y1113{bottom:262.580000pt;} +.y143d{bottom:262.753333pt;} +.y3b9{bottom:262.788000pt;} +.y720{bottom:262.968000pt;} +.y11eb{bottom:263.228000pt;} +.y59f{bottom:263.372000pt;} +.ye6a{bottom:263.405333pt;} +.y8a6{bottom:263.728000pt;} +.y4a4{bottom:264.082667pt;} +.y551{bottom:264.116000pt;} +.y73d{bottom:264.296000pt;} +.y9d0{bottom:264.416000pt;} +.yba8{bottom:264.505333pt;} +.ycb1{bottom:264.629333pt;} .y4e{bottom:264.709333pt;} -.y3c1{bottom:264.780000pt;} -.y104{bottom:264.893333pt;} -.y15ec{bottom:264.921333pt;} -.y90c{bottom:264.932000pt;} -.y70e{bottom:264.968000pt;} -.yf75{bottom:265.189333pt;} -.yaea{bottom:265.448000pt;} -.y1526{bottom:265.633333pt;} -.y106a{bottom:265.690667pt;} -.y17f{bottom:265.926566pt;} -.y982{bottom:265.928000pt;} -.y1336{bottom:266.118667pt;} -.y43f{bottom:266.190667pt;} -.y1463{bottom:266.232000pt;} -.y43d{bottom:266.436000pt;} -.yded{bottom:266.472000pt;} -.y102c{bottom:266.482667pt;} -.y24c{bottom:266.621333pt;} -.y169{bottom:266.738667pt;} -.y118c{bottom:266.878667pt;} -.y17d{bottom:266.884905pt;} -.y2af{bottom:266.997333pt;} -.y31d{bottom:267.152000pt;} -.y1009{bottom:267.173333pt;} -.y12c2{bottom:267.290667pt;} -.y1d8{bottom:267.440000pt;} -.y120b{bottom:267.560000pt;} -.ybb2{bottom:267.605333pt;} -.y87c{bottom:267.681333pt;} -.y2ad{bottom:267.860000pt;} -.yb87{bottom:267.885333pt;} -.yb6{bottom:268.030667pt;} -.y108a{bottom:268.090667pt;} -.y7de{bottom:268.221241pt;} -.y21e{bottom:268.438667pt;} -.yd0b{bottom:268.586667pt;} -.yb63{bottom:268.605333pt;} -.y1d6{bottom:268.732000pt;} -.y1587{bottom:268.777333pt;} -.ye62{bottom:268.826667pt;} -.y1589{bottom:268.976000pt;} -.y14ff{bottom:269.016000pt;} -.ya95{bottom:269.166667pt;} -.y5e0{bottom:269.220000pt;} -.y1384{bottom:269.436000pt;} -.y43b{bottom:269.733333pt;} -.y13cc{bottom:269.814667pt;} -.yf9e{bottom:269.838667pt;} -.y8a2{bottom:269.937333pt;} -.y66c{bottom:269.946797pt;} -.y1b4{bottom:270.014667pt;} -.yd87{bottom:270.045333pt;} -.y779{bottom:270.242667pt;} -.yac3{bottom:270.408000pt;} -.y15ed{bottom:270.433333pt;} -.y780{bottom:270.666667pt;} -.y1d5{bottom:270.724000pt;} -.ydc4{bottom:270.836000pt;} -.y1248{bottom:271.002381pt;} -.ye39{bottom:271.066667pt;} -.y141d{bottom:271.216000pt;} -.yecf{bottom:271.333333pt;} -.yc0f{bottom:271.376000pt;} -.y7c8{bottom:271.545333pt;} -.yd2f{bottom:271.669333pt;} -.ya26{bottom:271.685333pt;} -.y1249{bottom:271.985501pt;} -.y405{bottom:272.136000pt;} -.yec5{bottom:272.228000pt;} -.y9ae{bottom:272.253333pt;} -.y130f{bottom:272.464000pt;} -.ye15{bottom:272.641333pt;} -.y742{bottom:272.666667pt;} +.y3b8{bottom:264.780000pt;} +.y107{bottom:264.893333pt;} +.y158e{bottom:264.921333pt;} +.y8e7{bottom:264.932000pt;} +.y6f7{bottom:264.968000pt;} +.yf33{bottom:265.189333pt;} +.yabc{bottom:265.448000pt;} +.y14ca{bottom:265.633333pt;} +.y1022{bottom:265.690667pt;} +.y17c{bottom:265.926566pt;} +.y95b{bottom:265.928000pt;} +.y12e2{bottom:266.118667pt;} +.y434{bottom:266.190667pt;} +.y140a{bottom:266.232000pt;} +.y432{bottom:266.436000pt;} +.ydb1{bottom:266.472000pt;} +.yfe5{bottom:266.482667pt;} +.y246{bottom:266.621333pt;} +.y167{bottom:266.738667pt;} +.y1140{bottom:266.878667pt;} +.y17a{bottom:266.884905pt;} +.y2a9{bottom:266.997333pt;} +.y316{bottom:267.152000pt;} +.yfc3{bottom:267.173333pt;} +.y1272{bottom:267.290667pt;} +.ydb{bottom:267.418667pt;} +.y1d3{bottom:267.440000pt;} +.y11bc{bottom:267.560000pt;} +.yb7f{bottom:267.605333pt;} +.y85a{bottom:267.681333pt;} +.y2a7{bottom:267.860000pt;} +.yb55{bottom:267.885333pt;} +.yb5{bottom:268.030667pt;} +.y1042{bottom:268.090667pt;} +.y7c0{bottom:268.221241pt;} +.y218{bottom:268.438667pt;} +.ycd2{bottom:268.586667pt;} +.yb32{bottom:268.605333pt;} +.y1d1{bottom:268.732000pt;} +.y152a{bottom:268.777333pt;} +.ye24{bottom:268.826667pt;} +.y152c{bottom:268.976000pt;} +.y14a3{bottom:269.016000pt;} +.ya68{bottom:269.166667pt;} +.y5ce{bottom:269.220000pt;} +.y132e{bottom:269.436000pt;} +.y430{bottom:269.733333pt;} +.y1374{bottom:269.814667pt;} +.yf5b{bottom:269.838667pt;} +.y880{bottom:269.937333pt;} +.y658{bottom:269.946797pt;} +.y1b1{bottom:270.014667pt;} +.yd4d{bottom:270.045333pt;} +.y75f{bottom:270.242667pt;} +.ya96{bottom:270.408000pt;} +.y158f{bottom:270.433333pt;} +.y1d0{bottom:270.724000pt;} +.yd89{bottom:270.836000pt;} +.y11f8{bottom:271.002381pt;} +.ydfc{bottom:271.066667pt;} +.y13c4{bottom:271.216000pt;} +.ybdb{bottom:271.376000pt;} +.y7ac{bottom:271.545333pt;} +.ycf6{bottom:271.669333pt;} +.y9fc{bottom:271.685333pt;} +.y11f9{bottom:271.985501pt;} +.y3fb{bottom:272.136000pt;} +.ye86{bottom:272.228000pt;} +.y986{bottom:272.253333pt;} +.y12bc{bottom:272.464000pt;} +.ydd9{bottom:272.641333pt;} .y7d{bottom:272.680000pt;} -.y935{bottom:272.805333pt;} -.y138{bottom:272.837333pt;} -.ye87{bottom:272.872000pt;} -.y67f{bottom:272.920000pt;} -.y6ad{bottom:273.204000pt;} -.ya67{bottom:273.320000pt;} -.yf48{bottom:273.330667pt;} -.ya52{bottom:273.333333pt;} -.y11a5{bottom:273.381333pt;} -.y95d{bottom:273.488000pt;} -.yb14{bottom:273.741333pt;} -.y144a{bottom:273.910667pt;} -.y506{bottom:274.277333pt;} -.yd58{bottom:274.337333pt;} -.y10ab{bottom:274.452000pt;} -.y10f5{bottom:274.506667pt;} -.y43c{bottom:274.553333pt;} -.yda{bottom:274.581333pt;} -.yc92{bottom:274.709333pt;} -.y7eb{bottom:274.904610pt;} -.y7a1{bottom:275.174667pt;} -.y12e4{bottom:275.353333pt;} -.y10d2{bottom:275.374667pt;} -.y43e{bottom:275.414667pt;} -.y8e7{bottom:275.558667pt;} -.y63e{bottom:275.594018pt;} -.y1d7{bottom:276.209333pt;} -.yef5{bottom:276.241333pt;} -.ycbc{bottom:276.290667pt;} -.y1549{bottom:276.581333pt;} -.y9d8{bottom:276.733333pt;} -.y1172{bottom:276.840000pt;} -.y11e1{bottom:277.217333pt;} -.y14b1{bottom:277.365333pt;} -.y858{bottom:277.398667pt;} -.ye16{bottom:277.462667pt;} -.ya49{bottom:277.860000pt;} -.y37c{bottom:277.994667pt;} -.y25d{bottom:278.000000pt;} -.y2ab{bottom:278.117333pt;} -.yc84{bottom:278.476000pt;} -.yb40{bottom:278.497333pt;} -.y115d{bottom:278.520000pt;} -.y1497{bottom:278.694667pt;} -.y737{bottom:278.908000pt;} -.y1239{bottom:279.168000pt;} -.y3c0{bottom:279.258667pt;} -.y63f{bottom:279.306018pt;} -.y5b0{bottom:279.312000pt;} -.yea8{bottom:279.345333pt;} -.y31a{bottom:279.550667pt;} -.y1588{bottom:279.602667pt;} -.y8c8{bottom:279.668000pt;} -.y47c{bottom:279.748000pt;} -.y31c{bottom:279.794667pt;} -.y4b0{bottom:280.022667pt;} -.y561{bottom:280.056000pt;} -.y534{bottom:280.168000pt;} -.y63d{bottom:280.234017pt;} -.y9f9{bottom:280.356000pt;} -.yce9{bottom:280.569333pt;} +.y90f{bottom:272.805333pt;} +.y139{bottom:272.837333pt;} +.ye48{bottom:272.872000pt;} +.y66a{bottom:272.920000pt;} +.y697{bottom:273.204000pt;} +.ya3b{bottom:273.320000pt;} +.yf06{bottom:273.330667pt;} +.y1158{bottom:273.381333pt;} +.y936{bottom:273.488000pt;} +.yae5{bottom:273.741333pt;} +.y13f1{bottom:273.910667pt;} +.y4f7{bottom:274.277333pt;} +.yd1f{bottom:274.337333pt;} +.y1062{bottom:274.452000pt;} +.y10ab{bottom:274.506667pt;} +.y431{bottom:274.553333pt;} +.yc5a{bottom:274.709333pt;} +.y7cd{bottom:274.904610pt;} +.y786{bottom:275.174667pt;} +.y1292{bottom:275.353333pt;} +.y1089{bottom:275.374667pt;} +.y433{bottom:275.414667pt;} +.y8c3{bottom:275.558667pt;} +.y62a{bottom:275.594018pt;} +.y1d2{bottom:276.209333pt;} +.yeb5{bottom:276.241333pt;} +.yc84{bottom:276.290667pt;} +.y14ec{bottom:276.581333pt;} +.y9af{bottom:276.733333pt;} +.y1126{bottom:276.840000pt;} +.y1193{bottom:277.217333pt;} +.y1456{bottom:277.365333pt;} +.y837{bottom:277.398667pt;} +.ydda{bottom:277.462667pt;} +.ya1e{bottom:277.860000pt;} +.y374{bottom:277.994667pt;} +.y2a5{bottom:278.117333pt;} +.yc4c{bottom:278.476000pt;} +.yb10{bottom:278.497333pt;} +.y1112{bottom:278.520000pt;} +.y143c{bottom:278.694667pt;} +.y71f{bottom:278.908000pt;} +.y11ea{bottom:279.168000pt;} +.y3b7{bottom:279.258667pt;} +.y62b{bottom:279.306018pt;} +.y59e{bottom:279.312000pt;} +.ye69{bottom:279.345333pt;} +.y313{bottom:279.550667pt;} +.y152b{bottom:279.602667pt;} +.y8a5{bottom:279.668000pt;} +.y470{bottom:279.748000pt;} +.y315{bottom:279.794667pt;} +.y4a2{bottom:280.022667pt;} +.y550{bottom:280.056000pt;} +.y524{bottom:280.168000pt;} +.y629{bottom:280.234017pt;} +.y9cf{bottom:280.356000pt;} +.ycb0{bottom:280.569333pt;} .y4d{bottom:280.649333pt;} -.y13fa{bottom:280.684000pt;} -.y103{bottom:280.833333pt;} -.y90b{bottom:280.872000pt;} -.y1485{bottom:280.892000pt;} -.y70d{bottom:280.909333pt;} -.ybda{bottom:280.977333pt;} -.yf74{bottom:281.130667pt;} -.y3bf{bottom:281.252000pt;} -.y7dd{bottom:281.295180pt;} -.yae9{bottom:281.388000pt;} -.y1525{bottom:281.573333pt;} -.y15eb{bottom:281.592000pt;} -.y1069{bottom:281.630667pt;} -.y981{bottom:281.868000pt;} -.y1462{bottom:282.172000pt;} -.y6e2{bottom:282.404000pt;} -.ydec{bottom:282.412000pt;} -.y24b{bottom:282.562667pt;} -.y168{bottom:282.678667pt;} -.y118b{bottom:282.818667pt;} -.y318{bottom:283.092000pt;} -.y12c1{bottom:283.230667pt;} -.y120a{bottom:283.500000pt;} -.ybb1{bottom:283.545333pt;} -.y87b{bottom:283.621333pt;} -.yb86{bottom:283.825333pt;} -.yf1f{bottom:283.882667pt;} -.yb5{bottom:283.970667pt;} -.y1089{bottom:284.030667pt;} -.y14dc{bottom:284.356000pt;} -.y404{bottom:284.533333pt;} -.yb62{bottom:284.545333pt;} -.ye61{bottom:284.766667pt;} -.y4b1{bottom:284.842667pt;} -.ya94{bottom:285.108000pt;} -.y5df{bottom:285.160000pt;} -.y17b{bottom:285.362507pt;} -.y1383{bottom:285.376000pt;} -.y43a{bottom:285.673333pt;} -.y13cb{bottom:285.754667pt;} -.yf9d{bottom:285.778667pt;} -.y8a1{bottom:285.877333pt;} -.ya6c{bottom:285.946600pt;} -.y1b3{bottom:285.954667pt;} -.yd86{bottom:285.985333pt;} -.y778{bottom:286.182667pt;} -.yac2{bottom:286.348000pt;} -.y15e9{bottom:286.705333pt;} -.ydc3{bottom:286.776000pt;} -.ye38{bottom:287.008000pt;} -.y141c{bottom:287.157333pt;} -.y7c7{bottom:287.485333pt;} -.yd2e{bottom:287.609333pt;} -.ya25{bottom:287.625333pt;} -.y31b{bottom:287.913333pt;} -.y402{bottom:288.076000pt;} -.yec4{bottom:288.169333pt;} -.y9ad{bottom:288.193333pt;} -.ye14{bottom:288.581333pt;} +.y13a1{bottom:280.684000pt;} +.y106{bottom:280.833333pt;} +.y8e6{bottom:280.872000pt;} +.y142b{bottom:280.892000pt;} +.y6f6{bottom:280.909333pt;} +.yba6{bottom:280.977333pt;} +.yf32{bottom:281.130667pt;} +.y3b6{bottom:281.252000pt;} +.y7bf{bottom:281.295180pt;} +.yabb{bottom:281.388000pt;} +.y14c9{bottom:281.573333pt;} +.y158d{bottom:281.592000pt;} +.y1021{bottom:281.630667pt;} +.y95a{bottom:281.868000pt;} +.y1409{bottom:282.172000pt;} +.y6cb{bottom:282.404000pt;} +.ydb0{bottom:282.412000pt;} +.y245{bottom:282.562667pt;} +.y166{bottom:282.678667pt;} +.y113f{bottom:282.818667pt;} +.y311{bottom:283.092000pt;} +.y1271{bottom:283.230667pt;} +.y11bb{bottom:283.500000pt;} +.yb7e{bottom:283.545333pt;} +.y859{bottom:283.621333pt;} +.yb54{bottom:283.825333pt;} +.yedd{bottom:283.882667pt;} +.y73c{bottom:283.970667pt;} +.y1041{bottom:284.030667pt;} +.y1481{bottom:284.356000pt;} +.y3fa{bottom:284.533333pt;} +.yb31{bottom:284.545333pt;} +.ye23{bottom:284.766667pt;} +.y4a3{bottom:284.842667pt;} +.ya67{bottom:285.108000pt;} +.y5cd{bottom:285.160000pt;} +.y178{bottom:285.362507pt;} +.y132d{bottom:285.376000pt;} +.y42f{bottom:285.673333pt;} +.y1373{bottom:285.754667pt;} +.yf5a{bottom:285.778667pt;} +.y87f{bottom:285.877333pt;} +.ya40{bottom:285.946600pt;} +.y1b0{bottom:285.954667pt;} +.yd4c{bottom:285.985333pt;} +.y75e{bottom:286.182667pt;} +.ya95{bottom:286.348000pt;} +.y158b{bottom:286.705333pt;} +.yd88{bottom:286.776000pt;} +.ydfb{bottom:287.008000pt;} +.y13c3{bottom:287.157333pt;} +.y7ab{bottom:287.485333pt;} +.ycf5{bottom:287.609333pt;} +.y9fb{bottom:287.625333pt;} +.y314{bottom:287.913333pt;} +.y3f8{bottom:288.076000pt;} +.ye85{bottom:288.169333pt;} +.y985{bottom:288.193333pt;} +.ydd8{bottom:288.581333pt;} .y9c{bottom:288.620000pt;} -.y319{bottom:288.774667pt;} -.ye86{bottom:288.812000pt;} -.ybd8{bottom:288.814667pt;} -.y67d{bottom:288.860000pt;} -.y6ac{bottom:289.145333pt;} -.y17c{bottom:289.195867pt;} -.yf47{bottom:289.270667pt;} -.y11a4{bottom:289.321333pt;} -.y1033{bottom:289.333333pt;} -.y95c{bottom:289.428000pt;} -.y21d{bottom:289.446667pt;} -.yb13{bottom:289.682667pt;} -.y1449{bottom:289.850667pt;} -.y1247{bottom:289.983155pt;} -.y17a{bottom:290.154206pt;} -.y505{bottom:290.217333pt;} -.yd57{bottom:290.277333pt;} -.y127b{bottom:290.365333pt;} -.y10aa{bottom:290.392000pt;} -.yc91{bottom:290.649333pt;} -.y1586{bottom:290.761333pt;} -.y7f8{bottom:290.782667pt;} -.y7a0{bottom:291.114667pt;} -.y12e3{bottom:291.293333pt;} -.y10d1{bottom:291.314667pt;} -.y8e6{bottom:291.498667pt;} -.y1008{bottom:291.693333pt;} -.yef4{bottom:292.181333pt;} -.y15ea{bottom:292.218667pt;} -.ycba{bottom:292.230667pt;} -.y1246{bottom:292.385240pt;} -.y1548{bottom:292.522667pt;} -.y9d7{bottom:292.673333pt;} -.y1171{bottom:292.780000pt;} -.y11e0{bottom:293.157333pt;} -.y14b0{bottom:293.306667pt;} -.y857{bottom:293.338667pt;} -.y14fe{bottom:293.534667pt;} -.y67e{bottom:293.681333pt;} -.y403{bottom:293.758667pt;} -.y37a{bottom:293.934667pt;} -.y2aa{bottom:294.057333pt;} -.y104e{bottom:294.168000pt;} -.ya48{bottom:294.332000pt;} -.y7dc{bottom:294.369120pt;} -.y1238{bottom:295.108000pt;} -.y6c8{bottom:295.215164pt;} -.y6cb{bottom:295.276622pt;} -.yea7{bottom:295.286667pt;} -.y219{bottom:295.330667pt;} -.y8c7{bottom:295.608000pt;} -.y47b{bottom:295.688000pt;} -.y3be{bottom:295.730667pt;} -.y1584{bottom:295.876000pt;} -.y4ae{bottom:295.962667pt;} -.y55f{bottom:295.996000pt;} -.y533{bottom:296.108000pt;} -.y9f8{bottom:296.296000pt;} -.y13f9{bottom:296.624000pt;} -.y102{bottom:296.773333pt;} -.y909{bottom:296.812000pt;} -.y90a{bottom:296.813333pt;} -.y70c{bottom:296.849333pt;} -.y130b{bottom:296.906667pt;} -.ybd9{bottom:296.917333pt;} -.ycbb{bottom:297.050667pt;} -.yf73{bottom:297.070667pt;} -.yae8{bottom:297.329333pt;} -.y1119{bottom:297.337333pt;} -.y1524{bottom:297.513333pt;} -.y1068{bottom:297.570667pt;} -.y3bd{bottom:297.722667pt;} -.y980{bottom:297.809333pt;} -.y63b{bottom:298.126633pt;} -.y6e1{bottom:298.345333pt;} -.ydeb{bottom:298.352000pt;} -.y24a{bottom:298.502667pt;} -.y167{bottom:298.620000pt;} -.y37b{bottom:298.754667pt;} -.y118a{bottom:298.758667pt;} -.y12c0{bottom:299.170667pt;} -.y1208{bottom:299.440000pt;} -.ybb0{bottom:299.485333pt;} -.yb85{bottom:299.765333pt;} -.y1262{bottom:299.786135pt;} -.y756{bottom:299.910667pt;} -.y1088{bottom:299.970667pt;} -.y14db{bottom:300.296000pt;} -.ya6b{bottom:300.377000pt;} -.yd9{bottom:300.457333pt;} -.yb61{bottom:300.485333pt;} -.ye60{bottom:300.708000pt;} -.y4af{bottom:300.782667pt;} -.y560{bottom:300.817333pt;} -.ya93{bottom:301.048000pt;} -.yfc7{bottom:301.057333pt;} -.y5de{bottom:301.100000pt;} -.y1585{bottom:301.388000pt;} -.y439{bottom:301.613333pt;} -.y13ca{bottom:301.694667pt;} -.yf9c{bottom:301.720000pt;} -.y63c{bottom:301.838633pt;} -.y1b2{bottom:301.894667pt;} -.y934{bottom:301.900000pt;} +.y312{bottom:288.774667pt;} +.ye47{bottom:288.812000pt;} +.yba4{bottom:288.814667pt;} +.y668{bottom:288.860000pt;} +.y696{bottom:289.145333pt;} +.y179{bottom:289.195867pt;} +.yf05{bottom:289.270667pt;} +.y1157{bottom:289.321333pt;} +.y935{bottom:289.428000pt;} +.y217{bottom:289.446667pt;} +.yae4{bottom:289.682667pt;} +.y13f0{bottom:289.850667pt;} +.y11f7{bottom:289.983155pt;} +.y177{bottom:290.154206pt;} +.y4f6{bottom:290.217333pt;} +.yd1e{bottom:290.277333pt;} +.y122b{bottom:290.365333pt;} +.y1061{bottom:290.392000pt;} +.yc59{bottom:290.649333pt;} +.y1529{bottom:290.761333pt;} +.y7da{bottom:290.782667pt;} +.y785{bottom:291.114667pt;} +.y1291{bottom:291.293333pt;} +.y1088{bottom:291.314667pt;} +.y8c2{bottom:291.498667pt;} +.yfc2{bottom:291.693333pt;} +.yeb4{bottom:292.181333pt;} +.y158c{bottom:292.218667pt;} +.yc82{bottom:292.230667pt;} +.y11f6{bottom:292.385240pt;} +.y14eb{bottom:292.522667pt;} +.y9ae{bottom:292.673333pt;} +.y1125{bottom:292.780000pt;} +.y1192{bottom:293.157333pt;} +.y1455{bottom:293.306667pt;} +.y836{bottom:293.338667pt;} +.yda{bottom:293.352000pt;} +.y14a2{bottom:293.534667pt;} +.y669{bottom:293.681333pt;} +.y3f9{bottom:293.758667pt;} +.y372{bottom:293.934667pt;} +.y2a4{bottom:294.057333pt;} +.y1006{bottom:294.168000pt;} +.ya1d{bottom:294.332000pt;} +.y7be{bottom:294.369120pt;} +.y11e9{bottom:295.108000pt;} +.y6b1{bottom:295.215164pt;} +.y6b4{bottom:295.276622pt;} +.ye68{bottom:295.286667pt;} +.y213{bottom:295.330667pt;} +.y8a4{bottom:295.608000pt;} +.y46f{bottom:295.688000pt;} +.y3b5{bottom:295.730667pt;} +.y1527{bottom:295.876000pt;} +.y4a0{bottom:295.962667pt;} +.y54e{bottom:295.996000pt;} +.y523{bottom:296.108000pt;} +.y9ce{bottom:296.296000pt;} +.y13a0{bottom:296.624000pt;} +.y105{bottom:296.773333pt;} +.y8e4{bottom:296.812000pt;} +.y8e5{bottom:296.813333pt;} +.y6f5{bottom:296.849333pt;} +.y12b8{bottom:296.906667pt;} +.yba5{bottom:296.917333pt;} +.yc83{bottom:297.050667pt;} +.yf31{bottom:297.070667pt;} +.yaba{bottom:297.329333pt;} +.y10cf{bottom:297.337333pt;} +.y14c8{bottom:297.513333pt;} +.y1020{bottom:297.570667pt;} +.y3b4{bottom:297.722667pt;} +.y959{bottom:297.809333pt;} +.y627{bottom:298.126633pt;} +.y6ca{bottom:298.345333pt;} +.ydaf{bottom:298.352000pt;} +.y244{bottom:298.502667pt;} +.y165{bottom:298.620000pt;} +.y373{bottom:298.754667pt;} +.y113e{bottom:298.758667pt;} +.y1270{bottom:299.170667pt;} +.y11b9{bottom:299.440000pt;} +.yb7d{bottom:299.485333pt;} +.yb53{bottom:299.765333pt;} +.y1212{bottom:299.786135pt;} +.y73b{bottom:299.910667pt;} +.y1040{bottom:299.970667pt;} +.y1480{bottom:300.296000pt;} +.ya3f{bottom:300.377000pt;} +.yb30{bottom:300.485333pt;} +.ye22{bottom:300.708000pt;} +.y4a1{bottom:300.782667pt;} +.y54f{bottom:300.817333pt;} +.ya66{bottom:301.048000pt;} +.yf84{bottom:301.057333pt;} +.y5cc{bottom:301.100000pt;} +.y1528{bottom:301.388000pt;} +.y42e{bottom:301.613333pt;} +.y1372{bottom:301.694667pt;} +.yf59{bottom:301.720000pt;} +.y628{bottom:301.838633pt;} +.y1af{bottom:301.894667pt;} +.y90e{bottom:301.900000pt;} .y7c{bottom:301.902667pt;} -.yd85{bottom:301.925333pt;} -.y21c{bottom:302.102667pt;} -.y777{bottom:302.122667pt;} -.y111a{bottom:302.157333pt;} -.yac1{bottom:302.289333pt;} -.y1d4{bottom:302.604000pt;} -.yb1d{bottom:302.666667pt;} -.ydc2{bottom:302.716000pt;} -.y63a{bottom:302.766632pt;} -.ye37{bottom:302.948000pt;} -.y141b{bottom:303.097333pt;} -.y15e8{bottom:303.377333pt;} -.y7c6{bottom:303.426667pt;} -.yd2d{bottom:303.549333pt;} -.ya24{bottom:303.565333pt;} -.y401{bottom:304.016000pt;} -.yec3{bottom:304.109333pt;} -.y9ac{bottom:304.133333pt;} -.y1209{bottom:304.261333pt;} -.yc0e{bottom:304.498667pt;} -.ye13{bottom:304.522667pt;} +.yd4b{bottom:301.925333pt;} +.y216{bottom:302.102667pt;} +.y75d{bottom:302.122667pt;} +.y10d0{bottom:302.157333pt;} +.ya94{bottom:302.289333pt;} +.yb4{bottom:302.568000pt;} +.y1cf{bottom:302.604000pt;} +.yd87{bottom:302.716000pt;} +.y626{bottom:302.766632pt;} +.ydfa{bottom:302.948000pt;} +.y13c2{bottom:303.097333pt;} +.y158a{bottom:303.377333pt;} +.y7aa{bottom:303.426667pt;} +.ycf4{bottom:303.549333pt;} +.y9fa{bottom:303.565333pt;} +.y3f7{bottom:304.016000pt;} +.ye84{bottom:304.109333pt;} +.y984{bottom:304.133333pt;} +.y11ba{bottom:304.261333pt;} +.ybda{bottom:304.498667pt;} +.ydd7{bottom:304.522667pt;} .y9b{bottom:304.560000pt;} -.ye85{bottom:304.753333pt;} -.y67c{bottom:304.801333pt;} -.yc83{bottom:305.044000pt;} -.y6ab{bottom:305.085333pt;} -.yf46{bottom:305.210667pt;} -.y11a3{bottom:305.261333pt;} -.y95b{bottom:305.369333pt;} -.y1448{bottom:305.790667pt;} -.yd56{bottom:306.217333pt;} -.y2a9{bottom:306.236000pt;} -.y127a{bottom:306.305333pt;} -.y10a9{bottom:306.332000pt;} -.y6c7{bottom:306.420165pt;} -.yc90{bottom:306.589333pt;} -.y56a{bottom:306.666667pt;} -.y1461{bottom:306.692000pt;} -.y79f{bottom:307.056000pt;} -.y12e2{bottom:307.233333pt;} -.y10d0{bottom:307.254667pt;} -.y8e5{bottom:307.440000pt;} -.y21b{bottom:307.718667pt;} -.y115c{bottom:307.744000pt;} -.y102b{bottom:307.809333pt;} -.y379{bottom:307.882667pt;} -.y1245{bottom:308.115162pt;} -.yef3{bottom:308.121333pt;} -.ycb9{bottom:308.170667pt;} -.yb3f{bottom:308.253333pt;} -.yf12{bottom:308.324000pt;} -.y1547{bottom:308.462667pt;} -.y15e6{bottom:308.490667pt;} -.y9d6{bottom:308.613333pt;} -.y1170{bottom:308.721333pt;} -.y1244{bottom:308.826285pt;} -.y216{bottom:309.010667pt;} -.y11df{bottom:309.097333pt;} -.y14af{bottom:309.246667pt;} -.yd0a{bottom:309.270667pt;} -.y856{bottom:309.278667pt;} +.ye46{bottom:304.753333pt;} +.y667{bottom:304.801333pt;} +.yc4b{bottom:305.044000pt;} +.y695{bottom:305.085333pt;} +.yf04{bottom:305.210667pt;} +.y1156{bottom:305.261333pt;} +.y934{bottom:305.369333pt;} +.y13ef{bottom:305.790667pt;} +.yd1d{bottom:306.217333pt;} +.y2a3{bottom:306.236000pt;} +.y122a{bottom:306.305333pt;} +.y1060{bottom:306.332000pt;} +.y6b0{bottom:306.420165pt;} +.yc58{bottom:306.589333pt;} +.y1408{bottom:306.692000pt;} +.y784{bottom:307.056000pt;} +.y1290{bottom:307.233333pt;} +.y1087{bottom:307.254667pt;} +.y8c1{bottom:307.440000pt;} +.y215{bottom:307.718667pt;} +.y1111{bottom:307.744000pt;} +.yfe4{bottom:307.809333pt;} +.y371{bottom:307.882667pt;} +.y11f5{bottom:308.115162pt;} +.yeb3{bottom:308.121333pt;} +.yc81{bottom:308.170667pt;} +.yb0f{bottom:308.253333pt;} +.yed0{bottom:308.324000pt;} +.y14ea{bottom:308.462667pt;} +.y1588{bottom:308.490667pt;} +.y9ad{bottom:308.613333pt;} +.y1124{bottom:308.721333pt;} +.y11f4{bottom:308.826285pt;} +.y210{bottom:309.010667pt;} +.y1191{bottom:309.097333pt;} +.y1454{bottom:309.246667pt;} +.ycd1{bottom:309.270667pt;} +.y835{bottom:309.278667pt;} +.yd9{bottom:309.292000pt;} .y4c{bottom:309.873333pt;} -.y378{bottom:309.874667pt;} -.y1382{bottom:309.896000pt;} -.y2a7{bottom:309.997333pt;} -.y1335{bottom:310.046667pt;} -.y104d{bottom:310.108000pt;} -.y6ca{bottom:310.216623pt;} -.ya47{bottom:310.804000pt;} -.y215{bottom:311.002667pt;} -.y1237{bottom:311.048000pt;} -.y114b{bottom:311.097333pt;} -.yea6{bottom:311.226667pt;} -.y8c6{bottom:311.548000pt;} -.y47a{bottom:311.628000pt;} -.y10f4{bottom:311.692000pt;} -.y4ad{bottom:311.902667pt;} -.y55e{bottom:311.937333pt;} -.y532{bottom:312.048000pt;} -.y5af{bottom:312.196000pt;} -.y3bc{bottom:312.202667pt;} -.y9f7{bottom:312.236000pt;} -.y179{bottom:312.465168pt;} -.y1582{bottom:312.546667pt;} -.y13f8{bottom:312.564000pt;} -.y860{bottom:312.666667pt;} -.y1583{bottom:312.745333pt;} -.y908{bottom:312.753333pt;} -.y70b{bottom:312.789333pt;} -.y736{bottom:312.872000pt;} -.yf72{bottom:313.010667pt;} -.y1118{bottom:313.277333pt;} -.ybd7{bottom:313.389333pt;} -.y178{bottom:313.423507pt;} -.y1523{bottom:313.453333pt;} -.y1067{bottom:313.512000pt;} -.y97f{bottom:313.749333pt;} -.y15e7{bottom:314.004000pt;} -.y3bb{bottom:314.194667pt;} -.y6e0{bottom:314.285333pt;} -.ydea{bottom:314.293333pt;} -.y166{bottom:314.560000pt;} -.y500{bottom:314.658667pt;} -.y7cf{bottom:314.666667pt;} -.y1189{bottom:314.698667pt;} -.y2a8{bottom:314.818667pt;} -.y8a0{bottom:314.972000pt;} -.y12bf{bottom:315.112000pt;} -.ya6a{bottom:315.168160pt;} -.y317{bottom:315.180000pt;} -.y7d3{bottom:315.224000pt;} -.y1207{bottom:315.380000pt;} -.ybaf{bottom:315.425333pt;} -.yb84{bottom:315.705333pt;} -.y755{bottom:315.850667pt;} -.y1087{bottom:315.910667pt;} -.y14da{bottom:316.236000pt;} -.y21a{bottom:316.488000pt;} -.yce8{bottom:316.512000pt;} -.ye5f{bottom:316.648000pt;} -.ya92{bottom:316.988000pt;} -.yfc6{bottom:316.998667pt;} -.y5dd{bottom:317.041333pt;} -.y316{bottom:317.172000pt;} -.y438{bottom:317.553333pt;} -.y6c6{bottom:317.625165pt;} -.y13c9{bottom:317.636000pt;} -.yf9b{bottom:317.660000pt;} +.y370{bottom:309.874667pt;} +.y132c{bottom:309.896000pt;} +.y2a1{bottom:309.997333pt;} +.y12e1{bottom:310.046667pt;} +.y1005{bottom:310.108000pt;} +.y6b3{bottom:310.216623pt;} +.ya1c{bottom:310.804000pt;} +.y20f{bottom:311.002667pt;} +.y11e8{bottom:311.048000pt;} +.y1101{bottom:311.097333pt;} +.ye67{bottom:311.226667pt;} +.y8a3{bottom:311.548000pt;} +.y46e{bottom:311.628000pt;} +.y10aa{bottom:311.692000pt;} +.y49f{bottom:311.902667pt;} +.y54d{bottom:311.937333pt;} +.y522{bottom:312.048000pt;} +.y59d{bottom:312.196000pt;} +.y3b3{bottom:312.202667pt;} +.y9cd{bottom:312.236000pt;} +.y176{bottom:312.465168pt;} +.y1525{bottom:312.546667pt;} +.y139f{bottom:312.564000pt;} +.y1526{bottom:312.745333pt;} +.y8e3{bottom:312.753333pt;} +.y6f4{bottom:312.789333pt;} +.y71e{bottom:312.872000pt;} +.yf30{bottom:313.010667pt;} +.y10ce{bottom:313.277333pt;} +.yba3{bottom:313.389333pt;} +.y175{bottom:313.423507pt;} +.y14c7{bottom:313.453333pt;} +.y101f{bottom:313.512000pt;} +.y958{bottom:313.749333pt;} +.y1589{bottom:314.004000pt;} +.y3b2{bottom:314.194667pt;} +.y6c9{bottom:314.285333pt;} +.ydae{bottom:314.293333pt;} +.y164{bottom:314.560000pt;} +.y4f1{bottom:314.658667pt;} +.y113d{bottom:314.698667pt;} +.y2a2{bottom:314.818667pt;} +.y87e{bottom:314.972000pt;} +.y126f{bottom:315.112000pt;} +.ya3e{bottom:315.168160pt;} +.y310{bottom:315.180000pt;} +.y7b5{bottom:315.224000pt;} +.y11b8{bottom:315.380000pt;} +.yb7c{bottom:315.425333pt;} +.yb52{bottom:315.705333pt;} +.y73a{bottom:315.850667pt;} +.y103f{bottom:315.910667pt;} +.y147f{bottom:316.236000pt;} +.y214{bottom:316.488000pt;} +.ycaf{bottom:316.512000pt;} +.ye21{bottom:316.648000pt;} +.ya65{bottom:316.988000pt;} +.yf83{bottom:316.998667pt;} +.y5cb{bottom:317.041333pt;} +.y30f{bottom:317.172000pt;} +.y42d{bottom:317.553333pt;} +.y6af{bottom:317.625165pt;} +.y1371{bottom:317.636000pt;} +.yf58{bottom:317.660000pt;} .y7b{bottom:317.844000pt;} -.y776{bottom:318.062667pt;} -.yac0{bottom:318.229333pt;} -.yb4{bottom:318.508000pt;} -.y1d3{bottom:318.545333pt;} -.ye36{bottom:318.888000pt;} -.y141a{bottom:319.037333pt;} -.y7c5{bottom:319.366667pt;} -.y87a{bottom:319.432000pt;} -.ya23{bottom:319.505333pt;} -.y135d{bottom:319.878667pt;} -.y7ef{bottom:319.940876pt;} -.y400{bottom:319.956000pt;} -.y9ab{bottom:320.073333pt;} -.ye12{bottom:320.462667pt;} -.y638{bottom:320.659253pt;} -.ye84{bottom:320.693333pt;} -.y67b{bottom:320.741333pt;} -.yc82{bottom:320.984000pt;} -.y6aa{bottom:321.025333pt;} -.yf45{bottom:321.150667pt;} -.y11a2{bottom:321.201333pt;} -.y95a{bottom:321.309333pt;} -.y101{bottom:321.445333pt;} -.y1447{bottom:321.730667pt;} -.yae7{bottom:321.848000pt;} -.y1484{bottom:322.005333pt;} -.y2a6{bottom:322.176000pt;} -.y1279{bottom:322.245333pt;} -.y10a8{bottom:322.273333pt;} -.yc8f{bottom:322.529333pt;} -.y79e{bottom:322.996000pt;} -.y249{bottom:323.021333pt;} -.y12e1{bottom:323.173333pt;} -.y10cf{bottom:323.194667pt;} -.y218{bottom:323.622667pt;} -.y135c{bottom:323.628000pt;} -.y115b{bottom:323.684000pt;} -.y102a{bottom:323.749333pt;} -.y1580{bottom:323.904000pt;} -.yb3c{bottom:324.060000pt;} -.yef2{bottom:324.061333pt;} -.y1581{bottom:324.102667pt;} -.ycb8{bottom:324.110667pt;} -.y83a{bottom:324.116000pt;} -.yb3e{bottom:324.193333pt;} -.y639{bottom:324.371254pt;} -.y1546{bottom:324.402667pt;} -.y116f{bottom:324.661333pt;} -.y7f1{bottom:325.008902pt;} -.y11de{bottom:325.037333pt;} -.y6c9{bottom:325.156623pt;} -.yd09{bottom:325.212000pt;} -.y637{bottom:325.299253pt;} +.y75c{bottom:318.062667pt;} +.ya93{bottom:318.229333pt;} +.yb3{bottom:318.508000pt;} +.y1ce{bottom:318.545333pt;} +.ydf9{bottom:318.888000pt;} +.y13c1{bottom:319.037333pt;} +.y7a9{bottom:319.366667pt;} +.y858{bottom:319.432000pt;} +.y9f9{bottom:319.505333pt;} +.y1308{bottom:319.878667pt;} +.y7d1{bottom:319.940876pt;} +.y3f6{bottom:319.956000pt;} +.y983{bottom:320.073333pt;} +.ydd6{bottom:320.462667pt;} +.y624{bottom:320.659253pt;} +.ye45{bottom:320.693333pt;} +.y666{bottom:320.741333pt;} +.yc4a{bottom:320.984000pt;} +.y694{bottom:321.025333pt;} +.yf03{bottom:321.150667pt;} +.y1155{bottom:321.201333pt;} +.y933{bottom:321.309333pt;} +.y104{bottom:321.445333pt;} +.y13ee{bottom:321.730667pt;} +.yab9{bottom:321.848000pt;} +.y142a{bottom:322.005333pt;} +.y2a0{bottom:322.176000pt;} +.y1229{bottom:322.245333pt;} +.y105f{bottom:322.273333pt;} +.yc57{bottom:322.529333pt;} +.y783{bottom:322.996000pt;} +.y243{bottom:323.021333pt;} +.y128f{bottom:323.173333pt;} +.y1086{bottom:323.194667pt;} +.y212{bottom:323.622667pt;} +.y1307{bottom:323.628000pt;} +.y1110{bottom:323.684000pt;} +.yfe3{bottom:323.749333pt;} +.y1523{bottom:323.904000pt;} +.yb0c{bottom:324.060000pt;} +.yeb2{bottom:324.061333pt;} +.y1524{bottom:324.102667pt;} +.yc80{bottom:324.110667pt;} +.y819{bottom:324.116000pt;} +.yb0e{bottom:324.193333pt;} +.y625{bottom:324.371254pt;} +.y14e9{bottom:324.402667pt;} +.y1123{bottom:324.661333pt;} +.y7d3{bottom:325.008902pt;} +.y1190{bottom:325.037333pt;} +.y6b2{bottom:325.156623pt;} +.ycd0{bottom:325.212000pt;} +.y623{bottom:325.299253pt;} .y4b{bottom:325.813333pt;} -.y377{bottom:325.814667pt;} -.y2a4{bottom:325.938667pt;} -.y1334{bottom:325.986667pt;} -.y104c{bottom:326.048000pt;} -.yd8{bottom:326.332000pt;} -.y1243{bottom:326.351909pt;} -.y137{bottom:326.550667pt;} -.y1236{bottom:326.988000pt;} -.y114a{bottom:327.037333pt;} -.yea5{bottom:327.166667pt;} -.ya46{bottom:327.274667pt;} -.y479{bottom:327.569333pt;} -.y217{bottom:327.608000pt;} -.y10f3{bottom:327.632000pt;} -.y4ac{bottom:327.842667pt;} -.y55d{bottom:327.877333pt;} -.y531{bottom:327.988000pt;} -.y5ae{bottom:328.136000pt;} -.y15e5{bottom:328.349333pt;} -.yb12{bottom:328.352000pt;} -.y13f6{bottom:328.505333pt;} -.yec2{bottom:328.628000pt;} -.y3ba{bottom:328.673333pt;} -.y907{bottom:328.693333pt;} -.y70a{bottom:328.729333pt;} -.y735{bottom:328.812000pt;} -.y6c5{bottom:328.830165pt;} -.yc03{bottom:328.940000pt;} -.yf71{bottom:328.950667pt;} -.ybd4{bottom:329.196000pt;} -.y1117{bottom:329.217333pt;} -.ybd6{bottom:329.329333pt;} -.yfe1{bottom:329.333333pt;} -.y1522{bottom:329.393333pt;} -.ya69{bottom:329.598560pt;} -.y97e{bottom:329.689333pt;} -.y315{bottom:329.814667pt;} -.y6df{bottom:330.225333pt;} -.yde9{bottom:330.233333pt;} -.y165{bottom:330.500000pt;} -.y1188{bottom:330.640000pt;} -.y3b9{bottom:330.666667pt;} -.y2a5{bottom:330.758667pt;} -.y1b1{bottom:330.989333pt;} -.y12be{bottom:331.052000pt;} -.y1206{bottom:331.321333pt;} -.y176{bottom:331.766538pt;} -.y754{bottom:331.790667pt;} -.y827{bottom:331.792000pt;} -.y1496{bottom:331.828000pt;} -.y1086{bottom:331.852000pt;} -.y133f{bottom:332.000000pt;} -.y14d9{bottom:332.176000pt;} -.y3ff{bottom:332.354667pt;} -.yce7{bottom:332.452000pt;} -.ye5e{bottom:332.588000pt;} -.ya91{bottom:332.928000pt;} -.yfc5{bottom:332.938667pt;} -.y5dc{bottom:332.981333pt;} -.y7ee{bottom:333.014816pt;} -.y313{bottom:333.112000pt;} -.y13f7{bottom:333.325333pt;} -.y437{bottom:333.493333pt;} -.y13c8{bottom:333.576000pt;} -.yf9a{bottom:333.600000pt;} -.y1007{bottom:333.618667pt;} -.yb60{bottom:333.638667pt;} +.y36f{bottom:325.814667pt;} +.y29e{bottom:325.938667pt;} +.y12e0{bottom:325.986667pt;} +.y1004{bottom:326.048000pt;} +.y11f3{bottom:326.351909pt;} +.y138{bottom:326.550667pt;} +.y11e7{bottom:326.988000pt;} +.y1100{bottom:327.037333pt;} +.ye66{bottom:327.166667pt;} +.ya1b{bottom:327.274667pt;} +.y46d{bottom:327.569333pt;} +.y211{bottom:327.608000pt;} +.y10a9{bottom:327.632000pt;} +.y49e{bottom:327.842667pt;} +.y54c{bottom:327.877333pt;} +.y521{bottom:327.988000pt;} +.y59c{bottom:328.136000pt;} +.y1587{bottom:328.349333pt;} +.yae3{bottom:328.352000pt;} +.y139d{bottom:328.505333pt;} +.ye83{bottom:328.628000pt;} +.y3b1{bottom:328.673333pt;} +.y8e2{bottom:328.693333pt;} +.y6f3{bottom:328.729333pt;} +.y71d{bottom:328.812000pt;} +.y6ae{bottom:328.830165pt;} +.ybcf{bottom:328.940000pt;} +.yf2f{bottom:328.950667pt;} +.yba0{bottom:329.196000pt;} +.y10cd{bottom:329.217333pt;} +.yba2{bottom:329.329333pt;} +.y14c6{bottom:329.393333pt;} +.ya3d{bottom:329.598560pt;} +.y957{bottom:329.689333pt;} +.y30e{bottom:329.814667pt;} +.y6c8{bottom:330.225333pt;} +.ydad{bottom:330.233333pt;} +.y163{bottom:330.500000pt;} +.y113c{bottom:330.640000pt;} +.y3b0{bottom:330.666667pt;} +.y29f{bottom:330.758667pt;} +.y1ae{bottom:330.989333pt;} +.y126e{bottom:331.052000pt;} +.y11b7{bottom:331.321333pt;} +.y173{bottom:331.766538pt;} +.y739{bottom:331.790667pt;} +.y807{bottom:331.792000pt;} +.y143b{bottom:331.828000pt;} +.y103e{bottom:331.852000pt;} +.y147e{bottom:332.176000pt;} +.y3f5{bottom:332.354667pt;} +.ycae{bottom:332.452000pt;} +.ye20{bottom:332.588000pt;} +.ya64{bottom:332.928000pt;} +.yf82{bottom:332.938667pt;} +.y5ca{bottom:332.981333pt;} +.y7d0{bottom:333.014816pt;} +.y30c{bottom:333.112000pt;} +.y139e{bottom:333.325333pt;} +.y42c{bottom:333.493333pt;} +.y1370{bottom:333.576000pt;} +.yf57{bottom:333.600000pt;} +.yfc1{bottom:333.618667pt;} +.yb2f{bottom:333.638667pt;} .y7a{bottom:333.784000pt;} -.yabf{bottom:334.169333pt;} -.yb3{bottom:334.448000pt;} -.y1d2{bottom:334.485333pt;} -.y1419{bottom:334.977333pt;} -.y157e{bottom:335.261333pt;} -.y879{bottom:335.372000pt;} -.ya22{bottom:335.445333pt;} -.y157f{bottom:335.460000pt;} -.y14ae{bottom:335.813333pt;} -.y3fd{bottom:335.896000pt;} -.y9aa{bottom:336.014667pt;} -.ye11{bottom:336.402667pt;} -.ye83{bottom:336.633333pt;} -.y8cd{bottom:336.666667pt;} -.y67a{bottom:336.681333pt;} -.y9f6{bottom:336.756000pt;} -.y6a9{bottom:336.965333pt;} -.yf44{bottom:337.090667pt;} -.y11a1{bottom:337.141333pt;} -.y959{bottom:337.249333pt;} -.y100{bottom:337.385333pt;} -.y1446{bottom:337.672000pt;} -.y855{bottom:337.853333pt;} -.y314{bottom:337.933333pt;} -.y1483{bottom:337.945333pt;} -.y14fd{bottom:338.168000pt;} -.y1278{bottom:338.186667pt;} -.y10a7{bottom:338.213333pt;} -.y79d{bottom:338.936000pt;} -.y10ce{bottom:339.134667pt;} -.y177{bottom:339.433258pt;} -.y1029{bottom:339.689333pt;} -.yef1{bottom:340.001333pt;} -.ycb6{bottom:340.050667pt;} -.yb3d{bottom:340.133333pt;} -.y1545{bottom:340.342667pt;} -.y7f0{bottom:340.459923pt;} -.yd2c{bottom:340.466667pt;} -.y116e{bottom:340.601333pt;} -.yd08{bottom:341.152000pt;} -.y15e4{bottom:341.368000pt;} -.y8e4{bottom:341.404000pt;} -.y3fe{bottom:341.578667pt;} +.ya92{bottom:334.169333pt;} +.y1cd{bottom:334.485333pt;} +.y13c0{bottom:334.977333pt;} +.yd8{bottom:335.225333pt;} +.y1521{bottom:335.261333pt;} +.y857{bottom:335.372000pt;} +.y9f8{bottom:335.445333pt;} +.y1522{bottom:335.460000pt;} +.y1453{bottom:335.813333pt;} +.y3f3{bottom:335.896000pt;} +.y982{bottom:336.014667pt;} +.ydd5{bottom:336.402667pt;} +.ye44{bottom:336.633333pt;} +.y665{bottom:336.681333pt;} +.y9cc{bottom:336.756000pt;} +.y693{bottom:336.965333pt;} +.yf02{bottom:337.090667pt;} +.y1154{bottom:337.141333pt;} +.y932{bottom:337.249333pt;} +.y103{bottom:337.385333pt;} +.y13ed{bottom:337.672000pt;} +.y834{bottom:337.853333pt;} +.y30d{bottom:337.933333pt;} +.y1429{bottom:337.945333pt;} +.y14a1{bottom:338.168000pt;} +.y1228{bottom:338.186667pt;} +.y105e{bottom:338.213333pt;} +.y782{bottom:338.936000pt;} +.y1085{bottom:339.134667pt;} +.y174{bottom:339.433258pt;} +.yfe2{bottom:339.689333pt;} +.yeb1{bottom:340.001333pt;} +.yc7e{bottom:340.050667pt;} +.yb0d{bottom:340.133333pt;} +.y14e8{bottom:340.342667pt;} +.y7d2{bottom:340.459923pt;} +.ycf3{bottom:340.466667pt;} +.y1122{bottom:340.601333pt;} +.yccf{bottom:341.152000pt;} +.y1586{bottom:341.368000pt;} +.y8c0{bottom:341.404000pt;} +.y3f4{bottom:341.578667pt;} .y4a{bottom:341.753333pt;} -.y376{bottom:341.754667pt;} -.y2a3{bottom:341.878667pt;} -.y1333{bottom:341.928000pt;} -.y104b{bottom:341.988000pt;} -.yb8e{bottom:342.000000pt;} -.y136{bottom:342.490667pt;} -.y1235{bottom:342.929333pt;} -.y1149{bottom:342.977333pt;} -.yea4{bottom:343.106667pt;} -.y635{bottom:343.191874pt;} -.yd84{bottom:343.252000pt;} -.y135b{bottom:343.302667pt;} -.y478{bottom:343.509333pt;} -.y10f2{bottom:343.572000pt;} -.ya45{bottom:343.746667pt;} -.y4ab{bottom:343.784000pt;} -.y55c{bottom:343.817333pt;} -.y145f{bottom:343.876000pt;} -.ydc1{bottom:344.042667pt;} -.y5ad{bottom:344.076000pt;} -.yb11{bottom:344.292000pt;} -.ya68{bottom:344.389720pt;} -.y1381{bottom:344.424000pt;} -.y13f5{bottom:344.445333pt;} -.y906{bottom:344.633333pt;} -.y709{bottom:344.669333pt;} -.y734{bottom:344.753333pt;} -.ycb7{bottom:344.872000pt;} -.yf70{bottom:344.890667pt;} -.y3b8{bottom:345.145333pt;} -.y1116{bottom:345.157333pt;} -.ybd5{bottom:345.269333pt;} -.y1521{bottom:345.333333pt;} -.yc81{bottom:345.502667pt;} -.y310{bottom:345.510667pt;} -.y97d{bottom:345.629333pt;} -.y312{bottom:345.756000pt;} -.y933{bottom:345.828000pt;} -.y7ed{bottom:346.088757pt;} -.y6de{bottom:346.165333pt;} -.y164{bottom:346.440000pt;} -.y15e2{bottom:346.481333pt;} -.y157c{bottom:346.618667pt;} -.y157d{bottom:346.817333pt;} -.y636{bottom:346.903874pt;} -.y12bd{bottom:346.992000pt;} -.yb83{bottom:347.013333pt;} -.y175{bottom:347.099979pt;} -.y3b7{bottom:347.137333pt;} -.y1205{bottom:347.261333pt;} -.y753{bottom:347.732000pt;} -.y1085{bottom:347.792000pt;} -.y634{bottom:347.831873pt;} -.y14d8{bottom:348.117333pt;} -.yd55{bottom:348.125333pt;} -.yce6{bottom:348.393333pt;} -.ybae{bottom:348.578667pt;} -.y7c4{bottom:348.590667pt;} -.y1460{bottom:348.697333pt;} -.y5db{bottom:348.921333pt;} -.y8c5{bottom:349.048000pt;} -.y30e{bottom:349.052000pt;} -.y436{bottom:349.433333pt;} -.y13c7{bottom:349.516000pt;} -.yf99{bottom:349.540000pt;} -.y1006{bottom:349.558667pt;} -.yb5f{bottom:349.578667pt;} +.y36e{bottom:341.754667pt;} +.y29d{bottom:341.878667pt;} +.y12df{bottom:341.928000pt;} +.y1003{bottom:341.988000pt;} +.y137{bottom:342.490667pt;} +.y11e6{bottom:342.929333pt;} +.y10ff{bottom:342.977333pt;} +.ye65{bottom:343.106667pt;} +.y621{bottom:343.191874pt;} +.yd4a{bottom:343.252000pt;} +.y1306{bottom:343.302667pt;} +.y46c{bottom:343.509333pt;} +.y10a8{bottom:343.572000pt;} +.ya1a{bottom:343.746667pt;} +.y49d{bottom:343.784000pt;} +.y54b{bottom:343.817333pt;} +.y1406{bottom:343.876000pt;} +.yd86{bottom:344.042667pt;} +.y59b{bottom:344.076000pt;} +.yae2{bottom:344.292000pt;} +.ya3c{bottom:344.389720pt;} +.y132b{bottom:344.424000pt;} +.y139c{bottom:344.445333pt;} +.y8e1{bottom:344.633333pt;} +.y6f2{bottom:344.669333pt;} +.y71c{bottom:344.753333pt;} +.yc7f{bottom:344.872000pt;} +.yf2e{bottom:344.890667pt;} +.yb2{bottom:345.074667pt;} +.y3af{bottom:345.145333pt;} +.y10cc{bottom:345.157333pt;} +.yba1{bottom:345.269333pt;} +.y14c5{bottom:345.333333pt;} +.yc49{bottom:345.502667pt;} +.y309{bottom:345.510667pt;} +.y956{bottom:345.629333pt;} +.y30b{bottom:345.756000pt;} +.y90d{bottom:345.828000pt;} +.y7cf{bottom:346.088757pt;} +.y6c7{bottom:346.165333pt;} +.y162{bottom:346.440000pt;} +.y1584{bottom:346.481333pt;} +.y151f{bottom:346.618667pt;} +.y1520{bottom:346.817333pt;} +.y622{bottom:346.903874pt;} +.y126d{bottom:346.992000pt;} +.yb51{bottom:347.013333pt;} +.y172{bottom:347.099979pt;} +.y3ae{bottom:347.137333pt;} +.y11b6{bottom:347.261333pt;} +.y738{bottom:347.732000pt;} +.y103d{bottom:347.792000pt;} +.y620{bottom:347.831873pt;} +.y147d{bottom:348.117333pt;} +.yd1c{bottom:348.125333pt;} +.ycad{bottom:348.393333pt;} +.yb7b{bottom:348.578667pt;} +.y7a8{bottom:348.590667pt;} +.y1407{bottom:348.697333pt;} +.y5c9{bottom:348.921333pt;} +.y8a2{bottom:349.048000pt;} +.y307{bottom:349.052000pt;} +.yd7{bottom:349.173333pt;} +.y42b{bottom:349.433333pt;} +.y136f{bottom:349.516000pt;} +.yf56{bottom:349.540000pt;} +.yfc0{bottom:349.558667pt;} +.yb2e{bottom:349.578667pt;} .y79{bottom:349.724000pt;} -.y9d5{bottom:349.940000pt;} -.yabe{bottom:350.109333pt;} -.y1d1{bottom:350.425333pt;} -.y839{bottom:350.684000pt;} -.y1418{bottom:350.917333pt;} -.yc8e{bottom:351.624000pt;} -.y14ad{bottom:351.753333pt;} -.y3fc{bottom:351.837333pt;} -.y9a9{bottom:351.954667pt;} -.y15e3{bottom:351.994667pt;} -.yd7{bottom:352.208000pt;} -.ye10{bottom:352.342667pt;} -.y214{bottom:352.357333pt;} -.ye82{bottom:352.573333pt;} -.y530{bottom:352.730667pt;} -.y115a{bottom:352.778667pt;} -.y6a8{bottom:352.905333pt;} -.yf43{bottom:353.030667pt;} -.y11a0{bottom:353.081333pt;} -.y958{bottom:353.189333pt;} -.yff{bottom:353.325333pt;} -.y1445{bottom:353.612000pt;} -.y854{bottom:353.793333pt;} -.y311{bottom:353.873333pt;} -.y1482{bottom:353.885333pt;} -.y2a2{bottom:354.056000pt;} -.y1277{bottom:354.126667pt;} -.yc33{bottom:354.128000pt;} -.y10a6{bottom:354.153333pt;} -.y30f{bottom:354.734667pt;} -.y79c{bottom:354.876000pt;} -.y1066{bottom:355.072000pt;} -.y10cd{bottom:355.076000pt;} -.y1028{bottom:355.630667pt;} -.yef0{bottom:355.942667pt;} -.ycb5{bottom:355.992000pt;} -.yc32{bottom:356.120000pt;} -.yd2b{bottom:356.406667pt;} -.yb3b{bottom:356.605333pt;} -.yd07{bottom:357.092000pt;} -.ydab{bottom:357.252000pt;} -.y12e0{bottom:357.253333pt;} -.y8e3{bottom:357.344000pt;} +.y9ac{bottom:349.940000pt;} +.ya91{bottom:350.109333pt;} +.y1cc{bottom:350.425333pt;} +.y818{bottom:350.684000pt;} +.y13bf{bottom:350.917333pt;} +.yd6{bottom:351.165333pt;} +.yc56{bottom:351.624000pt;} +.y1452{bottom:351.753333pt;} +.y3f2{bottom:351.837333pt;} +.y981{bottom:351.954667pt;} +.y1585{bottom:351.994667pt;} +.ydd4{bottom:352.342667pt;} +.y20e{bottom:352.357333pt;} +.ye43{bottom:352.573333pt;} +.y520{bottom:352.730667pt;} +.y110f{bottom:352.778667pt;} +.y692{bottom:352.905333pt;} +.yf01{bottom:353.030667pt;} +.y1153{bottom:353.081333pt;} +.y931{bottom:353.189333pt;} +.y102{bottom:353.325333pt;} +.y13ec{bottom:353.612000pt;} +.y833{bottom:353.793333pt;} +.y30a{bottom:353.873333pt;} +.y1428{bottom:353.885333pt;} +.y29c{bottom:354.056000pt;} +.y1227{bottom:354.126667pt;} +.ybfe{bottom:354.128000pt;} +.y105d{bottom:354.153333pt;} +.y308{bottom:354.734667pt;} +.y781{bottom:354.876000pt;} +.y101e{bottom:355.072000pt;} +.y1084{bottom:355.076000pt;} +.yfe1{bottom:355.630667pt;} +.yeb0{bottom:355.942667pt;} +.yc7d{bottom:355.992000pt;} +.ybfd{bottom:356.120000pt;} +.ycf2{bottom:356.406667pt;} +.yb0b{bottom:356.605333pt;} +.ycce{bottom:357.092000pt;} +.yd71{bottom:357.252000pt;} +.y128e{bottom:357.253333pt;} +.y8bf{bottom:357.344000pt;} .y49{bottom:357.694667pt;} -.y375{bottom:357.696000pt;} -.y774{bottom:357.725333pt;} -.y2a0{bottom:357.818667pt;} -.y1332{bottom:357.868000pt;} -.y104a{bottom:357.929333pt;} -.y157b{bottom:357.976000pt;} -.y11dd{bottom:358.380000pt;} -.y1495{bottom:358.394667pt;} -.ya66{bottom:358.820120pt;} -.y1234{bottom:358.869333pt;} -.y1148{bottom:358.917333pt;} -.yae6{bottom:359.032000pt;} -.yd83{bottom:359.192000pt;} -.y248{bottom:359.220000pt;} -.y135a{bottom:359.242667pt;} -.y10f1{bottom:359.512000pt;} -.y4aa{bottom:359.724000pt;} -.y55b{bottom:359.757333pt;} -.y145e{bottom:359.816000pt;} -.ydbf{bottom:359.982667pt;} -.y5ac{bottom:360.016000pt;} -.ye35{bottom:360.214667pt;} -.ya44{bottom:360.218667pt;} -.yb10{bottom:360.232000pt;} -.y1380{bottom:360.364000pt;} -.y13f4{bottom:360.385333pt;} -.y905{bottom:360.573333pt;} -.y708{bottom:360.609333pt;} -.y733{bottom:360.693333pt;} -.yf6f{bottom:360.830667pt;} -.yb2{bottom:361.014667pt;} -.y1115{bottom:361.097333pt;} -.y1520{bottom:361.274667pt;} -.y97c{bottom:361.569333pt;} -.y3b6{bottom:361.617333pt;} -.ybd3{bottom:361.741333pt;} -.y932{bottom:361.768000pt;} -.ya90{bottom:362.022667pt;} -.y163{bottom:362.380000pt;} -.y775{bottom:362.545333pt;} -.y2a1{bottom:362.638667pt;} -.y14e0{bottom:362.666667pt;} -.y12bc{bottom:362.932000pt;} -.y1579{bottom:363.090667pt;} -.y15e1{bottom:363.152000pt;} -.y1204{bottom:363.201333pt;} -.y89f{bottom:363.244000pt;} -.y3b5{bottom:363.609333pt;} -.y752{bottom:363.672000pt;} -.y14d7{bottom:364.057333pt;} -.yd54{bottom:364.065333pt;} -.yb39{bottom:364.442667pt;} -.y823{bottom:364.508000pt;} -.y7c3{bottom:364.530667pt;} -.ydc0{bottom:364.802667pt;} -.y435{bottom:365.374667pt;} -.y13c6{bottom:365.456000pt;} -.yf98{bottom:365.480000pt;} -.y1005{bottom:365.498667pt;} -.yb5e{bottom:365.518667pt;} +.y36d{bottom:357.696000pt;} +.y75a{bottom:357.725333pt;} +.y29a{bottom:357.818667pt;} +.y12de{bottom:357.868000pt;} +.y1002{bottom:357.929333pt;} +.y151e{bottom:357.976000pt;} +.y118f{bottom:358.380000pt;} +.y143a{bottom:358.394667pt;} +.ya3a{bottom:358.820120pt;} +.y11e5{bottom:358.869333pt;} +.y10fe{bottom:358.917333pt;} +.yab8{bottom:359.032000pt;} +.yd49{bottom:359.192000pt;} +.y242{bottom:359.220000pt;} +.y1305{bottom:359.242667pt;} +.y10a7{bottom:359.512000pt;} +.y49c{bottom:359.724000pt;} +.y54a{bottom:359.757333pt;} +.y1405{bottom:359.816000pt;} +.yd84{bottom:359.982667pt;} +.y59a{bottom:360.016000pt;} +.ydf8{bottom:360.214667pt;} +.ya19{bottom:360.218667pt;} +.yae1{bottom:360.232000pt;} +.y132a{bottom:360.364000pt;} +.y139b{bottom:360.385333pt;} +.y8e0{bottom:360.573333pt;} +.y6f1{bottom:360.609333pt;} +.y71b{bottom:360.693333pt;} +.yf2d{bottom:360.830667pt;} +.yb1{bottom:361.014667pt;} +.y10cb{bottom:361.097333pt;} +.y14c4{bottom:361.274667pt;} +.y955{bottom:361.569333pt;} +.y3ad{bottom:361.617333pt;} +.yb9f{bottom:361.741333pt;} +.y90c{bottom:361.768000pt;} +.ya63{bottom:362.022667pt;} +.y161{bottom:362.380000pt;} +.y75b{bottom:362.545333pt;} +.y29b{bottom:362.638667pt;} +.y126c{bottom:362.932000pt;} +.y151c{bottom:363.090667pt;} +.y1583{bottom:363.152000pt;} +.y11b5{bottom:363.201333pt;} +.y87d{bottom:363.244000pt;} +.y3ac{bottom:363.609333pt;} +.y737{bottom:363.672000pt;} +.y147c{bottom:364.057333pt;} +.yd1b{bottom:364.065333pt;} +.yb09{bottom:364.442667pt;} +.y804{bottom:364.508000pt;} +.y7a7{bottom:364.530667pt;} +.yd85{bottom:364.802667pt;} +.y42a{bottom:365.374667pt;} +.y136e{bottom:365.456000pt;} +.yf55{bottom:365.480000pt;} +.yfbf{bottom:365.498667pt;} +.yb2d{bottom:365.518667pt;} .y78{bottom:365.664000pt;} -.y9d4{bottom:365.881333pt;} -.yd6{bottom:366.156000pt;} -.y838{bottom:366.624000pt;} -.y1417{bottom:366.857333pt;} -.y122{bottom:366.932000pt;} -.y44a{bottom:367.333333pt;} -.y1187{bottom:367.556000pt;} -.y7e2{bottom:367.647773pt;} -.y14ac{bottom:367.693333pt;} -.y3fb{bottom:367.777333pt;} -.y14fc{bottom:367.922667pt;} -.y463{bottom:367.950667pt;} -.y633{bottom:368.025618pt;} -.yd5{bottom:368.148000pt;} -.y15df{bottom:368.266667pt;} -.y213{bottom:368.297333pt;} -.ye81{bottom:368.513333pt;} -.y157a{bottom:368.602667pt;} -.y52f{bottom:368.672000pt;} -.y6a7{bottom:368.845333pt;} -.yf42{bottom:368.972000pt;} -.y119f{bottom:369.022667pt;} -.y679{bottom:369.096000pt;} -.y957{bottom:369.129333pt;} -.y13b4{bottom:369.420000pt;} -.y1444{bottom:369.552000pt;} -.y853{bottom:369.734667pt;} -.y1481{bottom:369.825333pt;} -.y29f{bottom:369.997333pt;} -.y1276{bottom:370.066667pt;} -.y1065{bottom:371.012000pt;} -.y10cc{bottom:371.016000pt;} -.yde8{bottom:371.560000pt;} -.yeef{bottom:371.882667pt;} -.ycb4{bottom:371.932000pt;} -.yc31{bottom:372.060000pt;} -.yd2a{bottom:372.346667pt;} -.yb3a{bottom:372.545333pt;} -.ye5d{bottom:372.862667pt;} -.yd06{bottom:373.032000pt;} -.y13b3{bottom:373.170667pt;} -.ydaa{bottom:373.193333pt;} -.y8e2{bottom:373.284000pt;} -.y2b1{bottom:373.333333pt;} +.y9ab{bottom:365.881333pt;} +.y817{bottom:366.624000pt;} +.y13be{bottom:366.857333pt;} +.y123{bottom:366.932000pt;} +.y113b{bottom:367.556000pt;} +.y7c4{bottom:367.647773pt;} +.y1451{bottom:367.693333pt;} +.y3f1{bottom:367.777333pt;} +.y14a0{bottom:367.922667pt;} +.y457{bottom:367.950667pt;} +.y61f{bottom:368.025618pt;} +.y1581{bottom:368.266667pt;} +.y20d{bottom:368.297333pt;} +.ye42{bottom:368.513333pt;} +.y151d{bottom:368.602667pt;} +.y51f{bottom:368.672000pt;} +.y691{bottom:368.845333pt;} +.yf00{bottom:368.972000pt;} +.y1152{bottom:369.022667pt;} +.y664{bottom:369.096000pt;} +.y930{bottom:369.129333pt;} +.y135d{bottom:369.420000pt;} +.y13eb{bottom:369.552000pt;} +.y832{bottom:369.734667pt;} +.y1427{bottom:369.825333pt;} +.y299{bottom:369.997333pt;} +.y1226{bottom:370.066667pt;} +.y101d{bottom:371.012000pt;} +.y1083{bottom:371.016000pt;} +.ydac{bottom:371.560000pt;} +.yeaf{bottom:371.882667pt;} +.yc7c{bottom:371.932000pt;} +.ybfc{bottom:372.060000pt;} +.ycf1{bottom:372.346667pt;} +.yb0a{bottom:372.545333pt;} +.ye1f{bottom:372.862667pt;} +.yccd{bottom:373.032000pt;} +.y135c{bottom:373.170667pt;} +.yd70{bottom:373.193333pt;} +.y8be{bottom:373.284000pt;} .y48{bottom:373.634667pt;} -.y374{bottom:373.636000pt;} -.y773{bottom:373.665333pt;} -.y4a9{bottom:373.672000pt;} -.y29d{bottom:373.758667pt;} -.y15e0{bottom:373.778667pt;} -.y1331{bottom:373.808000pt;} -.y1049{bottom:373.869333pt;} -.y9dd{bottom:374.000000pt;} -.y2ea{bottom:374.010667pt;} -.y1233{bottom:374.809333pt;} -.y1147{bottom:374.857333pt;} -.y1b0{bottom:374.917333pt;} -.yae5{bottom:374.973333pt;} -.y1d0{bottom:375.000000pt;} -.ya21{bottom:375.110667pt;} -.yd82{bottom:375.133333pt;} -.y247{bottom:375.160000pt;} -.y1359{bottom:375.182667pt;} -.y6dd{bottom:375.389333pt;} -.y10f0{bottom:375.452000pt;} -.y4a8{bottom:375.664000pt;} -.y55a{bottom:375.697333pt;} -.y145d{bottom:375.757333pt;} -.ydbe{bottom:375.922667pt;} -.y5ab{bottom:375.956000pt;} -.ye34{bottom:376.154667pt;} -.yb0f{bottom:376.172000pt;} -.y137f{bottom:376.304000pt;} -.y13f3{bottom:376.325333pt;} -.yc4d{bottom:376.500000pt;} -.y904{bottom:376.513333pt;} -.y707{bottom:376.550667pt;} -.y732{bottom:376.633333pt;} -.ya43{bottom:376.689333pt;} -.y878{bottom:376.698667pt;} -.yec1{bottom:376.841333pt;} -.yb1{bottom:376.954667pt;} -.y1cf{bottom:376.992000pt;} -.y1114{bottom:377.037333pt;} -.y822{bottom:377.128000pt;} -.y151e{bottom:377.214667pt;} -.y97b{bottom:377.510667pt;} -.ybd0{bottom:377.548000pt;} -.ybd2{bottom:377.681333pt;} -.y931{bottom:377.708000pt;} -.yfe{bottom:377.808000pt;} -.y162{bottom:378.320000pt;} -.yc4c{bottom:378.493333pt;} -.y29e{bottom:378.578667pt;} -.y9f5{bottom:378.681333pt;} -.yea3{bottom:378.738667pt;} -.y12bb{bottom:378.872000pt;} -.y1203{bottom:379.141333pt;} -.yfc4{bottom:379.172000pt;} -.y89e{bottom:379.184000pt;} -.yabd{bottom:379.204000pt;} -.y12c{bottom:379.558600pt;} -.y751{bottom:379.612000pt;} -.y1578{bottom:379.761333pt;} -.y14d6{bottom:379.997333pt;} -.yd53{bottom:380.005333pt;} -.y3b4{bottom:380.081333pt;} -.y7c2{bottom:380.470667pt;} +.y36c{bottom:373.636000pt;} +.y759{bottom:373.665333pt;} +.y49b{bottom:373.672000pt;} +.y297{bottom:373.758667pt;} +.y1582{bottom:373.778667pt;} +.y12dd{bottom:373.808000pt;} +.y1001{bottom:373.869333pt;} +.y2e3{bottom:374.010667pt;} +.y11e4{bottom:374.809333pt;} +.y10fd{bottom:374.857333pt;} +.y1ad{bottom:374.917333pt;} +.yab7{bottom:374.973333pt;} +.y1cb{bottom:375.000000pt;} +.y9f7{bottom:375.110667pt;} +.yd48{bottom:375.133333pt;} +.y241{bottom:375.160000pt;} +.y1304{bottom:375.182667pt;} +.y6c6{bottom:375.389333pt;} +.y10a6{bottom:375.452000pt;} +.y49a{bottom:375.664000pt;} +.y549{bottom:375.697333pt;} +.y1404{bottom:375.757333pt;} +.yd83{bottom:375.922667pt;} +.y599{bottom:375.956000pt;} +.ydf7{bottom:376.154667pt;} +.yae0{bottom:376.172000pt;} +.y1329{bottom:376.304000pt;} +.y139a{bottom:376.325333pt;} +.yc17{bottom:376.500000pt;} +.y8df{bottom:376.513333pt;} +.y6f0{bottom:376.550667pt;} +.y71a{bottom:376.633333pt;} +.ya18{bottom:376.689333pt;} +.y856{bottom:376.698667pt;} +.ye82{bottom:376.841333pt;} +.y1ca{bottom:376.992000pt;} +.y10ca{bottom:377.037333pt;} +.yd5{bottom:377.100000pt;} +.y803{bottom:377.128000pt;} +.y14c2{bottom:377.214667pt;} +.y954{bottom:377.510667pt;} +.yb9c{bottom:377.548000pt;} +.yb9e{bottom:377.681333pt;} +.y90b{bottom:377.708000pt;} +.y101{bottom:377.808000pt;} +.y160{bottom:378.320000pt;} +.yc16{bottom:378.493333pt;} +.y298{bottom:378.578667pt;} +.y9cb{bottom:378.681333pt;} +.ye64{bottom:378.738667pt;} +.y126b{bottom:378.872000pt;} +.y11b4{bottom:379.141333pt;} +.yf81{bottom:379.172000pt;} +.y87c{bottom:379.184000pt;} +.ya90{bottom:379.204000pt;} +.y12d{bottom:379.558600pt;} +.y736{bottom:379.612000pt;} +.y151b{bottom:379.761333pt;} +.y147b{bottom:379.997333pt;} +.yd1a{bottom:380.005333pt;} +.y3ab{bottom:380.081333pt;} +.y7a6{bottom:380.470667pt;} .y32{bottom:380.622667pt;} -.y12de{bottom:380.666667pt;} -.y434{bottom:381.314667pt;} -.yf97{bottom:381.421333pt;} -.y1004{bottom:381.438667pt;} +.y429{bottom:381.314667pt;} +.yf54{bottom:381.421333pt;} +.yfbe{bottom:381.438667pt;} .y77{bottom:381.604000pt;} -.y1544{bottom:381.669333pt;} -.y12df{bottom:381.694667pt;} -.y9d3{bottom:381.821333pt;} -.y11ae{bottom:382.000000pt;} -.y151f{bottom:382.034667pt;} -.y13b2{bottom:382.092000pt;} -.y8c4{bottom:382.138667pt;} -.yce5{bottom:382.652000pt;} -.yc80{bottom:382.688000pt;} -.y11cb{bottom:382.821333pt;} -.y116d{bottom:383.034667pt;} -.y10a5{bottom:383.248000pt;} -.ye0f{bottom:383.257333pt;} -.y14ab{bottom:383.633333pt;} -.y14fb{bottom:384.394667pt;} -.ye80{bottom:384.453333pt;} -.y52e{bottom:384.612000pt;} -.y6a6{bottom:384.786667pt;} -.y1576{bottom:384.874667pt;} -.yf41{bottom:384.912000pt;} -.y15de{bottom:384.937333pt;} -.y119e{bottom:384.962667pt;} -.y678{bottom:385.036000pt;} -.y956{bottom:385.069333pt;} -.y1443{bottom:385.492000pt;} -.y852{bottom:385.674667pt;} -.yb82{bottom:385.684000pt;} -.y1480{bottom:385.766667pt;} -.y13b1{bottom:385.842667pt;} -.y1275{bottom:386.006667pt;} -.yc30{bottom:386.008000pt;} -.y371{bottom:386.033333pt;} -.y373{bottom:386.278667pt;} -.y1064{bottom:386.952000pt;} -.y10cb{bottom:386.956000pt;} -.ybad{bottom:387.248000pt;} -.yde7{bottom:387.500000pt;} -.yeee{bottom:387.822667pt;} -.ycb3{bottom:387.872000pt;} -.yc2f{bottom:388.001333pt;} -.y3b3{bottom:388.050667pt;} -.y615{bottom:388.233333pt;} -.yd29{bottom:388.286667pt;} -.ye5c{bottom:388.802667pt;} -.yd05{bottom:388.972000pt;} -.yb38{bottom:389.016000pt;} -.y1084{bottom:389.118667pt;} -.yda9{bottom:389.133333pt;} -.y8e1{bottom:389.225333pt;} -.y5da{bottom:389.226667pt;} +.y14e7{bottom:381.669333pt;} +.y128d{bottom:381.694667pt;} +.y9aa{bottom:381.821333pt;} +.y14c3{bottom:382.034667pt;} +.y135b{bottom:382.092000pt;} +.y8a1{bottom:382.138667pt;} +.ycac{bottom:382.652000pt;} +.yc48{bottom:382.688000pt;} +.y117d{bottom:382.821333pt;} +.y1121{bottom:383.034667pt;} +.y105c{bottom:383.248000pt;} +.ydd3{bottom:383.257333pt;} +.y1450{bottom:383.633333pt;} +.y149f{bottom:384.394667pt;} +.ye41{bottom:384.453333pt;} +.y51e{bottom:384.612000pt;} +.y690{bottom:384.786667pt;} +.y1519{bottom:384.874667pt;} +.yeff{bottom:384.912000pt;} +.y1580{bottom:384.937333pt;} +.y1151{bottom:384.962667pt;} +.y663{bottom:385.036000pt;} +.y92f{bottom:385.069333pt;} +.y13ea{bottom:385.492000pt;} +.y831{bottom:385.674667pt;} +.yb50{bottom:385.684000pt;} +.y1426{bottom:385.766667pt;} +.y135a{bottom:385.842667pt;} +.y1225{bottom:386.006667pt;} +.ybfb{bottom:386.008000pt;} +.y369{bottom:386.033333pt;} +.y36b{bottom:386.278667pt;} +.y101c{bottom:386.952000pt;} +.y1082{bottom:386.956000pt;} +.yb7a{bottom:387.248000pt;} +.ydab{bottom:387.500000pt;} +.yb0{bottom:387.582667pt;} +.yeae{bottom:387.822667pt;} +.yc7b{bottom:387.872000pt;} +.ybfa{bottom:388.001333pt;} +.y3aa{bottom:388.050667pt;} +.y602{bottom:388.233333pt;} +.ycf0{bottom:388.286667pt;} +.ye1e{bottom:388.802667pt;} +.yccc{bottom:388.972000pt;} +.yb08{bottom:389.016000pt;} +.y103c{bottom:389.118667pt;} +.yd6f{bottom:389.133333pt;} +.y8bd{bottom:389.225333pt;} +.y5c8{bottom:389.226667pt;} .y47{bottom:389.574667pt;} -.y36f{bottom:389.576000pt;} -.y772{bottom:389.605333pt;} -.y821{bottom:389.746667pt;} -.y1330{bottom:389.748000pt;} -.y1048{bottom:389.809333pt;} -.y13c5{bottom:389.974667pt;} -.y914{bottom:390.000000pt;} -.y1577{bottom:390.388000pt;} -.y1027{bottom:390.701333pt;} -.y1232{bottom:390.749333pt;} -.y1146{bottom:390.798667pt;} -.y1af{bottom:390.857333pt;} -.yae4{bottom:390.913333pt;} -.ya20{bottom:391.050667pt;} -.yd81{bottom:391.073333pt;} -.y1358{bottom:391.124000pt;} -.y6dc{bottom:391.329333pt;} -.y1416{bottom:391.377333pt;} -.y10ef{bottom:391.392000pt;} -.y4a7{bottom:391.604000pt;} -.y66e{bottom:391.704171pt;} -.ydbd{bottom:391.862667pt;} -.y5aa{bottom:391.896000pt;} -.y137e{bottom:392.244000pt;} -.y3fa{bottom:392.296000pt;} -.y9a8{bottom:392.298667pt;} -.y4ff{bottom:392.364000pt;} -.yc4b{bottom:392.441333pt;} -.y903{bottom:392.453333pt;} -.y706{bottom:392.490667pt;} -.y731{bottom:392.573333pt;} -.y877{bottom:392.638667pt;} -.yec0{bottom:392.782667pt;} -.y1113{bottom:392.978667pt;} -.yfe0{bottom:392.994667pt;} -.y212{bottom:393.010667pt;} -.y151d{bottom:393.154667pt;} -.ya42{bottom:393.161333pt;} -.y837{bottom:393.190667pt;} -.y97a{bottom:393.450667pt;} -.y820{bottom:393.497333pt;} -.ybd1{bottom:393.621333pt;} -.y930{bottom:393.649333pt;} -.y12a{bottom:393.989000pt;} -.yd4{bottom:394.024000pt;} -.y161{bottom:394.261333pt;} -.y372{bottom:394.396000pt;} -.y79b{bottom:394.420000pt;} -.yc4a{bottom:394.433333pt;} -.y9f4{bottom:394.621333pt;} -.yea2{bottom:394.678667pt;} -.y13b0{bottom:394.765333pt;} -.y12ba{bottom:394.813333pt;} -.y1202{bottom:395.081333pt;} -.y370{bottom:395.258667pt;} -.y15db{bottom:395.365333pt;} -.y750{bottom:395.552000pt;} -.y15dd{bottom:395.564000pt;} -.y14d5{bottom:395.937333pt;} -.yd52{bottom:395.946667pt;} -.y3b1{bottom:396.021333pt;} +.y367{bottom:389.576000pt;} +.y758{bottom:389.605333pt;} +.y802{bottom:389.746667pt;} +.y12dc{bottom:389.748000pt;} +.y1000{bottom:389.809333pt;} +.y136d{bottom:389.974667pt;} +.y151a{bottom:390.388000pt;} +.yfe0{bottom:390.701333pt;} +.y11e3{bottom:390.749333pt;} +.y10fc{bottom:390.798667pt;} +.y1ac{bottom:390.857333pt;} +.yab6{bottom:390.913333pt;} +.y9f6{bottom:391.050667pt;} +.yd47{bottom:391.073333pt;} +.y1303{bottom:391.124000pt;} +.y6c5{bottom:391.329333pt;} +.y13bd{bottom:391.377333pt;} +.y10a5{bottom:391.392000pt;} +.y499{bottom:391.604000pt;} +.y65a{bottom:391.704171pt;} +.yd82{bottom:391.862667pt;} +.y598{bottom:391.896000pt;} +.y1328{bottom:392.244000pt;} +.y3f0{bottom:392.296000pt;} +.y980{bottom:392.298667pt;} +.y4f0{bottom:392.364000pt;} +.yc15{bottom:392.441333pt;} +.y8de{bottom:392.453333pt;} +.y6ef{bottom:392.490667pt;} +.y719{bottom:392.573333pt;} +.y855{bottom:392.638667pt;} +.ye81{bottom:392.782667pt;} +.y10c9{bottom:392.978667pt;} +.yf9b{bottom:392.994667pt;} +.y20c{bottom:393.010667pt;} +.yd4{bottom:393.040000pt;} +.y14c1{bottom:393.154667pt;} +.ya17{bottom:393.161333pt;} +.y816{bottom:393.190667pt;} +.y953{bottom:393.450667pt;} +.y801{bottom:393.497333pt;} +.yb9d{bottom:393.621333pt;} +.y90a{bottom:393.649333pt;} +.y12b{bottom:393.989000pt;} +.y15f{bottom:394.261333pt;} +.y36a{bottom:394.396000pt;} +.y780{bottom:394.420000pt;} +.yc14{bottom:394.433333pt;} +.y9ca{bottom:394.621333pt;} +.ye63{bottom:394.678667pt;} +.y1359{bottom:394.765333pt;} +.y126a{bottom:394.813333pt;} +.y11b3{bottom:395.081333pt;} +.y368{bottom:395.258667pt;} +.y157d{bottom:395.365333pt;} +.y735{bottom:395.552000pt;} +.y157f{bottom:395.564000pt;} +.y147a{bottom:395.937333pt;} +.yd19{bottom:395.946667pt;} +.y3a8{bottom:396.021333pt;} .y31{bottom:396.562667pt;} -.y1159{bottom:396.706667pt;} -.yfdf{bottom:396.745333pt;} -.yb36{bottom:396.853333pt;} -.y433{bottom:397.254667pt;} -.yf6e{bottom:397.260000pt;} -.yf96{bottom:397.361333pt;} -.y1003{bottom:397.378667pt;} +.y110e{bottom:396.706667pt;} +.yf9a{bottom:396.745333pt;} +.yb06{bottom:396.853333pt;} +.y428{bottom:397.254667pt;} +.yf2c{bottom:397.260000pt;} +.yf53{bottom:397.361333pt;} +.yfbd{bottom:397.378667pt;} .y76{bottom:397.544000pt;} -.y1543{bottom:397.609333pt;} -.y9d2{bottom:397.761333pt;} -.y8c3{bottom:398.078667pt;} -.yce4{bottom:398.593333pt;} -.y116c{bottom:398.974667pt;} -.ye0e{bottom:399.197333pt;} -.y14aa{bottom:399.574667pt;} -.ye7f{bottom:400.394667pt;} -.y29b{bottom:400.512000pt;} -.y52c{bottom:400.552000pt;} -.yb0e{bottom:400.692000pt;} -.yf40{bottom:400.852000pt;} -.y14fa{bottom:400.866667pt;} -.y119d{bottom:400.902667pt;} -.y677{bottom:400.976000pt;} -.y1575{bottom:401.545333pt;} -.y1ce{bottom:401.566667pt;} -.y851{bottom:401.614667pt;} -.yb81{bottom:401.624000pt;} -.y147f{bottom:401.706667pt;} -.y1274{bottom:401.946667pt;} -.y36e{bottom:401.973333pt;} -.y7ff{bottom:402.000000pt;} -.y1063{bottom:402.892000pt;} -.y10ca{bottom:402.896000pt;} -.y29c{bottom:403.168000pt;} -.ybac{bottom:403.188000pt;} -.yde5{bottom:403.440000pt;} -.yb0{bottom:403.522667pt;} -.y1cc{bottom:403.560000pt;} -.yeed{bottom:403.762667pt;} -.ycb2{bottom:403.812000pt;} -.yc2e{bottom:403.941333pt;} -.y614{bottom:404.173333pt;} -.yb5d{bottom:404.189333pt;} -.yd28{bottom:404.226667pt;} -.ye5b{bottom:404.742667pt;} -.yd04{bottom:404.912000pt;} -.yb37{bottom:404.957333pt;} -.y1083{bottom:405.058667pt;} -.yda8{bottom:405.073333pt;} -.yc6b{bottom:405.124000pt;} -.y8e0{bottom:405.165333pt;} -.y5d9{bottom:405.166667pt;} -.yfcd{bottom:405.333333pt;} -.y52d{bottom:405.372000pt;} +.y14e6{bottom:397.609333pt;} +.y9a9{bottom:397.761333pt;} +.y8a0{bottom:398.078667pt;} +.ycab{bottom:398.593333pt;} +.y1120{bottom:398.974667pt;} +.ydd2{bottom:399.197333pt;} +.y144f{bottom:399.574667pt;} +.ye40{bottom:400.394667pt;} +.y295{bottom:400.512000pt;} +.y51c{bottom:400.552000pt;} +.yadf{bottom:400.692000pt;} +.yefe{bottom:400.852000pt;} +.y149e{bottom:400.866667pt;} +.y1150{bottom:400.902667pt;} +.y662{bottom:400.976000pt;} +.y1518{bottom:401.545333pt;} +.y1c9{bottom:401.566667pt;} +.y830{bottom:401.614667pt;} +.yb4f{bottom:401.624000pt;} +.y1425{bottom:401.706667pt;} +.y1224{bottom:401.946667pt;} +.y366{bottom:401.973333pt;} +.y101b{bottom:402.892000pt;} +.y1081{bottom:402.896000pt;} +.y296{bottom:403.168000pt;} +.yb79{bottom:403.188000pt;} +.yda9{bottom:403.440000pt;} +.yaf{bottom:403.522667pt;} +.y1c7{bottom:403.560000pt;} +.yead{bottom:403.762667pt;} +.yc7a{bottom:403.812000pt;} +.ybf9{bottom:403.941333pt;} +.y601{bottom:404.173333pt;} +.yb2c{bottom:404.189333pt;} +.ycef{bottom:404.226667pt;} +.ye1d{bottom:404.742667pt;} +.yccb{bottom:404.912000pt;} +.yb07{bottom:404.957333pt;} +.y103b{bottom:405.058667pt;} +.yd6e{bottom:405.073333pt;} +.yc34{bottom:405.124000pt;} +.y8bc{bottom:405.165333pt;} +.y5c7{bottom:405.166667pt;} +.y51d{bottom:405.372000pt;} .y46{bottom:405.514667pt;} -.y36c{bottom:405.516000pt;} -.y771{bottom:405.545333pt;} -.y13f2{bottom:405.549333pt;} -.y132f{bottom:405.688000pt;} -.y1047{bottom:405.749333pt;} -.ya8f{bottom:405.950667pt;} -.y15dc{bottom:406.190667pt;} -.y66d{bottom:406.552172pt;} -.y1026{bottom:406.642667pt;} -.y1573{bottom:406.660000pt;} -.y1231{bottom:406.689333pt;} -.y1145{bottom:406.738667pt;} -.yae3{bottom:406.853333pt;} -.yfd{bottom:406.902667pt;} -.y246{bottom:406.949333pt;} -.ya1e{bottom:406.990667pt;} -.yd80{bottom:407.013333pt;} -.y1357{bottom:407.064000pt;} -.yc6a{bottom:407.117333pt;} -.y6db{bottom:407.269333pt;} -.y10ee{bottom:407.333333pt;} -.y13af{bottom:407.384000pt;} -.y4a6{bottom:407.544000pt;} -.ydbb{bottom:407.804000pt;} -.y5a9{bottom:407.837333pt;} -.y137d{bottom:408.184000pt;} -.y9a7{bottom:408.238667pt;} -.yde6{bottom:408.260000pt;} -.y4fe{bottom:408.304000pt;} -.y1cd{bottom:408.380000pt;} -.y902{bottom:408.394667pt;} -.y705{bottom:408.430667pt;} -.y876{bottom:408.578667pt;} -.yebf{bottom:408.722667pt;} -.y128{bottom:408.780160pt;} -.y1112{bottom:408.918667pt;} -.y836{bottom:409.130667pt;} -.y979{bottom:409.390667pt;} -.y955{bottom:409.589333pt;} -.ya41{bottom:409.633333pt;} -.y7c1{bottom:409.694667pt;} -.yd3{bottom:409.964000pt;} -.y1186{bottom:409.989333pt;} -.y1442{bottom:410.010667pt;} -.ybcf{bottom:410.093333pt;} -.y160{bottom:410.201333pt;} -.y79a{bottom:410.360000pt;} -.yc49{bottom:410.373333pt;} -.y559{bottom:410.389333pt;} -.y9f3{bottom:410.561333pt;} -.y81f{bottom:410.589333pt;} -.yea1{bottom:410.620000pt;} -.y12b8{bottom:410.753333pt;} -.y1201{bottom:411.021333pt;} -.y13ae{bottom:411.134667pt;} -.y36d{bottom:411.198667pt;} -.y12dd{bottom:411.353333pt;} -.y74f{bottom:411.492000pt;} -.ya1f{bottom:411.812000pt;} -.y14d4{bottom:411.877333pt;} -.yd51{bottom:411.886667pt;} -.y3b2{bottom:411.961333pt;} -.y1574{bottom:412.173333pt;} +.y364{bottom:405.516000pt;} +.y757{bottom:405.545333pt;} +.y1399{bottom:405.549333pt;} +.y12db{bottom:405.688000pt;} +.yfff{bottom:405.749333pt;} +.ya62{bottom:405.950667pt;} +.y157e{bottom:406.190667pt;} +.y659{bottom:406.552172pt;} +.yfdf{bottom:406.642667pt;} +.y1516{bottom:406.660000pt;} +.y11e2{bottom:406.689333pt;} +.y10fb{bottom:406.738667pt;} +.yab5{bottom:406.853333pt;} +.y100{bottom:406.902667pt;} +.y240{bottom:406.949333pt;} +.y9f4{bottom:406.990667pt;} +.yd46{bottom:407.013333pt;} +.y1302{bottom:407.064000pt;} +.yc33{bottom:407.117333pt;} +.y6c4{bottom:407.269333pt;} +.y10a4{bottom:407.333333pt;} +.y1358{bottom:407.384000pt;} +.y498{bottom:407.544000pt;} +.yd80{bottom:407.804000pt;} +.y597{bottom:407.837333pt;} +.y1327{bottom:408.184000pt;} +.y97f{bottom:408.238667pt;} +.ydaa{bottom:408.260000pt;} +.y4ef{bottom:408.304000pt;} +.y1c8{bottom:408.380000pt;} +.y8dd{bottom:408.394667pt;} +.y6ee{bottom:408.430667pt;} +.y854{bottom:408.578667pt;} +.ye80{bottom:408.722667pt;} +.y129{bottom:408.780160pt;} +.y10c8{bottom:408.918667pt;} +.yd3{bottom:408.980000pt;} +.y815{bottom:409.130667pt;} +.y952{bottom:409.390667pt;} +.y92e{bottom:409.589333pt;} +.ya16{bottom:409.633333pt;} +.y7a5{bottom:409.694667pt;} +.y113a{bottom:409.989333pt;} +.y13e9{bottom:410.010667pt;} +.yb9b{bottom:410.093333pt;} +.y15e{bottom:410.201333pt;} +.y77f{bottom:410.360000pt;} +.yc13{bottom:410.373333pt;} +.y548{bottom:410.389333pt;} +.y9c9{bottom:410.561333pt;} +.y800{bottom:410.589333pt;} +.ye62{bottom:410.620000pt;} +.y1268{bottom:410.753333pt;} +.y11b2{bottom:411.021333pt;} +.y1357{bottom:411.134667pt;} +.y365{bottom:411.198667pt;} +.y128c{bottom:411.353333pt;} +.y734{bottom:411.492000pt;} +.y9f5{bottom:411.812000pt;} +.y1479{bottom:411.877333pt;} +.yd18{bottom:411.886667pt;} +.y3a9{bottom:411.961333pt;} +.y1517{bottom:412.173333pt;} .y30{bottom:412.504000pt;} -.ydbc{bottom:412.624000pt;} -.y1158{bottom:412.646667pt;} -.y145c{bottom:412.673333pt;} -.y29a{bottom:413.065333pt;} -.ye33{bottom:413.070667pt;} -.y432{bottom:413.194667pt;} -.yf6d{bottom:413.200000pt;} -.yf95{bottom:413.301333pt;} -.y1002{bottom:413.320000pt;} +.yd81{bottom:412.624000pt;} +.y110d{bottom:412.646667pt;} +.y1403{bottom:412.673333pt;} +.y294{bottom:413.065333pt;} +.ydf6{bottom:413.070667pt;} +.y427{bottom:413.194667pt;} +.yf2b{bottom:413.200000pt;} +.yf52{bottom:413.301333pt;} +.yfbc{bottom:413.320000pt;} .y75{bottom:413.485333pt;} -.y1542{bottom:413.549333pt;} -.y9d1{bottom:413.701333pt;} -.y1ae{bottom:413.897333pt;} -.y6a5{bottom:414.009333pt;} -.y8c2{bottom:414.018667pt;} -.yfc3{bottom:414.377333pt;} -.yce3{bottom:414.533333pt;} -.y211{bottom:414.889333pt;} -.ye0d{bottom:415.137333pt;} -.y14a9{bottom:415.514667pt;} -.y12b9{bottom:415.573333pt;} -.yc7f{bottom:416.029333pt;} -.ye7e{bottom:416.334667pt;} -.yf3f{bottom:416.792000pt;} -.y119c{bottom:416.842667pt;} -.y676{bottom:416.917333pt;} -.yfde{bottom:417.157333pt;} -.y14f9{bottom:417.337333pt;} -.y15d9{bottom:417.349333pt;} -.y15da{bottom:417.548000pt;} -.y850{bottom:417.554667pt;} -.yb80{bottom:417.564000pt;} -.y147e{bottom:417.646667pt;} -.y151c{bottom:417.673333pt;} -.y1273{bottom:417.888000pt;} -.yc2d{bottom:417.889333pt;} -.y89d{bottom:418.210667pt;} -.y297{bottom:418.644000pt;} -.y20f{bottom:418.652000pt;} -.y1062{bottom:418.833333pt;} -.ybab{bottom:419.129333pt;} -.y299{bottom:419.366667pt;} -.yde4{bottom:419.380000pt;} -.yaf{bottom:419.462667pt;} -.yeec{bottom:419.702667pt;} -.ycb1{bottom:419.752000pt;} -.yc2c{bottom:419.881333pt;} -.y138d{bottom:420.000000pt;} -.y613{bottom:420.113333pt;} -.yb5c{bottom:420.129333pt;} -.yd27{bottom:420.168000pt;} -.ye5a{bottom:420.684000pt;} -.yd03{bottom:420.853333pt;} -.y1081{bottom:420.998667pt;} -.yda7{bottom:421.013333pt;} -.y8df{bottom:421.105333pt;} -.y5d8{bottom:421.106667pt;} -.yb35{bottom:421.428000pt;} +.y14e5{bottom:413.549333pt;} +.y9a8{bottom:413.701333pt;} +.y1ab{bottom:413.897333pt;} +.y68f{bottom:414.009333pt;} +.y89f{bottom:414.018667pt;} +.yf80{bottom:414.377333pt;} +.ycaa{bottom:414.533333pt;} +.y20b{bottom:414.889333pt;} +.ydd1{bottom:415.137333pt;} +.y144e{bottom:415.514667pt;} +.y1269{bottom:415.573333pt;} +.yc47{bottom:416.029333pt;} +.ye3f{bottom:416.334667pt;} +.yefd{bottom:416.792000pt;} +.y114f{bottom:416.842667pt;} +.y661{bottom:416.917333pt;} +.yf99{bottom:417.157333pt;} +.y149d{bottom:417.337333pt;} +.y157b{bottom:417.349333pt;} +.y157c{bottom:417.548000pt;} +.y82f{bottom:417.554667pt;} +.yb4e{bottom:417.564000pt;} +.y1424{bottom:417.646667pt;} +.y14c0{bottom:417.673333pt;} +.y1223{bottom:417.888000pt;} +.ybf8{bottom:417.889333pt;} +.y87b{bottom:418.210667pt;} +.y291{bottom:418.644000pt;} +.y209{bottom:418.652000pt;} +.y101a{bottom:418.833333pt;} +.yb78{bottom:419.129333pt;} +.y293{bottom:419.366667pt;} +.yda8{bottom:419.380000pt;} +.yae{bottom:419.462667pt;} +.yeac{bottom:419.702667pt;} +.yc79{bottom:419.752000pt;} +.ybf7{bottom:419.881333pt;} +.y600{bottom:420.113333pt;} +.yb2b{bottom:420.129333pt;} +.ycee{bottom:420.168000pt;} +.ye1c{bottom:420.684000pt;} +.ycca{bottom:420.853333pt;} +.y1039{bottom:420.998667pt;} +.yd6d{bottom:421.013333pt;} +.y8bb{bottom:421.105333pt;} +.y5c6{bottom:421.106667pt;} +.yb05{bottom:421.428000pt;} .y45{bottom:421.454667pt;} -.y36b{bottom:421.456000pt;} -.y770{bottom:421.485333pt;} -.y13f1{bottom:421.489333pt;} -.y1046{bottom:421.689333pt;} -.ya8e{bottom:421.890667pt;} -.y1025{bottom:422.582667pt;} -.y295{bottom:422.650667pt;} -.y1144{bottom:422.678667pt;} -.yae2{bottom:422.793333pt;} -.y245{bottom:422.889333pt;} -.ya1c{bottom:422.932000pt;} -.yabc{bottom:422.938667pt;} -.y1356{bottom:423.004000pt;} -.yc69{bottom:423.057333pt;} -.y6da{bottom:423.209333pt;} -.y126{bottom:423.210560pt;} -.y10ed{bottom:423.273333pt;} -.y1572{bottom:423.330667pt;} -.y210{bottom:423.472000pt;} -.y4a5{bottom:423.484000pt;} -.y116b{bottom:423.493333pt;} -.y137c{bottom:424.125333pt;} -.y9a6{bottom:424.178667pt;} -.y4fd{bottom:424.245333pt;} -.y901{bottom:424.334667pt;} -.y704{bottom:424.370667pt;} -.yebe{bottom:424.662667pt;} -.y1111{bottom:424.858667pt;} -.y7c0{bottom:425.634667pt;} -.y1082{bottom:425.818667pt;} -.ybcc{bottom:425.900000pt;} -.yd2{bottom:425.904000pt;} -.y1185{bottom:425.929333pt;} -.ybce{bottom:426.033333pt;} -.ya40{bottom:426.104000pt;} -.y15f{bottom:426.141333pt;} -.y799{bottom:426.300000pt;} -.yc48{bottom:426.313333pt;} -.y558{bottom:426.329333pt;} -.y9f2{bottom:426.501333pt;} -.yea0{bottom:426.560000pt;} -.y12b7{bottom:426.693333pt;} -.y3f8{bottom:426.824000pt;} -.y13c4{bottom:427.160000pt;} -.y12dc{bottom:427.293333pt;} -.y74e{bottom:427.432000pt;} -.y826{bottom:427.433333pt;} -.ya1d{bottom:427.752000pt;} -.y14d3{bottom:427.817333pt;} -.yd50{bottom:427.826667pt;} -.y298{bottom:428.136000pt;} -.y296{bottom:428.333333pt;} +.y363{bottom:421.456000pt;} +.y756{bottom:421.485333pt;} +.y1398{bottom:421.489333pt;} +.yffe{bottom:421.689333pt;} +.ya61{bottom:421.890667pt;} +.yfde{bottom:422.582667pt;} +.y28f{bottom:422.650667pt;} +.y10fa{bottom:422.678667pt;} +.yab4{bottom:422.793333pt;} +.y23f{bottom:422.889333pt;} +.y9f2{bottom:422.932000pt;} +.ya8f{bottom:422.938667pt;} +.y1301{bottom:423.004000pt;} +.yc32{bottom:423.057333pt;} +.y6c3{bottom:423.209333pt;} +.y127{bottom:423.210560pt;} +.y10a3{bottom:423.273333pt;} +.y1515{bottom:423.330667pt;} +.y20a{bottom:423.472000pt;} +.y497{bottom:423.484000pt;} +.y111f{bottom:423.493333pt;} +.y1326{bottom:424.125333pt;} +.y97e{bottom:424.178667pt;} +.y4ee{bottom:424.245333pt;} +.y8dc{bottom:424.334667pt;} +.y6ed{bottom:424.370667pt;} +.ye7f{bottom:424.662667pt;} +.y10c7{bottom:424.858667pt;} +.y7a4{bottom:425.634667pt;} +.y103a{bottom:425.818667pt;} +.yb98{bottom:425.900000pt;} +.y1139{bottom:425.929333pt;} +.yb9a{bottom:426.033333pt;} +.ya15{bottom:426.104000pt;} +.y15d{bottom:426.141333pt;} +.y77e{bottom:426.300000pt;} +.yc12{bottom:426.313333pt;} +.y547{bottom:426.329333pt;} +.y9c8{bottom:426.501333pt;} +.ye61{bottom:426.560000pt;} +.y1267{bottom:426.693333pt;} +.y3ee{bottom:426.824000pt;} +.y136c{bottom:427.160000pt;} +.y128b{bottom:427.293333pt;} +.y733{bottom:427.432000pt;} +.y806{bottom:427.433333pt;} +.y9f3{bottom:427.752000pt;} +.y1478{bottom:427.817333pt;} +.yd17{bottom:427.826667pt;} +.y292{bottom:428.136000pt;} +.y290{bottom:428.333333pt;} .y2f{bottom:428.444000pt;} -.y1570{bottom:428.445333pt;} -.y1415{bottom:428.561333pt;} -.y1157{bottom:428.586667pt;} -.y145b{bottom:428.613333pt;} -.y15d7{bottom:428.706667pt;} -.y15d8{bottom:428.905333pt;} -.ye32{bottom:429.012000pt;} -.y431{bottom:429.134667pt;} -.yf6c{bottom:429.140000pt;} -.yf94{bottom:429.241333pt;} -.y1001{bottom:429.260000pt;} -.yb33{bottom:429.265333pt;} +.y1513{bottom:428.445333pt;} +.y13bc{bottom:428.561333pt;} +.y110c{bottom:428.586667pt;} +.y1402{bottom:428.613333pt;} +.y1579{bottom:428.706667pt;} +.y157a{bottom:428.905333pt;} +.ydf5{bottom:429.012000pt;} +.y426{bottom:429.134667pt;} +.yf2a{bottom:429.140000pt;} +.yf51{bottom:429.241333pt;} +.yfbb{bottom:429.260000pt;} +.yb03{bottom:429.265333pt;} .y74{bottom:429.425333pt;} -.y132e{bottom:429.466667pt;} -.y1541{bottom:429.489333pt;} -.y9d0{bottom:429.641333pt;} -.y8c1{bottom:429.960000pt;} -.y1cb{bottom:430.126667pt;} -.yfc2{bottom:430.317333pt;} -.yce2{bottom:430.473333pt;} -.ye0c{bottom:431.078667pt;} -.y1ad{bottom:431.165333pt;} -.y14a8{bottom:431.454667pt;} -.y13ad{bottom:431.546667pt;} -.y3f9{bottom:431.644000pt;} -.y10a4{bottom:431.916000pt;} -.yf3e{bottom:432.732000pt;} -.y119b{bottom:432.782667pt;} -.y675{bottom:432.857333pt;} -.yfdd{bottom:433.097333pt;} -.y52b{bottom:433.344000pt;} -.y84f{bottom:433.494667pt;} -.y147d{bottom:433.586667pt;} -.y14f8{bottom:433.809333pt;} -.y1272{bottom:433.828000pt;} -.y730{bottom:433.900000pt;} -.y1571{bottom:433.957333pt;} -.y1061{bottom:434.773333pt;} -.ybaa{bottom:435.069333pt;} -.yde3{bottom:435.320000pt;} -.yae{bottom:435.402667pt;} -.y1200{bottom:435.541333pt;} -.yeeb{bottom:435.642667pt;} -.ycb0{bottom:435.692000pt;} -.y835{bottom:435.697333pt;} -.y1230{bottom:435.784000pt;} -.y612{bottom:436.053333pt;} -.yb5b{bottom:436.069333pt;} -.yd26{bottom:436.108000pt;} -.ye59{bottom:436.624000pt;} -.y107f{bottom:436.938667pt;} -.yda6{bottom:436.953333pt;} -.y5d7{bottom:437.048000pt;} -.yb34{bottom:437.368000pt;} +.y12da{bottom:429.466667pt;} +.y14e4{bottom:429.489333pt;} +.y9a7{bottom:429.641333pt;} +.y89e{bottom:429.960000pt;} +.y1c6{bottom:430.126667pt;} +.yf7f{bottom:430.317333pt;} +.yca9{bottom:430.473333pt;} +.ydd0{bottom:431.078667pt;} +.y1aa{bottom:431.165333pt;} +.y144d{bottom:431.454667pt;} +.y1356{bottom:431.546667pt;} +.y3ef{bottom:431.644000pt;} +.y105b{bottom:431.916000pt;} +.yefc{bottom:432.732000pt;} +.y114e{bottom:432.782667pt;} +.y660{bottom:432.857333pt;} +.yf98{bottom:433.097333pt;} +.y51b{bottom:433.344000pt;} +.y82e{bottom:433.494667pt;} +.y1423{bottom:433.586667pt;} +.y149c{bottom:433.809333pt;} +.y1222{bottom:433.828000pt;} +.y718{bottom:433.900000pt;} +.y1514{bottom:433.957333pt;} +.y1019{bottom:434.773333pt;} +.yd2{bottom:434.913333pt;} +.yb77{bottom:435.069333pt;} +.yda7{bottom:435.320000pt;} +.yad{bottom:435.402667pt;} +.y11b1{bottom:435.541333pt;} +.yeab{bottom:435.642667pt;} +.yc78{bottom:435.692000pt;} +.y814{bottom:435.697333pt;} +.y11e1{bottom:435.784000pt;} +.y5ff{bottom:436.053333pt;} +.yb2a{bottom:436.069333pt;} +.yced{bottom:436.108000pt;} +.ye1b{bottom:436.624000pt;} +.y1037{bottom:436.938667pt;} +.yd6c{bottom:436.953333pt;} +.y5c5{bottom:437.048000pt;} +.yb04{bottom:437.368000pt;} .y44{bottom:437.394667pt;} -.y76f{bottom:437.426667pt;} -.y1045{bottom:437.630667pt;} -.ya8d{bottom:437.830667pt;} -.yb0d{bottom:437.876000pt;} -.y124{bottom:438.001720pt;} -.y92f{bottom:438.281333pt;} -.y1024{bottom:438.522667pt;} -.y1143{bottom:438.618667pt;} -.yae1{bottom:438.733333pt;} -.ya1a{bottom:438.872000pt;} -.yabb{bottom:438.878667pt;} -.y1355{bottom:438.944000pt;} -.yc68{bottom:438.997333pt;} -.y6d9{bottom:439.150667pt;} -.y10ec{bottom:439.213333pt;} -.yc73{bottom:439.333333pt;} -.y4a4{bottom:439.425333pt;} -.y137b{bottom:440.065333pt;} -.y9a5{bottom:440.120000pt;} -.y4fb{bottom:440.185333pt;} -.yc47{bottom:440.261333pt;} -.y900{bottom:440.274667pt;} -.y703{bottom:440.310667pt;} -.yc7e{bottom:440.470667pt;} -.yebd{bottom:440.602667pt;} -.y1110{bottom:440.798667pt;} -.ye7d{bottom:440.853333pt;} -.y7bf{bottom:441.574667pt;} -.y1080{bottom:441.758667pt;} -.y1184{bottom:441.870667pt;} -.ybcd{bottom:441.973333pt;} -.y15d{bottom:442.081333pt;} -.y3b0{bottom:442.173333pt;} -.y798{bottom:442.240000pt;} -.yc46{bottom:442.253333pt;} -.y557{bottom:442.269333pt;} -.y9f1{bottom:442.441333pt;} -.y81e{bottom:442.469333pt;} -.ya3f{bottom:442.576000pt;} -.y12b6{bottom:442.633333pt;} -.y13f0{bottom:442.742667pt;} -.y3f7{bottom:442.764000pt;} -.ydba{bottom:442.874667pt;} -.y430{bottom:443.082667pt;} -.y13c3{bottom:443.100000pt;} -.y6a4{bottom:443.233333pt;} -.y15d6{bottom:443.252000pt;} -.y978{bottom:443.354667pt;} -.y20e{bottom:443.365333pt;} -.y74d{bottom:443.373333pt;} -.ya1b{bottom:443.692000pt;} -.y14d2{bottom:443.758667pt;} -.yd4f{bottom:443.766667pt;} -.y1ca{bottom:444.074667pt;} -.y10c9{bottom:444.222667pt;} +.y755{bottom:437.426667pt;} +.yffd{bottom:437.630667pt;} +.ya60{bottom:437.830667pt;} +.yade{bottom:437.876000pt;} +.y125{bottom:438.001720pt;} +.y909{bottom:438.281333pt;} +.yfdd{bottom:438.522667pt;} +.y10f9{bottom:438.618667pt;} +.yab3{bottom:438.733333pt;} +.y9f0{bottom:438.872000pt;} +.ya8e{bottom:438.878667pt;} +.y1300{bottom:438.944000pt;} +.yc31{bottom:438.997333pt;} +.y6c2{bottom:439.150667pt;} +.y10a2{bottom:439.213333pt;} +.y496{bottom:439.425333pt;} +.y1325{bottom:440.065333pt;} +.y97d{bottom:440.120000pt;} +.y4ec{bottom:440.185333pt;} +.yc11{bottom:440.261333pt;} +.y8db{bottom:440.274667pt;} +.y6ec{bottom:440.310667pt;} +.yc46{bottom:440.470667pt;} +.ye7e{bottom:440.602667pt;} +.y10c6{bottom:440.798667pt;} +.ye3e{bottom:440.853333pt;} +.y7a3{bottom:441.574667pt;} +.y1038{bottom:441.758667pt;} +.y1138{bottom:441.870667pt;} +.yb99{bottom:441.973333pt;} +.y15b{bottom:442.081333pt;} +.y3a7{bottom:442.173333pt;} +.y77d{bottom:442.240000pt;} +.yc10{bottom:442.253333pt;} +.y546{bottom:442.269333pt;} +.y9c7{bottom:442.441333pt;} +.y7ff{bottom:442.469333pt;} +.ya14{bottom:442.576000pt;} +.y1266{bottom:442.633333pt;} +.y1397{bottom:442.742667pt;} +.y3ed{bottom:442.764000pt;} +.yd7f{bottom:442.874667pt;} +.y425{bottom:443.082667pt;} +.y136b{bottom:443.100000pt;} +.y68e{bottom:443.233333pt;} +.y1578{bottom:443.252000pt;} +.y951{bottom:443.354667pt;} +.y208{bottom:443.365333pt;} +.y732{bottom:443.373333pt;} +.y9f1{bottom:443.692000pt;} +.y1477{bottom:443.758667pt;} +.yd16{bottom:443.766667pt;} +.y1c5{bottom:444.074667pt;} +.y1080{bottom:444.222667pt;} .y2e{bottom:444.384000pt;} -.y1414{bottom:444.501333pt;} -.y1156{bottom:444.526667pt;} -.y145a{bottom:444.553333pt;} -.ye31{bottom:444.952000pt;} -.y4fc{bottom:445.005333pt;} -.y42f{bottom:445.074667pt;} -.y156f{bottom:445.116000pt;} -.yf93{bottom:445.181333pt;} -.y1000{bottom:445.200000pt;} +.y13bb{bottom:444.501333pt;} +.y110b{bottom:444.526667pt;} +.y1401{bottom:444.553333pt;} +.ydf4{bottom:444.952000pt;} +.y4ed{bottom:445.005333pt;} +.y424{bottom:445.074667pt;} +.y1512{bottom:445.116000pt;} +.yf50{bottom:445.181333pt;} +.yfba{bottom:445.200000pt;} .y73{bottom:445.365333pt;} -.y1540{bottom:445.430667pt;} -.y875{bottom:445.494667pt;} -.y9cf{bottom:445.581333pt;} -.y8c0{bottom:445.900000pt;} -.y36a{bottom:445.976000pt;} -.y1c9{bottom:446.066667pt;} -.yfc0{bottom:446.258667pt;} -.yce1{bottom:446.413333pt;} -.y132d{bottom:446.734667pt;} -.y15e{bottom:446.901333pt;} -.y1ac{bottom:447.105333pt;} -.y14a7{bottom:447.394667pt;} -.y13ac{bottom:447.488000pt;} -.y10a3{bottom:447.857333pt;} -.y5a8{bottom:448.081333pt;} -.yf3d{bottom:448.673333pt;} -.y1494{bottom:448.722667pt;} -.y119a{bottom:448.724000pt;} -.yfdb{bottom:449.037333pt;} -.y52a{bottom:449.284000pt;} -.y147c{bottom:449.526667pt;} -.y1271{bottom:449.768000pt;} -.y72e{bottom:449.840000pt;} -.y89c{bottom:449.874667pt;} -.yfc{bottom:450.014667pt;} -.y156d{bottom:450.229333pt;} -.y14f7{bottom:450.281333pt;} -.ya65{bottom:450.582667pt;} -.y1060{bottom:450.713333pt;} -.yb7f{bottom:450.717333pt;} -.yba9{bottom:451.009333pt;} -.yfc1{bottom:451.078667pt;} -.yde2{bottom:451.260000pt;} -.yad{bottom:451.342667pt;} -.yeea{bottom:451.584000pt;} -.y834{bottom:451.638667pt;} -.yd1{bottom:451.780000pt;} -.y294{bottom:451.874667pt;} -.y611{bottom:451.993333pt;} -.yb5a{bottom:452.009333pt;} -.yd25{bottom:452.048000pt;} -.y120{bottom:452.432120pt;} -.ye58{bottom:452.564000pt;} -.y244{bottom:452.645333pt;} -.y107e{bottom:452.878667pt;} -.y5d6{bottom:452.988000pt;} +.y14e3{bottom:445.430667pt;} +.y853{bottom:445.494667pt;} +.y9a6{bottom:445.581333pt;} +.y89d{bottom:445.900000pt;} +.y362{bottom:445.976000pt;} +.y1c4{bottom:446.066667pt;} +.yf7d{bottom:446.258667pt;} +.yca8{bottom:446.413333pt;} +.y12d9{bottom:446.734667pt;} +.y15c{bottom:446.901333pt;} +.y1a9{bottom:447.105333pt;} +.y144c{bottom:447.394667pt;} +.y1355{bottom:447.488000pt;} +.y105a{bottom:447.857333pt;} +.y596{bottom:448.081333pt;} +.yefb{bottom:448.673333pt;} +.y1439{bottom:448.722667pt;} +.y114d{bottom:448.724000pt;} +.yf96{bottom:449.037333pt;} +.y51a{bottom:449.284000pt;} +.y1422{bottom:449.526667pt;} +.y1221{bottom:449.768000pt;} +.y716{bottom:449.840000pt;} +.y87a{bottom:449.874667pt;} +.yff{bottom:450.014667pt;} +.y1510{bottom:450.229333pt;} +.y149b{bottom:450.281333pt;} +.ya39{bottom:450.582667pt;} +.y1018{bottom:450.713333pt;} +.yb4d{bottom:450.717333pt;} +.yd1{bottom:450.853333pt;} +.yb76{bottom:451.009333pt;} +.yf7e{bottom:451.078667pt;} +.yda6{bottom:451.260000pt;} +.yac{bottom:451.342667pt;} +.yeaa{bottom:451.584000pt;} +.y813{bottom:451.638667pt;} +.y28e{bottom:451.874667pt;} +.y5fe{bottom:451.993333pt;} +.yb29{bottom:452.009333pt;} +.ycec{bottom:452.048000pt;} +.y121{bottom:452.432120pt;} +.ye1a{bottom:452.564000pt;} +.y23e{bottom:452.645333pt;} +.y1036{bottom:452.878667pt;} +.y5c4{bottom:452.988000pt;} .y43{bottom:453.336000pt;} -.y1441{bottom:453.482667pt;} -.ya8c{bottom:453.770667pt;} -.yb32{bottom:453.840000pt;} -.yfdc{bottom:453.857333pt;} -.yc2b{bottom:453.961333pt;} -.y4fa{bottom:454.132000pt;} -.y954{bottom:454.221333pt;} -.y1142{bottom:454.558667pt;} -.y72f{bottom:454.660000pt;} -.yae0{bottom:454.673333pt;} -.ya19{bottom:454.812000pt;} -.yaba{bottom:454.818667pt;} -.y151b{bottom:454.858667pt;} -.yc67{bottom:454.937333pt;} -.y6d8{bottom:455.090667pt;} -.y10eb{bottom:455.153333pt;} -.y4a2{bottom:455.365333pt;} -.yd02{bottom:455.506667pt;} -.y156e{bottom:455.742667pt;} -.y137a{bottom:456.005333pt;} -.y9a4{bottom:456.060000pt;} -.y4f9{bottom:456.125333pt;} -.y8ff{bottom:456.214667pt;} -.y702{bottom:456.250667pt;} -.yebc{bottom:456.542667pt;} -.y7be{bottom:457.514667pt;} -.ye9f{bottom:457.781333pt;} -.y1183{bottom:457.810667pt;} -.y15b{bottom:458.021333pt;} -.y3af{bottom:458.114667pt;} -.y797{bottom:458.181333pt;} -.yc45{bottom:458.194667pt;} -.y556{bottom:458.209333pt;} -.y9f0{bottom:458.382667pt;} -.ybcb{bottom:458.445333pt;} -.y12b5{bottom:458.573333pt;} +.y13e8{bottom:453.482667pt;} +.ya5f{bottom:453.770667pt;} +.yb02{bottom:453.840000pt;} +.yf97{bottom:453.857333pt;} +.ybf6{bottom:453.961333pt;} +.y4eb{bottom:454.132000pt;} +.y92d{bottom:454.221333pt;} +.y10f8{bottom:454.558667pt;} +.y717{bottom:454.660000pt;} +.yab2{bottom:454.673333pt;} +.y9ef{bottom:454.812000pt;} +.ya8d{bottom:454.818667pt;} +.y14bf{bottom:454.858667pt;} +.yc30{bottom:454.937333pt;} +.y6c1{bottom:455.090667pt;} +.y10a1{bottom:455.153333pt;} +.y494{bottom:455.365333pt;} +.ycc9{bottom:455.506667pt;} +.y1511{bottom:455.742667pt;} +.y1324{bottom:456.005333pt;} +.y97c{bottom:456.060000pt;} +.y4ea{bottom:456.125333pt;} +.y8da{bottom:456.214667pt;} +.y6eb{bottom:456.250667pt;} +.ye7d{bottom:456.542667pt;} +.y7a2{bottom:457.514667pt;} +.ye60{bottom:457.781333pt;} +.y1137{bottom:457.810667pt;} +.y159{bottom:458.021333pt;} +.y3a6{bottom:458.114667pt;} +.y77c{bottom:458.181333pt;} +.yc0f{bottom:458.194667pt;} +.y545{bottom:458.209333pt;} +.y9c6{bottom:458.382667pt;} +.yb97{bottom:458.445333pt;} +.y1265{bottom:458.573333pt;} .y9a{bottom:458.649333pt;} -.y13ef{bottom:458.682667pt;} -.ydb9{bottom:458.814667pt;} -.y13c2{bottom:459.040000pt;} -.ya3e{bottom:459.048000pt;} -.y6a3{bottom:459.173333pt;} -.y12db{bottom:459.174667pt;} -.y977{bottom:459.296000pt;} -.y74c{bottom:459.313333pt;} -.y14d1{bottom:459.698667pt;} -.yd4e{bottom:459.706667pt;} -.y15d4{bottom:460.049333pt;} -.y10c8{bottom:460.162667pt;} -.y4a3{bottom:460.185333pt;} -.y15d5{bottom:460.249333pt;} -.y1413{bottom:460.442667pt;} -.y1155{bottom:460.466667pt;} -.y1459{bottom:460.493333pt;} -.y116a{bottom:460.678667pt;} -.ye30{bottom:460.892000pt;} -.y42e{bottom:461.016000pt;} -.yf92{bottom:461.121333pt;} -.yfff{bottom:461.140000pt;} +.y1396{bottom:458.682667pt;} +.yd7e{bottom:458.814667pt;} +.y136a{bottom:459.040000pt;} +.ya13{bottom:459.048000pt;} +.y68d{bottom:459.173333pt;} +.y128a{bottom:459.174667pt;} +.y950{bottom:459.296000pt;} +.y731{bottom:459.313333pt;} +.y1476{bottom:459.698667pt;} +.yd15{bottom:459.706667pt;} +.y1576{bottom:460.049333pt;} +.y107f{bottom:460.162667pt;} +.y495{bottom:460.185333pt;} +.y1577{bottom:460.249333pt;} +.y13ba{bottom:460.442667pt;} +.y110a{bottom:460.466667pt;} +.y1400{bottom:460.493333pt;} +.y111e{bottom:460.678667pt;} +.ydf3{bottom:460.892000pt;} +.y423{bottom:461.016000pt;} +.yf4f{bottom:461.121333pt;} +.yfb9{bottom:461.140000pt;} .y72{bottom:461.305333pt;} -.y153f{bottom:461.370667pt;} -.y874{bottom:461.436000pt;} -.y9ce{bottom:461.522667pt;} -.yb30{bottom:461.677333pt;} -.y8bf{bottom:461.840000pt;} -.y20b{bottom:461.878667pt;} -.y76e{bottom:461.945333pt;} -.y84e{bottom:462.069333pt;} -.yfbf{bottom:462.198667pt;} -.yce0{bottom:462.353333pt;} -.y8de{bottom:462.432000pt;} -.y20d{bottom:462.601333pt;} -.y132c{bottom:462.674667pt;} -.y92b{bottom:462.722667pt;} -.y15c{bottom:462.842667pt;} -.y1ab{bottom:463.045333pt;} -.y14a6{bottom:463.334667pt;} -.y13ab{bottom:463.428000pt;} -.y1354{bottom:463.462667pt;} -.y10a2{bottom:463.797333pt;} -.y209{bottom:463.893333pt;} -.y5a7{bottom:464.021333pt;} -.yb0c{bottom:464.442667pt;} -.yf3c{bottom:464.613333pt;} -.y1199{bottom:464.664000pt;} -.yfda{bottom:464.977333pt;} -.y529{bottom:465.224000pt;} -.y110f{bottom:465.318667pt;} -.y147b{bottom:465.466667pt;} -.y1270{bottom:465.708000pt;} -.y72d{bottom:465.780000pt;} -.y89b{bottom:465.816000pt;} -.y208{bottom:465.885333pt;} -.yfb{bottom:465.954667pt;} -.ya64{bottom:466.524000pt;} -.y105f{bottom:466.653333pt;} -.yb7e{bottom:466.657333pt;} -.ycaf{bottom:466.713333pt;} -.y14f6{bottom:466.752000pt;} -.y156c{bottom:466.901333pt;} -.yba8{bottom:466.949333pt;} -.yac{bottom:467.282667pt;} -.yee9{bottom:467.524000pt;} -.y833{bottom:467.578667pt;} -.yd0{bottom:467.720000pt;} -.yc2a{bottom:467.909333pt;} -.y610{bottom:467.934667pt;} -.yb59{bottom:467.949333pt;} -.ye57{bottom:468.504000pt;} -.y243{bottom:468.585333pt;} -.y107d{bottom:468.818667pt;} -.y5d5{bottom:468.928000pt;} +.y14e2{bottom:461.370667pt;} +.y852{bottom:461.436000pt;} +.y9a5{bottom:461.522667pt;} +.yb00{bottom:461.677333pt;} +.y89c{bottom:461.840000pt;} +.y205{bottom:461.878667pt;} +.y754{bottom:461.945333pt;} +.y82d{bottom:462.069333pt;} +.yf7c{bottom:462.198667pt;} +.yca7{bottom:462.353333pt;} +.y8ba{bottom:462.432000pt;} +.y207{bottom:462.601333pt;} +.y12d8{bottom:462.674667pt;} +.y905{bottom:462.722667pt;} +.y15a{bottom:462.842667pt;} +.y1a8{bottom:463.045333pt;} +.y144b{bottom:463.334667pt;} +.y1354{bottom:463.428000pt;} +.y12ff{bottom:463.462667pt;} +.y1059{bottom:463.797333pt;} +.y203{bottom:463.893333pt;} +.y595{bottom:464.021333pt;} +.yadd{bottom:464.442667pt;} +.yefa{bottom:464.613333pt;} +.y114c{bottom:464.664000pt;} +.yf95{bottom:464.977333pt;} +.y519{bottom:465.224000pt;} +.y10c5{bottom:465.318667pt;} +.y1421{bottom:465.466667pt;} +.y1220{bottom:465.708000pt;} +.y715{bottom:465.780000pt;} +.y879{bottom:465.816000pt;} +.y202{bottom:465.885333pt;} +.yfe{bottom:465.954667pt;} +.ya38{bottom:466.524000pt;} +.y1017{bottom:466.653333pt;} +.yb4c{bottom:466.657333pt;} +.yc77{bottom:466.713333pt;} +.y149a{bottom:466.752000pt;} +.yd0{bottom:466.793333pt;} +.y150f{bottom:466.901333pt;} +.yb75{bottom:466.949333pt;} +.yea9{bottom:467.524000pt;} +.y812{bottom:467.578667pt;} +.ybf5{bottom:467.909333pt;} +.y5fd{bottom:467.934667pt;} +.yb28{bottom:467.949333pt;} +.ye19{bottom:468.504000pt;} +.y23d{bottom:468.585333pt;} +.y1035{bottom:468.818667pt;} +.y5c3{bottom:468.928000pt;} .y42{bottom:469.276000pt;} -.ye0b{bottom:469.354667pt;} -.ya8b{bottom:469.712000pt;} -.yb31{bottom:469.780000pt;} -.yc29{bottom:469.901333pt;} -.yf6b{bottom:469.978667pt;} -.y1141{bottom:470.500000pt;} -.y3ae{bottom:470.512000pt;} -.y1440{bottom:470.752000pt;} -.yab9{bottom:470.760000pt;} -.y151a{bottom:470.798667pt;} -.yc66{bottom:470.878667pt;} -.y10ea{bottom:471.093333pt;} -.y4a1{bottom:471.305333pt;} -.y20c{bottom:471.370667pt;} -.y15d2{bottom:471.406667pt;} -.yd01{bottom:471.448000pt;} -.y20a{bottom:471.568000pt;} -.y15d3{bottom:471.606667pt;} -.y1379{bottom:471.945333pt;} -.yc02{bottom:471.973333pt;} -.y9a3{bottom:472.000000pt;} -.y156a{bottom:472.014667pt;} -.y4f8{bottom:472.065333pt;} -.y701{bottom:472.192000pt;} -.y1c8{bottom:472.633333pt;} -.y11ff{bottom:472.725333pt;} -.y7bd{bottom:473.454667pt;} -.ye9e{bottom:473.721333pt;} -.y1182{bottom:473.750667pt;} -.y15a{bottom:473.961333pt;} -.yc01{bottom:473.966667pt;} -.y3ac{bottom:474.054667pt;} -.y796{bottom:474.121333pt;} -.yc44{bottom:474.134667pt;} -.y555{bottom:474.149333pt;} -.ybc8{bottom:474.252000pt;} -.y9ef{bottom:474.322667pt;} -.y81d{bottom:474.349333pt;} -.ybca{bottom:474.385333pt;} -.y12b4{bottom:474.513333pt;} -.y13ee{bottom:474.624000pt;} -.ydb8{bottom:474.756000pt;} -.y13c1{bottom:474.980000pt;} -.y6a2{bottom:475.114667pt;} -.y976{bottom:475.236000pt;} -.y74b{bottom:475.253333pt;} -.ya3d{bottom:475.518667pt;} -.yd4d{bottom:475.646667pt;} -.y1044{bottom:475.788000pt;} -.y10c7{bottom:476.102667pt;} -.y1154{bottom:476.406667pt;} -.y1458{bottom:476.434667pt;} -.y3f6{bottom:476.844000pt;} -.y42d{bottom:476.956000pt;} -.yf91{bottom:477.062667pt;} -.yffe{bottom:477.080000pt;} -.y291{bottom:477.092000pt;} +.ydcf{bottom:469.354667pt;} +.ya5e{bottom:469.712000pt;} +.yb01{bottom:469.780000pt;} +.ybf4{bottom:469.901333pt;} +.yf29{bottom:469.978667pt;} +.y10f7{bottom:470.500000pt;} +.y3a5{bottom:470.512000pt;} +.y13e7{bottom:470.752000pt;} +.ya8c{bottom:470.760000pt;} +.y14be{bottom:470.798667pt;} +.yc2f{bottom:470.878667pt;} +.y10a0{bottom:471.093333pt;} +.y493{bottom:471.305333pt;} +.y206{bottom:471.370667pt;} +.y1574{bottom:471.406667pt;} +.ycc8{bottom:471.448000pt;} +.y204{bottom:471.568000pt;} +.y1575{bottom:471.606667pt;} +.y1323{bottom:471.945333pt;} +.ybce{bottom:471.973333pt;} +.y97b{bottom:472.000000pt;} +.y150d{bottom:472.014667pt;} +.y4e9{bottom:472.065333pt;} +.y6ea{bottom:472.192000pt;} +.y1c3{bottom:472.633333pt;} +.y11b0{bottom:472.725333pt;} +.y7a1{bottom:473.454667pt;} +.ye5f{bottom:473.721333pt;} +.y1136{bottom:473.750667pt;} +.y158{bottom:473.961333pt;} +.ybcd{bottom:473.966667pt;} +.y3a3{bottom:474.054667pt;} +.y77b{bottom:474.121333pt;} +.yc0e{bottom:474.134667pt;} +.y544{bottom:474.149333pt;} +.yb94{bottom:474.252000pt;} +.y9c5{bottom:474.322667pt;} +.y7fe{bottom:474.349333pt;} +.yb96{bottom:474.385333pt;} +.y1264{bottom:474.513333pt;} +.y1395{bottom:474.624000pt;} +.yd7d{bottom:474.756000pt;} +.y1369{bottom:474.980000pt;} +.y68c{bottom:475.114667pt;} +.y94f{bottom:475.236000pt;} +.y730{bottom:475.253333pt;} +.ya12{bottom:475.518667pt;} +.yd14{bottom:475.646667pt;} +.yffc{bottom:475.788000pt;} +.y107e{bottom:476.102667pt;} +.y1109{bottom:476.406667pt;} +.y13ff{bottom:476.434667pt;} +.y3ec{bottom:476.844000pt;} +.y422{bottom:476.956000pt;} +.yf4e{bottom:477.062667pt;} +.yfb8{bottom:477.080000pt;} +.y28b{bottom:477.092000pt;} .y71{bottom:477.245333pt;} -.y153e{bottom:477.310667pt;} -.y873{bottom:477.376000pt;} -.y156b{bottom:477.528000pt;} -.y293{bottom:477.814667pt;} -.y93b{bottom:478.000000pt;} -.y84d{bottom:478.009333pt;} -.yfbe{bottom:478.138667pt;} -.yda5{bottom:478.280000pt;} -.ycdf{bottom:478.293333pt;} -.y8dd{bottom:478.372000pt;} -.y949{bottom:478.662667pt;} -.y122f{bottom:478.969333pt;} -.y1aa{bottom:478.986667pt;} -.y14a5{bottom:479.276000pt;} -.y13aa{bottom:479.368000pt;} -.y3ad{bottom:479.737333pt;} -.y132b{bottom:479.944000pt;} -.y5a6{bottom:479.962667pt;} -.yd7f{bottom:480.036000pt;} -.yf3b{bottom:480.553333pt;} -.y1493{bottom:480.604000pt;} -.yfd9{bottom:480.917333pt;} -.y1023{bottom:480.956000pt;} -.y28f{bottom:481.098667pt;} -.y528{bottom:481.164000pt;} -.y147a{bottom:481.408000pt;} -.y126f{bottom:481.648000pt;} -.y72c{bottom:481.720000pt;} -.y89a{bottom:481.756000pt;} -.yfa{bottom:481.894667pt;} -.ya63{bottom:482.464000pt;} -.y105e{bottom:482.593333pt;} -.yb7d{bottom:482.597333pt;} -.ycae{bottom:482.653333pt;} -.y15d0{bottom:482.764000pt;} -.yba7{bottom:482.889333pt;} -.y15d1{bottom:482.964000pt;} -.y369{bottom:483.160000pt;} -.y14f5{bottom:483.224000pt;} -.yee8{bottom:483.464000pt;} -.ycf{bottom:483.660000pt;} -.yb58{bottom:483.889333pt;} -.y6d7{bottom:484.314667pt;} -.ye56{bottom:484.444000pt;} -.y242{bottom:484.525333pt;} -.y107b{bottom:484.760000pt;} +.y14e1{bottom:477.310667pt;} +.y851{bottom:477.376000pt;} +.y150e{bottom:477.528000pt;} +.y28d{bottom:477.814667pt;} +.y82c{bottom:478.009333pt;} +.yf7b{bottom:478.138667pt;} +.yd6b{bottom:478.280000pt;} +.yca6{bottom:478.293333pt;} +.y8b9{bottom:478.372000pt;} +.y922{bottom:478.662667pt;} +.y11e0{bottom:478.969333pt;} +.y1a7{bottom:478.986667pt;} +.y144a{bottom:479.276000pt;} +.y1353{bottom:479.368000pt;} +.y3a4{bottom:479.737333pt;} +.y12d7{bottom:479.944000pt;} +.y594{bottom:479.962667pt;} +.yd45{bottom:480.036000pt;} +.yef9{bottom:480.553333pt;} +.y1438{bottom:480.604000pt;} +.yf94{bottom:480.917333pt;} +.yfdc{bottom:480.956000pt;} +.y289{bottom:481.098667pt;} +.y518{bottom:481.164000pt;} +.y1420{bottom:481.408000pt;} +.y121f{bottom:481.648000pt;} +.y714{bottom:481.720000pt;} +.y878{bottom:481.756000pt;} +.yfd{bottom:481.894667pt;} +.ya37{bottom:482.464000pt;} +.y1016{bottom:482.593333pt;} +.yb4b{bottom:482.597333pt;} +.yc76{bottom:482.653333pt;} +.y1572{bottom:482.764000pt;} +.yb74{bottom:482.889333pt;} +.y1573{bottom:482.964000pt;} +.y361{bottom:483.160000pt;} +.y1499{bottom:483.224000pt;} +.yea8{bottom:483.464000pt;} +.yb27{bottom:483.889333pt;} +.y6c0{bottom:484.314667pt;} +.ye18{bottom:484.444000pt;} +.y23c{bottom:484.525333pt;} +.y1033{bottom:484.760000pt;} .y41{bottom:485.216000pt;} -.ye7c{bottom:485.365333pt;} -.ya8a{bottom:485.652000pt;} -.yf6a{bottom:485.918667pt;} -.yb2f{bottom:486.252000pt;} -.yde1{bottom:486.332000pt;} -.y3a9{bottom:486.452000pt;} -.y292{bottom:486.582667pt;} -.y143f{bottom:486.692000pt;} -.y3ab{bottom:486.697333pt;} -.yab8{bottom:486.700000pt;} -.y1519{bottom:486.738667pt;} -.y290{bottom:486.781333pt;} -.yc65{bottom:486.818667pt;} -.y1412{bottom:487.009333pt;} -.y10e9{bottom:487.033333pt;} -.y4a0{bottom:487.245333pt;} -.yd00{bottom:487.388000pt;} -.y8fe{bottom:487.522667pt;} -.y1378{bottom:487.885333pt;} -.y9a2{bottom:487.940000pt;} -.y4f7{bottom:488.005333pt;} -.y6ff{bottom:488.132000pt;} -.y1c7{bottom:488.573333pt;} -.y11fe{bottom:488.665333pt;} -.y12cb{bottom:488.666667pt;} -.y1568{bottom:488.685333pt;} -.y14d0{bottom:488.793333pt;} -.y1569{bottom:488.885333pt;} -.y107c{bottom:489.580000pt;} -.ye9d{bottom:489.662667pt;} -.ya18{bottom:489.750667pt;} -.y1169{bottom:489.773333pt;} -.y159{bottom:489.902667pt;} -.yc00{bottom:489.906667pt;} -.y3a7{bottom:489.994667pt;} -.y130a{bottom:490.021333pt;} -.y795{bottom:490.061333pt;} -.yc43{bottom:490.074667pt;} -.y554{bottom:490.089333pt;} -.y9ee{bottom:490.262667pt;} -.y81c{bottom:490.290667pt;} -.ybc9{bottom:490.325333pt;} -.yadf{bottom:490.484000pt;} -.y13ed{bottom:490.564000pt;} -.ydb7{bottom:490.696000pt;} -.y9cd{bottom:490.745333pt;} -.y13c0{bottom:490.921333pt;} -.yb0b{bottom:491.010667pt;} -.y6a1{bottom:491.054667pt;} -.y74a{bottom:491.193333pt;} -.yd4c{bottom:491.588000pt;} -.y1043{bottom:491.728000pt;} -.yebb{bottom:491.748000pt;} -.y10c6{bottom:492.044000pt;} -.y1153{bottom:492.348000pt;} -.y1457{bottom:492.374667pt;} -.y3f5{bottom:492.784000pt;} -.y42c{bottom:492.896000pt;} -.y700{bottom:492.952000pt;} -.yf90{bottom:493.002667pt;} -.yffd{bottom:493.021333pt;} -.y12da{bottom:493.138667pt;} +.ye3d{bottom:485.365333pt;} +.ya5d{bottom:485.652000pt;} +.yab{bottom:485.880000pt;} +.yf28{bottom:485.918667pt;} +.yaff{bottom:486.252000pt;} +.yda5{bottom:486.332000pt;} +.y3a0{bottom:486.452000pt;} +.y28c{bottom:486.582667pt;} +.y13e6{bottom:486.692000pt;} +.y3a2{bottom:486.697333pt;} +.ya8b{bottom:486.700000pt;} +.y14bd{bottom:486.738667pt;} +.y28a{bottom:486.781333pt;} +.yc2e{bottom:486.818667pt;} +.y13b9{bottom:487.009333pt;} +.y109f{bottom:487.033333pt;} +.y492{bottom:487.245333pt;} +.ycc7{bottom:487.388000pt;} +.y8d9{bottom:487.522667pt;} +.y1322{bottom:487.885333pt;} +.y97a{bottom:487.940000pt;} +.y4e8{bottom:488.005333pt;} +.y6e8{bottom:488.132000pt;} +.y1c2{bottom:488.573333pt;} +.y11af{bottom:488.665333pt;} +.y150b{bottom:488.685333pt;} +.y1475{bottom:488.793333pt;} +.y150c{bottom:488.885333pt;} +.y1034{bottom:489.580000pt;} +.ye5e{bottom:489.662667pt;} +.y9ee{bottom:489.750667pt;} +.y111d{bottom:489.773333pt;} +.y157{bottom:489.902667pt;} +.ybcc{bottom:489.906667pt;} +.y39e{bottom:489.994667pt;} +.y12b7{bottom:490.021333pt;} +.y77a{bottom:490.061333pt;} +.yc0d{bottom:490.074667pt;} +.y543{bottom:490.089333pt;} +.y9c4{bottom:490.262667pt;} +.y7fd{bottom:490.290667pt;} +.yb95{bottom:490.325333pt;} +.yab1{bottom:490.484000pt;} +.y1394{bottom:490.564000pt;} +.yd7c{bottom:490.696000pt;} +.y9a4{bottom:490.745333pt;} +.y1368{bottom:490.921333pt;} +.yadc{bottom:491.010667pt;} +.y68b{bottom:491.054667pt;} +.y72f{bottom:491.193333pt;} +.yd13{bottom:491.588000pt;} +.yffb{bottom:491.728000pt;} +.ye7c{bottom:491.748000pt;} +.y107d{bottom:492.044000pt;} +.y1108{bottom:492.348000pt;} +.y13fe{bottom:492.374667pt;} +.y3eb{bottom:492.784000pt;} +.y421{bottom:492.896000pt;} +.y6e9{bottom:492.952000pt;} +.yf4d{bottom:493.002667pt;} +.yfb7{bottom:493.021333pt;} +.y1289{bottom:493.138667pt;} .y70{bottom:493.185333pt;} -.y153d{bottom:493.250667pt;} -.y872{bottom:493.316000pt;} -.yd24{bottom:493.374667pt;} -.y5d4{bottom:493.446667pt;} -.y1198{bottom:493.758667pt;} -.y84c{bottom:493.950667pt;} -.yfbd{bottom:494.078667pt;} -.yb2d{bottom:494.089333pt;} -.y15cf{bottom:494.122667pt;} -.yda4{bottom:494.220000pt;} -.ycde{bottom:494.234667pt;} -.y8dc{bottom:494.312000pt;} -.yc28{bottom:494.342667pt;} -.y3aa{bottom:494.814667pt;} -.y122e{bottom:494.909333pt;} -.y1a9{bottom:494.926667pt;} -.y13a9{bottom:495.308000pt;} -.y3a8{bottom:495.677333pt;} -.y132a{bottom:495.884000pt;} -.y5a5{bottom:495.902667pt;} -.yd7e{bottom:495.976000pt;} -.yf3a{bottom:496.493333pt;} -.y1492{bottom:496.544000pt;} -.y832{bottom:496.802667pt;} -.yfd8{bottom:496.858667pt;} -.y1022{bottom:496.896000pt;} -.y60f{bottom:497.029333pt;} -.y110e{bottom:497.069333pt;} -.y527{bottom:497.104000pt;} -.y126e{bottom:497.588000pt;} -.y72b{bottom:497.661333pt;} -.y899{bottom:497.696000pt;} -.y207{bottom:497.766667pt;} -.yf9{bottom:497.836000pt;} -.y1181{bottom:498.269333pt;} -.ycad{bottom:498.593333pt;} -.yba6{bottom:498.829333pt;} -.y76d{bottom:498.842667pt;} -.y368{bottom:499.100000pt;} -.y15cd{bottom:499.236000pt;} -.y8be{bottom:499.340000pt;} -.yee7{bottom:499.404000pt;} -.y14f4{bottom:499.696000pt;} -.yb57{bottom:499.830667pt;} -.y1566{bottom:500.042667pt;} -.y1567{bottom:500.242667pt;} -.ye55{bottom:500.384000pt;} -.y241{bottom:500.465333pt;} -.y1353{bottom:500.648000pt;} -.y107a{bottom:500.700000pt;} +.y14e0{bottom:493.250667pt;} +.y850{bottom:493.316000pt;} +.yceb{bottom:493.374667pt;} +.y5c2{bottom:493.446667pt;} +.y114b{bottom:493.758667pt;} +.y82b{bottom:493.950667pt;} +.yf7a{bottom:494.078667pt;} +.yafd{bottom:494.089333pt;} +.y1571{bottom:494.122667pt;} +.yd6a{bottom:494.220000pt;} +.yca5{bottom:494.234667pt;} +.y8b8{bottom:494.312000pt;} +.ybf3{bottom:494.342667pt;} +.y3a1{bottom:494.814667pt;} +.y11df{bottom:494.909333pt;} +.y1a6{bottom:494.926667pt;} +.y1352{bottom:495.308000pt;} +.y39f{bottom:495.677333pt;} +.y12d6{bottom:495.884000pt;} +.y593{bottom:495.902667pt;} +.yd44{bottom:495.976000pt;} +.yef8{bottom:496.493333pt;} +.y1437{bottom:496.544000pt;} +.y811{bottom:496.802667pt;} +.yf93{bottom:496.858667pt;} +.yfdb{bottom:496.896000pt;} +.y5fc{bottom:497.029333pt;} +.y10c4{bottom:497.069333pt;} +.y517{bottom:497.104000pt;} +.y121e{bottom:497.588000pt;} +.y713{bottom:497.661333pt;} +.y877{bottom:497.696000pt;} +.y201{bottom:497.766667pt;} +.yfc{bottom:497.836000pt;} +.y1135{bottom:498.269333pt;} +.yc75{bottom:498.593333pt;} +.yb73{bottom:498.829333pt;} +.y753{bottom:498.842667pt;} +.y360{bottom:499.100000pt;} +.y156f{bottom:499.236000pt;} +.y89b{bottom:499.340000pt;} +.yea7{bottom:499.404000pt;} +.y1498{bottom:499.696000pt;} +.yb26{bottom:499.830667pt;} +.y1509{bottom:500.042667pt;} +.ycf{bottom:500.064000pt;} +.y150a{bottom:500.242667pt;} +.ye17{bottom:500.384000pt;} +.y23b{bottom:500.465333pt;} +.y12fe{bottom:500.648000pt;} +.y1032{bottom:500.700000pt;} .y40{bottom:501.156000pt;} -.ye7b{bottom:501.305333pt;} -.ya89{bottom:501.592000pt;} -.yab{bottom:501.820000pt;} -.yf69{bottom:501.858667pt;} -.ye0a{bottom:502.113333pt;} -.yb2e{bottom:502.192000pt;} -.ye2f{bottom:502.218667pt;} -.yde0{bottom:502.272000pt;} -.y3a6{bottom:502.393333pt;} -.y143e{bottom:502.632000pt;} -.yab7{bottom:502.640000pt;} -.y7a5{bottom:502.666667pt;} -.y1518{bottom:502.678667pt;} -.yc64{bottom:502.758667pt;} -.y1411{bottom:502.949333pt;} -.y10e8{bottom:502.974667pt;} -.ycff{bottom:503.328000pt;} -.y8fd{bottom:503.462667pt;} -.y9a1{bottom:503.880000pt;} -.y4f6{bottom:503.945333pt;} -.y6fe{bottom:504.072000pt;} +.ye3c{bottom:501.305333pt;} +.ya5c{bottom:501.592000pt;} +.yaa{bottom:501.820000pt;} +.yf27{bottom:501.858667pt;} +.ydce{bottom:502.113333pt;} +.yafe{bottom:502.192000pt;} +.ydf2{bottom:502.218667pt;} +.yda4{bottom:502.272000pt;} +.y39d{bottom:502.393333pt;} +.y13e5{bottom:502.632000pt;} +.ya8a{bottom:502.640000pt;} +.y14bc{bottom:502.678667pt;} +.yc2d{bottom:502.758667pt;} +.y13b8{bottom:502.949333pt;} +.y109e{bottom:502.974667pt;} +.ycc6{bottom:503.328000pt;} +.y8d8{bottom:503.462667pt;} +.y979{bottom:503.880000pt;} +.y4e7{bottom:503.945333pt;} +.y6e7{bottom:504.072000pt;} .y99{bottom:504.477333pt;} -.y1c6{bottom:504.514667pt;} -.y11fd{bottom:504.606667pt;} -.y15ce{bottom:504.749333pt;} -.ye9c{bottom:505.602667pt;} -.ya17{bottom:505.692000pt;} -.y158{bottom:505.842667pt;} -.ybff{bottom:505.846667pt;} -.y3a4{bottom:505.934667pt;} -.y1309{bottom:505.961333pt;} -.yc42{bottom:506.014667pt;} -.y9ed{bottom:506.202667pt;} -.y28c{bottom:506.314667pt;} -.yade{bottom:506.424000pt;} -.y28e{bottom:506.560000pt;} -.y9cc{bottom:506.686667pt;} -.ybc7{bottom:506.797333pt;} -.y13bf{bottom:506.861333pt;} -.yb0a{bottom:506.950667pt;} -.y6a0{bottom:506.994667pt;} -.y749{bottom:507.133333pt;} -.y1042{bottom:507.668000pt;} -.yeba{bottom:507.688000pt;} -.ya3c{bottom:507.930667pt;} -.y10c5{bottom:507.984000pt;} -.y1456{bottom:508.314667pt;} -.y105d{bottom:508.462667pt;} -.y12b3{bottom:508.593333pt;} -.y42b{bottom:508.836000pt;} -.yf8f{bottom:508.942667pt;} -.yffc{bottom:508.961333pt;} -.y12d9{bottom:509.078667pt;} +.y1c1{bottom:504.514667pt;} +.y11ae{bottom:504.606667pt;} +.y1570{bottom:504.749333pt;} +.ye5d{bottom:505.602667pt;} +.y9ed{bottom:505.692000pt;} +.y156{bottom:505.842667pt;} +.ybcb{bottom:505.846667pt;} +.y39b{bottom:505.934667pt;} +.y12b6{bottom:505.961333pt;} +.yc0c{bottom:506.014667pt;} +.y9c3{bottom:506.202667pt;} +.y286{bottom:506.314667pt;} +.yab0{bottom:506.424000pt;} +.y288{bottom:506.560000pt;} +.y9a3{bottom:506.686667pt;} +.yb93{bottom:506.797333pt;} +.y1367{bottom:506.861333pt;} +.yadb{bottom:506.950667pt;} +.y68a{bottom:506.994667pt;} +.y72e{bottom:507.133333pt;} +.yffa{bottom:507.668000pt;} +.ye7b{bottom:507.688000pt;} +.ya11{bottom:507.930667pt;} +.y107c{bottom:507.984000pt;} +.y13fd{bottom:508.314667pt;} +.y1015{bottom:508.462667pt;} +.y1263{bottom:508.593333pt;} +.y420{bottom:508.836000pt;} +.yf4c{bottom:508.942667pt;} +.yfb6{bottom:508.961333pt;} +.y1288{bottom:509.078667pt;} .y6f{bottom:509.126667pt;} -.y153c{bottom:509.190667pt;} -.y871{bottom:509.256000pt;} -.yd23{bottom:509.314667pt;} -.y1140{bottom:509.645333pt;} -.y84b{bottom:509.890667pt;} -.yfbc{bottom:510.018667pt;} -.yda3{bottom:510.161333pt;} -.ycdd{bottom:510.174667pt;} -.y8db{bottom:510.252000pt;} -.y28a{bottom:510.322667pt;} -.y7bc{bottom:510.372000pt;} -.y122d{bottom:510.849333pt;} -.y13a8{bottom:511.248000pt;} -.y1564{bottom:511.400000pt;} -.y1565{bottom:511.600000pt;} -.y3a5{bottom:511.617333pt;} -.y1329{bottom:511.824000pt;} -.yd7d{bottom:511.916000pt;} -.y1377{bottom:512.405333pt;} -.yf39{bottom:512.433333pt;} -.y1491{bottom:512.484000pt;} -.y831{bottom:512.742667pt;} -.yfd7{bottom:512.798667pt;} -.y1021{bottom:512.836000pt;} -.y526{bottom:513.044000pt;} -.y126d{bottom:513.529333pt;} -.y6d6{bottom:513.537333pt;} -.y72a{bottom:513.601333pt;} -.y898{bottom:513.636000pt;} -.y206{bottom:513.706667pt;} -.yf8{bottom:513.776000pt;} -.ycac{bottom:514.534667pt;} -.y794{bottom:514.580000pt;} -.yba5{bottom:514.770667pt;} -.y76c{bottom:514.784000pt;} -.y367{bottom:515.040000pt;} -.y1a8{bottom:515.044000pt;} -.y28d{bottom:515.142667pt;} -.y8bd{bottom:515.280000pt;} -.yee6{bottom:515.344000pt;} -.yb56{bottom:515.770667pt;} -.y15cb{bottom:515.906667pt;} -.y28b{bottom:516.004000pt;} -.y15cc{bottom:516.106667pt;} -.y14f3{bottom:516.166667pt;} -.ye54{bottom:516.325333pt;} -.y49f{bottom:516.340000pt;} -.y240{bottom:516.405333pt;} -.y5a4{bottom:516.506667pt;} -.ya62{bottom:516.542667pt;} -.yf11{bottom:516.561333pt;} -.y975{bottom:516.562667pt;} -.y1352{bottom:516.588000pt;} -.yce{bottom:516.814667pt;} -.y1152{bottom:516.866667pt;} +.y14df{bottom:509.190667pt;} +.y84f{bottom:509.256000pt;} +.ycea{bottom:509.314667pt;} +.y10f6{bottom:509.645333pt;} +.y82a{bottom:509.890667pt;} +.yf79{bottom:510.018667pt;} +.yd69{bottom:510.161333pt;} +.yca4{bottom:510.174667pt;} +.y8b7{bottom:510.252000pt;} +.y285{bottom:510.322667pt;} +.y7a0{bottom:510.372000pt;} +.y11de{bottom:510.849333pt;} +.y1351{bottom:511.248000pt;} +.y1507{bottom:511.400000pt;} +.y1508{bottom:511.600000pt;} +.y39c{bottom:511.617333pt;} +.y12d5{bottom:511.824000pt;} +.yd43{bottom:511.916000pt;} +.y1321{bottom:512.405333pt;} +.yef7{bottom:512.433333pt;} +.y1436{bottom:512.484000pt;} +.y810{bottom:512.742667pt;} +.yf92{bottom:512.798667pt;} +.yfda{bottom:512.836000pt;} +.y516{bottom:513.044000pt;} +.y121d{bottom:513.529333pt;} +.y6bf{bottom:513.537333pt;} +.y712{bottom:513.601333pt;} +.y876{bottom:513.636000pt;} +.y200{bottom:513.706667pt;} +.yfb{bottom:513.776000pt;} +.yc74{bottom:514.534667pt;} +.y779{bottom:514.580000pt;} +.yb72{bottom:514.770667pt;} +.y752{bottom:514.784000pt;} +.y35f{bottom:515.040000pt;} +.y1a5{bottom:515.044000pt;} +.y287{bottom:515.142667pt;} +.y89a{bottom:515.280000pt;} +.yea6{bottom:515.344000pt;} +.yb25{bottom:515.770667pt;} +.y156d{bottom:515.906667pt;} +.yce{bottom:516.004000pt;} +.y156e{bottom:516.106667pt;} +.y1497{bottom:516.166667pt;} +.ye16{bottom:516.325333pt;} +.y491{bottom:516.340000pt;} +.y23a{bottom:516.405333pt;} +.y592{bottom:516.506667pt;} +.ya36{bottom:516.542667pt;} +.yecf{bottom:516.561333pt;} +.y94e{bottom:516.562667pt;} +.y12fd{bottom:516.588000pt;} +.y1107{bottom:516.866667pt;} .y3f{bottom:517.096000pt;} -.ye7a{bottom:517.245333pt;} -.y3c9{bottom:517.333333pt;} -.ya87{bottom:517.532000pt;} -.yaa{bottom:517.761333pt;} -.yf68{bottom:517.800000pt;} -.ye09{bottom:518.053333pt;} -.ye2e{bottom:518.158667pt;} -.yddf{bottom:518.212000pt;} -.y5a3{bottom:518.500000pt;} -.y143d{bottom:518.572000pt;} -.yab6{bottom:518.580000pt;} -.y1517{bottom:518.618667pt;} -.yef7{bottom:518.666667pt;} -.yc63{bottom:518.698667pt;} -.y10e7{bottom:518.914667pt;} -.y11ca{bottom:519.248000pt;} -.y8fc{bottom:519.404000pt;} -.y81a{bottom:519.513333pt;} -.y9a0{bottom:519.821333pt;} -.y4f5{bottom:519.886667pt;} -.y6fd{bottom:520.012000pt;} +.ye3b{bottom:517.245333pt;} +.ya5a{bottom:517.532000pt;} +.yf26{bottom:517.800000pt;} +.ydcd{bottom:518.053333pt;} +.ydf1{bottom:518.158667pt;} +.yda3{bottom:518.212000pt;} +.y591{bottom:518.500000pt;} +.y13e4{bottom:518.572000pt;} +.ya89{bottom:518.580000pt;} +.y14bb{bottom:518.618667pt;} +.yc2c{bottom:518.698667pt;} +.y109d{bottom:518.914667pt;} +.y117c{bottom:519.248000pt;} +.y8d7{bottom:519.404000pt;} +.y7fb{bottom:519.513333pt;} +.y978{bottom:519.821333pt;} +.y4e6{bottom:519.886667pt;} +.y6e6{bottom:520.012000pt;} .y98{bottom:520.417333pt;} -.y1c5{bottom:520.454667pt;} -.y3f4{bottom:520.546667pt;} -.y42a{bottom:521.234667pt;} -.yb7c{bottom:521.266667pt;} -.ye9b{bottom:521.542667pt;} -.ya16{bottom:521.632000pt;} -.y157{bottom:521.782667pt;} -.ybfe{bottom:521.786667pt;} -.yb2c{bottom:521.852000pt;} -.y3a3{bottom:521.874667pt;} -.y1308{bottom:521.901333pt;} -.yc41{bottom:521.954667pt;} -.ya88{bottom:522.352000pt;} -.yadd{bottom:522.364000pt;} -.y3f3{bottom:522.538667pt;} -.ybc4{bottom:522.604000pt;} -.y9cb{bottom:522.626667pt;} -.y1479{bottom:522.733333pt;} -.ybc6{bottom:522.737333pt;} -.y1562{bottom:522.758667pt;} -.yb09{bottom:522.890667pt;} -.y69f{bottom:522.934667pt;} -.y1563{bottom:522.957333pt;} -.y7c9{bottom:523.073333pt;} -.y748{bottom:523.074667pt;} -.yf04{bottom:523.350667pt;} -.yeb9{bottom:523.629333pt;} -.y10c4{bottom:523.924000pt;} -.y1455{bottom:524.254667pt;} -.y81b{bottom:524.334667pt;} -.ya3b{bottom:524.402667pt;} -.y428{bottom:524.776000pt;} -.yf8e{bottom:524.882667pt;} -.yffb{bottom:524.901333pt;} -.y12d8{bottom:525.018667pt;} +.y1c0{bottom:520.454667pt;} +.y3ea{bottom:520.546667pt;} +.y41f{bottom:521.234667pt;} +.yb4a{bottom:521.266667pt;} +.ye5c{bottom:521.542667pt;} +.y9ec{bottom:521.632000pt;} +.y155{bottom:521.782667pt;} +.ybca{bottom:521.786667pt;} +.yafc{bottom:521.852000pt;} +.y39a{bottom:521.874667pt;} +.y12b5{bottom:521.901333pt;} +.yc0b{bottom:521.954667pt;} +.ya5b{bottom:522.352000pt;} +.yaaf{bottom:522.364000pt;} +.y3e9{bottom:522.538667pt;} +.yb90{bottom:522.604000pt;} +.y9a2{bottom:522.626667pt;} +.y141f{bottom:522.733333pt;} +.yb92{bottom:522.737333pt;} +.y1505{bottom:522.758667pt;} +.yada{bottom:522.890667pt;} +.y689{bottom:522.934667pt;} +.y1506{bottom:522.957333pt;} +.y7ad{bottom:523.073333pt;} +.y72d{bottom:523.074667pt;} +.yec3{bottom:523.350667pt;} +.ye7a{bottom:523.629333pt;} +.y107b{bottom:523.924000pt;} +.y13fc{bottom:524.254667pt;} +.y7fc{bottom:524.334667pt;} +.ya10{bottom:524.402667pt;} +.y41d{bottom:524.776000pt;} +.yf4b{bottom:524.882667pt;} +.yfb5{bottom:524.901333pt;} +.y1287{bottom:525.018667pt;} .y6e{bottom:525.066667pt;} -.y153b{bottom:525.130667pt;} -.y870{bottom:525.196000pt;} -.yd22{bottom:525.254667pt;} -.y13ec{bottom:525.502667pt;} -.y113e{bottom:525.585333pt;} -.yfbb{bottom:525.958667pt;} -.yda2{bottom:526.101333pt;} -.y8da{bottom:526.193333pt;} -.y7bb{bottom:526.312000pt;} -.y122b{bottom:526.789333pt;} -.y13a7{bottom:527.188000pt;} -.y15ca{bottom:527.264000pt;} -.y10a1{bottom:527.557333pt;} -.y1328{bottom:527.764000pt;} -.ycfe{bottom:527.846667pt;} -.yd7c{bottom:527.856000pt;} -.yf38{bottom:528.373333pt;} -.y830{bottom:528.682667pt;} -.y1020{bottom:528.776000pt;} -.y525{bottom:528.985333pt;} -.y126c{bottom:529.469333pt;} -.y6d5{bottom:529.478667pt;} -.y1410{bottom:529.516000pt;} -.y729{bottom:529.541333pt;} -.y897{bottom:529.576000pt;} -.yf7{bottom:529.716000pt;} -.y113f{bottom:530.406667pt;} -.y429{bottom:530.458667pt;} -.y76b{bottom:530.724000pt;} -.y366{bottom:530.981333pt;} -.y8bc{bottom:531.220000pt;} -.yee5{bottom:531.285333pt;} -.yd4b{bottom:531.393333pt;} -.y122c{bottom:531.610667pt;} -.yb55{bottom:531.710667pt;} -.y552{bottom:532.142667pt;} -.ye53{bottom:532.265333pt;} -.y23f{bottom:532.345333pt;} -.y15c8{bottom:532.378667pt;} -.yf10{bottom:532.501333pt;} -.y974{bottom:532.502667pt;} -.y1351{bottom:532.528000pt;} -.y14f2{bottom:532.638667pt;} -.ycd{bottom:532.754667pt;} -.y129f{bottom:533.034667pt;} +.y14de{bottom:525.130667pt;} +.y84e{bottom:525.196000pt;} +.yce9{bottom:525.254667pt;} +.y1393{bottom:525.502667pt;} +.y10f4{bottom:525.585333pt;} +.yf78{bottom:525.958667pt;} +.yd68{bottom:526.101333pt;} +.y8b6{bottom:526.193333pt;} +.y79f{bottom:526.312000pt;} +.y11dc{bottom:526.789333pt;} +.y1350{bottom:527.188000pt;} +.y156c{bottom:527.264000pt;} +.y1058{bottom:527.557333pt;} +.y12d4{bottom:527.764000pt;} +.ycc5{bottom:527.846667pt;} +.yd42{bottom:527.856000pt;} +.yef6{bottom:528.373333pt;} +.ya9{bottom:528.388000pt;} +.y80f{bottom:528.682667pt;} +.yfd9{bottom:528.776000pt;} +.y515{bottom:528.985333pt;} +.y121c{bottom:529.469333pt;} +.y6be{bottom:529.478667pt;} +.y13b7{bottom:529.516000pt;} +.y711{bottom:529.541333pt;} +.y875{bottom:529.576000pt;} +.yfa{bottom:529.716000pt;} +.y10f5{bottom:530.406667pt;} +.y41e{bottom:530.458667pt;} +.y751{bottom:530.724000pt;} +.y35e{bottom:530.981333pt;} +.y899{bottom:531.220000pt;} +.yea5{bottom:531.285333pt;} +.yd12{bottom:531.393333pt;} +.y11dd{bottom:531.610667pt;} +.yb24{bottom:531.710667pt;} +.y541{bottom:532.142667pt;} +.ye15{bottom:532.265333pt;} +.y239{bottom:532.345333pt;} +.y156a{bottom:532.378667pt;} +.yece{bottom:532.501333pt;} +.y94d{bottom:532.502667pt;} +.y12fc{bottom:532.528000pt;} +.y1496{bottom:532.638667pt;} +.y124f{bottom:533.034667pt;} .y3e{bottom:533.036000pt;} -.ydb6{bottom:533.129333pt;} -.ye79{bottom:533.186667pt;} -.y1a7{bottom:533.301333pt;} -.ya86{bottom:533.472000pt;} +.yd7b{bottom:533.129333pt;} +.ye3a{bottom:533.186667pt;} +.y1a4{bottom:533.301333pt;} +.ya59{bottom:533.472000pt;} .y2d{bottom:533.701333pt;} -.ye08{bottom:533.994667pt;} -.ye2d{bottom:534.098667pt;} -.y1560{bottom:534.116000pt;} -.ydde{bottom:534.153333pt;} -.y1561{bottom:534.314667pt;} -.y143c{bottom:534.513333pt;} -.yab5{bottom:534.520000pt;} -.y1516{bottom:534.560000pt;} -.yc62{bottom:534.638667pt;} -.y10e6{bottom:534.854667pt;} -.y11c9{bottom:535.188000pt;} -.y819{bottom:535.454667pt;} -.y99f{bottom:535.761333pt;} -.y1079{bottom:535.770667pt;} -.y4f4{bottom:535.826667pt;} -.y6fc{bottom:535.952000pt;} -.y13be{bottom:535.956000pt;} -.y84a{bottom:536.197333pt;} +.ydcc{bottom:533.994667pt;} +.ydf0{bottom:534.098667pt;} +.y1503{bottom:534.116000pt;} +.yda2{bottom:534.153333pt;} +.y1504{bottom:534.314667pt;} +.y13e3{bottom:534.513333pt;} +.ya88{bottom:534.520000pt;} +.y14ba{bottom:534.560000pt;} +.yc2b{bottom:534.638667pt;} +.y109c{bottom:534.854667pt;} +.y117b{bottom:535.188000pt;} +.y7fa{bottom:535.454667pt;} +.y977{bottom:535.761333pt;} +.y1031{bottom:535.770667pt;} +.y4e5{bottom:535.826667pt;} +.y6e5{bottom:535.952000pt;} +.y1366{bottom:535.956000pt;} +.y829{bottom:536.197333pt;} .y97{bottom:536.357333pt;} -.y1c4{bottom:536.394667pt;} -.y205{bottom:536.428000pt;} -.y11fc{bottom:536.486667pt;} -.y553{bottom:536.964000pt;} -.y3f2{bottom:537.018667pt;} -.yb7b{bottom:537.206667pt;} -.y426{bottom:537.420000pt;} -.ye9a{bottom:537.482667pt;} -.ya15{bottom:537.572000pt;} -.y1197{bottom:537.685333pt;} -.y156{bottom:537.722667pt;} -.ybfd{bottom:537.726667pt;} -.y1307{bottom:537.841333pt;} -.y15c9{bottom:537.890667pt;} -.yc40{bottom:537.894667pt;} -.y204{bottom:538.420000pt;} -.y9ca{bottom:538.566667pt;} -.y1478{bottom:538.674667pt;} -.ybc5{bottom:538.677333pt;} -.y5d3{bottom:538.710667pt;} -.yb08{bottom:538.830667pt;} -.y69d{bottom:538.874667pt;} -.y3f1{bottom:539.010667pt;} -.y747{bottom:539.014667pt;} -.yf03{bottom:539.292000pt;} -.y1041{bottom:539.570667pt;} -.y10c3{bottom:539.864000pt;} -.y1180{bottom:540.194667pt;} -.y424{bottom:540.716000pt;} -.y427{bottom:540.717333pt;} -.y110d{bottom:540.768000pt;} -.ya3a{bottom:540.874667pt;} -.y12d7{bottom:540.958667pt;} +.y1bf{bottom:536.394667pt;} +.y1ff{bottom:536.428000pt;} +.y11ad{bottom:536.486667pt;} +.y542{bottom:536.964000pt;} +.y3e8{bottom:537.018667pt;} +.yb49{bottom:537.206667pt;} +.y41b{bottom:537.420000pt;} +.ye5b{bottom:537.482667pt;} +.y9eb{bottom:537.572000pt;} +.y114a{bottom:537.685333pt;} +.y154{bottom:537.722667pt;} +.ybc9{bottom:537.726667pt;} +.y12b4{bottom:537.841333pt;} +.y156b{bottom:537.890667pt;} +.yc0a{bottom:537.894667pt;} +.y1fe{bottom:538.420000pt;} +.y9a1{bottom:538.566667pt;} +.y141e{bottom:538.674667pt;} +.yb91{bottom:538.677333pt;} +.y5c1{bottom:538.710667pt;} +.yad9{bottom:538.830667pt;} +.y687{bottom:538.874667pt;} +.y3e7{bottom:539.010667pt;} +.ya1{bottom:539.014667pt;} +.yec2{bottom:539.292000pt;} +.yff9{bottom:539.570667pt;} +.y107a{bottom:539.864000pt;} +.y1134{bottom:540.194667pt;} +.y419{bottom:540.716000pt;} +.y41c{bottom:540.717333pt;} +.y10c3{bottom:540.768000pt;} +.ya0f{bottom:540.874667pt;} +.y1286{bottom:540.958667pt;} .y6d{bottom:541.006667pt;} -.y153a{bottom:541.072000pt;} -.y11f{bottom:541.076000pt;} -.y86f{bottom:541.136000pt;} -.yd21{bottom:541.194667pt;} -.y13eb{bottom:541.442667pt;} -.y113c{bottom:541.526667pt;} -.y1490{bottom:541.578667pt;} -.yfba{bottom:541.900000pt;} -.yda1{bottom:542.041333pt;} -.y8d9{bottom:542.133333pt;} -.y7ba{bottom:542.252000pt;} -.y122a{bottom:542.730667pt;} -.y11e{bottom:543.069333pt;} -.y13a6{bottom:543.129333pt;} -.y14cf{bottom:543.210667pt;} -.y69e{bottom:543.696000pt;} -.yd7b{bottom:543.796000pt;} -.yf37{bottom:544.314667pt;} -.ya9{bottom:544.328000pt;} -.y135e{bottom:544.666667pt;} -.y524{bottom:544.925333pt;} -.y126b{bottom:545.409333pt;} -.y6d3{bottom:545.418667pt;} -.y140f{bottom:545.457333pt;} -.y155e{bottom:545.473333pt;} -.y896{bottom:545.516000pt;} -.y425{bottom:545.537333pt;} -.yf6{bottom:545.656000pt;} -.y155f{bottom:545.672000pt;} -.ya61{bottom:546.298667pt;} -.y113d{bottom:546.346667pt;} -.y3a2{bottom:546.394667pt;} -.y365{bottom:546.921333pt;} -.y8bb{bottom:547.160000pt;} -.yee4{bottom:547.225333pt;} -.yd4a{bottom:547.333333pt;} -.y9ec{bottom:547.529333pt;} -.y1327{bottom:547.881333pt;} -.y551{bottom:548.082667pt;} -.yba4{bottom:548.112000pt;} -.yf0f{bottom:548.441333pt;} -.y972{bottom:548.442667pt;} -.y1350{bottom:548.468000pt;} -.y23e{bottom:548.817333pt;} -.ycdc{bottom:548.844000pt;} -.y15c6{bottom:549.049333pt;} -.ydb5{bottom:549.069333pt;} -.y14f1{bottom:549.110667pt;} -.ye78{bottom:549.126667pt;} -.y1a6{bottom:549.241333pt;} -.y15c7{bottom:549.248000pt;} -.yf8d{bottom:549.401333pt;} -.ya84{bottom:549.412000pt;} -.yb2b{bottom:549.481333pt;} +.y14dd{bottom:541.072000pt;} +.y120{bottom:541.076000pt;} +.y84d{bottom:541.136000pt;} +.yce8{bottom:541.194667pt;} +.y1392{bottom:541.442667pt;} +.y10f2{bottom:541.526667pt;} +.y1435{bottom:541.578667pt;} +.yf77{bottom:541.900000pt;} +.yd67{bottom:542.041333pt;} +.y8b5{bottom:542.133333pt;} +.y79e{bottom:542.252000pt;} +.y11db{bottom:542.730667pt;} +.y11f{bottom:543.069333pt;} +.y134f{bottom:543.129333pt;} +.y1474{bottom:543.210667pt;} +.y688{bottom:543.696000pt;} +.yd41{bottom:543.796000pt;} +.yef5{bottom:544.314667pt;} +.ya8{bottom:544.328000pt;} +.y514{bottom:544.925333pt;} +.y121b{bottom:545.409333pt;} +.y6bc{bottom:545.418667pt;} +.y13b6{bottom:545.457333pt;} +.y1501{bottom:545.473333pt;} +.y874{bottom:545.516000pt;} +.y41a{bottom:545.537333pt;} +.yf9{bottom:545.656000pt;} +.y1502{bottom:545.672000pt;} +.ya35{bottom:546.298667pt;} +.y10f3{bottom:546.346667pt;} +.y399{bottom:546.394667pt;} +.y35d{bottom:546.921333pt;} +.y898{bottom:547.160000pt;} +.yea4{bottom:547.225333pt;} +.yd11{bottom:547.333333pt;} +.y9c2{bottom:547.529333pt;} +.y12d3{bottom:547.881333pt;} +.y540{bottom:548.082667pt;} +.yb71{bottom:548.112000pt;} +.yecd{bottom:548.441333pt;} +.y94b{bottom:548.442667pt;} +.y12fb{bottom:548.468000pt;} +.y238{bottom:548.817333pt;} +.yca3{bottom:548.844000pt;} +.y1568{bottom:549.049333pt;} +.yd7a{bottom:549.069333pt;} +.y1495{bottom:549.110667pt;} +.ye39{bottom:549.126667pt;} +.y1a3{bottom:549.241333pt;} +.y1569{bottom:549.248000pt;} +.ycd{bottom:549.273333pt;} +.yf4a{bottom:549.401333pt;} +.ya57{bottom:549.412000pt;} +.yafb{bottom:549.481333pt;} .y2c{bottom:549.641333pt;} -.yfd6{bottom:549.714667pt;} -.ye07{bottom:549.934667pt;} -.yddd{bottom:550.093333pt;} -.y6d4{bottom:550.238667pt;} -.y5a2{bottom:550.380000pt;} -.yab4{bottom:550.460000pt;} -.y1515{bottom:550.500000pt;} -.yc61{bottom:550.578667pt;} -.y105c{bottom:550.621333pt;} -.y10e5{bottom:550.794667pt;} -.ycab{bottom:551.072000pt;} -.y11c8{bottom:551.128000pt;} -.y818{bottom:551.394667pt;} -.y793{bottom:551.457333pt;} -.y99e{bottom:551.701333pt;} -.y1078{bottom:551.712000pt;} -.y4f3{bottom:551.766667pt;} -.y143b{bottom:551.781333pt;} -.y6fb{bottom:551.893333pt;} -.y849{bottom:552.138667pt;} +.yf91{bottom:549.714667pt;} +.ydcb{bottom:549.934667pt;} +.yda1{bottom:550.093333pt;} +.y6bd{bottom:550.238667pt;} +.y590{bottom:550.380000pt;} +.ya87{bottom:550.460000pt;} +.y14b9{bottom:550.500000pt;} +.yc2a{bottom:550.578667pt;} +.y1014{bottom:550.621333pt;} +.y109b{bottom:550.794667pt;} +.yc73{bottom:551.072000pt;} +.y117a{bottom:551.128000pt;} +.y7f9{bottom:551.394667pt;} +.y778{bottom:551.457333pt;} +.y976{bottom:551.701333pt;} +.y1030{bottom:551.712000pt;} +.y4e4{bottom:551.766667pt;} +.y13e2{bottom:551.781333pt;} +.y6e4{bottom:551.893333pt;} +.y828{bottom:552.138667pt;} .y96{bottom:552.297333pt;} -.y1c3{bottom:552.334667pt;} -.y11fb{bottom:552.426667pt;} -.yb7a{bottom:553.148000pt;} -.y973{bottom:553.262667pt;} -.ye99{bottom:553.422667pt;} -.y3f0{bottom:553.489333pt;} -.y1196{bottom:553.626667pt;} -.y14a4{bottom:553.662667pt;} -.ybfc{bottom:553.666667pt;} -.y1306{bottom:553.781333pt;} -.yc3f{bottom:553.836000pt;} -.y1151{bottom:554.050667pt;} -.y728{bottom:554.060000pt;} -.ya85{bottom:554.233333pt;} -.yf67{bottom:554.266667pt;} -.y1476{bottom:554.614667pt;} -.y5d2{bottom:554.652000pt;} -.y69c{bottom:554.816000pt;} -.ya1{bottom:554.954667pt;} -.yf02{bottom:555.232000pt;} -.y3ef{bottom:555.482667pt;} -.y1040{bottom:555.510667pt;} -.y10c2{bottom:555.804000pt;} -.y60e{bottom:556.006667pt;} -.y117f{bottom:556.134667pt;} -.y423{bottom:556.657333pt;} -.y110c{bottom:556.708000pt;} -.y12d6{bottom:556.900000pt;} +.y1be{bottom:552.334667pt;} +.y11ac{bottom:552.426667pt;} +.yb48{bottom:553.148000pt;} +.y94c{bottom:553.262667pt;} +.ye5a{bottom:553.422667pt;} +.y3e6{bottom:553.489333pt;} +.y1149{bottom:553.626667pt;} +.y1449{bottom:553.662667pt;} +.ybc8{bottom:553.666667pt;} +.y12b3{bottom:553.781333pt;} +.yc09{bottom:553.836000pt;} +.y1106{bottom:554.050667pt;} +.y710{bottom:554.060000pt;} +.ya58{bottom:554.233333pt;} +.yf25{bottom:554.266667pt;} +.y141c{bottom:554.614667pt;} +.y5c0{bottom:554.652000pt;} +.y686{bottom:554.816000pt;} +.y284{bottom:554.954667pt;} +.yec1{bottom:555.232000pt;} +.y3e5{bottom:555.482667pt;} +.yff8{bottom:555.510667pt;} +.y1079{bottom:555.804000pt;} +.y5fb{bottom:556.006667pt;} +.y1133{bottom:556.134667pt;} +.y418{bottom:556.657333pt;} +.y10c2{bottom:556.708000pt;} +.y1285{bottom:556.900000pt;} .y6c{bottom:556.946667pt;} -.y1539{bottom:557.012000pt;} -.yd20{bottom:557.134667pt;} -.ya39{bottom:557.345333pt;} -.y113b{bottom:557.466667pt;} -.y82f{bottom:557.777333pt;} -.yfb9{bottom:557.840000pt;} -.yda0{bottom:557.981333pt;} -.y8d8{bottom:558.073333pt;} -.y7b9{bottom:558.192000pt;} -.y76a{bottom:558.282667pt;} -.ybc3{bottom:558.337333pt;} -.y1229{bottom:558.670667pt;} -.y11d{bottom:559.009333pt;} -.y13a5{bottom:559.069333pt;} -.y14ce{bottom:559.150667pt;} -.y1477{bottom:559.434667pt;} -.yd7a{bottom:559.737333pt;} -.y155d{bottom:560.018667pt;} -.yf36{bottom:560.254667pt;} -.ya8{bottom:560.268000pt;} -.y202{bottom:560.298667pt;} -.y15c4{bottom:560.406667pt;} -.yeb8{bottom:560.545333pt;} -.y15c5{bottom:560.606667pt;} -.y1376{bottom:560.618667pt;} -.y523{bottom:560.865333pt;} -.y6d2{bottom:561.358667pt;} -.y895{bottom:561.457333pt;} -.yf5{bottom:561.596000pt;} -.y203{bottom:562.068000pt;} +.y14dc{bottom:557.012000pt;} +.yce7{bottom:557.134667pt;} +.ya0e{bottom:557.345333pt;} +.y10f1{bottom:557.466667pt;} +.y80e{bottom:557.777333pt;} +.yf76{bottom:557.840000pt;} +.yd66{bottom:557.981333pt;} +.y8b4{bottom:558.073333pt;} +.y79d{bottom:558.192000pt;} +.y750{bottom:558.282667pt;} +.yb8f{bottom:558.337333pt;} +.y11da{bottom:558.670667pt;} +.y11e{bottom:559.009333pt;} +.y134e{bottom:559.069333pt;} +.y1473{bottom:559.150667pt;} +.y141d{bottom:559.434667pt;} +.yd40{bottom:559.737333pt;} +.y1500{bottom:560.018667pt;} +.yef4{bottom:560.254667pt;} +.ya7{bottom:560.268000pt;} +.y1fc{bottom:560.298667pt;} +.y1566{bottom:560.406667pt;} +.ye79{bottom:560.545333pt;} +.y1567{bottom:560.606667pt;} +.y1320{bottom:560.618667pt;} +.y513{bottom:560.865333pt;} +.y6bb{bottom:561.358667pt;} +.y873{bottom:561.457333pt;} +.yf8{bottom:561.596000pt;} +.y1fd{bottom:562.068000pt;} .y3d{bottom:562.260000pt;} -.y101f{bottom:562.741333pt;} -.ya60{bottom:562.769333pt;} -.y364{bottom:562.861333pt;} -.y8ba{bottom:563.101333pt;} -.yee3{bottom:563.165333pt;} -.yd49{bottom:563.273333pt;} -.y9eb{bottom:563.469333pt;} -.yadc{bottom:563.690667pt;} -.y550{bottom:564.024000pt;} -.y200{bottom:564.060000pt;} -.ycfd{bottom:564.166667pt;} -.y971{bottom:564.382667pt;} -.y134e{bottom:564.408000pt;} -.y23d{bottom:564.757333pt;} -.ycdb{bottom:564.784000pt;} -.yb54{bottom:564.864000pt;} -.y2e9{bottom:564.888000pt;} -.ydb4{bottom:565.009333pt;} -.ye77{bottom:565.066667pt;} -.ya83{bottom:565.353333pt;} -.yb2a{bottom:565.421333pt;} +.yfd8{bottom:562.741333pt;} +.ya34{bottom:562.769333pt;} +.y35c{bottom:562.861333pt;} +.y897{bottom:563.101333pt;} +.yea3{bottom:563.165333pt;} +.yd10{bottom:563.273333pt;} +.y9c1{bottom:563.469333pt;} +.yaae{bottom:563.690667pt;} +.y53f{bottom:564.024000pt;} +.y1fa{bottom:564.060000pt;} +.ycc4{bottom:564.166667pt;} +.y94a{bottom:564.382667pt;} +.y12f9{bottom:564.408000pt;} +.y237{bottom:564.757333pt;} +.yca2{bottom:564.784000pt;} +.yb23{bottom:564.864000pt;} +.y2e2{bottom:564.888000pt;} +.yd79{bottom:565.009333pt;} +.ye38{bottom:565.066667pt;} +.ya56{bottom:565.353333pt;} +.yafa{bottom:565.421333pt;} .y2b{bottom:565.581333pt;} -.yfd5{bottom:565.654667pt;} -.ye06{bottom:565.874667pt;} -.ycc{bottom:565.909333pt;} -.yddc{bottom:566.033333pt;} -.yffa{bottom:566.228000pt;} -.ye52{bottom:566.285333pt;} -.y5a1{bottom:566.320000pt;} -.yab3{bottom:566.401333pt;} -.y1514{bottom:566.440000pt;} -.yc60{bottom:566.520000pt;} -.y140e{bottom:566.710667pt;} -.y10e4{bottom:566.734667pt;} -.y155{bottom:566.817333pt;} -.ycaa{bottom:567.012000pt;} -.y11c7{bottom:567.068000pt;} -.y817{bottom:567.334667pt;} -.y792{bottom:567.398667pt;} -.y99d{bottom:567.641333pt;} -.y1077{bottom:567.652000pt;} -.y4f2{bottom:567.706667pt;} -.y9c9{bottom:567.790667pt;} -.y848{bottom:568.078667pt;} +.yf90{bottom:565.654667pt;} +.ydca{bottom:565.874667pt;} +.yda0{bottom:566.033333pt;} +.yfb4{bottom:566.228000pt;} +.ye14{bottom:566.285333pt;} +.y58f{bottom:566.320000pt;} +.ya86{bottom:566.401333pt;} +.y14b8{bottom:566.440000pt;} +.yc29{bottom:566.520000pt;} +.y13b5{bottom:566.710667pt;} +.y109a{bottom:566.734667pt;} +.y153{bottom:566.817333pt;} +.yc72{bottom:567.012000pt;} +.y1179{bottom:567.068000pt;} +.y7f8{bottom:567.334667pt;} +.y777{bottom:567.398667pt;} +.y975{bottom:567.641333pt;} +.y102f{bottom:567.652000pt;} +.y4e3{bottom:567.706667pt;} +.y9a0{bottom:567.790667pt;} +.y827{bottom:568.078667pt;} .y95{bottom:568.237333pt;} -.y825{bottom:568.238667pt;} -.y1c2{bottom:568.274667pt;} -.y11fa{bottom:568.366667pt;} -.y1326{bottom:568.721333pt;} -.y201{bottom:568.881333pt;} -.y10a0{bottom:568.884000pt;} -.y143a{bottom:569.049333pt;} -.yb79{bottom:569.088000pt;} -.ye2c{bottom:569.170667pt;} -.y134f{bottom:569.229333pt;} -.ye98{bottom:569.364000pt;} -.y1195{bottom:569.566667pt;} -.ybfb{bottom:569.608000pt;} -.y1305{bottom:569.722667pt;} -.yc3e{bottom:569.776000pt;} -.y3ee{bottom:569.961333pt;} -.y1150{bottom:569.992000pt;} -.yf66{bottom:570.206667pt;} -.y1475{bottom:570.554667pt;} -.y5d1{bottom:570.592000pt;} -.y69b{bottom:570.756000pt;} -.y289{bottom:570.894667pt;} -.yf01{bottom:571.172000pt;} -.y103f{bottom:571.450667pt;} -.y15c3{bottom:571.764000pt;} +.y805{bottom:568.238667pt;} +.y1bd{bottom:568.274667pt;} +.y11ab{bottom:568.366667pt;} +.y12d2{bottom:568.721333pt;} +.y1fb{bottom:568.881333pt;} +.y1057{bottom:568.884000pt;} +.y13e1{bottom:569.049333pt;} +.yb47{bottom:569.088000pt;} +.ydef{bottom:569.170667pt;} +.y12fa{bottom:569.229333pt;} +.ye59{bottom:569.364000pt;} +.y1148{bottom:569.566667pt;} +.ybc7{bottom:569.608000pt;} +.y12b2{bottom:569.722667pt;} +.yc08{bottom:569.776000pt;} +.y3e4{bottom:569.961333pt;} +.y1105{bottom:569.992000pt;} +.yf24{bottom:570.206667pt;} +.y141b{bottom:570.554667pt;} +.y5bf{bottom:570.592000pt;} +.y685{bottom:570.756000pt;} +.y283{bottom:570.894667pt;} +.yec0{bottom:571.172000pt;} +.yff7{bottom:571.450667pt;} +.y1565{bottom:571.764000pt;} .yb{bottom:571.788000pt;} -.y3ed{bottom:571.953333pt;} -.yb07{bottom:571.984000pt;} -.y117e{bottom:572.076000pt;} -.y110b{bottom:572.649333pt;} -.y12d5{bottom:572.840000pt;} +.y3e3{bottom:571.953333pt;} +.yad8{bottom:571.984000pt;} +.y1132{bottom:572.076000pt;} +.y10c1{bottom:572.649333pt;} +.y1284{bottom:572.840000pt;} .y6b{bottom:572.886667pt;} -.y1538{bottom:572.952000pt;} -.yd1f{bottom:573.076000pt;} -.y113a{bottom:573.406667pt;} -.yfb8{bottom:573.780000pt;} -.ya38{bottom:573.817333pt;} -.yd9e{bottom:573.921333pt;} -.y8d7{bottom:574.013333pt;} -.y7b8{bottom:574.133333pt;} -.y769{bottom:574.222667pt;} -.y1228{bottom:574.610667pt;} -.y11c{bottom:574.949333pt;} -.y13a4{bottom:575.009333pt;} -.y14cd{bottom:575.090667pt;} -.yd79{bottom:575.677333pt;} -.yf35{bottom:576.194667pt;} -.ya7{bottom:576.208000pt;} -.y155c{bottom:576.284000pt;} -.yeb7{bottom:576.485333pt;} -.y1375{bottom:576.558667pt;} -.y13ea{bottom:576.648000pt;} -.y522{bottom:576.805333pt;} -.y105b{bottom:576.838667pt;} -.y15c1{bottom:576.878667pt;} -.ya14{bottom:577.152000pt;} -.y894{bottom:577.397333pt;} -.yf4{bottom:577.536000pt;} -.y49e{bottom:577.669333pt;} -.yba3{bottom:577.866667pt;} +.y14db{bottom:572.952000pt;} +.yce6{bottom:573.076000pt;} +.y10f0{bottom:573.406667pt;} +.ya0{bottom:573.552000pt;} +.yf75{bottom:573.780000pt;} +.ya0d{bottom:573.817333pt;} +.yd64{bottom:573.921333pt;} +.y8b3{bottom:574.013333pt;} +.y79c{bottom:574.133333pt;} +.y74f{bottom:574.222667pt;} +.y11d9{bottom:574.610667pt;} +.y11d{bottom:574.949333pt;} +.y134d{bottom:575.009333pt;} +.y1472{bottom:575.090667pt;} +.ycc{bottom:575.208000pt;} +.yd3f{bottom:575.677333pt;} +.yef3{bottom:576.194667pt;} +.yc55{bottom:576.208000pt;} +.y14ff{bottom:576.284000pt;} +.ye78{bottom:576.485333pt;} +.y131f{bottom:576.558667pt;} +.y1391{bottom:576.648000pt;} +.y512{bottom:576.805333pt;} +.y1013{bottom:576.838667pt;} +.y1563{bottom:576.878667pt;} +.y9ea{bottom:577.152000pt;} +.y872{bottom:577.397333pt;} +.yf7{bottom:577.536000pt;} +.y490{bottom:577.669333pt;} +.yb70{bottom:577.866667pt;} .y3c{bottom:578.200000pt;} -.y101e{bottom:578.681333pt;} -.yd9f{bottom:578.742667pt;} -.y8b9{bottom:579.041333pt;} -.yee2{bottom:579.105333pt;} -.yd48{bottom:579.213333pt;} -.ya5f{bottom:579.241333pt;} -.y9ea{bottom:579.409333pt;} -.yadb{bottom:579.630667pt;} -.y13bd{bottom:579.882667pt;} -.y54f{bottom:579.964000pt;} -.y86e{bottom:580.064000pt;} -.ycfc{bottom:580.108000pt;} -.y14a3{bottom:580.230667pt;} -.y5a0{bottom:580.268000pt;} -.y970{bottom:580.322667pt;} -.y134d{bottom:580.349333pt;} -.y5ea{bottom:580.448000pt;} -.ycd9{bottom:580.724000pt;} -.yb53{bottom:580.804000pt;} -.y2e8{bottom:580.828000pt;} -.y3a1{bottom:580.922667pt;} -.ydb3{bottom:580.949333pt;} -.y422{bottom:581.176000pt;} -.y23c{bottom:581.229333pt;} -.ya82{bottom:581.293333pt;} -.yb29{bottom:581.361333pt;} +.yfd7{bottom:578.681333pt;} +.yd65{bottom:578.742667pt;} +.y896{bottom:579.041333pt;} +.yea2{bottom:579.105333pt;} +.yd0f{bottom:579.213333pt;} +.ya33{bottom:579.241333pt;} +.y9c0{bottom:579.409333pt;} +.yaad{bottom:579.630667pt;} +.y1365{bottom:579.882667pt;} +.y53e{bottom:579.964000pt;} +.y84c{bottom:580.064000pt;} +.ycc3{bottom:580.108000pt;} +.y1448{bottom:580.230667pt;} +.y58e{bottom:580.268000pt;} +.y949{bottom:580.322667pt;} +.y12f8{bottom:580.349333pt;} +.y5d7{bottom:580.448000pt;} +.yca0{bottom:580.724000pt;} +.yb22{bottom:580.804000pt;} +.y2e1{bottom:580.828000pt;} +.y398{bottom:580.922667pt;} +.yd78{bottom:580.949333pt;} +.y417{bottom:581.176000pt;} +.y236{bottom:581.229333pt;} +.ya55{bottom:581.293333pt;} +.yaf9{bottom:581.361333pt;} .y2a{bottom:581.521333pt;} -.y4f1{bottom:581.654667pt;} -.ye05{bottom:581.814667pt;} -.yddb{bottom:581.973333pt;} -.y14f0{bottom:582.053333pt;} -.yff9{bottom:582.168000pt;} -.ye51{bottom:582.225333pt;} -.y59f{bottom:582.260000pt;} -.yab2{bottom:582.341333pt;} -.y1513{bottom:582.380000pt;} -.y15c2{bottom:582.390667pt;} -.yc5f{bottom:582.460000pt;} -.y140d{bottom:582.650667pt;} -.y10e3{bottom:582.674667pt;} -.yca9{bottom:582.952000pt;} -.y11c6{bottom:583.009333pt;} -.y816{bottom:583.274667pt;} -.y791{bottom:583.338667pt;} -.y1076{bottom:583.592000pt;} -.y4f0{bottom:583.646667pt;} -.yc7d{bottom:583.724000pt;} -.y9c8{bottom:583.730667pt;} -.y847{bottom:584.018667pt;} +.y4e2{bottom:581.654667pt;} +.ydc9{bottom:581.814667pt;} +.yd9f{bottom:581.973333pt;} +.y1494{bottom:582.053333pt;} +.yfb3{bottom:582.168000pt;} +.ye13{bottom:582.225333pt;} +.y58d{bottom:582.260000pt;} +.ya85{bottom:582.341333pt;} +.y14b7{bottom:582.380000pt;} +.y1564{bottom:582.390667pt;} +.yc28{bottom:582.460000pt;} +.y13b4{bottom:582.650667pt;} +.y1099{bottom:582.674667pt;} +.yc71{bottom:582.952000pt;} +.y1178{bottom:583.009333pt;} +.y7f7{bottom:583.274667pt;} +.y776{bottom:583.338667pt;} +.y102e{bottom:583.592000pt;} +.y4e1{bottom:583.646667pt;} +.yc45{bottom:583.724000pt;} +.y99f{bottom:583.730667pt;} +.y826{bottom:584.018667pt;} .y94{bottom:584.178667pt;} -.y674{bottom:584.214667pt;} -.y11f9{bottom:584.306667pt;} -.y1325{bottom:584.661333pt;} -.y109e{bottom:584.824000pt;} -.yb78{bottom:585.028000pt;} -.ye2b{bottom:585.110667pt;} -.yf0e{bottom:585.142667pt;} -.y1194{bottom:585.506667pt;} -.ycda{bottom:585.545333pt;} -.ybfa{bottom:585.548000pt;} -.y1304{bottom:585.662667pt;} -.yc3d{bottom:585.716000pt;} -.y6fa{bottom:585.857333pt;} -.y114f{bottom:585.932000pt;} -.y1439{bottom:586.318667pt;} -.y3ec{bottom:586.433333pt;} -.ybc2{bottom:586.494667pt;} -.y5d0{bottom:586.532000pt;} -.yf8c{bottom:586.586667pt;} -.y69a{bottom:586.696000pt;} -.y745{bottom:586.834667pt;} -.y155b{bottom:586.912000pt;} -.yf00{bottom:587.112000pt;} -.y103e{bottom:587.390667pt;} -.y1ff{bottom:587.708000pt;} +.y65f{bottom:584.214667pt;} +.y11aa{bottom:584.306667pt;} +.y12d1{bottom:584.661333pt;} +.y1055{bottom:584.824000pt;} +.yb46{bottom:585.028000pt;} +.ydee{bottom:585.110667pt;} +.yecc{bottom:585.142667pt;} +.y1147{bottom:585.506667pt;} +.yca1{bottom:585.545333pt;} +.ybc6{bottom:585.548000pt;} +.y12b1{bottom:585.662667pt;} +.yc07{bottom:585.716000pt;} +.y6e3{bottom:585.857333pt;} +.y1104{bottom:585.932000pt;} +.y13e0{bottom:586.318667pt;} +.y3e2{bottom:586.433333pt;} +.yb8e{bottom:586.494667pt;} +.y5be{bottom:586.532000pt;} +.yf49{bottom:586.586667pt;} +.y684{bottom:586.696000pt;} +.ya6{bottom:586.834667pt;} +.y14fe{bottom:586.912000pt;} +.yebf{bottom:587.112000pt;} +.yff6{bottom:587.390667pt;} +.y1f9{bottom:587.708000pt;} .ya{bottom:587.728000pt;} -.yb06{bottom:587.924000pt;} -.y117d{bottom:588.016000pt;} -.y3eb{bottom:588.425333pt;} -.y110a{bottom:588.589333pt;} -.y12d4{bottom:588.780000pt;} +.yad7{bottom:587.924000pt;} +.y1131{bottom:588.016000pt;} +.y3e1{bottom:588.425333pt;} +.y10c0{bottom:588.589333pt;} +.y1283{bottom:588.780000pt;} .y6a{bottom:588.826667pt;} -.y1537{bottom:588.892000pt;} -.yd1e{bottom:589.016000pt;} -.ya0{bottom:589.492000pt;} -.y109f{bottom:589.645333pt;} -.y1fe{bottom:589.701333pt;} -.yfb7{bottom:589.720000pt;} -.y10c1{bottom:589.769333pt;} -.yd9d{bottom:589.861333pt;} -.y8fb{bottom:589.953333pt;} -.y7b7{bottom:590.073333pt;} -.y768{bottom:590.164000pt;} -.ya37{bottom:590.289333pt;} -.y1227{bottom:590.550667pt;} -.y11b{bottom:590.889333pt;} -.y13a3{bottom:590.949333pt;} -.y727{bottom:591.245333pt;} -.yd78{bottom:591.617333pt;} -.y746{bottom:591.656000pt;} -.ycb{bottom:591.784000pt;} -.y363{bottom:591.956000pt;} -.yf34{bottom:592.134667pt;} -.y1168{bottom:592.148000pt;} -.y99c{bottom:592.160000pt;} -.yeb6{bottom:592.425333pt;} -.y13e9{bottom:592.589333pt;} -.y521{bottom:592.745333pt;} -.y105a{bottom:592.778667pt;} +.y14da{bottom:588.892000pt;} +.yce5{bottom:589.016000pt;} +.y1056{bottom:589.645333pt;} +.y1f8{bottom:589.701333pt;} +.yf74{bottom:589.720000pt;} +.y1078{bottom:589.769333pt;} +.yd63{bottom:589.861333pt;} +.y8d6{bottom:589.953333pt;} +.y79b{bottom:590.073333pt;} +.y74e{bottom:590.164000pt;} +.ya0c{bottom:590.289333pt;} +.y11d8{bottom:590.550667pt;} +.y11c{bottom:590.889333pt;} +.y134c{bottom:590.949333pt;} +.ycb{bottom:591.148000pt;} +.y70f{bottom:591.245333pt;} +.yd3e{bottom:591.617333pt;} +.y72c{bottom:591.656000pt;} +.y35b{bottom:591.956000pt;} +.yef2{bottom:592.134667pt;} +.y111c{bottom:592.148000pt;} +.y974{bottom:592.160000pt;} +.ye77{bottom:592.425333pt;} +.y1390{bottom:592.589333pt;} +.y511{bottom:592.745333pt;} +.y1012{bottom:592.778667pt;} .y1b{bottom:593.066667pt;} -.ya13{bottom:593.092000pt;} -.yf3{bottom:593.477333pt;} -.y15bf{bottom:593.549333pt;} -.y49d{bottom:593.609333pt;} -.yba0{bottom:593.674667pt;} -.y15c0{bottom:593.748000pt;} -.yba2{bottom:593.806667pt;} -.y1a5{bottom:593.873333pt;} +.y9e9{bottom:593.092000pt;} +.yf6{bottom:593.477333pt;} +.y1561{bottom:593.549333pt;} +.y48f{bottom:593.609333pt;} +.yb6d{bottom:593.674667pt;} +.y1562{bottom:593.748000pt;} +.yb6f{bottom:593.806667pt;} +.y1a2{bottom:593.873333pt;} .y3b{bottom:594.141333pt;} -.y101d{bottom:594.621333pt;} -.y2e7{bottom:594.776000pt;} -.y8b8{bottom:594.981333pt;} -.yee1{bottom:595.045333pt;} -.yd47{bottom:595.153333pt;} -.y9e9{bottom:595.350667pt;} -.yada{bottom:595.570667pt;} -.ya5e{bottom:595.713333pt;} -.y13bc{bottom:595.824000pt;} -.y54e{bottom:595.904000pt;} -.y86d{bottom:596.005333pt;} -.ycfb{bottom:596.048000pt;} -.y14a2{bottom:596.170667pt;} -.yf0d{bottom:596.262667pt;} -.y134c{bottom:596.289333pt;} -.ycd8{bottom:596.665333pt;} -.yb52{bottom:596.744000pt;} -.y2e6{bottom:596.768000pt;} -.y126a{bottom:596.830667pt;} -.y3a0{bottom:596.862667pt;} -.ydb2{bottom:596.890667pt;} -.y23b{bottom:597.169333pt;} -.y1c1{bottom:597.369333pt;} +.yfd6{bottom:594.621333pt;} +.y2e0{bottom:594.776000pt;} +.y895{bottom:594.981333pt;} +.yea1{bottom:595.045333pt;} +.yd0e{bottom:595.153333pt;} +.y9bf{bottom:595.350667pt;} +.yaac{bottom:595.570667pt;} +.ya32{bottom:595.713333pt;} +.y1364{bottom:595.824000pt;} +.y53d{bottom:595.904000pt;} +.y84b{bottom:596.005333pt;} +.ycc2{bottom:596.048000pt;} +.y1447{bottom:596.170667pt;} +.yecb{bottom:596.262667pt;} +.y12f7{bottom:596.289333pt;} +.yc9f{bottom:596.665333pt;} +.yb21{bottom:596.744000pt;} +.y2df{bottom:596.768000pt;} +.y121a{bottom:596.830667pt;} +.y397{bottom:596.862667pt;} +.yd77{bottom:596.890667pt;} +.y235{bottom:597.169333pt;} +.y1bc{bottom:597.369333pt;} .y29{bottom:597.461333pt;} -.y155a{bottom:597.538667pt;} -.y4ef{bottom:597.594667pt;} -.ydda{bottom:597.913333pt;} -.yff8{bottom:598.108000pt;} -.ye50{bottom:598.165333pt;} -.yab1{bottom:598.281333pt;} -.y1512{bottom:598.320000pt;} -.y14ef{bottom:598.525333pt;} -.y10e2{bottom:598.616000pt;} -.y288{bottom:598.657333pt;} -.y11c5{bottom:598.949333pt;} -.yf63{bottom:599.032000pt;} -.y815{bottom:599.214667pt;} -.y790{bottom:599.278667pt;} -.y1075{bottom:599.532000pt;} -.y4ee{bottom:599.586667pt;} -.y9c7{bottom:599.670667pt;} +.y14fd{bottom:597.538667pt;} +.y4e0{bottom:597.594667pt;} +.yd9e{bottom:597.913333pt;} +.yfb2{bottom:598.108000pt;} +.ye12{bottom:598.165333pt;} +.ya84{bottom:598.281333pt;} +.y14b6{bottom:598.320000pt;} +.y1493{bottom:598.525333pt;} +.y1098{bottom:598.616000pt;} +.y282{bottom:598.657333pt;} +.y1177{bottom:598.949333pt;} +.yf21{bottom:599.032000pt;} +.y7f6{bottom:599.214667pt;} +.y775{bottom:599.278667pt;} +.y102d{bottom:599.532000pt;} +.y4df{bottom:599.586667pt;} +.y99e{bottom:599.670667pt;} .y93{bottom:600.118667pt;} -.y673{bottom:600.156000pt;} -.y11f8{bottom:600.248000pt;} -.y1324{bottom:600.601333pt;} -.y287{bottom:600.650667pt;} -.y109c{bottom:600.765333pt;} -.yb77{bottom:600.968000pt;} -.y1554{bottom:600.998667pt;} -.ye2a{bottom:601.050667pt;} -.y1193{bottom:601.446667pt;} -.ybf9{bottom:601.488000pt;} -.yc7c{bottom:601.656000pt;} -.y6f9{bottom:601.797333pt;} -.y114e{bottom:601.872000pt;} -.y1438{bottom:602.258667pt;} -.ybc1{bottom:602.434667pt;} -.y5cf{bottom:602.472000pt;} -.yf8b{bottom:602.526667pt;} -.y699{bottom:602.636000pt;} -.ya6{bottom:602.774667pt;} -.y3ea{bottom:602.904000pt;} -.yeff{bottom:603.052000pt;} -.y8d6{bottom:603.108000pt;} -.y103d{bottom:603.332000pt;} -.yb05{bottom:603.864000pt;} -.y140c{bottom:603.904000pt;} -.y117c{bottom:603.956000pt;} -.ye76{bottom:604.270667pt;} -.y1109{bottom:604.529333pt;} -.y12d3{bottom:604.720000pt;} +.y65e{bottom:600.156000pt;} +.y11a9{bottom:600.248000pt;} +.y12d0{bottom:600.601333pt;} +.y281{bottom:600.650667pt;} +.y1053{bottom:600.765333pt;} +.yb45{bottom:600.968000pt;} +.y14f7{bottom:600.998667pt;} +.yded{bottom:601.050667pt;} +.y1146{bottom:601.446667pt;} +.ybc5{bottom:601.488000pt;} +.yc44{bottom:601.656000pt;} +.y6e2{bottom:601.797333pt;} +.y1103{bottom:601.872000pt;} +.y13df{bottom:602.258667pt;} +.yb8d{bottom:602.434667pt;} +.y5bd{bottom:602.472000pt;} +.yf48{bottom:602.526667pt;} +.y683{bottom:602.636000pt;} +.ya5{bottom:602.774667pt;} +.y3e0{bottom:602.904000pt;} +.yebe{bottom:603.052000pt;} +.y8b2{bottom:603.108000pt;} +.yff5{bottom:603.332000pt;} +.yad6{bottom:603.864000pt;} +.y13b3{bottom:603.904000pt;} +.y1130{bottom:603.956000pt;} +.ye37{bottom:604.270667pt;} +.y10bf{bottom:604.529333pt;} +.y1282{bottom:604.720000pt;} .y69{bottom:604.768000pt;} -.y1536{bottom:604.832000pt;} -.y3e9{bottom:604.897333pt;} -.y15bd{bottom:604.906667pt;} -.yd1d{bottom:604.956000pt;} -.ye97{bottom:604.996000pt;} -.y15be{bottom:605.105333pt;} -.y109d{bottom:605.585333pt;} -.yfb6{bottom:605.660000pt;} -.y10c0{bottom:605.709333pt;} -.yd9c{bottom:605.802667pt;} -.yb28{bottom:605.881333pt;} -.y8fa{bottom:605.893333pt;} -.y6d1{bottom:605.990667pt;} -.y1139{bottom:606.298667pt;} -.y1226{bottom:606.490667pt;} -.y11a{bottom:606.829333pt;} -.y13a1{bottom:606.889333pt;} -.y59d{bottom:607.076000pt;} -.y726{bottom:607.185333pt;} -.yca{bottom:607.724000pt;} -.yfd4{bottom:608.088000pt;} -.yeb5{bottom:608.365333pt;} -.y13e8{bottom:608.529333pt;} +.y14d9{bottom:604.832000pt;} +.y3df{bottom:604.897333pt;} +.y155f{bottom:604.906667pt;} +.yce4{bottom:604.956000pt;} +.ye58{bottom:604.996000pt;} +.y1560{bottom:605.105333pt;} +.y1054{bottom:605.585333pt;} +.yf73{bottom:605.660000pt;} +.y1077{bottom:605.709333pt;} +.yd62{bottom:605.802667pt;} +.yaf8{bottom:605.881333pt;} +.y8d5{bottom:605.893333pt;} +.y6ba{bottom:605.990667pt;} +.y10ef{bottom:606.298667pt;} +.y11d7{bottom:606.490667pt;} +.y11b{bottom:606.829333pt;} +.y134a{bottom:606.889333pt;} +.y58b{bottom:607.076000pt;} +.y70e{bottom:607.185333pt;} +.yea{bottom:608.088000pt;} +.ye76{bottom:608.365333pt;} +.y138f{bottom:608.529333pt;} .y1a{bottom:609.006667pt;} -.yc5e{bottom:609.026667pt;} -.ya12{bottom:609.032000pt;} -.y2e5{bottom:609.410667pt;} -.yf2{bottom:609.417333pt;} -.y49c{bottom:609.549333pt;} -.yba1{bottom:609.748000pt;} -.y1559{bottom:610.003189pt;} +.yc27{bottom:609.026667pt;} +.y9e8{bottom:609.032000pt;} +.y2de{bottom:609.410667pt;} +.yf5{bottom:609.417333pt;} +.y48e{bottom:609.549333pt;} +.yb6e{bottom:609.748000pt;} +.y14fc{bottom:610.003189pt;} .y3a{bottom:610.081333pt;} -.y14cc{bottom:610.296000pt;} -.y846{bottom:610.325333pt;} -.ya81{bottom:610.388000pt;} -.y101c{bottom:610.561333pt;} -.y154{bottom:610.745333pt;} -.yee0{bottom:610.985333pt;} -.y1474{bottom:611.013333pt;} -.yd46{bottom:611.093333pt;} -.y9e8{bottom:611.290667pt;} -.y13a2{bottom:611.709333pt;} -.y1374{bottom:611.764000pt;} -.y54d{bottom:611.844000pt;} -.y59e{bottom:611.897333pt;} -.y86c{bottom:611.945333pt;} -.ycfa{bottom:611.988000pt;} -.y14a1{bottom:612.110667pt;} -.ya5d{bottom:612.184000pt;} -.yf0c{bottom:612.202667pt;} -.y134b{bottom:612.229333pt;} -.ycd7{bottom:612.605333pt;} -.y2e3{bottom:612.708000pt;} -.y82e{bottom:612.734667pt;} -.y1269{bottom:612.772000pt;} -.y39f{bottom:612.802667pt;} -.y23a{bottom:613.109333pt;} +.y1471{bottom:610.296000pt;} +.y825{bottom:610.325333pt;} +.ya54{bottom:610.388000pt;} +.yfd5{bottom:610.561333pt;} +.y152{bottom:610.745333pt;} +.yea0{bottom:610.985333pt;} +.y141a{bottom:611.013333pt;} +.yd0d{bottom:611.093333pt;} +.y9be{bottom:611.290667pt;} +.y134b{bottom:611.709333pt;} +.y131e{bottom:611.764000pt;} +.y53c{bottom:611.844000pt;} +.y58c{bottom:611.897333pt;} +.y84a{bottom:611.945333pt;} +.ycc1{bottom:611.988000pt;} +.y1446{bottom:612.110667pt;} +.ya31{bottom:612.184000pt;} +.yeca{bottom:612.202667pt;} +.y12f6{bottom:612.229333pt;} +.yc9e{bottom:612.605333pt;} +.y2dc{bottom:612.708000pt;} +.y80d{bottom:612.734667pt;} +.y1219{bottom:612.772000pt;} +.y396{bottom:612.802667pt;} +.y234{bottom:613.109333pt;} .y28{bottom:613.401333pt;} -.yff6{bottom:614.048000pt;} -.ye4f{bottom:614.105333pt;} -.yab0{bottom:614.221333pt;} -.y1511{bottom:614.260000pt;} -.y10e1{bottom:614.556000pt;} -.y11c4{bottom:614.889333pt;} -.y14ee{bottom:614.996000pt;} -.y286{bottom:615.129333pt;} -.y814{bottom:615.154667pt;} -.y1fd{bottom:615.341333pt;} -.y1074{bottom:615.472000pt;} -.y4ed{bottom:615.528000pt;} -.y824{bottom:616.000000pt;} +.yfb0{bottom:614.048000pt;} +.ye11{bottom:614.105333pt;} +.ya83{bottom:614.221333pt;} +.y14b5{bottom:614.260000pt;} +.y1097{bottom:614.556000pt;} +.y1176{bottom:614.889333pt;} +.y1492{bottom:614.996000pt;} +.y280{bottom:615.129333pt;} +.y7f5{bottom:615.154667pt;} +.y1f7{bottom:615.341333pt;} +.y102c{bottom:615.472000pt;} +.y4de{bottom:615.528000pt;} .y92{bottom:616.058667pt;} -.y672{bottom:616.096000pt;} -.y11f7{bottom:616.188000pt;} -.y15bb{bottom:616.264000pt;} -.y893{bottom:616.424000pt;} -.y15bc{bottom:616.464000pt;} -.y1323{bottom:616.542667pt;} -.y109b{bottom:616.705333pt;} -.yb76{bottom:616.908000pt;} -.y1553{bottom:616.938667pt;} -.ye29{bottom:616.990667pt;} -.y285{bottom:617.121333pt;} -.yf52{bottom:617.230667pt;} -.y96f{bottom:617.240000pt;} -.ya35{bottom:617.386667pt;} -.ybf8{bottom:617.428000pt;} -.y2e4{bottom:617.529333pt;} -.yc7b{bottom:617.596000pt;} -.y6f8{bottom:617.737333pt;} -.yca8{bottom:617.892000pt;} -.y1437{bottom:618.198667pt;} -.y174{bottom:618.316000pt;} -.ybc0{bottom:618.374667pt;} -.y5ce{bottom:618.412000pt;} -.yf8a{bottom:618.466667pt;} -.y698{bottom:618.576000pt;} -.y1059{bottom:618.648000pt;} -.ya5{bottom:618.716000pt;} -.yff7{bottom:618.869333pt;} -.ye04{bottom:618.984000pt;} -.yefe{bottom:618.993333pt;} -.y103c{bottom:619.272000pt;} -.y3e8{bottom:619.376000pt;} -.y1303{bottom:619.741333pt;} -.y140b{bottom:619.844000pt;} -.y117b{bottom:619.896000pt;} -.ye75{bottom:620.210667pt;} -.y1108{bottom:620.469333pt;} -.y1558{bottom:620.567158pt;} -.y12d2{bottom:620.660000pt;} +.y65d{bottom:616.096000pt;} +.y11a8{bottom:616.188000pt;} +.y155d{bottom:616.264000pt;} +.y871{bottom:616.424000pt;} +.y155e{bottom:616.464000pt;} +.y12cf{bottom:616.542667pt;} +.y1052{bottom:616.705333pt;} +.yb44{bottom:616.908000pt;} +.y14f6{bottom:616.938667pt;} +.ydec{bottom:616.990667pt;} +.y27f{bottom:617.121333pt;} +.yf10{bottom:617.230667pt;} +.y948{bottom:617.240000pt;} +.ya0a{bottom:617.386667pt;} +.ybc4{bottom:617.428000pt;} +.y2dd{bottom:617.529333pt;} +.yc43{bottom:617.596000pt;} +.y6e1{bottom:617.737333pt;} +.yc70{bottom:617.892000pt;} +.y13de{bottom:618.198667pt;} +.y171{bottom:618.316000pt;} +.yb8c{bottom:618.374667pt;} +.y5bc{bottom:618.412000pt;} +.yf47{bottom:618.466667pt;} +.y682{bottom:618.576000pt;} +.y1011{bottom:618.648000pt;} +.yfb1{bottom:618.869333pt;} +.ydc8{bottom:618.984000pt;} +.yebd{bottom:618.993333pt;} +.yff4{bottom:619.272000pt;} +.y3de{bottom:619.376000pt;} +.y12b0{bottom:619.741333pt;} +.y13b2{bottom:619.844000pt;} +.y112f{bottom:619.896000pt;} +.ye36{bottom:620.210667pt;} +.y10be{bottom:620.469333pt;} +.y14fb{bottom:620.567158pt;} +.y1281{bottom:620.660000pt;} .y68{bottom:620.708000pt;} -.y1535{bottom:620.772000pt;} -.yd1c{bottom:620.896000pt;} -.ye96{bottom:620.936000pt;} -.y3e7{bottom:621.368000pt;} -.ydb1{bottom:621.409333pt;} -.ye9{bottom:621.598667pt;} -.yfb5{bottom:621.600000pt;} -.y10bf{bottom:621.649333pt;} -.yd9b{bottom:621.742667pt;} -.y8f9{bottom:621.834667pt;} -.y767{bottom:622.044000pt;} -.yad9{bottom:622.137333pt;} -.ya36{bottom:622.208000pt;} -.y1138{bottom:622.238667pt;} -.yc3c{bottom:622.378667pt;} -.y1225{bottom:622.430667pt;} -.y119{bottom:622.769333pt;} -.y13a0{bottom:622.829333pt;} -.y725{bottom:623.125333pt;} -.yfd3{bottom:624.029333pt;} -.y8b7{bottom:624.076000pt;} -.yeb4{bottom:624.306667pt;} -.y13e7{bottom:624.469333pt;} -.yf33{bottom:624.944000pt;} -.y462{bottom:624.958667pt;} -.ya11{bottom:624.972000pt;} -.y2e2{bottom:625.352000pt;} -.yf1{bottom:625.357333pt;} -.yd77{bottom:625.697333pt;} +.y14d8{bottom:620.772000pt;} +.yce3{bottom:620.896000pt;} +.ye57{bottom:620.936000pt;} +.y3dd{bottom:621.368000pt;} +.yd76{bottom:621.409333pt;} +.yec{bottom:621.598667pt;} +.yf72{bottom:621.600000pt;} +.y1076{bottom:621.649333pt;} +.yd61{bottom:621.742667pt;} +.y8d4{bottom:621.834667pt;} +.y74d{bottom:622.044000pt;} +.yaab{bottom:622.137333pt;} +.ya0b{bottom:622.208000pt;} +.y10ee{bottom:622.238667pt;} +.yc06{bottom:622.378667pt;} +.y11d6{bottom:622.430667pt;} +.y11a{bottom:622.769333pt;} +.y1349{bottom:622.829333pt;} +.y70d{bottom:623.125333pt;} +.yf8f{bottom:624.029333pt;} +.y894{bottom:624.076000pt;} +.ye75{bottom:624.306667pt;} +.yca{bottom:624.417333pt;} +.y138e{bottom:624.469333pt;} +.yef1{bottom:624.944000pt;} +.y456{bottom:624.958667pt;} +.y9e7{bottom:624.972000pt;} +.y2db{bottom:625.352000pt;} +.yf4{bottom:625.357333pt;} +.yd3d{bottom:625.697333pt;} .y39{bottom:626.021333pt;} -.yb9f{bottom:626.218667pt;} -.y14cb{bottom:626.236000pt;} -.y845{bottom:626.266667pt;} -.y361{bottom:626.585333pt;} -.y153{bottom:626.685333pt;} -.y78f{bottom:626.720000pt;} -.yd44{bottom:627.034667pt;} -.y15b9{bottom:627.621333pt;} -.y1373{bottom:627.704000pt;} -.y15ba{bottom:627.821333pt;} -.y86b{bottom:627.885333pt;} -.ycf8{bottom:627.928000pt;} -.yf0b{bottom:628.142667pt;} -.y134a{bottom:628.169333pt;} -.y360{bottom:628.216000pt;} -.ycd6{bottom:628.545333pt;} -.y35e{bottom:628.577333pt;} -.y2e0{bottom:628.648000pt;} -.ya5c{bottom:628.656000pt;} -.y82d{bottom:628.674667pt;} -.y39e{bottom:628.742667pt;} -.y239{bottom:629.049333pt;} -.y421{bottom:629.169333pt;} +.yb6c{bottom:626.218667pt;} +.y1470{bottom:626.236000pt;} +.y824{bottom:626.266667pt;} +.y359{bottom:626.585333pt;} +.y151{bottom:626.685333pt;} +.y774{bottom:626.720000pt;} +.yd0b{bottom:627.034667pt;} +.y155b{bottom:627.621333pt;} +.y131d{bottom:627.704000pt;} +.y155c{bottom:627.821333pt;} +.y849{bottom:627.885333pt;} +.ycbf{bottom:627.928000pt;} +.yec9{bottom:628.142667pt;} +.y12f5{bottom:628.169333pt;} +.y358{bottom:628.216000pt;} +.yc9d{bottom:628.545333pt;} +.y356{bottom:628.577333pt;} +.y2d9{bottom:628.648000pt;} +.ya30{bottom:628.656000pt;} +.y80c{bottom:628.674667pt;} +.y395{bottom:628.742667pt;} +.y233{bottom:629.049333pt;} +.y416{bottom:629.169333pt;} .y27{bottom:629.342667pt;} -.y35f{bottom:629.544000pt;} -.y35d{bottom:629.905333pt;} -.yff5{bottom:629.988000pt;} -.ye4e{bottom:630.045333pt;} -.y1510{bottom:630.201333pt;} -.y6b8{bottom:630.433333pt;} -.y10e0{bottom:630.496000pt;} -.y59c{bottom:630.776000pt;} -.y813{bottom:631.096000pt;} -.y114c{bottom:631.333333pt;} -.y7b6{bottom:631.400000pt;} -.y14ed{bottom:631.468000pt;} -.y284{bottom:631.601333pt;} -.y520{bottom:631.792000pt;} -.yd45{bottom:631.854667pt;} +.y357{bottom:629.544000pt;} +.y355{bottom:629.905333pt;} +.yfaf{bottom:629.988000pt;} +.ye10{bottom:630.045333pt;} +.y14b4{bottom:630.201333pt;} +.y6a1{bottom:630.433333pt;} +.y1096{bottom:630.496000pt;} +.y58a{bottom:630.776000pt;} +.y7f4{bottom:631.096000pt;} +.y79a{bottom:631.400000pt;} +.y1491{bottom:631.468000pt;} +.y27e{bottom:631.601333pt;} +.y510{bottom:631.792000pt;} +.yd0c{bottom:631.854667pt;} .y91{bottom:631.998667pt;} -.y11f5{bottom:632.128000pt;} -.y892{bottom:632.364000pt;} -.y1322{bottom:632.482667pt;} -.y109a{bottom:632.645333pt;} -.ycf9{bottom:632.748000pt;} -.y59b{bottom:632.768000pt;} -.yb74{bottom:632.849333pt;} -.ye28{bottom:632.930667pt;} -.y96e{bottom:633.180000pt;} -.ya34{bottom:633.326667pt;} -.ybf7{bottom:633.368000pt;} -.y2e1{bottom:633.469333pt;} -.yc7a{bottom:633.536000pt;} -.y283{bottom:633.593333pt;} -.y9c6{bottom:633.636000pt;} -.y6f7{bottom:633.678667pt;} -.yca7{bottom:633.832000pt;} -.ybbf{bottom:634.314667pt;} -.y5cd{bottom:634.352000pt;} -.yf89{bottom:634.406667pt;} -.y697{bottom:634.516000pt;} -.y1058{bottom:634.588000pt;} -.y1557{bottom:634.827854pt;} -.ye03{bottom:634.924000pt;} -.yefd{bottom:634.933333pt;} -.yb51{bottom:635.413333pt;} -.y1436{bottom:635.468000pt;} -.yc5d{bottom:635.593333pt;} -.y9e7{bottom:635.809333pt;} -.y114d{bottom:635.836000pt;} -.y3e6{bottom:635.848000pt;} -.ye74{bottom:636.152000pt;} -.y54c{bottom:636.362667pt;} -.y12d1{bottom:636.601333pt;} +.y11a6{bottom:632.128000pt;} +.y870{bottom:632.364000pt;} +.y12ce{bottom:632.482667pt;} +.y1051{bottom:632.645333pt;} +.ycc0{bottom:632.748000pt;} +.y589{bottom:632.768000pt;} +.yb42{bottom:632.849333pt;} +.ydeb{bottom:632.930667pt;} +.y947{bottom:633.180000pt;} +.ya09{bottom:633.326667pt;} +.ybc3{bottom:633.368000pt;} +.y2da{bottom:633.469333pt;} +.yc42{bottom:633.536000pt;} +.y27d{bottom:633.593333pt;} +.y99d{bottom:633.636000pt;} +.y6e0{bottom:633.678667pt;} +.yc6f{bottom:633.832000pt;} +.yb8b{bottom:634.314667pt;} +.y5bb{bottom:634.352000pt;} +.yf46{bottom:634.406667pt;} +.y681{bottom:634.516000pt;} +.y1010{bottom:634.588000pt;} +.ye9{bottom:634.656000pt;} +.y14fa{bottom:634.827854pt;} +.ydc7{bottom:634.924000pt;} +.yebc{bottom:634.933333pt;} +.yb20{bottom:635.413333pt;} +.y13dd{bottom:635.468000pt;} +.yc26{bottom:635.593333pt;} +.y9bd{bottom:635.809333pt;} +.y1102{bottom:635.836000pt;} +.y3dc{bottom:635.848000pt;} +.ye35{bottom:636.152000pt;} +.y53b{bottom:636.362667pt;} +.y1280{bottom:636.601333pt;} .y67{bottom:636.648000pt;} -.y49b{bottom:636.781333pt;} -.yd1b{bottom:636.836000pt;} -.ye95{bottom:636.876000pt;} -.y11f6{bottom:636.948000pt;} -.y1242{bottom:637.213333pt;} -.yfb4{bottom:637.541333pt;} -.y10be{bottom:637.589333pt;} -.yb75{bottom:637.669333pt;} -.yd9a{bottom:637.682667pt;} -.y8f8{bottom:637.774667pt;} -.y3e5{bottom:637.840000pt;} -.y766{bottom:637.984000pt;} -.y1137{bottom:638.178667pt;} -.yc3b{bottom:638.318667pt;} -.y1224{bottom:638.372000pt;} -.y14a0{bottom:638.677333pt;} -.y118{bottom:638.710667pt;} -.y139e{bottom:638.769333pt;} -.y49a{bottom:638.773333pt;} -.yc27{bottom:638.850667pt;} -.y15b7{bottom:638.978667pt;} -.y724{bottom:639.065333pt;} -.y15b8{bottom:639.178667pt;} -.yfd2{bottom:639.969333pt;} -.y1fc{bottom:640.054667pt;} -.ydd9{bottom:640.346667pt;} -.yc9{bottom:640.878667pt;} -.yf32{bottom:640.884000pt;} -.y461{bottom:640.898667pt;} -.ya10{bottom:640.913333pt;} -.y2df{bottom:641.292000pt;} -.yf0{bottom:641.297333pt;} +.y48d{bottom:636.781333pt;} +.yce2{bottom:636.836000pt;} +.ye56{bottom:636.876000pt;} +.y11a7{bottom:636.948000pt;} +.y11f2{bottom:637.213333pt;} +.ya4{bottom:637.312000pt;} +.yf71{bottom:637.541333pt;} +.y1075{bottom:637.589333pt;} +.yb43{bottom:637.669333pt;} +.yd60{bottom:637.682667pt;} +.y8d3{bottom:637.774667pt;} +.y3db{bottom:637.840000pt;} +.y74c{bottom:637.984000pt;} +.y10ed{bottom:638.178667pt;} +.yc05{bottom:638.318667pt;} +.y11d5{bottom:638.372000pt;} +.y1445{bottom:638.677333pt;} +.y119{bottom:638.710667pt;} +.y1347{bottom:638.769333pt;} +.y48c{bottom:638.773333pt;} +.ybf2{bottom:638.850667pt;} +.y1559{bottom:638.978667pt;} +.y70c{bottom:639.065333pt;} +.y155a{bottom:639.178667pt;} +.yf8e{bottom:639.969333pt;} +.y1f6{bottom:640.054667pt;} +.yd9d{bottom:640.346667pt;} +.yc9{bottom:640.357333pt;} +.yef0{bottom:640.884000pt;} +.y455{bottom:640.898667pt;} +.y9e6{bottom:640.913333pt;} +.y2d8{bottom:641.292000pt;} +.yf3{bottom:641.297333pt;} .y38{bottom:641.961333pt;} -.y32b{bottom:642.000000pt;} -.yb9c{bottom:642.026667pt;} -.y35c{bottom:642.097333pt;} -.yb9e{bottom:642.158667pt;} -.y14ca{bottom:642.176000pt;} -.y844{bottom:642.206667pt;} -.yb03{bottom:642.534667pt;} -.y152{bottom:642.625333pt;} -.y78e{bottom:642.660000pt;} -.yd43{bottom:642.974667pt;} -.y1552{bottom:643.505333pt;} -.y139f{bottom:643.590667pt;} -.y1372{bottom:643.644000pt;} -.y86a{bottom:643.825333pt;} -.ycf7{bottom:643.868000pt;} -.yf0a{bottom:644.082667pt;} -.y1349{bottom:644.109333pt;} -.y12ee{bottom:644.184000pt;} -.ycd5{bottom:644.485333pt;} -.y2dd{bottom:644.589333pt;} -.y82c{bottom:644.614667pt;} -.y39d{bottom:644.682667pt;} -.y238{bottom:644.990667pt;} -.y420{bottom:645.109333pt;} -.y671{bottom:645.190667pt;} +.yb69{bottom:642.026667pt;} +.y354{bottom:642.097333pt;} +.yb6b{bottom:642.158667pt;} +.y146f{bottom:642.176000pt;} +.y823{bottom:642.206667pt;} +.yad4{bottom:642.534667pt;} +.y150{bottom:642.625333pt;} +.y773{bottom:642.660000pt;} +.yd0a{bottom:642.974667pt;} +.y14f5{bottom:643.505333pt;} +.y1348{bottom:643.590667pt;} +.y131c{bottom:643.644000pt;} +.y848{bottom:643.825333pt;} +.ycbe{bottom:643.868000pt;} +.yec8{bottom:644.082667pt;} +.y12f4{bottom:644.109333pt;} +.y129b{bottom:644.184000pt;} +.yc9c{bottom:644.485333pt;} +.y2d6{bottom:644.589333pt;} +.y80b{bottom:644.614667pt;} +.y394{bottom:644.682667pt;} +.y232{bottom:644.990667pt;} +.y415{bottom:645.109333pt;} +.y65c{bottom:645.190667pt;} .y26{bottom:645.282667pt;} -.y1534{bottom:645.292000pt;} -.y1556{bottom:645.391823pt;} -.y362{bottom:645.684000pt;} -.yff4{bottom:645.929333pt;} -.ye4d{bottom:645.986667pt;} -.y150f{bottom:646.141333pt;} -.y99b{bottom:646.189333pt;} -.y140a{bottom:646.412000pt;} -.y10df{bottom:646.436000pt;} -.y812{bottom:647.036000pt;} -.y7b5{bottom:647.340000pt;} -.yb04{bottom:647.354667pt;} -.y35b{bottom:647.676000pt;} -.y51f{bottom:647.732000pt;} +.y14d7{bottom:645.292000pt;} +.y14f9{bottom:645.391823pt;} +.y35a{bottom:645.684000pt;} +.yfae{bottom:645.929333pt;} +.ye0f{bottom:645.986667pt;} +.y14b3{bottom:646.141333pt;} +.y973{bottom:646.189333pt;} +.y13b1{bottom:646.412000pt;} +.y1095{bottom:646.436000pt;} +.y7f3{bottom:647.036000pt;} +.y799{bottom:647.340000pt;} +.yad5{bottom:647.354667pt;} +.y353{bottom:647.676000pt;} +.y50f{bottom:647.732000pt;} .y90{bottom:647.938667pt;} -.y14ec{bottom:647.940000pt;} -.y11f4{bottom:648.068000pt;} -.y282{bottom:648.072000pt;} -.ya5b{bottom:648.316000pt;} -.y1098{bottom:648.585333pt;} -.yad8{bottom:648.705333pt;} -.yb73{bottom:648.789333pt;} -.ye27{bottom:648.872000pt;} -.yaaf{bottom:648.910667pt;} -.y96d{bottom:649.120000pt;} -.ya33{bottom:649.268000pt;} -.ybf6{bottom:649.309333pt;} -.y2de{bottom:649.409333pt;} -.yc79{bottom:649.477333pt;} -.y9c5{bottom:649.576000pt;} -.y6f6{bottom:649.618667pt;} -.yb27{bottom:649.652000pt;} -.y281{bottom:650.065333pt;} -.y15b5{bottom:650.336000pt;} -.yf88{bottom:650.348000pt;} -.y696{bottom:650.457333pt;} -.y15b6{bottom:650.536000pt;} -.ye7{bottom:650.596000pt;} -.ye02{bottom:650.864000pt;} -.yefc{bottom:650.873333pt;} -.yb50{bottom:651.353333pt;} -.y1435{bottom:651.408000pt;} -.yc5c{bottom:651.534667pt;} -.y8d5{bottom:651.776000pt;} -.y1454{bottom:651.777333pt;} -.y101b{bottom:651.888000pt;} -.ye73{bottom:652.092000pt;} -.y12d0{bottom:652.541333pt;} +.y1490{bottom:647.940000pt;} +.y11a5{bottom:648.068000pt;} +.y27c{bottom:648.072000pt;} +.ya2f{bottom:648.316000pt;} +.y104f{bottom:648.585333pt;} +.yaaa{bottom:648.705333pt;} +.yb41{bottom:648.789333pt;} +.ydea{bottom:648.872000pt;} +.ya82{bottom:648.910667pt;} +.y946{bottom:649.120000pt;} +.ya08{bottom:649.268000pt;} +.ybc2{bottom:649.309333pt;} +.y2d7{bottom:649.409333pt;} +.yc41{bottom:649.477333pt;} +.y99c{bottom:649.576000pt;} +.y6df{bottom:649.618667pt;} +.yaf7{bottom:649.652000pt;} +.y27b{bottom:650.065333pt;} +.y1557{bottom:650.336000pt;} +.yf45{bottom:650.348000pt;} +.y680{bottom:650.457333pt;} +.y1558{bottom:650.536000pt;} +.y9f{bottom:650.596000pt;} +.ydc6{bottom:650.864000pt;} +.yebb{bottom:650.873333pt;} +.yb1f{bottom:651.353333pt;} +.y13dc{bottom:651.408000pt;} +.yc25{bottom:651.534667pt;} +.y8b1{bottom:651.776000pt;} +.y13fb{bottom:651.777333pt;} +.yfd4{bottom:651.888000pt;} +.ye34{bottom:652.092000pt;} +.y127f{bottom:652.541333pt;} .y66{bottom:652.588000pt;} -.y499{bottom:652.721333pt;} -.yd1a{bottom:652.776000pt;} -.yc26{bottom:652.797333pt;} -.y1107{bottom:653.105333pt;} -.ydb0{bottom:653.160000pt;} -.y1473{bottom:653.234667pt;} -.ya4{bottom:653.252000pt;} -.y1099{bottom:653.406667pt;} -.yfb3{bottom:653.481333pt;} -.y10bd{bottom:653.529333pt;} -.yd99{bottom:653.622667pt;} -.y13e6{bottom:653.693333pt;} -.y765{bottom:653.924000pt;} -.y1136{bottom:654.118667pt;} -.y3e4{bottom:654.312000pt;} -.y149f{bottom:654.617333pt;} -.y139d{bottom:654.710667pt;} -.y498{bottom:654.713333pt;} -.yc25{bottom:654.790667pt;} -.y723{bottom:655.005333pt;} -.yd76{bottom:655.452000pt;} -.y1321{bottom:655.522667pt;} -.yfd1{bottom:655.909333pt;} -.y1fb{bottom:655.996000pt;} -.ydd8{bottom:656.288000pt;} -.y59a{bottom:656.466667pt;} -.y1555{bottom:656.484654pt;} -.yc8{bottom:656.818667pt;} -.yf31{bottom:656.824000pt;} -.y460{bottom:656.838667pt;} -.ya0f{bottom:656.853333pt;} -.y2dc{bottom:657.232000pt;} -.yef{bottom:657.237333pt;} -.y103b{bottom:657.429333pt;} -.y1073{bottom:657.905333pt;} -.yb9d{bottom:658.100000pt;} -.y14c9{bottom:658.116000pt;} -.y843{bottom:658.146667pt;} -.yedf{bottom:658.160000pt;} -.y599{bottom:658.460000pt;} -.yb02{bottom:658.474667pt;} -.y151{bottom:658.565333pt;} -.y78d{bottom:658.600000pt;} -.yd42{bottom:658.914667pt;} -.y1057{bottom:659.106667pt;} -.y1551{bottom:659.445333pt;} -.y11c3{bottom:659.521333pt;} -.y1371{bottom:659.584000pt;} -.y869{bottom:659.765333pt;} -.ycf6{bottom:659.808000pt;} -.yf09{bottom:660.024000pt;} -.y1348{bottom:660.050667pt;} -.y4ec{bottom:660.160000pt;} -.ycd4{bottom:660.425333pt;} -.y2da{bottom:660.529333pt;} -.y82b{bottom:660.554667pt;} -.y39c{bottom:660.622667pt;} -.y237{bottom:660.930667pt;} +.y48b{bottom:652.721333pt;} +.yce1{bottom:652.776000pt;} +.ybf1{bottom:652.797333pt;} +.y10bd{bottom:653.105333pt;} +.yd75{bottom:653.160000pt;} +.y1419{bottom:653.234667pt;} +.ya3{bottom:653.252000pt;} +.y1050{bottom:653.406667pt;} +.yf70{bottom:653.481333pt;} +.y1074{bottom:653.529333pt;} +.yd5f{bottom:653.622667pt;} +.y138d{bottom:653.693333pt;} +.y74b{bottom:653.924000pt;} +.y10ec{bottom:654.118667pt;} +.y3da{bottom:654.312000pt;} +.y1444{bottom:654.617333pt;} +.y1346{bottom:654.710667pt;} +.y48a{bottom:654.713333pt;} +.ybf0{bottom:654.790667pt;} +.y70b{bottom:655.005333pt;} +.yd3c{bottom:655.452000pt;} +.y12cd{bottom:655.522667pt;} +.yf8d{bottom:655.909333pt;} +.y1f5{bottom:655.996000pt;} +.yd9c{bottom:656.288000pt;} +.yc8{bottom:656.298667pt;} +.y588{bottom:656.466667pt;} +.y14f8{bottom:656.484654pt;} +.yeef{bottom:656.824000pt;} +.y454{bottom:656.838667pt;} +.y9e5{bottom:656.853333pt;} +.y2d5{bottom:657.232000pt;} +.yf2{bottom:657.237333pt;} +.yff3{bottom:657.429333pt;} +.y102b{bottom:657.905333pt;} +.yb6a{bottom:658.100000pt;} +.y146e{bottom:658.116000pt;} +.y822{bottom:658.146667pt;} +.ye9f{bottom:658.160000pt;} +.y587{bottom:658.460000pt;} +.yad3{bottom:658.474667pt;} +.y14f{bottom:658.565333pt;} +.y772{bottom:658.600000pt;} +.yd09{bottom:658.914667pt;} +.y100f{bottom:659.106667pt;} +.y14f4{bottom:659.445333pt;} +.y1175{bottom:659.521333pt;} +.y131b{bottom:659.584000pt;} +.y847{bottom:659.765333pt;} +.ycbd{bottom:659.808000pt;} +.yec7{bottom:660.024000pt;} +.y12f3{bottom:660.050667pt;} +.y4dd{bottom:660.160000pt;} +.yc9b{bottom:660.425333pt;} +.y2d3{bottom:660.529333pt;} +.y80a{bottom:660.554667pt;} +.y393{bottom:660.622667pt;} +.y231{bottom:660.930667pt;} .y25{bottom:661.222667pt;} -.ye94{bottom:661.394667pt;} -.y15b3{bottom:661.693333pt;} -.y15b4{bottom:661.893333pt;} -.y150e{bottom:662.081333pt;} -.y3e3{bottom:662.281333pt;} -.y1409{bottom:662.352000pt;} -.y10de{bottom:662.376000pt;} +.ye55{bottom:661.394667pt;} +.y1555{bottom:661.693333pt;} +.y1556{bottom:661.893333pt;} +.y14b2{bottom:662.081333pt;} +.y3d9{bottom:662.281333pt;} +.y13b0{bottom:662.352000pt;} +.y1094{bottom:662.376000pt;} .y19{bottom:662.741333pt;} -.yc3a{bottom:662.760000pt;} -.y811{bottom:662.976000pt;} -.y117{bottom:663.229333pt;} -.y7b4{bottom:663.280000pt;} -.yd74{bottom:663.289333pt;} -.ybbe{bottom:663.409333pt;} -.y51e{bottom:663.672000pt;} +.yc04{bottom:662.760000pt;} +.y7f2{bottom:662.976000pt;} +.y118{bottom:663.229333pt;} +.y798{bottom:663.280000pt;} +.yd3a{bottom:663.289333pt;} +.yb8a{bottom:663.409333pt;} +.y50e{bottom:663.672000pt;} .y8f{bottom:663.878667pt;} -.y744{bottom:663.880000pt;} -.y11f3{bottom:664.008000pt;} -.ya5a{bottom:664.256000pt;} -.y14eb{bottom:664.410667pt;} -.y1097{bottom:664.525333pt;} -.y280{bottom:664.544000pt;} -.yb72{bottom:664.729333pt;} -.ye26{bottom:664.812000pt;} -.yaae{bottom:664.850667pt;} -.y96c{bottom:665.060000pt;} -.ya32{bottom:665.208000pt;} -.y2db{bottom:665.349333pt;} -.yc78{bottom:665.417333pt;} -.y9c4{bottom:665.516000pt;} -.y6f5{bottom:665.558667pt;} -.yb26{bottom:665.592000pt;} -.yeb3{bottom:665.633333pt;} -.y891{bottom:665.873333pt;} -.y695{bottom:666.397333pt;} -.y9f{bottom:666.536000pt;} -.ye01{bottom:666.805333pt;} -.yefb{bottom:666.813333pt;} -.y8f7{bottom:666.869333pt;} -.yb4e{bottom:667.294667pt;} -.y8b6{bottom:667.345333pt;} -.y1434{bottom:667.348000pt;} -.y8d4{bottom:667.717333pt;} -.y101a{bottom:667.829333pt;} -.ye72{bottom:668.032000pt;} -.y12cf{bottom:668.481333pt;} -.y497{bottom:668.661333pt;} -.yd19{bottom:668.717333pt;} -.y1106{bottom:669.045333pt;} -.y1472{bottom:669.174667pt;} -.ya3{bottom:669.193333pt;} -.yfb2{bottom:669.421333pt;} -.y10bc{bottom:669.470667pt;} -.y5cc{bottom:669.557333pt;} -.y13e5{bottom:669.633333pt;} -.y764{bottom:669.865333pt;} -.y1135{bottom:670.058667pt;} -.y3e1{bottom:670.252000pt;} -.y149e{bottom:670.558667pt;} -.y995{bottom:670.630667pt;} -.y496{bottom:670.654667pt;} -.yc24{bottom:670.730667pt;} +.y72b{bottom:663.880000pt;} +.y11a4{bottom:664.008000pt;} +.ya2e{bottom:664.256000pt;} +.y148f{bottom:664.410667pt;} +.y104e{bottom:664.525333pt;} +.y27a{bottom:664.544000pt;} +.yb40{bottom:664.729333pt;} +.yde9{bottom:664.812000pt;} +.ya81{bottom:664.850667pt;} +.y945{bottom:665.060000pt;} +.ya07{bottom:665.208000pt;} +.y2d4{bottom:665.349333pt;} +.yc40{bottom:665.417333pt;} +.y99b{bottom:665.516000pt;} +.y6de{bottom:665.558667pt;} +.yaf6{bottom:665.592000pt;} +.ye74{bottom:665.633333pt;} +.y86f{bottom:665.873333pt;} +.y67f{bottom:666.397333pt;} +.y279{bottom:666.536000pt;} +.ydc5{bottom:666.805333pt;} +.yeba{bottom:666.813333pt;} +.y8d2{bottom:666.869333pt;} +.yb1d{bottom:667.294667pt;} +.y893{bottom:667.345333pt;} +.y13db{bottom:667.348000pt;} +.y8b0{bottom:667.717333pt;} +.yfd3{bottom:667.829333pt;} +.ye33{bottom:668.032000pt;} +.y127e{bottom:668.481333pt;} +.y489{bottom:668.661333pt;} +.yce0{bottom:668.717333pt;} +.y10bc{bottom:669.045333pt;} +.y1418{bottom:669.174667pt;} +.yf6f{bottom:669.421333pt;} +.y1073{bottom:669.470667pt;} +.y5ba{bottom:669.557333pt;} +.y138c{bottom:669.633333pt;} +.y74a{bottom:669.865333pt;} +.y10eb{bottom:670.058667pt;} +.y3d7{bottom:670.252000pt;} +.y1443{bottom:670.558667pt;} +.y96d{bottom:670.630667pt;} +.y488{bottom:670.654667pt;} +.ybef{bottom:670.730667pt;} .y37{bottom:671.185333pt;} -.yd75{bottom:671.392000pt;} -.y1fa{bottom:671.936000pt;} -.ya80{bottom:672.085333pt;} -.yb4f{bottom:672.114667pt;} -.ydd7{bottom:672.228000pt;} -.yf30{bottom:672.765333pt;} -.y45f{bottom:672.780000pt;} -.y1320{bottom:672.790667pt;} -.ya0e{bottom:672.793333pt;} -.y359{bottom:672.914667pt;} -.y9e6{bottom:672.993333pt;} -.y2d9{bottom:673.172000pt;} -.yee{bottom:673.177333pt;} -.y103a{bottom:673.369333pt;} -.y1072{bottom:673.846667pt;} -.y14c8{bottom:674.056000pt;} -.yede{bottom:674.100000pt;} -.yb01{bottom:674.414667pt;} -.y150{bottom:674.506667pt;} -.y78c{bottom:674.540000pt;} -.yb9a{bottom:674.570667pt;} -.yb9b{bottom:674.704000pt;} -.yd41{bottom:674.854667pt;} -.yf87{bottom:674.866667pt;} -.y358{bottom:674.908000pt;} -.yad7{bottom:675.272000pt;} -.y13b5{bottom:675.333333pt;} -.ybf5{bottom:675.437333pt;} -.y1370{bottom:675.525333pt;} -.y868{bottom:675.706667pt;} -.ycf5{bottom:675.749333pt;} -.yf08{bottom:675.964000pt;} -.yc5b{bottom:676.053333pt;} -.y4eb{bottom:676.100000pt;} +.yd3b{bottom:671.392000pt;} +.y1f4{bottom:671.936000pt;} +.ya53{bottom:672.085333pt;} +.yb1e{bottom:672.114667pt;} +.yd9b{bottom:672.228000pt;} +.yeee{bottom:672.765333pt;} +.y453{bottom:672.780000pt;} +.y12cc{bottom:672.790667pt;} +.y9e4{bottom:672.793333pt;} +.y351{bottom:672.914667pt;} +.y9bc{bottom:672.993333pt;} +.y2d2{bottom:673.172000pt;} +.yf1{bottom:673.177333pt;} +.yff2{bottom:673.369333pt;} +.y102a{bottom:673.846667pt;} +.y146d{bottom:674.056000pt;} +.ye9e{bottom:674.100000pt;} +.yad2{bottom:674.414667pt;} +.y14e{bottom:674.506667pt;} +.y771{bottom:674.540000pt;} +.yb67{bottom:674.570667pt;} +.yb68{bottom:674.704000pt;} +.yd08{bottom:674.854667pt;} +.yf44{bottom:674.866667pt;} +.y350{bottom:674.908000pt;} +.yaa9{bottom:675.272000pt;} +.ybc1{bottom:675.437333pt;} +.y131a{bottom:675.525333pt;} +.y846{bottom:675.706667pt;} +.ycbc{bottom:675.749333pt;} +.yec6{bottom:675.964000pt;} +.yc24{bottom:676.053333pt;} +.y4dc{bottom:676.100000pt;} .y18{bottom:676.108000pt;} -.y357{bottom:676.236000pt;} -.y15b2{bottom:676.238667pt;} -.y2d7{bottom:676.469333pt;} -.y82a{bottom:676.494667pt;} +.y34f{bottom:676.236000pt;} +.y1554{bottom:676.238667pt;} +.y2d0{bottom:676.469333pt;} +.y809{bottom:676.494667pt;} .y24{bottom:677.162667pt;} -.y236{bottom:677.401333pt;} -.y150d{bottom:678.021333pt;} -.y1408{bottom:678.292000pt;} -.y10dd{bottom:678.317333pt;} +.y230{bottom:677.401333pt;} +.y14b1{bottom:678.021333pt;} +.y13af{bottom:678.292000pt;} +.y1093{bottom:678.317333pt;} .y17{bottom:678.682667pt;} -.y810{bottom:678.916000pt;} -.y7b3{bottom:679.220000pt;} -.y139c{bottom:679.229333pt;} -.y51d{bottom:679.613333pt;} +.y7f1{bottom:678.916000pt;} +.y797{bottom:679.220000pt;} +.y1345{bottom:679.229333pt;} +.y50d{bottom:679.613333pt;} .y8e{bottom:679.820000pt;} -.yff3{bottom:679.893333pt;} -.y11f2{bottom:679.949333pt;} -.yca6{bottom:680.066667pt;} -.y41e{bottom:680.314667pt;} -.yb71{bottom:680.669333pt;} -.ye25{bottom:680.752000pt;} -.yaad{bottom:680.790667pt;} -.y14ea{bottom:680.882667pt;} -.y96b{bottom:681.000000pt;} -.y27f{bottom:681.016000pt;} -.ya31{bottom:681.148000pt;} -.y2d8{bottom:681.289333pt;} -.yc77{bottom:681.357333pt;} -.y9c3{bottom:681.456000pt;} -.y6f4{bottom:681.498667pt;} -.yb25{bottom:681.532000pt;} -.yeb2{bottom:681.573333pt;} +.yfad{bottom:679.893333pt;} +.y11a3{bottom:679.949333pt;} +.yc6e{bottom:680.066667pt;} +.y413{bottom:680.314667pt;} +.yb3f{bottom:680.669333pt;} +.yde8{bottom:680.752000pt;} +.ya80{bottom:680.790667pt;} +.y148e{bottom:680.882667pt;} +.y944{bottom:681.000000pt;} +.y278{bottom:681.016000pt;} +.ya06{bottom:681.148000pt;} +.y2d1{bottom:681.289333pt;} +.yc3f{bottom:681.357333pt;} +.y99a{bottom:681.456000pt;} +.y6dd{bottom:681.498667pt;} +.yaf5{bottom:681.532000pt;} +.ye73{bottom:681.573333pt;} .y65{bottom:681.812000pt;} -.y890{bottom:681.813333pt;} -.yc8d{bottom:681.984000pt;} -.y694{bottom:682.337333pt;} -.y1533{bottom:682.476000pt;} -.yc7{bottom:682.694667pt;} -.yd98{bottom:682.717333pt;} -.ye00{bottom:682.745333pt;} -.yefa{bottom:682.753333pt;} -.y27e{bottom:683.008000pt;} -.yb4d{bottom:683.234667pt;} -.y598{bottom:683.276000pt;} -.y8b5{bottom:683.285333pt;} -.y1433{bottom:683.288000pt;} -.y8d3{bottom:683.657333pt;} -.y129e{bottom:683.841333pt;} -.y11b1{bottom:683.964000pt;} -.ye71{bottom:683.972000pt;} -.y722{bottom:684.229333pt;} -.y12ce{bottom:684.421333pt;} -.y842{bottom:684.453333pt;} -.yd18{bottom:684.657333pt;} -.yc23{bottom:684.678667pt;} -.y1105{bottom:684.985333pt;} -.y1471{bottom:685.114667pt;} -.yfd0{bottom:685.133333pt;} -.y41f{bottom:685.134667pt;} -.y39b{bottom:685.142667pt;} -.yfb1{bottom:685.361333pt;} -.y10bb{bottom:685.410667pt;} -.y5cb{bottom:685.497333pt;} -.y1550{bottom:686.013333pt;} -.y3e2{bottom:686.192000pt;} -.ye4c{bottom:686.261333pt;} -.y149d{bottom:686.498667pt;} -.y495{bottom:686.594667pt;} -.yc22{bottom:686.670667pt;} -.yd73{bottom:687.864000pt;} -.y1f9{bottom:687.876000pt;} -.ye8{bottom:688.017333pt;} -.ydd6{bottom:688.168000pt;} -.y356{bottom:688.426667pt;} -.yf2f{bottom:688.705333pt;} -.y45e{bottom:688.720000pt;} -.y131f{bottom:688.730667pt;} -.ya0d{bottom:688.733333pt;} -.y2d6{bottom:689.112000pt;} -.yed{bottom:689.118667pt;} +.y86e{bottom:681.813333pt;} +.yc54{bottom:681.984000pt;} +.yc7{bottom:682.232000pt;} +.y67e{bottom:682.337333pt;} +.y14d6{bottom:682.476000pt;} +.yd5e{bottom:682.717333pt;} +.ydc4{bottom:682.745333pt;} +.yeb9{bottom:682.753333pt;} +.y277{bottom:683.008000pt;} +.yb1c{bottom:683.234667pt;} +.y586{bottom:683.276000pt;} +.y892{bottom:683.285333pt;} +.y13da{bottom:683.288000pt;} +.y8af{bottom:683.657333pt;} +.y124e{bottom:683.841333pt;} +.y1163{bottom:683.964000pt;} +.ye32{bottom:683.972000pt;} +.y70a{bottom:684.229333pt;} +.y127d{bottom:684.421333pt;} +.y821{bottom:684.453333pt;} +.ycdf{bottom:684.657333pt;} +.ybee{bottom:684.678667pt;} +.y10bb{bottom:684.985333pt;} +.y1417{bottom:685.114667pt;} +.yf8c{bottom:685.133333pt;} +.y414{bottom:685.134667pt;} +.y392{bottom:685.142667pt;} +.yf6e{bottom:685.361333pt;} +.y1072{bottom:685.410667pt;} +.y5b9{bottom:685.497333pt;} +.y14f3{bottom:686.013333pt;} +.y3d8{bottom:686.192000pt;} +.ye0e{bottom:686.261333pt;} +.y1442{bottom:686.498667pt;} +.y487{bottom:686.594667pt;} +.ybed{bottom:686.670667pt;} +.yd39{bottom:687.864000pt;} +.y1f3{bottom:687.876000pt;} +.yeb{bottom:688.017333pt;} +.yd9a{bottom:688.168000pt;} +.y34e{bottom:688.426667pt;} +.yeed{bottom:688.705333pt;} +.y452{bottom:688.720000pt;} +.y12cb{bottom:688.730667pt;} +.y9e3{bottom:688.733333pt;} +.y2cf{bottom:689.112000pt;} +.yf0{bottom:689.118667pt;} .y4{bottom:689.128385pt;} -.y1039{bottom:689.309333pt;} -.y1071{bottom:689.786667pt;} -.y14c7{bottom:689.997333pt;} -.yedd{bottom:690.040000pt;} -.yb00{bottom:690.354667pt;} -.y14f{bottom:690.446667pt;} -.y78b{bottom:690.481333pt;} -.y54b{bottom:690.732000pt;} -.yd40{bottom:690.794667pt;} -.yb99{bottom:691.176000pt;} -.y136f{bottom:691.465333pt;} -.ycf4{bottom:691.689333pt;} -.yf07{bottom:691.904000pt;} -.ya2e{bottom:692.000000pt;} -.y35a{bottom:692.013333pt;} -.y4ea{bottom:692.041333pt;} -.y2d4{bottom:692.409333pt;} -.y15b1{bottom:693.037333pt;} +.yff1{bottom:689.309333pt;} +.y1029{bottom:689.786667pt;} +.y146c{bottom:689.997333pt;} +.ye9d{bottom:690.040000pt;} +.yad1{bottom:690.354667pt;} +.y14d{bottom:690.446667pt;} +.y770{bottom:690.481333pt;} +.y53a{bottom:690.732000pt;} +.yd07{bottom:690.794667pt;} +.yb66{bottom:691.176000pt;} +.y1319{bottom:691.465333pt;} +.ycbb{bottom:691.689333pt;} +.yec5{bottom:691.904000pt;} +.y352{bottom:692.013333pt;} +.y4db{bottom:692.041333pt;} +.y2cd{bottom:692.409333pt;} +.y1553{bottom:693.037333pt;} .y23{bottom:693.102667pt;} -.y235{bottom:693.342667pt;} -.y355{bottom:694.006667pt;} -.y1347{bottom:694.129333pt;} -.y10dc{bottom:694.257333pt;} -.ya59{bottom:694.468000pt;} +.y22f{bottom:693.342667pt;} +.y34d{bottom:694.006667pt;} +.y12f2{bottom:694.129333pt;} +.y1092{bottom:694.257333pt;} +.ya2d{bottom:694.468000pt;} .y16{bottom:694.622667pt;} -.y80f{bottom:694.856000pt;} -.y7b2{bottom:695.160000pt;} -.y51c{bottom:695.553333pt;} -.yd71{bottom:695.701333pt;} +.y7f0{bottom:694.856000pt;} +.y796{bottom:695.160000pt;} +.y50c{bottom:695.553333pt;} +.yd37{bottom:695.701333pt;} .y8d{bottom:695.760000pt;} -.yff2{bottom:695.833333pt;} -.y11f1{bottom:695.889333pt;} -.yca5{bottom:696.006667pt;} -.y41d{bottom:696.254667pt;} -.yb70{bottom:696.609333pt;} -.ya30{bottom:697.088000pt;} -.y2d5{bottom:697.229333pt;} -.yc76{bottom:697.297333pt;} -.y14e9{bottom:697.354667pt;} -.y9c2{bottom:697.396000pt;} -.y27d{bottom:697.486667pt;} -.yeb1{bottom:697.513333pt;} -.y88f{bottom:697.753333pt;} -.y693{bottom:698.277333pt;} -.y1532{bottom:698.416000pt;} -.yc6{bottom:698.634667pt;} -.ydfe{bottom:698.685333pt;} -.yef9{bottom:698.693333pt;} -.y13e4{bottom:698.857333pt;} -.yb97{bottom:699.012000pt;} -.yb4c{bottom:699.174667pt;} -.y8b4{bottom:699.225333pt;} -.y1432{bottom:699.228000pt;} -.y27c{bottom:699.480000pt;} -.y8d2{bottom:699.597333pt;} -.y129d{bottom:699.781333pt;} -.ye70{bottom:699.912000pt;} -.y721{bottom:700.169333pt;} -.y12cd{bottom:700.361333pt;} -.y841{bottom:700.394667pt;} -.yd17{bottom:700.597333pt;} -.y1056{bottom:700.882667pt;} -.y1104{bottom:700.925333pt;} -.yfcf{bottom:701.073333pt;} -.y5ca{bottom:701.438667pt;} -.ybf4{bottom:701.566667pt;} -.y763{bottom:701.745333pt;} -.y1019{bottom:701.793333pt;} -.yad6{bottom:701.838667pt;} -.ya7f{bottom:701.841333pt;} -.y154f{bottom:701.953333pt;} -.y1223{bottom:702.132000pt;} -.ye4b{bottom:702.201333pt;} -.y150c{bottom:702.540000pt;} -.yc21{bottom:702.610667pt;} -.y15ae{bottom:703.464000pt;} -.ydff{bottom:703.505333pt;} -.y15b0{bottom:703.664000pt;} -.yd72{bottom:703.804000pt;} -.y1f8{bottom:703.816000pt;} -.ydd5{bottom:704.108000pt;} -.yf2e{bottom:704.645333pt;} -.y45d{bottom:704.660000pt;} -.ya0c{bottom:704.673333pt;} -.y54a{bottom:704.678667pt;} -.y2d3{bottom:705.052000pt;} -.ycd3{bottom:705.058667pt;} -.y1038{bottom:705.249333pt;} -.ye93{bottom:705.292000pt;} -.y14c5{bottom:705.937333pt;} -.yedc{bottom:705.981333pt;} -.y131e{bottom:706.000000pt;} -.yaff{bottom:706.294667pt;} -.y14e{bottom:706.386667pt;} -.y78a{bottom:706.421333pt;} -.y549{bottom:706.672000pt;} -.yd3f{bottom:706.734667pt;} -.y9e5{bottom:706.958667pt;} -.yb98{bottom:707.116000pt;} -.y136e{bottom:707.405333pt;} -.y2d1{bottom:708.349333pt;} -.y631{bottom:709.042667pt;} +.yfac{bottom:695.833333pt;} +.y11a2{bottom:695.889333pt;} +.yc6d{bottom:696.006667pt;} +.y412{bottom:696.254667pt;} +.yb3e{bottom:696.609333pt;} +.ya05{bottom:697.088000pt;} +.y2ce{bottom:697.229333pt;} +.yc3e{bottom:697.297333pt;} +.y148d{bottom:697.354667pt;} +.y999{bottom:697.396000pt;} +.y276{bottom:697.486667pt;} +.ye72{bottom:697.513333pt;} +.y86d{bottom:697.753333pt;} +.yc6{bottom:698.172000pt;} +.y67d{bottom:698.277333pt;} +.y14d5{bottom:698.416000pt;} +.ydc2{bottom:698.685333pt;} +.yeb8{bottom:698.693333pt;} +.y138b{bottom:698.857333pt;} +.yb64{bottom:699.012000pt;} +.yb1b{bottom:699.174667pt;} +.y891{bottom:699.225333pt;} +.y13d9{bottom:699.228000pt;} +.y275{bottom:699.480000pt;} +.y8ae{bottom:699.597333pt;} +.y124d{bottom:699.781333pt;} +.ye31{bottom:699.912000pt;} +.y709{bottom:700.169333pt;} +.y127c{bottom:700.361333pt;} +.y820{bottom:700.394667pt;} +.ycde{bottom:700.597333pt;} +.y100e{bottom:700.882667pt;} +.y10ba{bottom:700.925333pt;} +.yf8b{bottom:701.073333pt;} +.y5b8{bottom:701.438667pt;} +.ybc0{bottom:701.566667pt;} +.y749{bottom:701.745333pt;} +.yfd2{bottom:701.793333pt;} +.yaa8{bottom:701.838667pt;} +.ya52{bottom:701.841333pt;} +.y14f2{bottom:701.953333pt;} +.y11d4{bottom:702.132000pt;} +.ye0d{bottom:702.201333pt;} +.y14b0{bottom:702.540000pt;} +.ybec{bottom:702.610667pt;} +.y1550{bottom:703.464000pt;} +.ydc3{bottom:703.505333pt;} +.y1552{bottom:703.664000pt;} +.ye8{bottom:703.729333pt;} +.yd38{bottom:703.804000pt;} +.y1f2{bottom:703.816000pt;} +.yd99{bottom:704.108000pt;} +.yeec{bottom:704.645333pt;} +.y451{bottom:704.660000pt;} +.y9e2{bottom:704.673333pt;} +.y539{bottom:704.678667pt;} +.y2cc{bottom:705.052000pt;} +.yc9a{bottom:705.058667pt;} +.yff0{bottom:705.249333pt;} +.ye54{bottom:705.292000pt;} +.y146a{bottom:705.937333pt;} +.ye9c{bottom:705.981333pt;} +.y12ca{bottom:706.000000pt;} +.yad0{bottom:706.294667pt;} +.y14c{bottom:706.386667pt;} +.y76f{bottom:706.421333pt;} +.y538{bottom:706.672000pt;} +.yd06{bottom:706.734667pt;} +.y9bb{bottom:706.958667pt;} +.yb65{bottom:707.116000pt;} +.y1318{bottom:707.405333pt;} +.y2ca{bottom:708.349333pt;} +.y61d{bottom:709.042667pt;} .y22{bottom:709.044000pt;} -.yf86{bottom:709.394667pt;} -.yfb0{bottom:709.560000pt;} -.y10db{bottom:710.197333pt;} -.y92a{bottom:710.217333pt;} -.ya58{bottom:710.409333pt;} +.yf43{bottom:709.394667pt;} +.yf6d{bottom:709.560000pt;} +.y1091{bottom:710.197333pt;} +.y904{bottom:710.217333pt;} +.ya2c{bottom:710.409333pt;} .y15{bottom:710.562667pt;} -.y14c6{bottom:710.757333pt;} -.y80e{bottom:710.796000pt;} -.y7b1{bottom:711.100000pt;} -.y51b{bottom:711.493333pt;} +.y146b{bottom:710.757333pt;} +.y7ef{bottom:710.796000pt;} +.y795{bottom:711.100000pt;} +.y50b{bottom:711.493333pt;} .y8c{bottom:711.700000pt;} -.yff1{bottom:711.773333pt;} -.y11f0{bottom:711.829333pt;} -.yb6f{bottom:712.549333pt;} -.y867{bottom:712.622667pt;} -.y234{bottom:713.001333pt;} -.ya2f{bottom:713.028000pt;} -.ybbd{bottom:713.038667pt;} -.y2d2{bottom:713.170667pt;} -.yc5a{bottom:713.237333pt;} -.y9c1{bottom:713.336000pt;} -.yeaf{bottom:713.453333pt;} -.y139b{bottom:713.757333pt;} -.yc8c{bottom:713.864000pt;} -.y27b{bottom:713.958667pt;} -.y15af{bottom:714.290667pt;} -.y14e8{bottom:714.357333pt;} -.y13bb{bottom:714.504000pt;} -.ydfd{bottom:714.625333pt;} -.yef8{bottom:714.634667pt;} -.y13e3{bottom:714.797333pt;} -.y8b3{bottom:715.165333pt;} -.y1431{bottom:715.168000pt;} -.y8d1{bottom:715.537333pt;} -.y129c{bottom:715.722667pt;} -.ye6f{bottom:715.852000pt;} -.y1407{bottom:715.888000pt;} -.y27a{bottom:715.950667pt;} -.y720{bottom:716.110667pt;} -.y116{bottom:716.204000pt;} -.ycf3{bottom:716.208000pt;} -.y12cc{bottom:716.301333pt;} -.y3e0{bottom:716.404000pt;} -.y829{bottom:716.520000pt;} -.y1055{bottom:716.822667pt;} -.y1103{bottom:716.866667pt;} +.yfab{bottom:711.773333pt;} +.y11a1{bottom:711.829333pt;} +.yb3d{bottom:712.549333pt;} +.y845{bottom:712.622667pt;} +.y22e{bottom:713.001333pt;} +.ya04{bottom:713.028000pt;} +.yb89{bottom:713.038667pt;} +.y2cb{bottom:713.170667pt;} +.yc23{bottom:713.237333pt;} +.y998{bottom:713.336000pt;} +.ye70{bottom:713.453333pt;} +.y1344{bottom:713.757333pt;} +.yc53{bottom:713.864000pt;} +.y274{bottom:713.958667pt;} +.y1551{bottom:714.290667pt;} +.y148c{bottom:714.357333pt;} +.y1363{bottom:714.504000pt;} +.ydc1{bottom:714.625333pt;} +.yeb7{bottom:714.634667pt;} +.y138a{bottom:714.797333pt;} +.y890{bottom:715.165333pt;} +.y13d8{bottom:715.168000pt;} +.y8ad{bottom:715.537333pt;} +.y124c{bottom:715.722667pt;} +.ye30{bottom:715.852000pt;} +.y13ae{bottom:715.888000pt;} +.y273{bottom:715.950667pt;} +.y708{bottom:716.110667pt;} +.y117{bottom:716.204000pt;} +.ycba{bottom:716.208000pt;} +.y127b{bottom:716.301333pt;} +.y3d6{bottom:716.404000pt;} +.y808{bottom:716.520000pt;} +.y100d{bottom:716.822667pt;} +.y10b9{bottom:716.866667pt;} .y36{bottom:717.013333pt;} -.y5c9{bottom:717.378667pt;} -.ybf3{bottom:717.506667pt;} -.y1018{bottom:717.733333pt;} -.yad4{bottom:717.778667pt;} -.y1221{bottom:718.073333pt;} -.ye4a{bottom:718.141333pt;} -.yeb0{bottom:718.273333pt;} -.ya7e{bottom:718.312000pt;} -.yc20{bottom:718.550667pt;} -.y1340{bottom:718.570667pt;} -.ye6{bottom:719.670667pt;} -.y1f7{bottom:719.756000pt;} -.y4e9{bottom:719.802667pt;} -.ydd4{bottom:720.048000pt;} -.yd70{bottom:720.276000pt;} -.y6f3{bottom:720.426667pt;} -.yf2d{bottom:720.585333pt;} -.y45c{bottom:720.600000pt;} -.y232{bottom:720.972000pt;} -.y2d0{bottom:720.993333pt;} -.yf06{bottom:720.998667pt;} -.ye92{bottom:721.232000pt;} -.y4e8{bottom:721.796000pt;} -.y14c4{bottom:721.877333pt;} -.yedb{bottom:721.921333pt;} -.y1070{bottom:722.142667pt;} -.yafe{bottom:722.234667pt;} -.y14d{bottom:722.326667pt;} -.y789{bottom:722.361333pt;} -.yad5{bottom:722.600000pt;} -.yd3e{bottom:722.676000pt;} -.y1222{bottom:722.893333pt;} -.y9e4{bottom:722.898667pt;} -.ye24{bottom:723.185333pt;} -.y131d{bottom:723.268000pt;} -.y136d{bottom:723.345333pt;} -.yb96{bottom:723.586667pt;} -.y2ce{bottom:724.289333pt;} +.y5b7{bottom:717.378667pt;} +.ybbf{bottom:717.506667pt;} +.yfd1{bottom:717.733333pt;} +.yaa6{bottom:717.778667pt;} +.y11d2{bottom:718.073333pt;} +.ye0c{bottom:718.141333pt;} +.ye71{bottom:718.273333pt;} +.ya51{bottom:718.312000pt;} +.ybeb{bottom:718.550667pt;} +.y12eb{bottom:718.570667pt;} +.ye7{bottom:719.670667pt;} +.y1f1{bottom:719.756000pt;} +.y4da{bottom:719.802667pt;} +.yd98{bottom:720.048000pt;} +.yd36{bottom:720.276000pt;} +.y6dc{bottom:720.426667pt;} +.yeeb{bottom:720.585333pt;} +.y450{bottom:720.600000pt;} +.y22c{bottom:720.972000pt;} +.y2c9{bottom:720.993333pt;} +.yec4{bottom:720.998667pt;} +.ye53{bottom:721.232000pt;} +.y4d9{bottom:721.796000pt;} +.y1469{bottom:721.877333pt;} +.ye9b{bottom:721.921333pt;} +.y1028{bottom:722.142667pt;} +.yacf{bottom:722.234667pt;} +.y14b{bottom:722.326667pt;} +.y76e{bottom:722.361333pt;} +.yaa7{bottom:722.600000pt;} +.yd05{bottom:722.676000pt;} +.y11d3{bottom:722.893333pt;} +.y9ba{bottom:722.898667pt;} +.yde7{bottom:723.185333pt;} +.y12c9{bottom:723.268000pt;} +.y1317{bottom:723.345333pt;} +.yb63{bottom:723.586667pt;} +.y2c7{bottom:724.289333pt;} .y21{bottom:724.984000pt;} -.yd16{bottom:725.116000pt;} -.yf85{bottom:725.334667pt;} -.y15ad{bottom:725.448000pt;} -.y354{bottom:725.886667pt;} -.y597{bottom:726.157333pt;} -.y1470{bottom:726.441333pt;} +.ycdd{bottom:725.116000pt;} +.yf42{bottom:725.334667pt;} +.y154f{bottom:725.448000pt;} +.y34c{bottom:725.886667pt;} +.y585{bottom:726.157333pt;} +.y1416{bottom:726.441333pt;} .y14{bottom:726.502667pt;} -.y10ba{bottom:726.737333pt;} -.y7b0{bottom:727.041333pt;} -.y51a{bottom:727.433333pt;} +.y1071{bottom:726.737333pt;} +.y794{bottom:727.041333pt;} +.y50a{bottom:727.433333pt;} .y64{bottom:727.640000pt;} -.yff0{bottom:727.714667pt;} -.y11ef{bottom:727.769333pt;} -.yd6e{bottom:728.113333pt;} -.yb6e{bottom:728.490667pt;} -.y154e{bottom:728.520000pt;} -.y866{bottom:728.562667pt;} -.y233{bottom:728.941333pt;} -.y840{bottom:728.969333pt;} -.ybbc{bottom:728.978667pt;} -.y2cf{bottom:729.110667pt;} -.y9c0{bottom:729.277333pt;} -.yeae{bottom:729.393333pt;} -.y139a{bottom:729.697333pt;} -.y41c{bottom:729.821333pt;} -.y1531{bottom:730.297333pt;} -.y279{bottom:730.430667pt;} -.yb4b{bottom:730.482667pt;} -.ydfc{bottom:730.565333pt;} -.yc75{bottom:730.638667pt;} -.y14e7{bottom:730.828000pt;} -.y8b2{bottom:731.105333pt;} -.y1430{bottom:731.109333pt;} -.yca4{bottom:731.212000pt;} -.y5c8{bottom:731.326667pt;} -.yd97{bottom:731.386667pt;} -.yb94{bottom:731.424000pt;} -.y8d0{bottom:731.477333pt;} -.y129b{bottom:731.662667pt;} -.y13ba{bottom:731.773333pt;} -.yc5{bottom:731.789333pt;} -.ye6e{bottom:731.793333pt;} -.y1406{bottom:731.828000pt;} -.y71f{bottom:732.050667pt;} -.y692{bottom:732.242667pt;} -.y3df{bottom:732.345333pt;} -.y278{bottom:732.422667pt;} -.y1054{bottom:732.762667pt;} -.y1102{bottom:732.806667pt;} -.y494{bottom:732.953333pt;} -.y5c7{bottom:733.318667pt;} -.y762{bottom:733.625333pt;} -.y1017{bottom:733.673333pt;} -.yad3{bottom:733.720000pt;} -.yfaf{bottom:733.758667pt;} -.y1220{bottom:734.013333pt;} -.ye49{bottom:734.081333pt;} -.y1037{bottom:734.344000pt;} -.yc1f{bottom:734.492000pt;} -.y10da{bottom:734.716000pt;} -.ya7d{bottom:734.784000pt;} -.ycd2{bottom:734.813333pt;} +.yfaa{bottom:727.714667pt;} +.y11a0{bottom:727.769333pt;} +.yd34{bottom:728.113333pt;} +.yb3c{bottom:728.490667pt;} +.y14f1{bottom:728.520000pt;} +.y844{bottom:728.562667pt;} +.y22d{bottom:728.941333pt;} +.y81f{bottom:728.969333pt;} +.yb88{bottom:728.978667pt;} +.y2c8{bottom:729.110667pt;} +.y997{bottom:729.277333pt;} +.ye6f{bottom:729.393333pt;} +.y1343{bottom:729.697333pt;} +.y411{bottom:729.821333pt;} +.y14d4{bottom:730.297333pt;} +.y272{bottom:730.430667pt;} +.yb1a{bottom:730.482667pt;} +.ydc0{bottom:730.565333pt;} +.yc3d{bottom:730.638667pt;} +.y148b{bottom:730.828000pt;} +.y88f{bottom:731.105333pt;} +.y13d7{bottom:731.109333pt;} +.yc6c{bottom:731.212000pt;} +.y5b6{bottom:731.326667pt;} +.yd5d{bottom:731.386667pt;} +.yb61{bottom:731.424000pt;} +.yc5{bottom:731.441333pt;} +.y8ac{bottom:731.477333pt;} +.y124b{bottom:731.662667pt;} +.y1362{bottom:731.773333pt;} +.ye2f{bottom:731.793333pt;} +.y13ad{bottom:731.828000pt;} +.y707{bottom:732.050667pt;} +.y67c{bottom:732.242667pt;} +.y3d5{bottom:732.345333pt;} +.y271{bottom:732.422667pt;} +.y100c{bottom:732.762667pt;} +.y10b8{bottom:732.806667pt;} +.y486{bottom:732.953333pt;} +.y5b5{bottom:733.318667pt;} +.y748{bottom:733.625333pt;} +.yfd0{bottom:733.673333pt;} +.yaa5{bottom:733.720000pt;} +.yf6c{bottom:733.758667pt;} +.y11d1{bottom:734.013333pt;} +.ye0b{bottom:734.081333pt;} +.yfef{bottom:734.344000pt;} +.ybea{bottom:734.492000pt;} +.y1090{bottom:734.716000pt;} +.ya50{bottom:734.784000pt;} +.yc99{bottom:734.813333pt;} .y3{bottom:735.153214pt;} -.y548{bottom:735.497333pt;} -.y1f6{bottom:735.696000pt;} -.y4e7{bottom:735.744000pt;} -.y15aa{bottom:735.876000pt;} -.ydd3{bottom:735.988000pt;} -.y15ac{bottom:736.076000pt;} -.yd6f{bottom:736.216000pt;} -.y6f2{bottom:736.366667pt;} -.yf2c{bottom:736.525333pt;} -.y45b{bottom:736.540000pt;} -.y88e{bottom:736.780000pt;} -.y4d6{bottom:736.806667pt;} -.ye91{bottom:737.172000pt;} -.y4e6{bottom:737.736000pt;} -.y14c3{bottom:737.817333pt;} -.yeda{bottom:737.861333pt;} -.y106f{bottom:738.082667pt;} -.yafd{bottom:738.176000pt;} -.y14c{bottom:738.266667pt;} -.yd3d{bottom:738.616000pt;} -.y4d5{bottom:738.798667pt;} -.y9e3{bottom:738.838667pt;} -.ye23{bottom:739.125333pt;} -.y131c{bottom:739.208000pt;} -.y13e2{bottom:739.316000pt;} -.ya57{bottom:739.502667pt;} -.yb95{bottom:739.528000pt;} -.y353{bottom:739.834667pt;} -.y2cd{bottom:740.230667pt;} -.y10e{bottom:740.645333pt;} +.y537{bottom:735.497333pt;} +.y1f0{bottom:735.696000pt;} +.y4d8{bottom:735.744000pt;} +.y154c{bottom:735.876000pt;} +.yd97{bottom:735.988000pt;} +.y154e{bottom:736.076000pt;} +.yd35{bottom:736.216000pt;} +.y6db{bottom:736.366667pt;} +.yeea{bottom:736.525333pt;} +.y44f{bottom:736.540000pt;} +.y86c{bottom:736.780000pt;} +.y4c7{bottom:736.806667pt;} +.ye52{bottom:737.172000pt;} +.y4d7{bottom:737.736000pt;} +.y1468{bottom:737.817333pt;} +.ye9a{bottom:737.861333pt;} +.y1027{bottom:738.082667pt;} +.yace{bottom:738.176000pt;} +.y14a{bottom:738.266667pt;} +.yd04{bottom:738.616000pt;} +.y4c6{bottom:738.798667pt;} +.y9b9{bottom:738.838667pt;} +.yde6{bottom:739.125333pt;} +.y12c8{bottom:739.208000pt;} +.y1389{bottom:739.316000pt;} +.ya2b{bottom:739.502667pt;} +.yb62{bottom:739.528000pt;} +.y34b{bottom:739.834667pt;} +.y2c6{bottom:740.230667pt;} +.y10f{bottom:740.645333pt;} .y20{bottom:740.924000pt;} -.yf84{bottom:741.274667pt;} -.y352{bottom:741.826667pt;} -.ybf2{bottom:742.026667pt;} -.y146f{bottom:742.381333pt;} +.yf41{bottom:741.274667pt;} +.y34a{bottom:741.826667pt;} +.ybbe{bottom:742.026667pt;} +.y1415{bottom:742.381333pt;} .y13{bottom:742.442667pt;} -.ycd0{bottom:742.650667pt;} -.y10b9{bottom:742.677333pt;} -.y7af{bottom:742.981333pt;} -.y39a{bottom:743.049333pt;} -.y519{bottom:743.373333pt;} +.yc97{bottom:742.650667pt;} +.y1070{bottom:742.677333pt;} +.y793{bottom:742.981333pt;} +.y391{bottom:743.049333pt;} +.y509{bottom:743.373333pt;} .y63{bottom:743.580000pt;} -.yfef{bottom:743.654667pt;} -.y11ee{bottom:743.709333pt;} -.ya0b{bottom:744.338667pt;} -.yb6d{bottom:744.430667pt;} -.y154d{bottom:744.460000pt;} -.y865{bottom:744.502667pt;} -.y80d{bottom:744.761333pt;} -.ybbb{bottom:744.918667pt;} -.yead{bottom:745.333333pt;} -.y1399{bottom:745.637333pt;} -.y41b{bottom:745.761333pt;} +.yfa9{bottom:743.654667pt;} +.y119f{bottom:743.709333pt;} +.y9e1{bottom:744.338667pt;} +.yb3b{bottom:744.430667pt;} +.y14f0{bottom:744.460000pt;} +.y843{bottom:744.502667pt;} +.y7ee{bottom:744.761333pt;} +.yb87{bottom:744.918667pt;} +.ye6e{bottom:745.333333pt;} +.y1342{bottom:745.637333pt;} +.y410{bottom:745.761333pt;} .y35{bottom:746.237333pt;} -.y150b{bottom:746.310667pt;} -.y136c{bottom:746.385333pt;} -.ydfb{bottom:746.505333pt;} -.y15ab{bottom:746.702667pt;} -.y277{bottom:746.901333pt;} -.y142f{bottom:747.049333pt;} -.yca3{bottom:747.152000pt;} -.yc59{bottom:747.317333pt;} -.yd96{bottom:747.326667pt;} -.y8f6{bottom:747.417333pt;} -.y8cf{bottom:747.418667pt;} -.y129a{bottom:747.602667pt;} -.y13b9{bottom:747.713333pt;} -.yc4{bottom:747.729333pt;} -.y1405{bottom:747.768000pt;} -.y14e6{bottom:747.832000pt;} -.y691{bottom:748.182667pt;} -.y3de{bottom:748.285333pt;} -.y1053{bottom:748.702667pt;} -.y1101{bottom:748.746667pt;} -.y493{bottom:748.893333pt;} -.y276{bottom:748.894667pt;} -.yad2{bottom:749.660000pt;} -.yfae{bottom:749.698667pt;} -.y788{bottom:749.802667pt;} -.ye48{bottom:750.021333pt;} -.yc1e{bottom:750.432000pt;} -.y56b{bottom:750.598667pt;} -.ycd1{bottom:750.753333pt;} -.ya7c{bottom:751.256000pt;} -.y1f5{bottom:751.637333pt;} -.y4e5{bottom:751.684000pt;} -.y6f1{bottom:752.306667pt;} -.yf2b{bottom:752.466667pt;} -.y45a{bottom:752.480000pt;} -.y2ca{bottom:752.628000pt;} -.y5c6{bottom:752.630667pt;} -.yd6d{bottom:752.686667pt;} -.y88d{bottom:752.720000pt;} -.y4d4{bottom:752.746667pt;} -.y2cc{bottom:752.873333pt;} -.ye90{bottom:753.112000pt;} -.y5c4{bottom:753.221333pt;} -.y4e4{bottom:753.676000pt;} -.y14c2{bottom:753.757333pt;} -.yed9{bottom:753.801333pt;} -.y106e{bottom:754.022667pt;} +.y14af{bottom:746.310667pt;} +.y1316{bottom:746.385333pt;} +.ydbf{bottom:746.505333pt;} +.y154d{bottom:746.702667pt;} +.y270{bottom:746.901333pt;} +.y13d6{bottom:747.049333pt;} +.yc6b{bottom:747.152000pt;} +.yc22{bottom:747.317333pt;} +.yd5c{bottom:747.326667pt;} +.yc4{bottom:747.382667pt;} +.y8d1{bottom:747.417333pt;} +.y8ab{bottom:747.418667pt;} +.y124a{bottom:747.602667pt;} +.y1361{bottom:747.713333pt;} +.y13ac{bottom:747.768000pt;} +.y148a{bottom:747.832000pt;} +.y67b{bottom:748.182667pt;} +.y3d4{bottom:748.285333pt;} +.y100b{bottom:748.702667pt;} +.y10b7{bottom:748.746667pt;} +.y485{bottom:748.893333pt;} +.y26f{bottom:748.894667pt;} +.yaa4{bottom:749.660000pt;} +.yf6b{bottom:749.698667pt;} +.y76d{bottom:749.802667pt;} +.ye0a{bottom:750.021333pt;} +.ybe9{bottom:750.432000pt;} +.y559{bottom:750.598667pt;} +.yc98{bottom:750.753333pt;} +.ya4f{bottom:751.256000pt;} +.y1ef{bottom:751.637333pt;} +.y4d6{bottom:751.684000pt;} +.y6da{bottom:752.306667pt;} +.yee9{bottom:752.466667pt;} +.y44e{bottom:752.480000pt;} +.y2c3{bottom:752.628000pt;} +.y5b4{bottom:752.630667pt;} +.yd33{bottom:752.686667pt;} +.y86b{bottom:752.720000pt;} +.y4c5{bottom:752.746667pt;} +.y2c5{bottom:752.873333pt;} +.ye51{bottom:753.112000pt;} +.y5b2{bottom:753.221333pt;} +.y4d5{bottom:753.676000pt;} +.y1467{bottom:753.757333pt;} +.ye99{bottom:753.801333pt;} +.y1026{bottom:754.022667pt;} .ya2{bottom:754.208000pt;} -.yd3c{bottom:754.556000pt;} -.y4d3{bottom:754.738667pt;} -.y9e2{bottom:754.778667pt;} -.ye22{bottom:755.065333pt;} -.yc74{bottom:755.081333pt;} -.y131b{bottom:755.148000pt;} -.yb92{bottom:755.998667pt;} -.yb93{bottom:756.132000pt;} -.y8b1{bottom:756.142667pt;} -.y2c8{bottom:756.170667pt;} -.y547{bottom:756.485333pt;} +.yd03{bottom:754.556000pt;} +.y4c4{bottom:754.738667pt;} +.y9b8{bottom:754.778667pt;} +.yde5{bottom:755.065333pt;} +.yc3c{bottom:755.081333pt;} +.y12c7{bottom:755.148000pt;} +.yb5f{bottom:755.998667pt;} +.yb60{bottom:756.132000pt;} +.y88e{bottom:756.142667pt;} +.y2c1{bottom:756.170667pt;} +.y536{bottom:756.485333pt;} .y1f{bottom:756.864000pt;} -.yf83{bottom:757.214667pt;} -.y351{bottom:757.766667pt;} -.y15a9{bottom:757.860000pt;} -.yec{bottom:758.192000pt;} -.y146e{bottom:758.322667pt;} +.yf40{bottom:757.214667pt;} +.y349{bottom:757.766667pt;} +.y154b{bottom:757.860000pt;} +.yef{bottom:758.192000pt;} +.y1414{bottom:758.322667pt;} .y12{bottom:758.382667pt;} -.y546{bottom:758.477333pt;} -.y121f{bottom:758.532000pt;} -.y10b8{bottom:758.617333pt;} -.y7ae{bottom:758.921333pt;} -.y518{bottom:759.313333pt;} +.y535{bottom:758.477333pt;} +.y11d0{bottom:758.532000pt;} +.y106f{bottom:758.617333pt;} +.y792{bottom:758.921333pt;} +.y508{bottom:759.313333pt;} .y62{bottom:759.521333pt;} -.yfee{bottom:759.594667pt;} -.y11ed{bottom:759.649333pt;} -.ya0a{bottom:760.278667pt;} -.y864{bottom:760.442667pt;} -.ydd2{bottom:760.508000pt;} -.yd6b{bottom:760.524000pt;} -.y80c{bottom:760.701333pt;} -.ycf2{bottom:760.901333pt;} -.y2cb{bottom:760.990667pt;} -.yc58{bottom:761.265333pt;} -.y71e{bottom:761.274667pt;} -.y1398{bottom:761.577333pt;} -.y2c9{bottom:761.853333pt;} +.yfa8{bottom:759.594667pt;} +.y119e{bottom:759.649333pt;} +.y9e0{bottom:760.278667pt;} +.y842{bottom:760.442667pt;} +.yd96{bottom:760.508000pt;} +.yd31{bottom:760.524000pt;} +.y7ed{bottom:760.701333pt;} +.ycb9{bottom:760.901333pt;} +.y2c4{bottom:760.990667pt;} +.yc21{bottom:761.265333pt;} +.y706{bottom:761.274667pt;} +.y1341{bottom:761.577333pt;} +.y2c2{bottom:761.853333pt;} .y9e{bottom:762.177333pt;} -.y150a{bottom:762.250667pt;} -.ydfa{bottom:762.446667pt;} -.y15a7{bottom:762.974667pt;} -.y142e{bottom:762.989333pt;} -.yca2{bottom:763.092000pt;} -.yc57{bottom:763.257333pt;} -.yd95{bottom:763.266667pt;} -.y8ce{bottom:763.358667pt;} -.y275{bottom:763.373333pt;} -.y1299{bottom:763.542667pt;} -.y136b{bottom:763.653333pt;} -.y690{bottom:764.122667pt;} -.y3dc{bottom:764.225333pt;} -.y14e5{bottom:764.302667pt;} -.y1052{bottom:764.642667pt;} -.y1100{bottom:764.686667pt;} -.yafc{bottom:764.742667pt;} -.y492{bottom:764.834667pt;} -.y5c5{bottom:765.288000pt;} -.y274{bottom:765.365333pt;} -.ye6d{bottom:765.480000pt;} -.y761{bottom:765.506667pt;} -.yad1{bottom:765.600000pt;} -.yfad{bottom:765.638667pt;} -.y787{bottom:765.742667pt;} -.y5c3{bottom:765.877333pt;} -.ye47{bottom:765.962667pt;} -.yc1d{bottom:766.372000pt;} -.yaac{bottom:767.092000pt;} -.yccf{bottom:767.225333pt;} -.y96a{bottom:767.490667pt;} -.y1f4{bottom:767.577333pt;} -.ya7b{bottom:767.726667pt;} -.yb24{bottom:768.022667pt;} -.y6f0{bottom:768.248000pt;} -.yf2a{bottom:768.406667pt;} -.y15a8{bottom:768.486667pt;} -.yd6c{bottom:768.628000pt;} -.y3dd{bottom:769.045333pt;} -.ye8f{bottom:769.053333pt;} -.yb4a{bottom:769.152000pt;} -.yfce{bottom:769.654667pt;} -.y14c1{bottom:769.698667pt;} -.yed8{bottom:769.741333pt;} -.yd15{bottom:769.749333pt;} -.y106d{bottom:769.964000pt;} -.y14b{bottom:770.148000pt;} -.yd3b{bottom:770.496000pt;} -.y9bf{bottom:770.602667pt;} -.y9e1{bottom:770.720000pt;} -.y399{bottom:770.812000pt;} -.ye21{bottom:771.006667pt;} -.y154c{bottom:771.026667pt;} -.y131a{bottom:771.088000pt;} -.y4d2{bottom:771.210667pt;} -.y5c2{bottom:771.457333pt;} -.y10d9{bottom:772.000000pt;} -.y8b0{bottom:772.082667pt;} -.y545{bottom:772.425333pt;} +.y14ae{bottom:762.250667pt;} +.ydbe{bottom:762.446667pt;} +.y1549{bottom:762.974667pt;} +.y13d5{bottom:762.989333pt;} +.yc6a{bottom:763.092000pt;} +.yc20{bottom:763.257333pt;} +.yd5b{bottom:763.266667pt;} +.y8aa{bottom:763.358667pt;} +.y26e{bottom:763.373333pt;} +.y1249{bottom:763.542667pt;} +.y1315{bottom:763.653333pt;} +.y67a{bottom:764.122667pt;} +.y3d2{bottom:764.225333pt;} +.y1489{bottom:764.302667pt;} +.y100a{bottom:764.642667pt;} +.y10b6{bottom:764.686667pt;} +.yacd{bottom:764.742667pt;} +.y484{bottom:764.834667pt;} +.y5b3{bottom:765.288000pt;} +.y26d{bottom:765.365333pt;} +.ye2e{bottom:765.480000pt;} +.y747{bottom:765.506667pt;} +.yaa3{bottom:765.600000pt;} +.yf6a{bottom:765.638667pt;} +.y76c{bottom:765.742667pt;} +.y5b1{bottom:765.877333pt;} +.ye09{bottom:765.962667pt;} +.ybe8{bottom:766.372000pt;} +.ya7f{bottom:767.092000pt;} +.yc96{bottom:767.225333pt;} +.y943{bottom:767.490667pt;} +.y1ee{bottom:767.577333pt;} +.ya4e{bottom:767.726667pt;} +.yaf4{bottom:768.022667pt;} +.y6d9{bottom:768.248000pt;} +.yee8{bottom:768.406667pt;} +.y154a{bottom:768.486667pt;} +.yd32{bottom:768.628000pt;} +.y3d3{bottom:769.045333pt;} +.ye50{bottom:769.053333pt;} +.yb19{bottom:769.152000pt;} +.yf8a{bottom:769.654667pt;} +.y1466{bottom:769.698667pt;} +.ye98{bottom:769.741333pt;} +.ycdc{bottom:769.749333pt;} +.y1025{bottom:769.964000pt;} +.y149{bottom:770.148000pt;} +.yd02{bottom:770.496000pt;} +.y996{bottom:770.602667pt;} +.y9b7{bottom:770.720000pt;} +.y390{bottom:770.812000pt;} +.yde4{bottom:771.006667pt;} +.y14ef{bottom:771.026667pt;} +.y12c6{bottom:771.088000pt;} +.y4c3{bottom:771.210667pt;} +.y5b0{bottom:771.457333pt;} +.y88d{bottom:772.082667pt;} +.y534{bottom:772.425333pt;} .y1e{bottom:772.804000pt;} -.y41a{bottom:772.992000pt;} -.yf82{bottom:773.156000pt;} -.y5c1{bottom:773.449333pt;} -.yc3{bottom:773.605333pt;} -.y146d{bottom:774.262667pt;} -.y544{bottom:774.417333pt;} -.y10b7{bottom:774.557333pt;} -.y7ad{bottom:774.861333pt;} -.y419{bottom:774.985333pt;} -.y1016{bottom:775.000000pt;} -.yccd{bottom:775.062667pt;} -.y517{bottom:775.254667pt;} +.y40f{bottom:772.992000pt;} +.yf3f{bottom:773.156000pt;} +.yc3{bottom:773.316000pt;} +.y5af{bottom:773.449333pt;} +.y1413{bottom:774.262667pt;} +.y533{bottom:774.417333pt;} +.y106e{bottom:774.557333pt;} +.y791{bottom:774.861333pt;} +.y40e{bottom:774.985333pt;} +.yfcf{bottom:775.000000pt;} +.yc94{bottom:775.062667pt;} +.y507{bottom:775.254667pt;} .y34{bottom:775.461333pt;} -.yfed{bottom:775.534667pt;} -.y11ec{bottom:775.590667pt;} -.yb6c{bottom:775.738667pt;} -.yb91{bottom:775.792000pt;} -.yb23{bottom:775.860000pt;} -.ya09{bottom:776.218667pt;} -.y863{bottom:776.384000pt;} -.y13e1{bottom:776.501333pt;} -.y80b{bottom:776.641333pt;} -.ycf1{bottom:776.841333pt;} -.y71d{bottom:777.214667pt;} -.y1397{bottom:777.518667pt;} -.y1036{bottom:777.726667pt;} -.y1530{bottom:778.117333pt;} -.y1509{bottom:778.192000pt;} -.ydf9{bottom:778.386667pt;} -.y142d{bottom:778.929333pt;} -.yca1{bottom:779.032000pt;} -.yd94{bottom:779.206667pt;} -.y8f5{bottom:779.298667pt;} -.ybba{bottom:779.478667pt;} -.y1298{bottom:779.482667pt;} -.y136a{bottom:779.593333pt;} -.y15a6{bottom:779.645333pt;} -.y273{bottom:779.845333pt;} -.y68f{bottom:780.062667pt;} -.y3db{bottom:780.165333pt;} -.y1051{bottom:780.584000pt;} -.y10ff{bottom:780.626667pt;} -.yafb{bottom:780.682667pt;} -.y491{bottom:780.774667pt;} +.yfa7{bottom:775.534667pt;} +.y119d{bottom:775.590667pt;} +.yb3a{bottom:775.738667pt;} +.yb5e{bottom:775.792000pt;} +.yaf3{bottom:775.860000pt;} +.y9df{bottom:776.218667pt;} +.y841{bottom:776.384000pt;} +.y1388{bottom:776.501333pt;} +.y7ec{bottom:776.641333pt;} +.ycb8{bottom:776.841333pt;} +.y705{bottom:777.214667pt;} +.y1340{bottom:777.518667pt;} +.yfee{bottom:777.726667pt;} +.y14d3{bottom:778.117333pt;} +.y14ad{bottom:778.192000pt;} +.ydbd{bottom:778.386667pt;} +.y13d4{bottom:778.929333pt;} +.yc69{bottom:779.032000pt;} +.yd5a{bottom:779.206667pt;} +.y8d0{bottom:779.298667pt;} +.yb86{bottom:779.478667pt;} +.y1248{bottom:779.482667pt;} +.y1314{bottom:779.593333pt;} +.y1548{bottom:779.645333pt;} +.y26c{bottom:779.845333pt;} +.y679{bottom:780.062667pt;} +.y3d1{bottom:780.165333pt;} +.y1009{bottom:780.584000pt;} +.y10b5{bottom:780.626667pt;} +.yacc{bottom:780.682667pt;} +.y483{bottom:780.774667pt;} .y2{bottom:781.178044pt;} -.ye6c{bottom:781.420000pt;} -.y760{bottom:781.446667pt;} -.yad0{bottom:781.540000pt;} -.yfac{bottom:781.580000pt;} -.y2c7{bottom:781.660000pt;} -.y786{bottom:781.682667pt;} -.y272{bottom:781.837333pt;} -.ye46{bottom:781.902667pt;} -.yaab{bottom:782.236000pt;} -.yc1c{bottom:782.312000pt;} -.ycce{bottom:783.165333pt;} -.ya56{bottom:783.430667pt;} -.y1f3{bottom:783.517333pt;} -.y969{bottom:783.962667pt;} -.y6ef{bottom:784.188000pt;} -.ya7a{bottom:784.198667pt;} -.yf29{bottom:784.346667pt;} -.y88c{bottom:784.384000pt;} -.y4e3{bottom:784.626667pt;} -.y15a4{bottom:784.760000pt;} -.ye8e{bottom:784.993333pt;} -.yb49{bottom:785.092000pt;} -.yd6a{bottom:785.098667pt;} -.y14c0{bottom:785.638667pt;} -.yed7{bottom:785.681333pt;} -.y4d1{bottom:785.689333pt;} -.ybf1{bottom:786.220000pt;} -.yd3a{bottom:786.436000pt;} -.y9be{bottom:786.544000pt;} -.y4e2{bottom:786.618667pt;} -.y9e0{bottom:786.660000pt;} -.ye20{bottom:786.946667pt;} -.y154b{bottom:786.968000pt;} -.y1319{bottom:787.029333pt;} -.y398{bottom:787.284000pt;} -.y4d0{bottom:787.681333pt;} -.yc56{bottom:787.698667pt;} -.y1404{bottom:788.252000pt;} -.y543{bottom:788.365333pt;} +.ye2d{bottom:781.420000pt;} +.y746{bottom:781.446667pt;} +.yaa2{bottom:781.540000pt;} +.yf69{bottom:781.580000pt;} +.y2c0{bottom:781.660000pt;} +.y76b{bottom:781.682667pt;} +.y26b{bottom:781.837333pt;} +.ye08{bottom:781.902667pt;} +.ya7e{bottom:782.236000pt;} +.ybe7{bottom:782.312000pt;} +.yc95{bottom:783.165333pt;} +.ya2a{bottom:783.430667pt;} +.y1ed{bottom:783.517333pt;} +.y942{bottom:783.962667pt;} +.y6d8{bottom:784.188000pt;} +.ya4d{bottom:784.198667pt;} +.yee7{bottom:784.346667pt;} +.y86a{bottom:784.384000pt;} +.y4d4{bottom:784.626667pt;} +.y1546{bottom:784.760000pt;} +.ye4f{bottom:784.993333pt;} +.yb18{bottom:785.092000pt;} +.yd30{bottom:785.098667pt;} +.y1465{bottom:785.638667pt;} +.ye97{bottom:785.681333pt;} +.y4c2{bottom:785.689333pt;} +.ybbd{bottom:786.220000pt;} +.yd01{bottom:786.436000pt;} +.y995{bottom:786.544000pt;} +.y4d3{bottom:786.618667pt;} +.y9b6{bottom:786.660000pt;} +.yde3{bottom:786.946667pt;} +.y14ee{bottom:786.968000pt;} +.y12c5{bottom:787.029333pt;} +.y38f{bottom:787.284000pt;} +.y4c1{bottom:787.681333pt;} +.yc1f{bottom:787.698667pt;} +.y13ab{bottom:788.252000pt;} +.y532{bottom:788.365333pt;} .y1d{bottom:788.744000pt;} -.y418{bottom:788.933333pt;} -.y397{bottom:789.276000pt;} -.y146c{bottom:790.202667pt;} -.y15a5{bottom:790.272000pt;} -.y542{bottom:790.357333pt;} -.y10b6{bottom:790.497333pt;} -.y7ac{bottom:790.801333pt;} -.y417{bottom:790.925333pt;} -.y1015{bottom:790.940000pt;} -.y516{bottom:791.194667pt;} +.y40d{bottom:788.933333pt;} +.y38e{bottom:789.276000pt;} +.y1412{bottom:790.202667pt;} +.y1547{bottom:790.272000pt;} +.y531{bottom:790.357333pt;} +.y106d{bottom:790.497333pt;} +.y790{bottom:790.801333pt;} +.y40c{bottom:790.925333pt;} +.yfce{bottom:790.940000pt;} +.y506{bottom:791.194667pt;} .y61{bottom:791.401333pt;} -.yfec{bottom:791.474667pt;} -.y11eb{bottom:791.530667pt;} -.ya08{bottom:792.160000pt;} -.y862{bottom:792.324000pt;} -.y13e0{bottom:792.441333pt;} -.y3da{bottom:792.564000pt;} -.y80a{bottom:792.581333pt;} -.y149c{bottom:792.637333pt;} -.yd68{bottom:792.936000pt;} -.yeac{bottom:793.154667pt;} -.y1396{bottom:793.458667pt;} -.y1035{bottom:793.666667pt;} -.yc8b{bottom:794.057333pt;} -.y1508{bottom:794.132000pt;} -.y142c{bottom:794.869333pt;} -.yca0{bottom:794.972000pt;} -.yd93{bottom:795.146667pt;} -.y8f4{bottom:795.238667pt;} -.ybb9{bottom:795.420000pt;} -.y1297{bottom:795.422667pt;} -.y1369{bottom:795.533333pt;} -.y68e{bottom:796.002667pt;} -.y3d8{bottom:796.105333pt;} -.y271{bottom:796.316000pt;} -.y10fe{bottom:796.568000pt;} -.yafa{bottom:796.622667pt;} -.y48f{bottom:796.714667pt;} -.y459{bottom:797.113333pt;} -.y8af{bottom:797.118667pt;} -.y14e4{bottom:797.246667pt;} -.ye6b{bottom:797.361333pt;} -.yaaa{bottom:797.378667pt;} -.yfab{bottom:797.520000pt;} -.yeb{bottom:798.042667pt;} -.y270{bottom:798.309333pt;} -.y2c6{bottom:798.928000pt;} -.y34f{bottom:799.102667pt;} -.y14a{bottom:799.370667pt;} -.y1f2{bottom:799.457333pt;} -.yd14{bottom:799.504000pt;} -.yccc{bottom:799.637333pt;} -.y968{bottom:799.902667pt;} -.y148f{bottom:800.000000pt;} -.y6ee{bottom:800.128000pt;} -.yf28{bottom:800.286667pt;} -.y88b{bottom:800.325333pt;} -.y350{bottom:800.406667pt;} -.yb22{bottom:800.434667pt;} -.y4e1{bottom:800.566667pt;} -.ya79{bottom:800.670667pt;} -.ye8d{bottom:800.933333pt;} -.yd69{bottom:801.038667pt;} -.y15a3{bottom:801.430667pt;} -.y490{bottom:801.534667pt;} -.y121e{bottom:801.560000pt;} -.y14bf{bottom:801.578667pt;} -.yed6{bottom:801.622667pt;} -.y4cf{bottom:801.629333pt;} -.y3d9{bottom:801.788000pt;} -.yd39{bottom:802.376000pt;} -.y34d{bottom:802.400000pt;} -.y9bd{bottom:802.484000pt;} -.y4e0{bottom:802.560000pt;} -.y9df{bottom:802.600000pt;} -.yf7c{bottom:802.666667pt;} -.y630{bottom:802.692000pt;} -.y4ce{bottom:803.622667pt;} -.y396{bottom:803.754667pt;} -.y541{bottom:804.305333pt;} -.ye5{bottom:804.685333pt;} -.y416{bottom:804.873333pt;} -.y5c0{bottom:805.329333pt;} -.y395{bottom:805.748000pt;} -.yacf{bottom:806.060000pt;} -.y146b{bottom:806.142667pt;} -.y540{bottom:806.298667pt;} -.ye45{bottom:806.421333pt;} -.y10b5{bottom:806.437333pt;} -.y15a1{bottom:806.544000pt;} -.y7ab{bottom:806.741333pt;} -.yc2{bottom:806.758667pt;} -.y415{bottom:806.865333pt;} -.y1014{bottom:806.881333pt;} -.y515{bottom:807.134667pt;} -.y1318{bottom:807.145333pt;} -.y34e{bottom:807.220000pt;} +.yfa6{bottom:791.474667pt;} +.y119c{bottom:791.530667pt;} +.y9de{bottom:792.160000pt;} +.y840{bottom:792.324000pt;} +.y1387{bottom:792.441333pt;} +.y3d0{bottom:792.564000pt;} +.y7eb{bottom:792.581333pt;} +.y1441{bottom:792.637333pt;} +.yd2e{bottom:792.936000pt;} +.ye6d{bottom:793.154667pt;} +.y133f{bottom:793.458667pt;} +.yfed{bottom:793.666667pt;} +.yc52{bottom:794.057333pt;} +.y14ac{bottom:794.132000pt;} +.y13d3{bottom:794.869333pt;} +.yc68{bottom:794.972000pt;} +.yd59{bottom:795.146667pt;} +.y8cf{bottom:795.238667pt;} +.yb85{bottom:795.420000pt;} +.y1247{bottom:795.422667pt;} +.y1313{bottom:795.533333pt;} +.y678{bottom:796.002667pt;} +.y3ce{bottom:796.105333pt;} +.y26a{bottom:796.316000pt;} +.y10b4{bottom:796.568000pt;} +.yacb{bottom:796.622667pt;} +.ye6{bottom:796.714667pt;} +.y44d{bottom:797.113333pt;} +.y88c{bottom:797.118667pt;} +.y1488{bottom:797.246667pt;} +.ye2c{bottom:797.361333pt;} +.ya7d{bottom:797.378667pt;} +.yf68{bottom:797.520000pt;} +.yee{bottom:798.042667pt;} +.y269{bottom:798.309333pt;} +.y2bf{bottom:798.928000pt;} +.y347{bottom:799.102667pt;} +.y148{bottom:799.370667pt;} +.y1ec{bottom:799.457333pt;} +.ycdb{bottom:799.504000pt;} +.yc93{bottom:799.637333pt;} +.y941{bottom:799.902667pt;} +.y6d7{bottom:800.128000pt;} +.yee6{bottom:800.286667pt;} +.y869{bottom:800.325333pt;} +.y348{bottom:800.406667pt;} +.yaf2{bottom:800.434667pt;} +.y4d2{bottom:800.566667pt;} +.ya4c{bottom:800.670667pt;} +.ye4e{bottom:800.933333pt;} +.yd2f{bottom:801.038667pt;} +.y1545{bottom:801.430667pt;} +.y482{bottom:801.534667pt;} +.y11cf{bottom:801.560000pt;} +.y1464{bottom:801.578667pt;} +.ye96{bottom:801.622667pt;} +.y4c0{bottom:801.629333pt;} +.y3cf{bottom:801.788000pt;} +.yd00{bottom:802.376000pt;} +.y345{bottom:802.400000pt;} +.y994{bottom:802.484000pt;} +.y4d1{bottom:802.560000pt;} +.y9b5{bottom:802.600000pt;} +.y61c{bottom:802.692000pt;} +.y4bf{bottom:803.622667pt;} +.y38d{bottom:803.754667pt;} +.y530{bottom:804.305333pt;} +.y22b{bottom:804.685333pt;} +.y40b{bottom:804.873333pt;} +.y5ae{bottom:805.329333pt;} +.y38c{bottom:805.748000pt;} +.yaa1{bottom:806.060000pt;} +.y1411{bottom:806.142667pt;} +.y52f{bottom:806.298667pt;} +.ye07{bottom:806.421333pt;} +.y106c{bottom:806.437333pt;} +.y1543{bottom:806.544000pt;} +.yc2{bottom:806.585333pt;} +.y78f{bottom:806.741333pt;} +.y40a{bottom:806.865333pt;} +.yfcd{bottom:806.881333pt;} +.y505{bottom:807.134667pt;} +.y12c4{bottom:807.145333pt;} +.y346{bottom:807.220000pt;} .y60{bottom:807.341333pt;} -.yfeb{bottom:807.414667pt;} -.y11ea{bottom:807.470667pt;} -.ycca{bottom:807.474667pt;} -.ydf8{bottom:807.476000pt;} -.ya07{bottom:808.100000pt;} -.yb21{bottom:808.272000pt;} -.y809{bottom:808.522667pt;} -.ydd1{bottom:808.721333pt;} -.y75f{bottom:809.005333pt;} -.y1395{bottom:809.398667pt;} -.y1034{bottom:809.606667pt;} -.ya55{bottom:809.998667pt;} -.yf81{bottom:810.072000pt;} -.y142b{bottom:810.810667pt;} -.yd92{bottom:811.086667pt;} -.y71c{bottom:811.178667pt;} -.ybb8{bottom:811.360000pt;} -.ye1f{bottom:811.465333pt;} -.y1368{bottom:811.474667pt;} -.y68d{bottom:811.942667pt;} -.y3d7{bottom:812.046667pt;} -.y15a2{bottom:812.057333pt;} +.yfa5{bottom:807.414667pt;} +.y119b{bottom:807.470667pt;} +.yc91{bottom:807.474667pt;} +.ydbc{bottom:807.476000pt;} +.y9dd{bottom:808.100000pt;} +.yaf1{bottom:808.272000pt;} +.y7ea{bottom:808.522667pt;} +.yd95{bottom:808.721333pt;} +.y745{bottom:809.005333pt;} +.y133e{bottom:809.398667pt;} +.yfec{bottom:809.606667pt;} +.ya29{bottom:809.998667pt;} +.yf3e{bottom:810.072000pt;} +.y13d2{bottom:810.810667pt;} +.yd58{bottom:811.086667pt;} +.y704{bottom:811.178667pt;} +.yb84{bottom:811.360000pt;} +.yde2{bottom:811.465333pt;} +.y1312{bottom:811.474667pt;} +.y677{bottom:811.942667pt;} +.y3cd{bottom:812.046667pt;} +.y1544{bottom:812.057333pt;} .y11{bottom:812.118667pt;} -.y10fd{bottom:812.508000pt;} -.yaa9{bottom:812.522667pt;} -.yaf9{bottom:812.562667pt;} -.y48e{bottom:812.654667pt;} -.y26f{bottom:812.788000pt;} -.y13b8{bottom:812.802667pt;} -.y458{bottom:813.053333pt;} -.y8ae{bottom:813.058667pt;} -.ye6a{bottom:813.301333pt;} -.yfaa{bottom:813.460000pt;} -.y785{bottom:813.562667pt;} -.y14e3{bottom:814.249333pt;} -.yb6b{bottom:814.408000pt;} -.y26e{bottom:814.780000pt;} -.y2c5{bottom:814.869333pt;} -.y34c{bottom:815.042667pt;} -.y149{bottom:815.312000pt;} -.y1f0{bottom:815.397333pt;} -.yd13{bottom:815.444000pt;} -.yccb{bottom:815.577333pt;} -.ybf0{bottom:815.976000pt;} -.y6ed{bottom:816.068000pt;} -.yf27{bottom:816.226667pt;} -.y88a{bottom:816.265333pt;} -.y967{bottom:816.374667pt;} -.yb48{bottom:816.400000pt;} -.ye8c{bottom:816.873333pt;} -.ya78{bottom:817.141333pt;} -.yd67{bottom:817.510667pt;} -.y14be{bottom:817.518667pt;} -.yed5{bottom:817.562667pt;} -.y4cd{bottom:817.569333pt;} -.yd38{bottom:818.317333pt;} -.y34a{bottom:818.340000pt;} -.y9bc{bottom:818.424000pt;} -.y9de{bottom:818.540000pt;} -.y62f{bottom:818.632000pt;} -.y4df{bottom:819.030667pt;} -.y5bf{bottom:819.277333pt;} -.yc9f{bottom:819.492000pt;} -.y4cc{bottom:819.562667pt;} -.y1f1{bottom:820.218667pt;} -.y394{bottom:820.226667pt;} -.y231{bottom:820.625333pt;} -.y1050{bottom:821.037333pt;} -.y5be{bottom:821.270667pt;} -.y11b0{bottom:821.852000pt;} -.yf51{bottom:821.952000pt;} -.y393{bottom:822.218667pt;} -.y53f{bottom:822.238667pt;} -.y10b4{bottom:822.378667pt;} -.y7aa{bottom:822.682667pt;} -.y1013{bottom:822.821333pt;} -.y514{bottom:823.074667pt;} -.y34b{bottom:823.160000pt;} -.y15a0{bottom:823.214667pt;} +.y10b3{bottom:812.508000pt;} +.ya7c{bottom:812.522667pt;} +.yaca{bottom:812.562667pt;} +.y481{bottom:812.654667pt;} +.y268{bottom:812.788000pt;} +.y1360{bottom:812.802667pt;} +.y44c{bottom:813.053333pt;} +.y88b{bottom:813.058667pt;} +.ye2b{bottom:813.301333pt;} +.yf67{bottom:813.460000pt;} +.y76a{bottom:813.562667pt;} +.y1487{bottom:814.249333pt;} +.yb39{bottom:814.408000pt;} +.y267{bottom:814.780000pt;} +.y2be{bottom:814.869333pt;} +.y344{bottom:815.042667pt;} +.y147{bottom:815.312000pt;} +.y1ea{bottom:815.397333pt;} +.ycda{bottom:815.444000pt;} +.yc92{bottom:815.577333pt;} +.ybbc{bottom:815.976000pt;} +.y6d6{bottom:816.068000pt;} +.yee5{bottom:816.226667pt;} +.y868{bottom:816.265333pt;} +.y940{bottom:816.374667pt;} +.yb17{bottom:816.400000pt;} +.ye4d{bottom:816.873333pt;} +.ya4b{bottom:817.141333pt;} +.yd2d{bottom:817.510667pt;} +.y1463{bottom:817.518667pt;} +.ye95{bottom:817.562667pt;} +.y4be{bottom:817.569333pt;} +.ycff{bottom:818.317333pt;} +.y342{bottom:818.340000pt;} +.y993{bottom:818.424000pt;} +.y9b4{bottom:818.540000pt;} +.y61b{bottom:818.632000pt;} +.y4d0{bottom:819.030667pt;} +.y5ad{bottom:819.277333pt;} +.yc67{bottom:819.492000pt;} +.y4bd{bottom:819.562667pt;} +.y1eb{bottom:820.218667pt;} +.y38b{bottom:820.226667pt;} +.y22a{bottom:820.625333pt;} +.y1008{bottom:821.037333pt;} +.y5ac{bottom:821.270667pt;} +.y1162{bottom:821.852000pt;} +.yf0f{bottom:821.952000pt;} +.y38a{bottom:822.218667pt;} +.y52e{bottom:822.238667pt;} +.y106b{bottom:822.378667pt;} +.y78e{bottom:822.682667pt;} +.yfcc{bottom:822.821333pt;} +.y504{bottom:823.074667pt;} +.y343{bottom:823.160000pt;} +.y1542{bottom:823.214667pt;} .y5f{bottom:823.281333pt;} -.y414{bottom:823.337333pt;} -.yfea{bottom:823.356000pt;} -.y11e9{bottom:823.410667pt;} -.ydf7{bottom:823.416000pt;} -.ya06{bottom:824.040000pt;} -.y808{bottom:824.462667pt;} -.y1296{bottom:824.517333pt;} -.ydd0{bottom:824.661333pt;} -.y75e{bottom:824.945333pt;} -.y1394{bottom:825.338667pt;} -.yd65{bottom:825.348000pt;} -.ya54{bottom:825.938667pt;} -.yf80{bottom:826.012000pt;} -.y142a{bottom:826.750667pt;} -.yc1b{bottom:826.945333pt;} -.yd91{bottom:827.028000pt;} -.y2c4{bottom:827.046667pt;} -.y71b{bottom:827.118667pt;} -.ybb7{bottom:827.300000pt;} -.y1367{bottom:827.414667pt;} -.yaa8{bottom:827.665333pt;} -.y68c{bottom:827.884000pt;} -.y3d5{bottom:827.986667pt;} +.y409{bottom:823.337333pt;} +.yfa4{bottom:823.356000pt;} +.y119a{bottom:823.410667pt;} +.ydbb{bottom:823.416000pt;} +.y9dc{bottom:824.040000pt;} +.y7e9{bottom:824.462667pt;} +.y1246{bottom:824.517333pt;} +.yd94{bottom:824.661333pt;} +.y744{bottom:824.945333pt;} +.y133d{bottom:825.338667pt;} +.yd2b{bottom:825.348000pt;} +.ya28{bottom:825.938667pt;} +.yf3d{bottom:826.012000pt;} +.y13d1{bottom:826.750667pt;} +.ybe6{bottom:826.945333pt;} +.yd57{bottom:827.028000pt;} +.y2bd{bottom:827.046667pt;} +.y703{bottom:827.118667pt;} +.yb83{bottom:827.300000pt;} +.y1311{bottom:827.414667pt;} +.ya7b{bottom:827.665333pt;} +.y676{bottom:827.884000pt;} +.y3cb{bottom:827.986667pt;} .y10{bottom:828.058667pt;} -.y159e{bottom:828.329333pt;} -.y10fc{bottom:828.448000pt;} -.y48d{bottom:828.594667pt;} -.y13b7{bottom:828.742667pt;} -.y8ad{bottom:829.000000pt;} -.ye69{bottom:829.241333pt;} -.y26d{bottom:829.260000pt;} -.yfa9{bottom:829.400000pt;} -.yb6a{bottom:830.348000pt;} -.y14e2{bottom:830.720000pt;} -.y347{bottom:830.738667pt;} -.y2c2{bottom:830.809333pt;} -.y349{bottom:830.982667pt;} -.y148{bottom:831.252000pt;} -.y1ee{bottom:831.337333pt;} -.ybed{bottom:831.782667pt;} -.ybef{bottom:831.916000pt;} -.y6ec{bottom:832.008000pt;} -.ycc9{bottom:832.049333pt;} -.yf26{bottom:832.166667pt;} -.y889{bottom:832.205333pt;} -.yc1{bottom:832.634667pt;} -.y3d6{bottom:832.806667pt;} -.y966{bottom:832.845333pt;} -.yd66{bottom:833.450667pt;} -.y14bd{bottom:833.458667pt;} -.yed4{bottom:833.502667pt;} -.y4cb{bottom:833.510667pt;} -.ya77{bottom:833.613333pt;} -.y159f{bottom:833.842667pt;} -.yd37{bottom:834.257333pt;} -.y345{bottom:834.280000pt;} -.y9bb{bottom:834.364000pt;} -.y4ca{bottom:835.502667pt;} -.y2c3{bottom:835.629333pt;} -.y1192{bottom:836.000000pt;} -.y1ef{bottom:836.158667pt;} -.y230{bottom:836.565333pt;} -.y392{bottom:836.698667pt;} -.y104f{bottom:836.977333pt;} -.y13df{bottom:837.073333pt;} -.y44b{bottom:837.494667pt;} -.yf50{bottom:837.892000pt;} -.y10b3{bottom:838.318667pt;} -.y7a9{bottom:838.622667pt;} -.y391{bottom:838.690667pt;} -.y513{bottom:839.014667pt;} -.y348{bottom:839.101333pt;} -.yaf8{bottom:839.130667pt;} +.y1540{bottom:828.329333pt;} +.y10b2{bottom:828.448000pt;} +.y480{bottom:828.594667pt;} +.y135f{bottom:828.742667pt;} +.y88a{bottom:829.000000pt;} +.ye2a{bottom:829.241333pt;} +.y266{bottom:829.260000pt;} +.yf66{bottom:829.400000pt;} +.yb38{bottom:830.348000pt;} +.y1486{bottom:830.720000pt;} +.y33f{bottom:830.738667pt;} +.y2bb{bottom:830.809333pt;} +.y341{bottom:830.982667pt;} +.y146{bottom:831.252000pt;} +.y1e8{bottom:831.337333pt;} +.ybb9{bottom:831.782667pt;} +.ybbb{bottom:831.916000pt;} +.y6d5{bottom:832.008000pt;} +.yc90{bottom:832.049333pt;} +.yee4{bottom:832.166667pt;} +.y867{bottom:832.205333pt;} +.yc1{bottom:832.518667pt;} +.y3cc{bottom:832.806667pt;} +.y93f{bottom:832.845333pt;} +.yd2c{bottom:833.450667pt;} +.y1462{bottom:833.458667pt;} +.ye94{bottom:833.502667pt;} +.y4bc{bottom:833.510667pt;} +.ya4a{bottom:833.613333pt;} +.y1541{bottom:833.842667pt;} +.ycfe{bottom:834.257333pt;} +.y33d{bottom:834.280000pt;} +.y992{bottom:834.364000pt;} +.y4bb{bottom:835.502667pt;} +.y2bc{bottom:835.629333pt;} +.y1e9{bottom:836.158667pt;} +.y229{bottom:836.565333pt;} +.y389{bottom:836.698667pt;} +.y1007{bottom:836.977333pt;} +.y1386{bottom:837.073333pt;} +.y43f{bottom:837.494667pt;} +.yf0e{bottom:837.892000pt;} +.y106a{bottom:838.318667pt;} +.y78d{bottom:838.622667pt;} +.y388{bottom:838.690667pt;} +.y503{bottom:839.014667pt;} +.y340{bottom:839.101333pt;} +.yac9{bottom:839.130667pt;} .y5e{bottom:839.221333pt;} -.y413{bottom:839.277333pt;} -.yfe9{bottom:839.296000pt;} -.y11e8{bottom:839.350667pt;} -.ydf6{bottom:839.356000pt;} -.y121d{bottom:839.680000pt;} -.ycc7{bottom:839.886667pt;} -.y346{bottom:839.962667pt;} -.ya05{bottom:839.980000pt;} -.y807{bottom:840.402667pt;} -.ydcf{bottom:840.601333pt;} -.yb20{bottom:840.682667pt;} -.y75d{bottom:840.886667pt;} -.y1393{bottom:841.278667pt;} -.y1167{bottom:841.878667pt;} -.yf7f{bottom:841.952000pt;} -.y1429{bottom:842.690667pt;} -.yaa7{bottom:842.808000pt;} -.yd90{bottom:842.968000pt;} -.y71a{bottom:843.060000pt;} -.yace{bottom:843.244000pt;} -.ye44{bottom:843.425333pt;} -.y68b{bottom:843.824000pt;} -.y3d4{bottom:843.926667pt;} -.y10fb{bottom:844.388000pt;} -.y1366{bottom:844.682667pt;} -.y8ac{bottom:844.940000pt;} -.y159d{bottom:845.000000pt;} -.ye68{bottom:845.181333pt;} -.y784{bottom:845.444000pt;} -.y26c{bottom:845.730667pt;} -.y5bd{bottom:846.134667pt;} -.y11af{bottom:846.293333pt;} -.y2c1{bottom:846.749333pt;} -.y147{bottom:847.192000pt;} -.yb90{bottom:847.201333pt;} -.y1ec{bottom:847.278667pt;} -.yd11{bottom:847.722667pt;} -.y26b{bottom:847.724000pt;} -.ybee{bottom:847.856000pt;} -.ycc8{bottom:847.989333pt;} -.yc0{bottom:848.574667pt;} -.y965{bottom:848.786667pt;} -.yed3{bottom:849.442667pt;} -.y4c9{bottom:849.450667pt;} -.yd64{bottom:849.922667pt;} -.ya76{bottom:850.085333pt;} -.y159b{bottom:850.114667pt;} -.yd36{bottom:850.197333pt;} -.y9ba{bottom:850.304000pt;} -.y53e{bottom:850.513333pt;} -.yc1a{bottom:851.386667pt;} -.y4c8{bottom:851.442667pt;} -.y1ed{bottom:852.098667pt;} -.y22f{bottom:852.505333pt;} -.y390{bottom:853.169333pt;} -.yf4f{bottom:853.832000pt;} -.y7a8{bottom:854.562667pt;} -.y511{bottom:854.954667pt;} -.yaf7{bottom:855.070667pt;} +.y408{bottom:839.277333pt;} +.yfa3{bottom:839.296000pt;} +.y1199{bottom:839.350667pt;} +.ydba{bottom:839.356000pt;} +.y11ce{bottom:839.680000pt;} +.yc8e{bottom:839.886667pt;} +.y33e{bottom:839.962667pt;} +.y9db{bottom:839.980000pt;} +.y7e8{bottom:840.402667pt;} +.yd93{bottom:840.601333pt;} +.yaf0{bottom:840.682667pt;} +.y743{bottom:840.886667pt;} +.y133c{bottom:841.278667pt;} +.y111b{bottom:841.878667pt;} +.yf3c{bottom:841.952000pt;} +.y13d0{bottom:842.690667pt;} +.ya7a{bottom:842.808000pt;} +.yd56{bottom:842.968000pt;} +.y702{bottom:843.060000pt;} +.yaa0{bottom:843.244000pt;} +.ye06{bottom:843.425333pt;} +.y675{bottom:843.824000pt;} +.y3ca{bottom:843.926667pt;} +.y10b1{bottom:844.388000pt;} +.y1310{bottom:844.682667pt;} +.y889{bottom:844.940000pt;} +.y153f{bottom:845.000000pt;} +.ye29{bottom:845.181333pt;} +.y769{bottom:845.444000pt;} +.y265{bottom:845.730667pt;} +.y5ab{bottom:846.134667pt;} +.y1161{bottom:846.293333pt;} +.y2ba{bottom:846.749333pt;} +.y145{bottom:847.192000pt;} +.yb5d{bottom:847.201333pt;} +.y1e6{bottom:847.278667pt;} +.ycd8{bottom:847.722667pt;} +.y264{bottom:847.724000pt;} +.ybba{bottom:847.856000pt;} +.yc8f{bottom:847.989333pt;} +.yc0{bottom:848.458667pt;} +.y93e{bottom:848.786667pt;} +.ye93{bottom:849.442667pt;} +.y4ba{bottom:849.450667pt;} +.yd2a{bottom:849.922667pt;} +.ya49{bottom:850.085333pt;} +.y153d{bottom:850.114667pt;} +.ycfd{bottom:850.197333pt;} +.y991{bottom:850.304000pt;} +.y52d{bottom:850.513333pt;} +.ybe5{bottom:851.386667pt;} +.y4b9{bottom:851.442667pt;} +.y1e7{bottom:852.098667pt;} +.y228{bottom:852.505333pt;} +.y387{bottom:853.169333pt;} +.yf0d{bottom:853.832000pt;} +.y78c{bottom:854.562667pt;} +.y501{bottom:854.954667pt;} +.yac8{bottom:855.070667pt;} .y5d{bottom:855.162667pt;} -.yfe8{bottom:855.236000pt;} -.y11e7{bottom:855.290667pt;} -.ydf5{bottom:855.296000pt;} -.y121c{bottom:855.620000pt;} -.y159c{bottom:855.626667pt;} -.yc9e{bottom:856.217333pt;} -.y3d3{bottom:856.324000pt;} -.y806{bottom:856.342667pt;} -.y6eb{bottom:856.528000pt;} -.ydce{bottom:856.542667pt;} -.y1391{bottom:857.218667pt;} -.y14bb{bottom:857.518667pt;} -.yd62{bottom:857.760000pt;} +.yfa2{bottom:855.236000pt;} +.y1198{bottom:855.290667pt;} +.ydb9{bottom:855.296000pt;} +.y11cd{bottom:855.620000pt;} +.y153e{bottom:855.626667pt;} +.yc66{bottom:856.217333pt;} +.y3c9{bottom:856.324000pt;} +.y7e7{bottom:856.342667pt;} +.y6d4{bottom:856.528000pt;} +.yd92{bottom:856.542667pt;} +.y133a{bottom:857.218667pt;} +.y1460{bottom:857.518667pt;} +.yd28{bottom:857.760000pt;} .y1c{bottom:857.818667pt;} -.y1012{bottom:857.892000pt;} -.yf7e{bottom:857.893333pt;} -.yaa6{bottom:857.952000pt;} -.yfa8{bottom:858.494667pt;} -.y1428{bottom:858.630667pt;} -.y719{bottom:859.000000pt;} -.yacd{bottom:859.184000pt;} -.y32c{bottom:859.238667pt;} -.ye43{bottom:859.365333pt;} -.y68a{bottom:859.764000pt;} -.y512{bottom:859.776000pt;} -.y3d1{bottom:859.866667pt;} -.y10fa{bottom:860.328000pt;} -.y1365{bottom:860.622667pt;} -.y13d6{bottom:861.514667pt;} -.yb69{bottom:861.656000pt;} -.y1392{bottom:862.040000pt;} -.y26a{bottom:862.202667pt;} -.y14bc{bottom:862.340000pt;} -.y2c0{bottom:862.689333pt;} -.yc8a{bottom:863.132000pt;} -.y1eb{bottom:863.218667pt;} -.y14e1{bottom:863.664000pt;} -.yd12{bottom:863.796000pt;} -.y269{bottom:864.194667pt;} -.ybec{bottom:864.328000pt;} -.yea{bottom:864.460000pt;} -.ybf{bottom:864.514667pt;} -.y964{bottom:865.257333pt;} -.y4c7{bottom:865.390667pt;} -.y3d2{bottom:865.549333pt;} -.ye4{bottom:865.789333pt;} -.yd63{bottom:865.862667pt;} -.yd35{bottom:866.137333pt;} -.y53d{bottom:866.453333pt;} -.y159a{bottom:866.785333pt;} -.y4c6{bottom:867.382667pt;} -.y4de{bottom:867.914667pt;} +.yfcb{bottom:857.892000pt;} +.yf3b{bottom:857.893333pt;} +.ya79{bottom:857.952000pt;} +.yf65{bottom:858.494667pt;} +.y13cf{bottom:858.630667pt;} +.y701{bottom:859.000000pt;} +.ya9f{bottom:859.184000pt;} +.y324{bottom:859.238667pt;} +.ye05{bottom:859.365333pt;} +.y674{bottom:859.764000pt;} +.y502{bottom:859.776000pt;} +.y3c7{bottom:859.866667pt;} +.y10b0{bottom:860.328000pt;} +.y130f{bottom:860.622667pt;} +.y137d{bottom:861.514667pt;} +.yb37{bottom:861.656000pt;} +.y133b{bottom:862.040000pt;} +.y263{bottom:862.202667pt;} +.y1461{bottom:862.340000pt;} +.y2b9{bottom:862.689333pt;} +.yc51{bottom:863.132000pt;} +.y1e5{bottom:863.218667pt;} +.y1485{bottom:863.664000pt;} +.ycd9{bottom:863.796000pt;} +.y262{bottom:864.194667pt;} +.ybb8{bottom:864.328000pt;} +.ybf{bottom:864.400000pt;} +.yed{bottom:864.460000pt;} +.y93d{bottom:865.257333pt;} +.y4b8{bottom:865.390667pt;} +.y3c8{bottom:865.549333pt;} +.yd29{bottom:865.862667pt;} +.ycfc{bottom:866.137333pt;} +.y52c{bottom:866.453333pt;} +.y153c{bottom:866.785333pt;} +.y4b7{bottom:867.382667pt;} +.y4cf{bottom:867.914667pt;} .y8b{bottom:868.445333pt;} -.y38f{bottom:869.641333pt;} -.ya75{bottom:869.744000pt;} -.y5bc{bottom:869.858667pt;} -.y7a7{bottom:870.502667pt;} -.y510{bottom:870.896000pt;} -.yaf6{bottom:871.010667pt;} +.y386{bottom:869.641333pt;} +.ya48{bottom:869.744000pt;} +.y5aa{bottom:869.858667pt;} +.y78b{bottom:870.502667pt;} +.y500{bottom:870.896000pt;} +.yac7{bottom:871.010667pt;} .y5c{bottom:871.102667pt;} -.yfe7{bottom:871.176000pt;} -.y888{bottom:871.232000pt;} -.y121b{bottom:871.560000pt;} -.y38e{bottom:871.633333pt;} -.y5bb{bottom:871.850667pt;} -.y1598{bottom:871.900000pt;} -.yc9d{bottom:872.157333pt;} -.y805{bottom:872.282667pt;} -.ycc5{bottom:872.297333pt;} -.y783{bottom:872.885333pt;} -.ya04{bottom:873.048000pt;} -.yaa5{bottom:873.094667pt;} -.y1390{bottom:873.160000pt;} -.y48c{bottom:873.228000pt;} -.y117a{bottom:873.266667pt;} -.y146{bottom:873.758667pt;} -.yf7d{bottom:873.833333pt;} -.y9b9{bottom:874.824000pt;} -.y8f3{bottom:874.940000pt;} -.y689{bottom:875.704000pt;} -.y3d0{bottom:875.806667pt;} -.y10f9{bottom:876.268000pt;} -.y1364{bottom:876.564000pt;} -.y1599{bottom:877.412000pt;} -.y2bf{bottom:878.629333pt;} -.y268{bottom:878.674667pt;} -.y1427{bottom:878.748000pt;} -.ya53{bottom:879.072000pt;} -.y1e9{bottom:879.158667pt;} -.ybe9{bottom:880.134667pt;} -.ybeb{bottom:880.268000pt;} -.ycc6{bottom:880.401333pt;} -.ybe{bottom:880.456000pt;} -.y267{bottom:880.666667pt;} -.y963{bottom:881.197333pt;} -.y4c5{bottom:881.330667pt;} -.ye3{bottom:881.729333pt;} +.yfa1{bottom:871.176000pt;} +.y866{bottom:871.232000pt;} +.y11cc{bottom:871.560000pt;} +.y385{bottom:871.633333pt;} +.y5a9{bottom:871.850667pt;} +.y153a{bottom:871.900000pt;} +.yc65{bottom:872.157333pt;} +.y7e6{bottom:872.282667pt;} +.yc8c{bottom:872.297333pt;} +.y768{bottom:872.885333pt;} +.y9da{bottom:873.048000pt;} +.ya78{bottom:873.094667pt;} +.y1339{bottom:873.160000pt;} +.y47f{bottom:873.228000pt;} +.y112e{bottom:873.266667pt;} +.y144{bottom:873.758667pt;} +.yf3a{bottom:873.833333pt;} +.y990{bottom:874.824000pt;} +.y8ce{bottom:874.940000pt;} +.y673{bottom:875.704000pt;} +.y3c6{bottom:875.806667pt;} +.y10af{bottom:876.268000pt;} +.y130e{bottom:876.564000pt;} +.y153b{bottom:877.412000pt;} +.y2b8{bottom:878.629333pt;} +.y261{bottom:878.674667pt;} +.y13ce{bottom:878.748000pt;} +.ya27{bottom:879.072000pt;} +.y1e3{bottom:879.158667pt;} +.ybb5{bottom:880.134667pt;} +.ybb7{bottom:880.268000pt;} +.ybe{bottom:880.340000pt;} +.yc8d{bottom:880.401333pt;} +.y260{bottom:880.666667pt;} +.y93c{bottom:881.197333pt;} +.y4b6{bottom:881.330667pt;} .yf{bottom:881.794667pt;} -.yd61{bottom:882.334667pt;} -.y4dd{bottom:882.393333pt;} -.y14ba{bottom:882.833333pt;} -.y4c4{bottom:883.322667pt;} -.y1ea{bottom:883.978667pt;} -.yd8f{bottom:884.294667pt;} +.yd27{bottom:882.334667pt;} +.y4ce{bottom:882.393333pt;} +.y145f{bottom:882.833333pt;} +.y4b5{bottom:883.322667pt;} +.y1e4{bottom:883.978667pt;} +.yd55{bottom:884.294667pt;} .y8a{bottom:884.385333pt;} -.ya74{bottom:885.685333pt;} -.y38d{bottom:886.113333pt;} -.y50f{bottom:886.836000pt;} -.yaf5{bottom:886.950667pt;} +.ya47{bottom:885.685333pt;} +.y384{bottom:886.113333pt;} +.y4ff{bottom:886.836000pt;} +.yac6{bottom:886.950667pt;} .y5b{bottom:887.042667pt;} -.yfe6{bottom:887.116000pt;} -.y887{bottom:887.172000pt;} -.y121a{bottom:887.500000pt;} -.yc9c{bottom:888.097333pt;} -.y38c{bottom:888.105333pt;} -.y804{bottom:888.222667pt;} -.yaa4{bottom:888.238667pt;} -.y6ea{bottom:888.278667pt;} -.ye42{bottom:888.460000pt;} -.y1597{bottom:888.570667pt;} -.y782{bottom:888.825333pt;} -.ya03{bottom:888.988000pt;} -.y138f{bottom:889.100000pt;} -.y48b{bottom:889.168000pt;} -.yb8f{bottom:889.206667pt;} -.y145{bottom:889.698667pt;} -.y1011{bottom:889.773333pt;} -.y10d{bottom:889.858667pt;} -.yd5f{bottom:890.172000pt;} -.yf4e{bottom:890.261333pt;} -.yd34{bottom:890.657333pt;} -.y8f2{bottom:890.880000pt;} -.y688{bottom:891.644000pt;} -.y3cf{bottom:891.746667pt;} -.yed2{bottom:891.876000pt;} -.y1363{bottom:892.504000pt;} -.y1595{bottom:893.684000pt;} -.y2be{bottom:894.569333pt;} -.y7d2{bottom:895.013333pt;} -.y7a6{bottom:895.021333pt;} -.y266{bottom:895.145333pt;} -.y5ba{bottom:895.573333pt;} -.ybea{bottom:896.208000pt;} -.ycc4{bottom:896.872000pt;} -.y265{bottom:897.138667pt;} -.y5b9{bottom:897.566667pt;} -.ye2{bottom:897.669333pt;} +.yfa0{bottom:887.116000pt;} +.y865{bottom:887.172000pt;} +.y11cb{bottom:887.500000pt;} +.yc64{bottom:888.097333pt;} +.y383{bottom:888.105333pt;} +.y7e5{bottom:888.222667pt;} +.ya77{bottom:888.238667pt;} +.y6d3{bottom:888.278667pt;} +.ye04{bottom:888.460000pt;} +.y1539{bottom:888.570667pt;} +.y767{bottom:888.825333pt;} +.y9d9{bottom:888.988000pt;} +.y1338{bottom:889.100000pt;} +.y47e{bottom:889.168000pt;} +.yb5c{bottom:889.206667pt;} +.ye5{bottom:889.698667pt;} +.yfca{bottom:889.773333pt;} +.y10e{bottom:889.858667pt;} +.yd25{bottom:890.172000pt;} +.yf0c{bottom:890.261333pt;} +.ycfb{bottom:890.657333pt;} +.y8cd{bottom:890.880000pt;} +.y672{bottom:891.644000pt;} +.y3c5{bottom:891.746667pt;} +.ye92{bottom:891.876000pt;} +.y130d{bottom:892.504000pt;} +.y1537{bottom:893.684000pt;} +.y2b7{bottom:894.569333pt;} +.y7b4{bottom:895.013333pt;} +.y78a{bottom:895.021333pt;} +.y25f{bottom:895.145333pt;} +.y5a8{bottom:895.573333pt;} +.ybb6{bottom:896.208000pt;} +.yc8b{bottom:896.872000pt;} +.y25e{bottom:897.138667pt;} +.y5a7{bottom:897.566667pt;} +.y93b{bottom:897.669333pt;} .ye{bottom:897.734667pt;} -.yd60{bottom:898.274667pt;} -.y4dc{bottom:898.333333pt;} -.y1596{bottom:899.197333pt;} -.y4c3{bottom:899.794667pt;} +.yd26{bottom:898.274667pt;} +.y4cd{bottom:898.333333pt;} +.y1538{bottom:899.197333pt;} +.y4b4{bottom:899.794667pt;} .y89{bottom:900.326667pt;} -.y1e8{bottom:901.177333pt;} -.y50e{bottom:902.776000pt;} +.y1e2{bottom:901.177333pt;} +.y4fe{bottom:902.776000pt;} .y5a{bottom:902.982667pt;} -.yfe5{bottom:903.056000pt;} -.y886{bottom:903.112000pt;} -.yaa3{bottom:903.381333pt;} -.y1219{bottom:903.441333pt;} -.y3ce{bottom:904.145333pt;} -.y803{bottom:904.164000pt;} -.y38b{bottom:904.577333pt;} -.ycc3{bottom:904.709333pt;} -.y781{bottom:904.765333pt;} -.ya02{bottom:904.928000pt;} -.y743{bottom:905.146667pt;} -.yb1f{bottom:905.506667pt;} -.y144{bottom:905.640000pt;} -.y1010{bottom:905.713333pt;} -.y10c{bottom:905.798667pt;} -.yf4d{bottom:906.201333pt;} -.ybd{bottom:906.330667pt;} -.y2bb{bottom:906.502667pt;} -.y2bd{bottom:906.748000pt;} -.y8f1{bottom:906.820000pt;} -.y1e5{bottom:907.060000pt;} -.y3cc{bottom:907.688000pt;} -.yed1{bottom:907.816000pt;} -.y14b9{bottom:908.146667pt;} -.y1362{bottom:908.444000pt;} -.y1594{bottom:910.354667pt;} -.y2b9{bottom:910.510667pt;} -.y861{bottom:910.953333pt;} -.y264{bottom:911.617333pt;} -.y389{bottom:912.546667pt;} -.ybe7{bottom:912.680000pt;} -.ybe8{bottom:912.812000pt;} -.yfa7{bottom:912.941333pt;} -.y3cd{bottom:913.369333pt;} -.y263{bottom:913.609333pt;} -.y138e{bottom:913.618667pt;} +.yf9f{bottom:903.056000pt;} +.y864{bottom:903.112000pt;} +.ya76{bottom:903.381333pt;} +.y11ca{bottom:903.441333pt;} +.y3c4{bottom:904.145333pt;} +.y7e4{bottom:904.164000pt;} +.y382{bottom:904.577333pt;} +.yc8a{bottom:904.709333pt;} +.y766{bottom:904.765333pt;} +.y9d8{bottom:904.928000pt;} +.y72a{bottom:905.146667pt;} +.yaef{bottom:905.506667pt;} +.ye4{bottom:905.640000pt;} +.yfc9{bottom:905.713333pt;} +.y10d{bottom:905.798667pt;} +.yf0b{bottom:906.201333pt;} +.ybd{bottom:906.273333pt;} +.y2b4{bottom:906.502667pt;} +.y2b6{bottom:906.748000pt;} +.y8cc{bottom:906.820000pt;} +.y1df{bottom:907.060000pt;} +.y3c2{bottom:907.688000pt;} +.ye91{bottom:907.816000pt;} +.y145e{bottom:908.146667pt;} +.y130c{bottom:908.444000pt;} +.y1536{bottom:910.354667pt;} +.y2b2{bottom:910.510667pt;} +.y83f{bottom:910.953333pt;} +.y25d{bottom:911.617333pt;} +.y380{bottom:912.546667pt;} +.ybb3{bottom:912.680000pt;} +.ybb4{bottom:912.812000pt;} +.yf64{bottom:912.941333pt;} +.y3c3{bottom:913.369333pt;} +.y25c{bottom:913.609333pt;} +.y1337{bottom:913.618667pt;} .yd{bottom:913.674667pt;} -.y1e7{bottom:913.833333pt;} -.y22d{bottom:914.273333pt;} -.y2bc{bottom:915.330667pt;} -.y1592{bottom:915.469333pt;} -.y2ba{bottom:916.192000pt;} +.y1e1{bottom:913.833333pt;} +.y226{bottom:914.273333pt;} +.y2b5{bottom:915.330667pt;} +.y1534{bottom:915.469333pt;} +.y2b3{bottom:916.192000pt;} .y88{bottom:916.266667pt;} -.y48a{bottom:916.398667pt;} -.y4db{bottom:916.797333pt;} -.yd5e{bottom:917.934667pt;} -.y489{bottom:918.392000pt;} -.yaa2{bottom:918.524000pt;} +.y47d{bottom:916.398667pt;} +.y4cc{bottom:916.797333pt;} +.yd24{bottom:917.934667pt;} +.y47c{bottom:918.392000pt;} +.ya75{bottom:918.524000pt;} .y59{bottom:918.922667pt;} -.yfe4{bottom:918.997333pt;} -.y885{bottom:919.052000pt;} -.y1218{bottom:919.381333pt;} -.y802{bottom:920.104000pt;} -.y38a{bottom:920.517333pt;} -.y1e2{bottom:920.740000pt;} -.ya01{bottom:920.868000pt;} -.y1593{bottom:920.981333pt;} -.y22e{bottom:921.086667pt;} -.y7d1{bottom:921.580000pt;} -.ybc{bottom:922.270667pt;} -.y1e1{bottom:922.733333pt;} -.y9b8{bottom:923.037333pt;} -.y5b8{bottom:923.282667pt;} -.y3cb{bottom:923.628000pt;} -.y1361{bottom:924.384000pt;} -.y2b8{bottom:926.450667pt;} -.y50d{bottom:927.294667pt;} -.y262{bottom:928.089333pt;} -.y1e6{bottom:928.217333pt;} -.ybe5{bottom:929.284000pt;} -.ybe6{bottom:929.417333pt;} -.y261{bottom:930.081333pt;} -.y4c2{bottom:930.214667pt;} -.y4da{bottom:931.277333pt;} -.y1591{bottom:932.140000pt;} +.yf9e{bottom:918.997333pt;} +.y863{bottom:919.052000pt;} +.y11c9{bottom:919.381333pt;} +.y7e3{bottom:920.104000pt;} +.y381{bottom:920.517333pt;} +.y1dc{bottom:920.740000pt;} +.y9d7{bottom:920.868000pt;} +.y1535{bottom:920.981333pt;} +.y227{bottom:921.086667pt;} +.ye3{bottom:921.580000pt;} +.ybc{bottom:922.213333pt;} +.y1db{bottom:922.733333pt;} +.y98f{bottom:923.037333pt;} +.y5a6{bottom:923.282667pt;} +.y3c1{bottom:923.628000pt;} +.y130b{bottom:924.384000pt;} +.y2b1{bottom:926.450667pt;} +.y4fd{bottom:927.294667pt;} +.y25b{bottom:928.089333pt;} +.y1e0{bottom:928.217333pt;} +.ybb1{bottom:929.284000pt;} +.ybb2{bottom:929.417333pt;} +.y25a{bottom:930.081333pt;} +.y4b3{bottom:930.214667pt;} +.y4cb{bottom:931.277333pt;} +.y1533{bottom:932.140000pt;} .y87{bottom:932.206667pt;} -.yed0{bottom:932.336000pt;} -.y488{bottom:932.340000pt;} -.y4d9{bottom:933.269333pt;} -.yaa1{bottom:933.668000pt;} -.y487{bottom:934.332000pt;} +.ye90{bottom:932.336000pt;} +.y47b{bottom:932.340000pt;} +.y4ca{bottom:933.269333pt;} +.ya74{bottom:933.668000pt;} +.y47a{bottom:934.332000pt;} .y58{bottom:934.862667pt;} -.yfe3{bottom:934.937333pt;} -.y884{bottom:934.992000pt;} -.y1e4{bottom:935.352000pt;} -.y801{bottom:936.044000pt;} -.ya00{bottom:936.808000pt;} -.y412{bottom:937.026667pt;} -.y7d0{bottom:937.520000pt;} -.yb1e{bottom:937.918667pt;} -.y9b7{bottom:938.977333pt;} -.y5b7{bottom:939.222667pt;} -.y1e3{bottom:939.337333pt;} -.y3ca{bottom:939.568000pt;} -.y1360{bottom:940.324000pt;} -.y2b7{bottom:942.050667pt;} -.y158f{bottom:943.497333pt;} -.y1590{bottom:943.697333pt;} -.y13b6{bottom:944.501333pt;} -.ybe4{bottom:945.888000pt;} -.y962{bottom:946.021333pt;} -.y4d8{bottom:947.217333pt;} +.yf9d{bottom:934.937333pt;} +.y862{bottom:934.992000pt;} +.y1de{bottom:935.352000pt;} +.y7e2{bottom:936.044000pt;} +.y9d6{bottom:936.808000pt;} +.y407{bottom:937.026667pt;} +.y7b3{bottom:937.520000pt;} +.yaee{bottom:937.918667pt;} +.y98e{bottom:938.977333pt;} +.y5a5{bottom:939.222667pt;} +.y1dd{bottom:939.337333pt;} +.y3c0{bottom:939.568000pt;} +.y130a{bottom:940.324000pt;} +.y2b0{bottom:942.050667pt;} +.y1531{bottom:943.497333pt;} +.y1532{bottom:943.697333pt;} +.y135e{bottom:944.501333pt;} +.ybb0{bottom:945.888000pt;} +.y93a{bottom:946.021333pt;} +.y4c9{bottom:947.217333pt;} .y86{bottom:948.146667pt;} -.y486{bottom:948.280000pt;} -.y4c1{bottom:948.678667pt;} -.y4d7{bottom:949.209333pt;} -.y260{bottom:949.741333pt;} -.y485{bottom:950.272000pt;} -.yfe2{bottom:950.877333pt;} -.y800{bottom:951.984000pt;} -.yaa0{bottom:951.998667pt;} -.y9ff{bottom:952.748000pt;} -.y1166{bottom:952.966667pt;} -.y2b4{bottom:953.984000pt;} -.y2b6{bottom:954.229333pt;} -.y158d{bottom:954.854667pt;} -.y9b6{bottom:954.917333pt;} -.y158e{bottom:955.054667pt;} -.y25e{bottom:957.710667pt;} -.y2b2{bottom:957.992000pt;} -.ya9e{bottom:959.305333pt;} -.y135f{bottom:960.441333pt;} -.y62e{bottom:962.094667pt;} -.y2b5{bottom:962.812000pt;} -.y2b3{bottom:963.673333pt;} +.y479{bottom:948.280000pt;} +.y4b2{bottom:948.678667pt;} +.y4c8{bottom:949.209333pt;} +.y259{bottom:949.741333pt;} +.y478{bottom:950.272000pt;} +.yf9c{bottom:950.877333pt;} +.y7e1{bottom:951.984000pt;} +.ya73{bottom:951.998667pt;} +.y9d5{bottom:952.748000pt;} +.y111a{bottom:952.966667pt;} +.y2ad{bottom:953.984000pt;} +.y2af{bottom:954.229333pt;} +.y152f{bottom:954.854667pt;} +.y98d{bottom:954.917333pt;} +.y1530{bottom:955.054667pt;} +.y257{bottom:957.710667pt;} +.y2ab{bottom:957.992000pt;} +.ya71{bottom:959.305333pt;} +.y1309{bottom:960.441333pt;} +.y61a{bottom:962.094667pt;} +.y2ae{bottom:962.812000pt;} +.y2ac{bottom:963.673333pt;} .y57{bottom:964.086667pt;} -.y4c0{bottom:965.149333pt;} -.y25f{bottom:965.681333pt;} -.y484{bottom:966.212000pt;} -.ya9f{bottom:966.610667pt;} +.y4b1{bottom:965.149333pt;} +.y258{bottom:965.681333pt;} +.y477{bottom:966.212000pt;} +.ya72{bottom:966.610667pt;} .yc{bottom:967.410667pt;} -.y718{bottom:968.908000pt;} -.y158c{bottom:969.400000pt;} -.y1bf{bottom:1010.000000pt;} -.y10b{bottom:1015.361333pt;} -.h27{height:0.666667pt;} -.h2e{height:14.850916pt;} -.h2a{height:17.746711pt;} -.h39{height:17.985814pt;} -.h8a{height:18.803753pt;} -.h8f{height:19.588965pt;} -.h54{height:20.372374pt;} -.h1e{height:21.551241pt;} -.h2c{height:22.107556pt;} -.h52{height:22.635970pt;} -.h38{height:22.816745pt;} -.h65{height:22.910001pt;} -.h8e{height:22.995740pt;} -.h86{height:23.183329pt;} -.h33{height:23.429032pt;} -.h26{height:23.659020pt;} -.h1d{height:23.742518pt;} -.he1{height:24.183535pt;} -.h44{height:24.263222pt;} -.h59{height:24.593689pt;} -.h41{height:25.005970pt;} -.ha0{height:25.465775pt;} -.hda{height:25.510571pt;} -.hf7{height:25.516466pt;} -.hfe{height:25.660065pt;} +.y700{bottom:968.908000pt;} +.y152e{bottom:969.400000pt;} +.y10c{bottom:1015.361333pt;} +.h26{height:14.850916pt;} +.h24{height:17.746711pt;} +.h2f{height:17.985814pt;} +.h64{height:18.803753pt;} +.h67{height:19.588965pt;} +.h41{height:20.372374pt;} +.h1d{height:21.551241pt;} +.h25{height:22.107556pt;} +.h3f{height:22.635970pt;} +.h2e{height:22.816745pt;} +.h50{height:22.910001pt;} +.h66{height:22.995740pt;} +.h61{height:23.183329pt;} +.h2a{height:23.429032pt;} +.h23{height:23.659020pt;} +.h1c{height:23.742518pt;} +.h90{height:24.183535pt;} +.h36{height:24.263222pt;} +.h45{height:24.593689pt;} +.h33{height:25.005970pt;} +.h6b{height:25.465775pt;} +.h89{height:25.510571pt;} +.h9d{height:25.516466pt;} +.h9f{height:25.660065pt;} .hc{height:25.812358pt;} -.h5d{height:26.183564pt;} -.hb7{height:26.221508pt;} -.hea{height:26.237860pt;} -.ha2{height:26.400594pt;} -.hb3{height:26.502901pt;} -.h28{height:27.333333pt;} -.h1c{height:27.699604pt;} -.hfd{height:27.730618pt;} -.h12{height:27.895200pt;} -.h6f{height:27.901282pt;} -.hf6{height:28.068114pt;} -.h88{height:28.105906pt;} -.h87{height:28.205628pt;} -.h85{height:28.335180pt;} -.h8d{height:28.680888pt;} -.h83{height:29.383445pt;} -.he3{height:29.392296pt;} -.h47{height:29.499997pt;} -.h14{height:29.506222pt;} -.h76{height:29.574218pt;} -.h84{height:29.623142pt;} -.h5f{height:30.160814pt;} -.h53{height:30.558559pt;} -.hc8{height:30.783263pt;} -.h4a{height:30.971999pt;} -.hdc{height:31.005155pt;} -.hee{height:31.036921pt;} -.hcd{height:31.203198pt;} -.hc0{height:31.233901pt;} -.h5e{height:31.420277pt;} -.h1f{height:31.880400pt;} -.hec{height:31.889091pt;} -.hc9{height:32.276966pt;} -.hdd{height:32.509624pt;} -.hb4{height:32.714518pt;} -.hcf{height:32.717277pt;} -.hd8{height:32.765547pt;} -.hd5{height:33.199503pt;} -.h5a{height:33.201479pt;} -.he4{height:33.591069pt;} -.he2{height:33.591197pt;} -.h6e{height:33.751173pt;} -.h78{height:33.799108pt;} -.h51{height:33.953953pt;} -.h23{height:34.065992pt;} -.h37{height:34.225116pt;} -.h64{height:34.365000pt;} -.h77{height:34.368617pt;} -.h6d{height:34.577931pt;} -.h66{height:34.645334pt;} -.hd7{height:34.946844pt;} -.h36{height:35.063483pt;} -.hb6{height:35.121179pt;} -.ha1{height:35.142768pt;} -.h32{height:35.143546pt;} -.hc7{height:35.180875pt;} -.h79{height:35.210500pt;} -.h61{height:35.347811pt;} -.hdb{height:35.434465pt;} -.h24{height:35.488528pt;} -.h45{height:35.499037pt;} -.h6c{height:35.510720pt;} -.hd4{height:35.535692pt;} -.hce{height:35.660800pt;} -.h11{height:35.734862pt;} -.h25{height:35.778027pt;} -.h4e{height:35.865600pt;} -.h31{height:36.030369pt;} -.h43{height:36.394831pt;} -.hd6{height:36.406163pt;} -.h4b{height:36.437646pt;} -.heb{height:36.444677pt;} -.h40{height:36.506604pt;} -.h9e{height:36.667490pt;} +.h49{height:26.183564pt;} +.h73{height:26.221508pt;} +.h96{height:26.237860pt;} +.h6d{height:26.400594pt;} +.h6f{height:26.502901pt;} +.h1b{height:27.699604pt;} +.h9e{height:27.730618pt;} +.h11{height:27.895200pt;} +.h57{height:27.901282pt;} +.h9c{height:28.068114pt;} +.h63{height:28.105906pt;} +.h62{height:28.205628pt;} +.h60{height:28.335180pt;} +.h65{height:28.680888pt;} +.h5e{height:29.383445pt;} +.h92{height:29.392296pt;} +.h38{height:29.499997pt;} +.h13{height:29.506222pt;} +.h59{height:29.574218pt;} +.h5f{height:29.623142pt;} +.h4b{height:30.160814pt;} +.h40{height:30.558559pt;} +.h79{height:30.783263pt;} +.h3a{height:30.971999pt;} +.h8b{height:31.005155pt;} +.h9a{height:31.036921pt;} +.h7e{height:31.203198pt;} +.h75{height:31.233901pt;} +.h4a{height:31.420277pt;} +.h1e{height:31.880400pt;} +.h98{height:31.889091pt;} +.h7a{height:32.276966pt;} +.h8c{height:32.509624pt;} +.h70{height:32.714518pt;} +.h80{height:32.717277pt;} +.h87{height:32.765547pt;} +.h84{height:33.199503pt;} +.h46{height:33.201479pt;} +.h93{height:33.591069pt;} +.h91{height:33.591197pt;} +.h56{height:33.751173pt;} +.h5b{height:33.799108pt;} +.h3e{height:33.953953pt;} +.h20{height:34.065992pt;} +.h2d{height:34.225116pt;} +.h4f{height:34.365000pt;} +.h5a{height:34.368617pt;} +.h55{height:34.577931pt;} +.h51{height:34.645334pt;} +.h86{height:34.946844pt;} +.h2c{height:35.063483pt;} +.h72{height:35.121179pt;} +.h6c{height:35.142768pt;} +.h29{height:35.143546pt;} +.h78{height:35.180875pt;} +.h5c{height:35.210500pt;} +.h4d{height:35.347811pt;} +.h8a{height:35.434465pt;} +.h21{height:35.488528pt;} +.h37{height:35.499037pt;} +.h54{height:35.510720pt;} +.h83{height:35.535692pt;} +.h7f{height:35.660800pt;} +.h10{height:35.734862pt;} +.h22{height:35.778027pt;} +.h3c{height:35.865600pt;} +.h28{height:36.030369pt;} +.h35{height:36.394831pt;} +.h85{height:36.406163pt;} +.h3b{height:36.437646pt;} +.h97{height:36.444677pt;} +.h32{height:36.506604pt;} +.h69{height:36.667490pt;} .h9{height:36.874903pt;} -.h57{height:36.890532pt;} -.h58{height:37.191467pt;} -.h3f{height:37.508953pt;} -.h60{height:37.701016pt;} -.he0{height:37.790096pt;} -.h9f{height:38.198660pt;} -.hcc{height:38.510277pt;} -.h5c{height:39.275344pt;} -.hca{height:39.578483pt;} +.h43{height:36.890532pt;} +.h44{height:37.191467pt;} +.h31{height:37.508953pt;} +.h4c{height:37.701016pt;} +.h8f{height:37.790096pt;} +.h6a{height:38.198660pt;} +.h7d{height:38.510277pt;} +.h48{height:39.275344pt;} +.h7b{height:39.578483pt;} .h8{height:39.850400pt;} -.hde{height:39.863772pt;} -.hd0{height:40.118398pt;} -.he5{height:40.819681pt;} +.h8d{height:39.863772pt;} +.h81{height:40.118398pt;} +.h94{height:40.819681pt;} .h7{height:41.072479pt;} -.h6b{height:41.493517pt;} -.hc1{height:41.834797pt;} -.hed{height:44.287201pt;} +.h53{height:41.493517pt;} +.h76{height:41.834797pt;} +.h99{height:44.287201pt;} .h6{height:47.820667pt;} .hb{height:47.820800pt;} .h5{height:56.905703pt;} -.h1b{height:57.000080pt;} +.h1a{height:57.000080pt;} .he{height:57.384800pt;} -.h49{height:59.182933pt;} -.h1a{height:71.430480pt;} -.h13{height:73.234280pt;} +.h39{height:59.182933pt;} +.h19{height:71.430480pt;} +.h12{height:73.234280pt;} .hd{height:82.650000pt;} .h4{height:85.358550pt;} -.h19{height:86.221640pt;} -.h16{height:87.664680pt;} -.h18{height:88.025440pt;} -.h17{height:88.386200pt;} +.h18{height:86.221640pt;} +.h15{height:87.664680pt;} +.h17{height:88.025440pt;} +.h16{height:88.386200pt;} .ha{height:99.148400pt;} .h3{height:103.141585pt;} -.hf5{height:115.856160pt;} -.hcb{height:117.164027pt;} -.hc6{height:117.170613pt;} -.h35{height:118.132307pt;} -.h9d{height:125.983587pt;} -.h10{height:131.078080pt;} -.hdf{height:132.286000pt;} -.he7{height:134.000000pt;} -.h3e{height:139.876667pt;} -.h5b{height:147.776933pt;} -.h15{height:158.734400pt;} -.h30{height:172.355040pt;} -.he9{height:173.868267pt;} -.hc4{height:174.666667pt;} -.hb2{height:188.977200pt;} -.hb5{height:188.981467pt;} -.hd9{height:188.983800pt;} -.h56{height:207.873733pt;} -.hb8{height:208.000000pt;} -.hf9{height:210.666667pt;} -.h82{height:226.773427pt;} -.h50{height:226.779933pt;} -.hbf{height:226.780027pt;} -.h42{height:237.747387pt;} -.hbe{height:238.666667pt;} -.hb1{height:243.333333pt;} -.h67{height:278.000000pt;} -.haa{height:314.666667pt;} -.h92{height:318.666667pt;} -.hf3{height:335.333333pt;} -.hd3{height:340.159520pt;} -.h6a{height:346.940000pt;} -.h22{height:359.058053pt;} -.h34{height:368.666667pt;} -.h75{height:377.955720pt;} -.hc2{height:379.333333pt;} -.h7b{height:394.666667pt;} -.hfc{height:398.666667pt;} -.h93{height:416.666667pt;} -.h63{height:419.456000pt;} -.hf1{height:466.000000pt;} -.hb0{height:492.000000pt;} -.h3b{height:493.333333pt;} -.h73{height:508.000000pt;} -.he6{height:522.000000pt;} -.h89{height:532.666667pt;} -.ha6{height:571.333333pt;} -.hf2{height:590.666667pt;} -.hb9{height:605.333333pt;} -.h7a{height:608.666667pt;} -.h81{height:620.666667pt;} -.hc5{height:628.666667pt;} -.h91{height:636.666667pt;} -.h2f{height:637.333333pt;} -.h3d{height:643.333333pt;} -.hfa{height:648.000000pt;} -.h9b{height:668.666667pt;} -.h7f{height:674.000000pt;} -.hf0{height:678.666667pt;} -.hba{height:681.333333pt;} -.h74{height:696.000000pt;} -.h7d{height:698.000000pt;} -.h4f{height:704.000000pt;} -.h98{height:708.000000pt;} -.hbc{height:721.333333pt;} -.h2d{height:732.666667pt;} -.h94{height:737.333333pt;} -.h71{height:738.000000pt;} -.haf{height:739.333333pt;} -.h72{height:740.000000pt;} -.ha5{height:749.333333pt;} -.hfb{height:757.333333pt;} -.h3a{height:767.333333pt;} -.hc3{height:771.333333pt;} -.hbd{height:772.000000pt;} -.h62{height:772.666667pt;} -.ha4{height:777.333333pt;} -.h95{height:784.666667pt;} -.h7e{height:786.666667pt;} -.h55{height:787.333333pt;} -.ha9{height:793.333333pt;} -.ha7{height:794.666667pt;} -.had{height:797.333333pt;} -.h3c{height:799.333333pt;} -.ha3{height:800.000000pt;} -.h8c{height:804.666667pt;} -.h46{height:805.333333pt;} -.h70{height:806.666667pt;} -.h29{height:808.000000pt;} -.hbb{height:812.666667pt;} -.hf8{height:813.333333pt;} -.ha8{height:815.333333pt;} -.h7c{height:824.666667pt;} -.hae{height:831.333333pt;} -.h9c{height:832.000000pt;} -.hd1{height:834.000000pt;} -.h20{height:834.666667pt;} -.h96{height:836.000000pt;} -.h4d{height:837.333333pt;} -.h90{height:838.666667pt;} -.hff{height:842.666667pt;} -.he8{height:846.666667pt;} -.h21{height:847.333333pt;} -.hf4{height:848.000000pt;} -.h69{height:849.333333pt;} -.h4c{height:850.000000pt;} -.h8b{height:851.333333pt;} -.hab{height:854.000000pt;} -.h48{height:854.666667pt;} -.h9a{height:856.000000pt;} -.h68{height:857.333333pt;} -.hef{height:859.333333pt;} -.h80{height:860.666667pt;} -.h97{height:861.333333pt;} -.hf{height:862.666667pt;} -.h99{height:871.333333pt;} -.hac{height:872.000000pt;} -.h2b{height:874.666667pt;} -.hd2{height:939.333333pt;} +.h9b{height:115.856160pt;} +.h7c{height:117.164027pt;} +.h77{height:117.170613pt;} +.h2b{height:118.132307pt;} +.h68{height:125.983587pt;} +.hf{height:131.078080pt;} +.h8e{height:132.286000pt;} +.h30{height:139.876667pt;} +.h47{height:147.776933pt;} +.h14{height:158.734400pt;} +.h27{height:172.355040pt;} +.h95{height:173.868267pt;} +.h6e{height:188.977200pt;} +.h71{height:188.981467pt;} +.h88{height:188.983800pt;} +.h42{height:207.873733pt;} +.h5d{height:226.773427pt;} +.h3d{height:226.779933pt;} +.h74{height:226.780027pt;} +.h34{height:237.747387pt;} +.h82{height:340.159520pt;} +.h52{height:346.940000pt;} +.h1f{height:359.058053pt;} +.h58{height:377.955720pt;} +.h4e{height:419.456000pt;} .h2{height:1121.938571pt;} .h0{height:1122.520000pt;} .h1{height:1122.666667pt;} -.w19{width:28.139280pt;} -.w4{width:30.303840pt;} -.w17{width:64.576040pt;} -.wd{width:191.937733pt;} -.w1c{width:198.707733pt;} -.w1d{width:203.734667pt;} -.w12{width:204.428880pt;} -.we{width:211.194400pt;} -.w18{width:215.012960pt;} -.w1e{width:221.759067pt;} -.w13{width:240.666667pt;} -.w5{width:248.563640pt;} -.w21{width:258.232853pt;} -.w7{width:338.666667pt;} -.w6{width:360.974733pt;} -.w25{width:362.498933pt;} -.w1a{width:377.950760pt;} -.w3{width:377.955200pt;} -.wc{width:377.963733pt;} -.w23{width:387.786960pt;} -.w24{width:389.333333pt;} -.wb{width:396.869653pt;} -.w15{width:398.808440pt;} -.w1b{width:401.333333pt;} -.w26{width:402.685467pt;} -.w10{width:415.744000pt;} -.wf{width:415.755200pt;} -.wa{width:415.771333pt;} -.w20{width:449.396267pt;} -.w9{width:460.806173pt;} -.w8{width:479.999520pt;} -.w11{width:491.360000pt;} -.w1f{width:496.391720pt;} -.w27{width:499.217600pt;} -.w22{width:500.767200pt;} -.w16{width:510.666667pt;} -.w2{width:602.000000pt;} -.w14{width:602.666667pt;} +.w14{width:28.139280pt;} +.w3{width:30.303840pt;} +.w12{width:64.576040pt;} +.wb{width:191.937733pt;} +.w16{width:198.707733pt;} +.w17{width:203.734667pt;} +.w10{width:204.428880pt;} +.wc{width:211.194400pt;} +.w13{width:215.012960pt;} +.w18{width:221.759067pt;} +.w4{width:248.563640pt;} +.w1b{width:258.232853pt;} +.w5{width:360.974733pt;} +.w1e{width:362.498933pt;} +.w15{width:377.950760pt;} +.w2{width:377.955200pt;} +.wa{width:377.963733pt;} +.w1d{width:387.786960pt;} +.w9{width:396.869653pt;} +.w11{width:398.808440pt;} +.w1f{width:402.685467pt;} +.we{width:415.744000pt;} +.wd{width:415.755200pt;} +.w8{width:415.771333pt;} +.w1a{width:449.396267pt;} +.w7{width:460.806173pt;} +.w6{width:479.999520pt;} +.wf{width:491.360000pt;} +.w19{width:496.391720pt;} +.w20{width:499.217600pt;} +.w1c{width:500.767200pt;} .w0{width:793.701333pt;} .w1{width:794.000000pt;} .x0{left:0.000000pt;} -.x3d{left:2.875020pt;} +.x3c{left:2.875020pt;} .x112{left:5.536084pt;} -.x3e{left:8.308148pt;} +.x3d{left:8.308148pt;} .x27{left:9.744055pt;} .x1d{left:11.093001pt;} .x129{left:13.683365pt;} @@ -13022,27 +12629,27 @@ .x1c{left:20.731147pt;} .x124{left:24.078295pt;} .x14b{left:27.773675pt;} -.xd6{left:30.419718pt;} +.xd5{left:30.419718pt;} .x110{left:32.925919pt;} .x115{left:34.656769pt;} -.xd3{left:38.455476pt;} +.xd2{left:38.455476pt;} .x137{left:42.056040pt;} -.xd7{left:44.461694pt;} +.xd6{left:44.461694pt;} .x132{left:46.753183pt;} .x139{left:48.402733pt;} -.xe5{left:49.773179pt;} +.xe4{left:49.773179pt;} .x12f{left:53.870502pt;} .x10f{left:56.077920pt;} .x146{left:58.271302pt;} .x135{left:61.079166pt;} -.xf3{left:63.332046pt;} -.xd4{left:66.254676pt;} -.xd5{left:67.929237pt;} +.xf2{left:63.332046pt;} +.xd3{left:66.254676pt;} +.xd4{left:67.929237pt;} .x12c{left:69.629493pt;} -.xf2{left:71.165758pt;} +.xf1{left:71.165758pt;} .x11c{left:73.036973pt;} .x12d{left:75.351759pt;} -.xf4{left:78.387484pt;} +.xf3{left:78.387484pt;} .x116{left:80.401594pt;} .x14e{left:83.224435pt;} .x113{left:86.819988pt;} @@ -13053,8 +12660,8 @@ .x114{left:98.063759pt;} .x20{left:99.407914pt;} .x1b{left:102.936966pt;} -.x3f{left:104.354667pt;} -.x40{left:105.962667pt;} +.x3e{left:104.354667pt;} +.x3f{left:105.962667pt;} .x142{left:107.693905pt;} .x14f{left:109.362029pt;} .x2b{left:110.789333pt;} @@ -13065,285 +12672,285 @@ .xfa{left:119.854667pt;} .x10b{left:121.829333pt;} .x141{left:123.670667pt;} -.xf1{left:125.021333pt;} +.xf0{left:125.021333pt;} .x125{left:126.384697pt;} .x13{left:129.209333pt;} .xff{left:131.029333pt;} -.xde{left:132.511404pt;} -.x72{left:133.909333pt;} -.x41{left:136.381333pt;} -.x45{left:140.206667pt;} +.xdd{left:132.511404pt;} +.x70{left:133.909333pt;} +.x40{left:136.381333pt;} +.x43{left:140.206667pt;} .x149{left:141.754667pt;} -.xbe{left:143.296000pt;} -.x49{left:144.973333pt;} +.xbd{left:143.296000pt;} +.x47{left:144.973333pt;} .x11{left:146.477333pt;} .x21{left:149.134667pt;} .x2a{left:150.721333pt;} -.xbf{left:153.058667pt;} -.xdf{left:154.844700pt;} -.x46{left:156.714667pt;} +.xbe{left:153.058667pt;} +.xde{left:154.844700pt;} +.x44{left:156.714667pt;} .x136{left:158.068160pt;} .x22{left:159.521333pt;} -.x76{left:161.060000pt;} -.xcf{left:163.855889pt;} -.x75{left:165.785333pt;} +.x74{left:161.060000pt;} +.xce{left:163.855889pt;} +.x73{left:165.785333pt;} .x11d{left:167.435454pt;} .x138{left:168.950667pt;} -.x44{left:170.666667pt;} +.xf4{left:170.517766pt;} .x1e{left:172.475936pt;} -.x4e{left:174.328000pt;} +.x4c{left:174.328000pt;} .x1f{left:176.816490pt;} -.xe0{left:178.322068pt;} +.xdf{left:178.322068pt;} .x119{left:180.674859pt;} -.xc8{left:182.369333pt;} +.xc7{left:182.369333pt;} .x144{left:184.902667pt;} -.xe1{left:186.965734pt;} -.xc9{left:188.328000pt;} -.x4f{left:190.010667pt;} -.xd2{left:193.396077pt;} +.xe0{left:186.965734pt;} +.xc8{left:188.328000pt;} +.x4d{left:190.010667pt;} +.xd1{left:193.396077pt;} .xa{left:194.749333pt;} .x29{left:196.751902pt;} .x10c{left:198.534667pt;} -.x7b{left:199.906667pt;} -.xce{left:201.365399pt;} +.x79{left:199.906667pt;} +.xcd{left:201.365399pt;} .x118{left:203.139166pt;} -.x77{left:205.312000pt;} +.x75{left:205.312000pt;} .x1a{left:207.874667pt;} -.xb7{left:209.329333pt;} -.xb3{left:211.201333pt;} +.xb6{left:209.329333pt;} +.xb2{left:211.201333pt;} .x13c{left:212.773333pt;} .x19{left:215.760000pt;} .x14c{left:217.687550pt;} -.x5f{left:219.265333pt;} +.x5d{left:219.265333pt;} .x121{left:221.644000pt;} -.x60{left:223.688000pt;} +.x5e{left:223.688000pt;} .x145{left:225.084000pt;} .x11a{left:226.419679pt;} .x108{left:228.082667pt;} -.xd1{left:230.905594pt;} -.x8e{left:232.709333pt;} +.xd0{left:230.905594pt;} +.x8c{left:232.709333pt;} .x2d{left:234.146667pt;} -.xd0{left:236.874558pt;} +.xcf{left:236.874558pt;} .x2c{left:239.790667pt;} .xd{left:241.453333pt;} -.x38{left:244.097553pt;} -.x3b{left:245.520082pt;} +.x37{left:244.097553pt;} +.x3a{left:245.520082pt;} .xe{left:248.426667pt;} -.xab{left:250.241333pt;} -.x6d{left:251.613333pt;} -.xa6{left:253.174667pt;} -.x34{left:254.857287pt;} -.x5b{left:257.522667pt;} -.x63{left:260.022667pt;} -.x9e{left:262.314667pt;} +.xaa{left:250.241333pt;} +.x6b{left:251.613333pt;} +.xa5{left:253.174667pt;} +.x33{left:254.857287pt;} +.x59{left:257.522667pt;} +.x61{left:260.022667pt;} +.x9d{left:262.314667pt;} .x14a{left:263.713333pt;} -.x85{left:265.222667pt;} -.x36{left:266.744544pt;} -.x92{left:270.744000pt;} +.x83{left:265.222667pt;} +.x35{left:266.744544pt;} +.x91{left:270.744000pt;} .x26{left:272.569333pt;} -.xe2{left:274.409076pt;} -.xca{left:276.281333pt;} +.xe1{left:274.409076pt;} +.xc9{left:276.281333pt;} .x127{left:279.018667pt;} -.x30{left:280.722667pt;} -.x95{left:282.366667pt;} -.xbc{left:285.045333pt;} -.x31{left:286.681333pt;} -.xc6{left:288.677333pt;} -.x8f{left:291.065333pt;} -.x3c{left:293.292352pt;} -.x39{left:294.714884pt;} -.x90{left:297.024000pt;} -.xb1{left:299.118667pt;} -.x2e{left:300.646667pt;} -.x50{left:303.724000pt;} +.x2f{left:280.722667pt;} +.x94{left:282.366667pt;} +.xbb{left:285.045333pt;} +.x30{left:286.681333pt;} +.xc5{left:288.677333pt;} +.x8d{left:291.065333pt;} +.x3b{left:293.292352pt;} +.x38{left:294.714884pt;} +.x8e{left:297.024000pt;} +.xb0{left:299.118667pt;} +.x8f{left:301.378667pt;} +.x4e{left:303.724000pt;} .x10d{left:305.840000pt;} .x143{left:307.376000pt;} -.xbd{left:308.733333pt;} +.xbc{left:308.733333pt;} .x11e{left:310.338520pt;} .x2{left:311.884127pt;} -.x32{left:313.997333pt;} -.x35{left:316.327468pt;} -.xb0{left:318.114667pt;} -.x33{left:319.957333pt;} -.x3a{left:321.930619pt;} -.xb5{left:323.444000pt;} -.x37{left:325.762469pt;} +.x31{left:313.997333pt;} +.x34{left:316.327468pt;} +.xaf{left:318.114667pt;} +.x32{left:319.957333pt;} +.x39{left:321.930619pt;} +.xb4{left:323.444000pt;} +.x36{left:325.762469pt;} .x133{left:327.698266pt;} -.x6e{left:329.958667pt;} +.x6c{left:329.958667pt;} .xb{left:332.552000pt;} -.x6b{left:334.388000pt;} +.x69{left:334.388000pt;} .xf5{left:336.331819pt;} .x25{left:338.227653pt;} -.x6f{left:340.185333pt;} -.x64{left:342.260000pt;} -.x80{left:344.173333pt;} -.xd8{left:345.921243pt;} -.x86{left:347.460000pt;} -.x51{left:348.842667pt;} +.x6d{left:340.185333pt;} +.x62{left:342.260000pt;} +.x7e{left:344.173333pt;} +.xd7{left:345.921243pt;} +.x84{left:347.460000pt;} +.x4f{left:348.842667pt;} .x123{left:350.573333pt;} -.xda{left:351.993899pt;} +.xd9{left:351.993899pt;} .x5{left:353.396150pt;} .x18{left:355.868000pt;} .x1{left:358.304189pt;} -.xe3{left:362.222446pt;} -.x52{left:363.786667pt;} +.xe2{left:362.222446pt;} +.x50{left:363.786667pt;} .x13b{left:365.505333pt;} -.x81{left:367.049333pt;} -.x82{left:369.189333pt;} -.x9d{left:371.529333pt;} -.xdb{left:373.394621pt;} -.x5c{left:374.777333pt;} -.x65{left:376.390667pt;} -.x66{left:378.530667pt;} -.xc5{left:380.038667pt;} -.xd9{left:381.430403pt;} +.x7f{left:367.049333pt;} +.x80{left:369.189333pt;} +.x9c{left:371.529333pt;} +.xda{left:373.394621pt;} +.x5a{left:374.777333pt;} +.x63{left:376.390667pt;} +.x64{left:378.530667pt;} +.xc4{left:380.038667pt;} +.xd8{left:381.430403pt;} .x11b{left:383.347597pt;} -.x53{left:384.722667pt;} +.x51{left:384.722667pt;} .x105{left:386.073333pt;} .x15{left:387.810667pt;} .x14{left:389.654667pt;} .x100{left:391.521333pt;} .x12{left:393.160000pt;} .x10{left:395.005333pt;} -.xe4{left:396.725525pt;} -.x9f{left:398.652000pt;} -.x67{left:400.092000pt;} -.xa0{left:403.681333pt;} +.xe3{left:396.725525pt;} +.x9e{left:398.652000pt;} +.x65{left:400.092000pt;} +.x9f{left:403.681333pt;} .x106{left:406.004000pt;} -.x54{left:408.409333pt;} -.xdc{left:410.493960pt;} +.x52{left:408.409333pt;} +.xdb{left:410.493960pt;} .x134{left:412.069333pt;} -.xaa{left:413.473333pt;} -.x55{left:415.324000pt;} -.xa1{left:416.794667pt;} -.xcb{left:419.718667pt;} -.xa2{left:423.436000pt;} -.x8c{left:425.080000pt;} -.x94{left:427.049333pt;} +.xa9{left:413.473333pt;} +.x53{left:415.324000pt;} +.xa0{left:416.794667pt;} +.xca{left:419.718667pt;} +.xa1{left:423.436000pt;} +.x8a{left:425.080000pt;} +.x93{left:427.049333pt;} .xfd{left:428.517333pt;} .xf9{left:431.844000pt;} -.x7c{left:433.629333pt;} +.x7a{left:433.629333pt;} .x11f{left:435.298667pt;} -.x93{left:437.108000pt;} -.x89{left:439.833333pt;} -.x56{left:441.225333pt;} -.xb6{left:443.818667pt;} +.x92{left:437.108000pt;} +.x87{left:439.833333pt;} +.x54{left:441.225333pt;} +.xb5{left:443.818667pt;} .x130{left:445.949333pt;} -.x84{left:447.429333pt;} +.x82{left:447.429333pt;} .x4{left:449.463602pt;} .x23{left:451.906667pt;} .xfb{left:454.569333pt;} .x147{left:456.254667pt;} .x24{left:457.866667pt;} -.x5d{left:459.233333pt;} -.xcd{left:460.838667pt;} -.xdd{left:463.501688pt;} -.x57{left:465.850667pt;} -.x5e{left:468.882667pt;} -.x58{left:471.809333pt;} +.x5b{left:459.233333pt;} +.xcc{left:460.838667pt;} +.xdc{left:463.501688pt;} +.x55{left:465.850667pt;} +.x5c{left:468.882667pt;} +.x56{left:471.809333pt;} .xfe{left:473.830667pt;} -.x61{left:475.757333pt;} -.x59{left:478.722667pt;} -.x62{left:480.180000pt;} -.xa3{left:481.944000pt;} -.x8d{left:483.734667pt;} -.x7d{left:486.318667pt;} -.x70{left:488.105333pt;} -.x68{left:490.148000pt;} -.x7e{left:492.485333pt;} -.x69{left:494.570667pt;} -.x87{left:496.012000pt;} -.x71{left:498.838667pt;} +.x5f{left:475.757333pt;} +.x57{left:478.722667pt;} +.x60{left:480.180000pt;} +.xa2{left:481.944000pt;} +.x8b{left:483.734667pt;} +.x7b{left:486.318667pt;} +.x6e{left:488.105333pt;} +.x66{left:490.148000pt;} +.x7c{left:492.485333pt;} +.x67{left:494.570667pt;} +.x85{left:496.012000pt;} +.x6f{left:498.838667pt;} .x107{left:500.520000pt;} -.x83{left:501.957333pt;} +.x81{left:501.957333pt;} .x102{left:503.460000pt;} .x10e{left:506.440000pt;} -.xae{left:508.889333pt;} -.xcc{left:510.476000pt;} +.xad{left:508.889333pt;} +.xcb{left:510.476000pt;} .x13d{left:512.300000pt;} -.x7f{left:513.636000pt;} -.xa8{left:517.345333pt;} +.x7d{left:513.636000pt;} +.xa7{left:517.345333pt;} .x122{left:518.974667pt;} .x3{left:520.774420pt;} .x13f{left:522.126667pt;} -.x88{left:524.054667pt;} -.xa4{left:527.308000pt;} -.x6a{left:529.254667pt;} +.x86{left:524.054667pt;} +.xa3{left:527.308000pt;} +.x68{left:529.254667pt;} .x128{left:531.253333pt;} -.x91{left:533.637333pt;} +.x90{left:533.637333pt;} .xfc{left:535.008000pt;} -.xa5{left:537.270667pt;} -.xb2{left:538.970667pt;} -.xa7{left:540.590667pt;} -.xaf{left:541.950667pt;} -.xa9{left:543.912000pt;} +.xa4{left:537.270667pt;} +.xb1{left:538.970667pt;} +.xa6{left:540.590667pt;} +.xae{left:541.950667pt;} +.xa8{left:543.912000pt;} .x148{left:546.697333pt;} -.x47{left:548.496000pt;} -.xc0{left:550.301333pt;} -.xb9{left:551.917333pt;} +.x45{left:548.496000pt;} +.xbf{left:550.301333pt;} +.xb8{left:551.917333pt;} .x109{left:555.600000pt;} -.xba{left:557.876000pt;} +.xb9{left:557.876000pt;} .x12b{left:560.825333pt;} -.x6c{left:563.289333pt;} -.x48{left:564.817333pt;} +.x6a{left:563.289333pt;} +.x46{left:564.817333pt;} .x10a{left:567.408000pt;} -.xe6{left:569.057333pt;} +.xe5{left:569.057333pt;} .x140{left:571.253333pt;} -.x4a{left:573.152000pt;} -.xbb{left:575.666667pt;} +.x48{left:573.152000pt;} +.xba{left:575.666667pt;} .x7{left:577.559690pt;} .x16{left:579.450667pt;} -.x4b{left:581.264000pt;} +.x49{left:581.264000pt;} .x120{left:583.476000pt;} -.xc1{left:585.962667pt;} +.xc0{left:585.962667pt;} .x17{left:588.954667pt;} -.xef{left:591.373333pt;} -.xe7{left:592.744000pt;} +.xee{left:591.373333pt;} +.xe6{left:592.744000pt;} .x8{left:596.773180pt;} -.xe8{left:599.658667pt;} -.xac{left:602.402667pt;} -.x4c{left:604.808000pt;} +.xe7{left:599.658667pt;} +.xab{left:602.402667pt;} +.x4a{left:604.808000pt;} .x103{left:608.177333pt;} .xf6{left:610.838667pt;} -.xc2{left:614.710667pt;} -.x4d{left:616.061333pt;} +.xc1{left:614.710667pt;} +.x4b{left:616.061333pt;} .xf7{left:617.752000pt;} -.xb4{left:619.673333pt;} +.xb3{left:619.673333pt;} .x9{left:622.384927pt;} -.x78{left:624.476000pt;} -.xe9{left:626.117333pt;} -.xad{left:627.981333pt;} -.xea{left:632.076000pt;} -.x73{left:634.846667pt;} +.x76{left:624.476000pt;} +.xe8{left:626.117333pt;} +.xac{left:627.981333pt;} +.xe9{left:632.076000pt;} +.x71{left:634.846667pt;} .x13a{left:636.197333pt;} -.xeb{left:640.046667pt;} +.xea{left:640.046667pt;} .x6{left:641.598503pt;} -.x74{left:643.301333pt;} -.x96{left:647.057333pt;} -.x79{left:649.317333pt;} +.x72{left:643.301333pt;} +.x95{left:647.057333pt;} +.x77{left:649.317333pt;} .x13e{left:651.489333pt;} -.x97{left:653.972000pt;} -.xc3{left:655.414667pt;} -.xc7{left:658.620000pt;} -.xc4{left:662.328000pt;} +.x96{left:653.972000pt;} +.xc2{left:655.414667pt;} +.xc6{left:658.620000pt;} +.xc3{left:662.328000pt;} .x101{left:663.753333pt;} .x104{left:666.674667pt;} .xf8{left:668.278667pt;} -.x5a{left:670.396000pt;} -.x7a{left:672.860000pt;} -.x9c{left:676.925333pt;} -.x98{left:679.873333pt;} -.xf0{left:681.644000pt;} -.xb8{left:684.417333pt;} -.x8a{left:686.576000pt;} -.x42{left:688.052000pt;} -.x2f{left:691.058667pt;} -.x8b{left:692.534667pt;} -.x43{left:694.010667pt;} -.xec{left:697.488000pt;} -.x99{left:704.498667pt;} -.xed{left:708.741333pt;} -.xee{left:715.656000pt;} -.x9a{left:725.649333pt;} -.x9b{left:732.562667pt;} +.x58{left:670.396000pt;} +.x78{left:672.860000pt;} +.x9b{left:676.925333pt;} +.x97{left:679.873333pt;} +.xef{left:681.644000pt;} +.xb7{left:684.417333pt;} +.x88{left:686.576000pt;} +.x41{left:688.052000pt;} +.x2e{left:691.058667pt;} +.x89{left:692.534667pt;} +.x42{left:694.010667pt;} +.xeb{left:697.488000pt;} +.x98{left:704.498667pt;} +.xec{left:708.741333pt;} +.xed{left:715.656000pt;} +.x99{left:725.649333pt;} +.x9a{left:732.562667pt;} } diff --git a/book/riscv-book.html b/book/riscv-book.html index d27040b..5c5a880 100644 --- a/book/riscv-book.html +++ b/book/riscv-book.html @@ -1,5 +1,5 @@ - +