commit 0ce376b486dc689aeab8213a767dbfbe85255488 Author: cheatfate Date: Thu Nov 28 08:22:47 2024 +0000 deploy: 03f4328de6135a06830103fdfd1d0aeb9bc8a1c8 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..f1731109 --- /dev/null +++ b/.nojekyll @@ -0,0 +1 @@ +This file makes sure that Github Pages doesn't process mdBook's output. diff --git a/404.html b/404.html new file mode 100644 index 00000000..6cb0e6dd --- /dev/null +++ b/404.html @@ -0,0 +1,222 @@ + + + + + + Page not found - Chronos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Document not found (404)

+

This URL is invalid, sorry. Please use the navigation bar or search to continue.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/FontAwesome/css/font-awesome.css b/FontAwesome/css/font-awesome.css new file mode 100644 index 00000000..540440ce --- /dev/null +++ b/FontAwesome/css/font-awesome.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/FontAwesome/fonts/FontAwesome.ttf b/FontAwesome/fonts/FontAwesome.ttf new file mode 100644 index 00000000..35acda2f Binary files /dev/null and b/FontAwesome/fonts/FontAwesome.ttf differ diff --git a/FontAwesome/fonts/fontawesome-webfont.eot b/FontAwesome/fonts/fontawesome-webfont.eot new file mode 100644 index 00000000..e9f60ca9 Binary files /dev/null and b/FontAwesome/fonts/fontawesome-webfont.eot differ diff --git a/FontAwesome/fonts/fontawesome-webfont.svg b/FontAwesome/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000..855c845e --- /dev/null +++ b/FontAwesome/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FontAwesome/fonts/fontawesome-webfont.ttf b/FontAwesome/fonts/fontawesome-webfont.ttf new file mode 100644 index 00000000..35acda2f Binary files /dev/null and b/FontAwesome/fonts/fontawesome-webfont.ttf differ diff --git a/FontAwesome/fonts/fontawesome-webfont.woff b/FontAwesome/fonts/fontawesome-webfont.woff new file mode 100644 index 00000000..400014a4 Binary files /dev/null and b/FontAwesome/fonts/fontawesome-webfont.woff differ diff --git a/FontAwesome/fonts/fontawesome-webfont.woff2 b/FontAwesome/fonts/fontawesome-webfont.woff2 new file mode 100644 index 00000000..4d13fc60 Binary files /dev/null and b/FontAwesome/fonts/fontawesome-webfont.woff2 differ diff --git a/api/chronos.html b/api/chronos.html new file mode 100644 index 00000000..cd25a911 --- /dev/null +++ b/api/chronos.html @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + +chronos + + + + + + + + +
+
+

chronos

+
+
+
+ +     Dark Mode +
+ +
+ Search: +
+
+ Group by: + +
+ + +
+   Source +  Edit + +
+
+ +

async/await framework for Nim

+

See https://status-im.github.io/nim-chronos/ for documentation

+

+ +
+

Exports

+
+setThreadDispatcher, closeSocket, ENOSR, EHOSTUNREACH, EHOSTDOWN, ECONNRESET, EDQUOT, fail, ECANCELED, EMLINK, FuturePendingError, milliseconds, <=, +=, $, asyncTimer, internalRaiseIfError, getSrcLocation, FutureError, fromNow, weeks, ESPIPE, withTimeout, LocationKind, id, <=, FutureCompletedError, ENOEXEC, ESHUTDOWN, fail, EREMOTEIO, toString, EXFULL, waitFor, complete, ==, oneValue, internalInitFutureBase, EPROTONOSUPPORT, Nanosecond, epochNanoSeconds, cancelAndWait, addTimer, Moment, ECOMM, EPROTOTYPE, AsyncExceptionError, milliseconds, getTrackerCounter, ENOENT, millis, removeTimer, FutureFlag, ENOTCONN, EBUSY, init, ENOTUNIQ, days, +=, await, or, ZeroDuration, EKEYREVOKED, AsyncTimeoutError, EUCLEAN, Second, EEXIST, ENOLINK, newInternalRaisesFuture, idleAsync, ==, internalRaiseIfError, SomeIntegerI64, ENOMEM, ENOKEY, +, removeWriter2, ENOMSG, [], trackCounter, EKEYEXPIRED, Week, isCounterLeaked, awaitne, EAFNOSUPPORT, EWOULDBLOCK, EREMOTE, Finished, untrackCounter, AsyncCallback, EHWPOISON, epochSeconds, newDispatcher, EPERM, microseconds, trackerCounters, >=, weeks, Finished, cancelCallback=, ETOOMANYREFS, $, EISCONN, callSoon, ESOCKTNOSUPPORT, setGlobalDispatcher, EXDEV, EBADF, cancelSoon, allFinished, TrackerBase, hours, InternalAsyncCallback, EBFONT, ENETDOWN, EACCES, ELOOP, InfiniteDuration, ETIMEDOUT, >=, EINVAL, value, EBADFD, Future, completed, PDispatcher, ESRCH, EL2NSYNC, EFAULT, low, ESTRPIPE, -=, or, ENOTSOCK, getAsyncTimestamp, await, Hour, EIDRM, removeReader2, secs, getThreadDispatcher, futureContinue, ENOANO, EADV, CallbackFunc, ENFILE, FutureBase, waitFor, high, Microsecond, ENOPKG, ELIBBAD, callSoon, EOWNERDEAD, flags, ERANGE, done, ENONET, completed, callSoon, cancelSoon, EMSGSIZE, EALREADY, EBADMSG, EILSEQ, ENOPROTOOPT, SrcLoc, allFutures, -, complete, FutureState, EBADR, nanos, location, FutureDefect, EDOTDOT, ENOBUFS, EKEYREJECTED, <, Minute, error, ==, one, CancelledError, nanoseconds, EISDIR, EOVERFLOW, FutureSeq, cancelAndWait, micros, all, -, ESRMNT, ENOTEMPTY, EPROTO, TimerCallback, microseconds, error, ENOTRECOVERABLE, wait, callIdle, join, hours, AsyncError, EBADRQC, ENODEV, tryCancel, addTimer, ECHRNG, ENOTDIR, EUNATCH, cancelAndSchedule, failed, nanoseconds, ERESTART, *, ETXTBSY, getTracker, newFutureStr, EMFILE, LocFinishIndex, withTimeout, addTimer, race, EUSERS, ENOTBLK, ENOTTY, EISNAM, ELIBACC, ENAVAIL, init, race, internalCallTick, EDESTADDRREQ, +, cancelSoon, completed, minutes, cancel, FutureFlags, getGlobalDispatcher, ELIBEXEC, stepsAsync, micros, wait, EINPROGRESS, EPFNOSUPPORT, E2BIG, -=, runForever, ENOMEDIUM, secs, value, read, waitFor, EL3HLT, unregisterAndCloseFd, EBADSLT, InternalRaisesFuture, -, <, ENETRESET, fastEpochTime, ENXIO, isZero, EPIPE, allFutures, Day, wait, now, read, asyncSpawn, removeCallback, EAGAIN, raiseOsDefect, trackerCounterKeys, EADDRNOTAVAIL, read, removeCallback, TrackerCounter, async, addCallback, init, async, EREMCHG, finished, addCallback, seconds, noCancel, low, AsyncFD, ECHILD, Raising, init, ECONNABORTED, state, wait, >, callIdle, removeTimer, LocCreateIndex, addReader2, ETIME, ENOLCK, EDEADLK, asyncCheck, Duration, ELNRNG, EDOM, ENOCSI, millis, EBADE, EMEDIUMTYPE, readError, sleepAsync, isInfinite, asyncDiscard, callback=, ENETUNREACH, InternalFutureBase, callIdle, ENOSYS, ELIBSCN, EIO, EROFS, seconds, ELIBMAX, div, init, EL2HLT, EOPNOTSUPP, FutureStr, poll, oneIndex, clearTimer, register2, LocCompleteIndex, days, ENOSTR, EADDRINUSE, one, sleepAsync, ENAMETOOLONG, EMULTIHOP, ESTALE, race, ENODATA, EFBIG, +, minutes, ERFKILL, cancelled, $, toException, join, EDEADLOCK, allFutures, MaxEventsCount, wait, read, raiseAsDefect, ENOSPC, Millisecond, >, setTimer, cancelSoon, unregister2, failed, waitFor, newFutureSeq, addTracker, callback=, orImpl, ECONNREFUSED, high, ENOTNAM, nanos, addWriter2, removeTimer, internalCallTick, EINTR, and, closeHandle, EL3RST, readError, *, newFuture, internalCallTick, []=, EDQUOT, Second, closeSocket, EHOSTUNREACH, EHOSTDOWN, closeWait, ECONNRESET, ==, fail, ECANCELED, EMLINK, milliseconds, FutureBase, <=, +=, $, asyncTimer, internalRaiseIfError, getSrcLocation, FutureError, fromNow, close, weeks, LocFinishIndex, ESPIPE, withTimeout, LocationKind, id, isSet, <=, FutureCompletedError, SomeIntegerI64, fail, EREMOTEIO, waitFor, addTimer, ==, oneValue, internalInitFutureBase, EPROTONOSUPPORT, nanoseconds, cancelAndWait, addTimer, Moment, ECOMM, addFirst, register, EPROTOTYPE, [], AsyncExceptionError, and, SrcLoc, ENOCSI, milliseconds, getTrackerCounter, ENOENT, millis, removeTimer, ELIBACC, EADDRNOTAVAIL, ENOTCONN, EBUSY, init, waitFor, days, +=, await, EAFNOSUPPORT, cancelSoon, AsyncTimeoutError, internalCallTick, []=, setThreadDispatcher, EEXIST, isInfinite, ENOLINK, newInternalRaisesFuture, idleAsync, internalRaiseIfError, ESHUTDOWN, ENOMEM, ENOKEY, +, removeWriter2, ENOMSG, [], trackCounter, EKEYEXPIRED, Week, isCounterLeaked, awaitne, $, EWOULDBLOCK, EREMOTE, unregister, Finished, untrackCounter, AsyncCallback, EHWPOISON, epochSeconds, newDispatcher, EPERM, microseconds, trackerCounters, >=, sleepAsync, addCallback, weeks, EFAULT, callIdle, cancelCallback=, ETOOMANYREFS, mitems, EISCONN, callSoon, ESOCKTNOSUPPORT, newAsyncQueue, setGlobalDispatcher, AsyncQueue, EXDEV, EBADF, EKEYREVOKED, micros, microseconds, hours, wait, ENETDOWN, EACCES, AsyncEvent, AsyncEventQueue, ELOOP, InfiniteDuration, ETIMEDOUT, >=, clear, EINVAL, ==, EBADFD, Future, addCallback, len, completed, PDispatcher, ESRCH, EL2NSYNC, Finished, low, popFirst, ESTRPIPE, -=, contains, getAsyncTimestamp, div, race, Hour, EIDRM, removeReader2, EventQueueReader, secs, getThreadDispatcher, EventQueueKey, futureContinue, popFirstNoWait, join, ENOANO, readError, CallbackFunc, $, FutureStr, addLastNoWait, ENOEXEC, waitFor, high, Microsecond, complete, $, pairs, ELIBBAD, callSoon, EOWNERDEAD, oneIndex, ERANGE, done, clearTimer, popLastNoWait, ENONET, completed, callSoon, release, cancelSoon, EMSGSIZE, EBADMSG, EILSEQ, ENOPROTOOPT, Day, allFutures, empty, -, complete, FutureState, addFirstNoWait, EBADR, nanos, location, FutureDefect, EDOTDOT, ENOBUFS, put, EKEYREJECTED, <, Minute, error, epochNanoSeconds, one, CancelledError, EISDIR, EOVERFLOW, FutureSeq, cancelAndWait, micros, all, -, ESRMNT, ENOTEMPTY, EPROTO, TimerCallback, TrackerBase, ENOTRECOVERABLE, EBFONT, callIdle, EDOM, value, hours, AsyncError, EBADRQC, ENODEV, ENFILE, ENOPKG, callback=, ECHRNG, wait, EUNATCH, cancelAndSchedule, failed, nanoseconds, ERESTART, *, ETXTBSY, getTracker, newFutureStr, full, EMFILE, orImpl, withTimeout, addTimer, race, EUSERS, ENOTBLK, ENOTTY, EISNAM, ENOSR, init, EXFULL, EUCLEAN, EDESTADDRREQ, +, cancelSoon, minutes, cancel, FutureFlags, getGlobalDispatcher, ELIBEXEC, stepsAsync, error, allFinished, wait, clear, value, EINPROGRESS, completed, E2BIG, -=, runForever, ENOMEDIUM, secs, AsyncQueueEmptyError, read, waitFor, EINTR, unregisterAndCloseFd, EBADSLT, or, [], -, EALREADY, <, ENETRESET, fastEpochTime, waitEvents, seconds, isZero, FuturePendingError, EPIPE, AsyncLockError, InternalFutureBase, getNoWait, allFutures, len, race, ENAVAIL, EPFNOSUPPORT, wait, EMULTIHOP, read, asyncSpawn, removeCallback, EAGAIN, raiseOsDefect, trackerCounterKeys, FutureFlag, read, removeCallback, TrackerCounter, async, AsyncLock, init, popLast, async, EREMCHG, finished, fire, ENXIO, or, seconds, noCancel, low, AsyncFD, ECHILD, init, ECONNABORTED, state, ENOTDIR, >, callIdle, removeTimer, LocCreateIndex, setTimer, ETIME, InternalRaisesFuture, EBADE, EDEADLK, items, cancelSoon, asyncCheck, unregister2, Duration, ELNRNG, locked, join, millis, EMEDIUMTYPE, readError, ZeroDuration, newFutureSeq, newAsyncEventQueue, asyncDiscard, InternalAsyncCallback, ENETUNREACH, get, ENOSYS, acquire, ELIBSCN, EIO, EROFS, AsyncEventQueueFullError, ELIBMAX, newAsyncEvent, ENOLCK, EFBIG, EL2HLT, AsyncQueueFullError, EOPNOTSUPP, emit, tryCancel, poll, readerOverflow, flags, register2, LocCompleteIndex, newAsyncLock, sleepAsync, days, ENOSTR, EADDRINUSE, one, size, newFuture, now, putNoWait, Nanosecond, wait, ESTALE, Raising, await, ENODATA, init, +, minutes, ERFKILL, cancelled, toException, EDEADLOCK, allFutures, MaxEventsCount, wait, read, raiseAsDefect, ENOSPC, Millisecond, addLast, >, addReader2, failed, ENOTUNIQ, addTracker, callback=, ENOTSOCK, ECONNREFUSED, high, ENOTNAM, nanos, addWriter2, toString, removeTimer, internalCallTick, EL3HLT, closeHandle, EL3RST, EADV, *, ENAMETOOLONG, internalCallTick, asyncInvalidPipe, getMaxOpenFiles2, getMaxOpenFiles, setSockOpt, getSocketError, getSocketError2, setSockOpt2, createAsyncSocket, getInheritable, createAsyncPipe, setMaxOpenFiles, getSockOpt2, wrapAsyncSocket2, getSockOpt, createAsyncSocket2, wrapAsyncSocket, getSockOpt2, setSockOpt, setSocketBlocking, getSockOpt, setSockOpt2, setMaxOpenFiles2, getDualstack, asyncInvalidSocket, isAvailable, setDualstack, createStreamServer, AsyncStreamError, createStreamServer, createStreamServer, SocketServer, fromNow, close, weeks, LocFinishIndex, peekMessage, <=, FutureCompletedError, EPROTONOSUPPORT, createStreamServer, createStreamServer, ChunkedStreamError, removeTimer, $, race, ENOSPC, TransportUseClosedError, idleAsync, init, ENOKEY, awaitne, EFAULT, FutureStr, getUserData, weeks, ETOOMANYREFS, raiseAsyncStreamLimitError, localAddress, AnyAddress, EACCES, EINVAL, len, ==, raiseTransportOsError, finish, prefix, id, join, <=, newDatagramTransport6, init, FutureBase, ELIBBAD, TransportLimitError, sendTo, EILSEQ, unregister, allFutures, EADV, -, newAsyncStreamWriter, location, addFirstNoWait, toIPv6, ReadMessagePredicate, Route, close, ECHRNG, setTimer, closeWait, init, createStreamServer, FutureFlags, getGlobalDispatcher, E2BIG, -=, checkWriteEof, fastEpochTime, isLinkLocalMulticast, resolveTAddress, read, closeWait, write, localAddress2, EREMCHG, SocketFlags, toString, stopped, removeTimer, release, Duration, failed, initTAddress, EROFS, seconds, start, DatagramCallback, writeFile, atEof, ChunkedStreamWriter, race, +, DefaultStreamBufferSize, createStreamServer, ELIBSCN, mitems, nanos, popFirstNoWait, send, $, ChunkedStreamReader, FutureError, getTransportTooManyError, init, contains, EREMOTEIO, newChunkedStreamWriter, InterfaceState, DatagramTransport, noCancel, []=, EEXIST, newInternalRaisesFuture, ESHUTDOWN, removeWriter2, EWOULDBLOCK, Finished, untrackCounter, setGlobalDispatcher, newDatagramTransport, >=, AsyncEventQueue, ESTRPIPE, $, callSoon, readUntil, close, getUserData, ETIME, getDomain, EL2HLT, removeReader2, futureContinue, and, ENOANO, ChunkedStreamIncompleteError, DefaultBacklogSize, register, closed, done, localAddress, init, completed, EMSGSIZE, EDOTDOT, ChunkedStreamProtocolError, readLine, EOVERFLOW, raiseTransportError, micros, newAsyncStreamReader, AnyAddress6, ENOTEMPTY, EADDRNOTAVAIL, wait, checkClosed, EUNATCH, newAsyncLock, div, ERESTART, FuturePendingError, unregisterAndCloseFd, newAsyncQueue, ENOTBLK, race, micros, size, AsyncStreamDefaultBufferSize, -, new, join, EPIPE, shutdownWait, removeCallback, isDocumentation, FutureFlag, read, resolveTAddress, ENXIO, ENOEXEC, locked, ZeroDuration, subnetMask, callIdle, ENOSYS, EventQueueKey, ELIBMAX, EOPNOTSUPP, isPrivate, ENOSTR, getTransportError, checkClosed, join, initIp, read, consume, ECONNREFUSED, join, ECANCELED, init, TransportAddress, complete, AsyncBufferRef, AddressFamily, nanoseconds, ECOMM, init, closed, getTrackerCounter, AsyncBuffer, ENOTCONN, setDualstack, days, sleepAsync, consume, StreamReaderLoop, ENOMEM, sendTo, or, EPERM, fromPipe, newAsyncEventQueue, DefaultDatagramBufferSize, readMessage, init, EKEYREVOKED, toIpAddress, hours, TransportIncompleteError, clear, MaxAdapterAddressLength, fire, atEof, secs, allFutures, isAvailable, AsyncStreamRW, isSet, netmask, value, getTransportOsError, read, checkStreamClosed, waitFor, ENOPKG, newAsyncStreamWriter, IpMask, network, WriteItem, EBADE, getAsyncTimestamp, FutureState, PDispatcher, DualStackType, nanoseconds, init, broadcast, address, ENAVAIL, AsyncError, EBADRQC, failed, withTimeout, isLinkLocalUnicast, flags, ELIBACC, minutes, isUnicast, AsyncStreamWriter, toException, init, isLinkLocal, EBADSLT, TransportUseEofError, ENETRESET, waitEvents, init, wait, asyncSpawn, DgramTransportTrackerName, init, addCallback, AsyncFD, ECHILD, Raising, newAsyncStreamUseClosedError, >, AsyncStreamWriterTrackerName, getError, join, millis, checkStreamFinished, toIPv4, callback=, EIO, write, poll, days, ESTALE, InterfaceType, AsyncStreamState, raiseAsDefect, newAsyncStreamReader, consume, addReader2, unregister2, init, high, internalCallTick, EINTR, raiseAsyncStreamWriteEOFError, closeWait, popLast, transfer, AsyncStreamWriteEOFError, StreamCallback, connect, fail, EPROTOTYPE, ENOCSI, init, now, or, createStreamServer, ==, toException, StreamTransport, newAsyncStreamLimitError, init, UnsafeDatagramCallback, newDispatcher, isBenchmarking, readOnce, newAsyncStreamWriter, ServerFlags, TransportTooManyError, ENOSR, AsyncStreamReaderTrackerName, allFinished, resolveTAddress, toHex, trackerCounterKeys, -=, isNone, stop2, readerOverflow, ENOMEDIUM, resolveTAddress, CallbackFunc, Microsecond, EHWPOISON, newDatagramTransport, callSoon, readUntil, TransportOsError, addTimer, closed, isGlobalMulticast, init, newChunkedStreamWriter, FutureDefect, ENOBUFS, -, inc, resolveTAddress, ENOTRECOVERABLE, ENOTDIR, getInterfaces, hours, cancelAndSchedule, ServerStatus, TransportFlags, complete, EXFULL, TransportAddressError, stepsAsync, clear, value, EventQueueReader, secs, read, waitFor, TransportNoSupport, empty, closeWait, raiseAsyncStreamIncompleteError, AsyncStream, toSAddr, AsyncQueueFullError, write, TransportAbortedError, newAsyncStreamReader, localAddress2, AsyncStreamUseClosedError, InternalAsyncCallback, InternalFutureBase, getTransportUseClosedError, resolveTAddress, AsyncEventQueueFullError, atEof, isBroadcast, register2, LocCompleteIndex, newDatagramTransport6, EMULTIHOP, putNoWait, await, EFBIG, isMulticast, cancelled, allFutures, isGlobal, newFutureSeq, ENOTSOCK, TransportState, removeTimer, stop, EDQUOT, milliseconds, EMLINK, milliseconds, getTransportOsError, read, $, waitFor, cancelAndWait, +, failed, newAsyncStreamWriter, network, initTAddress, EREMOTE, getMessage, epochSeconds, microseconds, AsyncEvent, cancelCallback=, TransportInitCallback, init, newDatagramTransport6, wait, ENETDOWN, -, full, EBADFD, seconds, AsyncStreamWriteError, read, AsyncStreamIncorrectDefect, completed, dec, cancelSoon, Week, waitFor, remoteAddress, error, ENOLCK, FutureSeq, cancelAndWait, all, EPROTO, getConnectionAbortedError, callIdle, ENODEV, tryCancel, ERFKILL, init, running, addTimer, broadcast, ENOTTY, EISNAM, +, $, ELIBEXEC, ServerCommand, AsyncQueueEmptyError, newAsyncStreamWriter, <, isUnspecified, newDatagramTransport, $, fromPipe2, TrackerCounter, start2, async, finished, resolveTAddress, StreamServer, low, createStreamServer, ==, AsyncStreamDefaultQueueSize, getUserData, localAddress, init, sendTo, nanos, Nanosecond, close, ENODATA, init, windowsAnyAddressFix, read, failed, orImpl, ENOTNAM, closeHandle, ENOTUNIQ, newFuture, closeSocket, ECONNRESET, Second, getSrcLocation, withTimeout, initTAddress, newChunkedStreamReader, ENOENT, AsyncStreamReadError, []=, setThreadDispatcher, ENOMSG, SomeIntegerI64, [], setDualstack, isCounterLeaked, $, readMessage, TransportError, RTA_ALIGN, EAFNOSUPPORT, EISCONN, getServerUseClosedError, EBADF, microseconds, ETIMEDOUT, Future, EL2NSYNC, EIDRM, ERANGE, popLastNoWait, contains, init, ENONET, EPFNOSUPPORT, EBADMSG, ENOPROTOOPT, newDatagramTransport, closed, oneValue, one, Minute, CancelledError, TimerCallback, init, AsyncStreamIncompleteError, WriteType, newDatagramTransport6, wait, newFutureStr, EMFILE, newAsyncEvent, init, InternalRaisesFuture, cancelSoon, cancel, wait, EINPROGRESS, ==, remoteAddress, AsyncLockError, getNoWait, EDESTADDRREQ, EAGAIN, newDatagramTransport, async, emit, init, ECONNABORTED, state, [], EDEADLK, asyncCheck, addCallback, one, popFirst, isShared, items, Millisecond, [], readError, addWriter2, EL3HLT, readError, *, EHOSTUNREACH, EHOSTDOWN, +=, internalRaiseIfError, ESPIPE, LocationKind, internalInitFutureBase, ==, host, EDOM, NetworkInterface, millis, newDatagramTransport, EBUSY, +=, EUCLEAN, isZero, internalRaiseIfError, addFirst, EKEYEXPIRED, AsyncCallback, trackerCounters, Finished, ESOCKTNOSUPPORT, RTA_PAYLOAD, AsyncQueue, EXDEV, cancelSoon, newDatagramTransport, InfiniteDuration, >=, ==, isSiteLocal, ESRCH, fromSAddr, getThreadDispatcher, write, ip, close, addLastNoWait, epochNanoSeconds, callSoon, newAsyncStreamReader, isUnicastLinkLocal, StreamServerTrackerName, len, EBADR, put, EKEYREJECTED, EISDIR, StreamWriterLoop, ESRMNT, error, write, ENFILE, createStreamServer, getAutoAddresses, ETXTBSY, send, oneIndex, Day, SrcLoc, runForever, join, upload, removeCallback, AsyncLock, getConnectionAbortedError, subnetMask, clearTimer, newAsyncStreamReader, consume, callIdle, LocCreateIndex, StreamTransportTrackerName, EMEDIUMTYPE, sleepAsync, getDomain, asyncDiscard, init, InterfaceAddress, high, minutes, MaxEventsCount, wait, >, addTracker, callback=, ==, and, cmp, init, internalCallTick, fail, isZero, readOnce, closeWait, AsyncStreamLimitError, addTimer, Moment, isV4Mapped, AsyncExceptionError, get, await, AsyncTimeoutError, ENOLINK, finished, +, isAnyLocal, trackCounter, init, StreamCallback2, completed, mask, isReserved, readExactly, ELOOP, $, AsyncStreamReader, $, finished, low, toUnchecked, hexValue, TransportKind, Hour, init, addLast, asyncTimer, newChunkedStreamReader, pairs, EOWNERDEAD, connect, EALREADY, remoteAddress2, initTAddress, newAsyncStreamWriter, <, cancelSoon, TrackerBase, EBFONT, ==, *, getTracker, isLoopback, getAutoAddress, readLine, EUSERS, newDatagramTransport, isUniqueLocal, internalCallTick, raiseEmptyMessageDefect, accept, $, newAsyncStreamReader, write, send, isInterfaceLocalMulticast, copyOut, raiseOsDefect, acquire, wait, getBestRoute, ELNRNG, IpNet, raiseAsyncStreamUseClosedError, isInfinite, ENETUNREACH, resolveTAddress, readExactly, init, not, forget, remoteAddress2, or, EDEADLOCK, running, newAsyncStreamIncompleteError, EADDRINUSE, EL3RST, ENAMETOOLONG, Hour, init, fromNow, milliseconds, <, fastEpochTime, Minute, secs, Day, micros, >=, ==, nanoseconds, +, >=, nanos, minutes, <=, low, milliseconds, millis, $, micros, asyncTimer, +=, Nanosecond, -, -, Second, >, high, epochNanoSeconds, Microsecond, weeks, microseconds, secs, InfiniteDuration, -=, +, minutes, +=, microseconds, $, hours, toString, hours, Duration, now, <, weeks, Millisecond, <=, millis, >, ==, seconds, isZero, ZeroDuration, isInfinite, SomeIntegerI64, div, +, *, epochSeconds, high, nanoseconds, nanos, low, -, days, -=, Week, days, seconds, *, Moment, EDQUOT, Second, closeSocket, EHOSTUNREACH, EHOSTDOWN, ECONNRESET, ==, fail, ECANCELED, EMLINK, milliseconds, FutureBase, <=, +=, $, asyncTimer, internalRaiseIfError, getSrcLocation, FutureError, fromNow, weeks, LocFinishIndex, ESPIPE, withTimeout, LocationKind, id, <=, FutureCompletedError, SomeIntegerI64, fail, EREMOTEIO, waitFor, addTimer, ==, oneValue, internalInitFutureBase, EPROTONOSUPPORT, nanoseconds, cancelAndWait, addTimer, Moment, ECOMM, EPROTOTYPE, AsyncExceptionError, and, SrcLoc, ENOCSI, milliseconds, getTrackerCounter, ENOENT, millis, removeTimer, ELIBACC, EADDRNOTAVAIL, ENOTCONN, EBUSY, init, waitFor, days, +=, await, EAFNOSUPPORT, cancelSoon, AsyncTimeoutError, internalCallTick, setThreadDispatcher, EEXIST, isInfinite, ENOLINK, newInternalRaisesFuture, idleAsync, internalRaiseIfError, ESHUTDOWN, ENOMEM, ENOKEY, +, removeWriter2, ENOMSG, [], trackCounter, EKEYEXPIRED, Week, isCounterLeaked, awaitne, $, EWOULDBLOCK, EREMOTE, Finished, untrackCounter, AsyncCallback, EHWPOISON, epochSeconds, newDispatcher, EPERM, microseconds, trackerCounters, >=, sleepAsync, addCallback, weeks, EFAULT, callIdle, cancelCallback=, ETOOMANYREFS, EISCONN, callSoon, ESOCKTNOSUPPORT, setGlobalDispatcher, EXDEV, EBADF, EKEYREVOKED, micros, microseconds, hours, wait, ENETDOWN, EACCES, ELOOP, InfiniteDuration, ETIMEDOUT, >=, EINVAL, ==, EBADFD, Future, addCallback, completed, PDispatcher, ESRCH, EL2NSYNC, OnlyCompleted, Finished, low, ESTRPIPE, -=, getAsyncTimestamp, div, race, Hour, EIDRM, removeReader2, secs, getThreadDispatcher, futureContinue, join, ENOANO, readError, CallbackFunc, $, FutureStr, ENOEXEC, waitFor, high, Microsecond, complete, ELIBBAD, callSoon, EOWNERDEAD, oneIndex, ERANGE, done, clearTimer, ENONET, completed, callSoon, cancelSoon, EMSGSIZE, EBADMSG, EILSEQ, ENOPROTOOPT, Day, allFutures, -, complete, FutureState, EBADR, nanos, location, FutureDefect, EDOTDOT, dumpPendingFutures, ENOBUFS, EKEYREJECTED, <, Minute, error, epochNanoSeconds, one, CancelledError, EISDIR, EOVERFLOW, FutureSeq, cancelAndWait, micros, all, -, ESRMNT, ENOTEMPTY, EPROTO, TimerCallback, TrackerBase, ENOTRECOVERABLE, EBFONT, callIdle, EDOM, value, hours, AsyncError, EBADRQC, ENODEV, ENFILE, ENOPKG, callback=, ECHRNG, wait, EUNATCH, cancelAndSchedule, failed, nanoseconds, ERESTART, *, ETXTBSY, getTracker, newFutureStr, EMFILE, orImpl, withTimeout, addTimer, race, EUSERS, ENOTBLK, ENOTTY, EISNAM, ENOSR, init, EXFULL, EUCLEAN, EDESTADDRREQ, +, cancelSoon, minutes, cancel, FutureFlags, getGlobalDispatcher, ELIBEXEC, stepsAsync, error, allFinished, wait, value, EINPROGRESS, completed, E2BIG, -=, runForever, ENOMEDIUM, secs, AllFutureStates, read, waitFor, EINTR, unregisterAndCloseFd, EBADSLT, or, -, EALREADY, <, ENETRESET, fastEpochTime, seconds, isZero, FuturePendingError, EPIPE, InternalFutureBase, allFutures, race, ENAVAIL, EPFNOSUPPORT, wait, EMULTIHOP, read, asyncSpawn, removeCallback, EAGAIN, raiseOsDefect, trackerCounterKeys, FutureFlag, read, removeCallback, TrackerCounter, async, init, async, EREMCHG, finished, ENXIO, or, seconds, noCancel, low, AsyncFD, ECHILD, init, ECONNABORTED, state, ENOTDIR, >, callIdle, removeTimer, LocCreateIndex, setTimer, ETIME, InternalRaisesFuture, EBADE, EDEADLK, cancelSoon, asyncCheck, unregister2, Duration, ELNRNG, join, millis, EMEDIUMTYPE, readError, ZeroDuration, newFutureSeq, asyncDiscard, InternalAsyncCallback, ENETUNREACH, ENOSYS, ELIBSCN, EIO, EROFS, ELIBMAX, WithoutCompleted, ENOLCK, EFBIG, EL2HLT, pendingFuturesCount, EOPNOTSUPP, tryCancel, poll, flags, register2, LocCompleteIndex, sleepAsync, days, ENOSTR, EADDRINUSE, one, OnlyPending, newFuture, now, Nanosecond, ESTALE, Raising, await, ENODATA, init, +, minutes, ERFKILL, cancelled, toException, EDEADLOCK, allFutures, MaxEventsCount, wait, read, raiseAsDefect, ENOSPC, Millisecond, >, addReader2, failed, ENOTUNIQ, addTracker, callback=, ENOTSOCK, ECONNREFUSED, high, ENOTNAM, nanos, addWriter2, toString, removeTimer, internalCallTick, EL3HLT, closeHandle, EL3RST, EADV, *, ENAMETOOLONG, internalCallTick +
+ +
+
+ +
+ +
+
+
+ + + diff --git a/api/chronos/asyncloop.html b/api/chronos/asyncloop.html new file mode 100644 index 00000000..055b5d6a --- /dev/null +++ b/api/chronos/asyncloop.html @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + +chronos/asyncloop + + + + + + + + +
+
+

chronos/asyncloop

+
+
+
+ +     Dark Mode +
+ +
+ Search: +
+
+ Group by: + +
+ + +
+   Source +  Edit + +
+
+ +

+ +
+

Exports

+
+one, Finished, init, init, race, allFutures, LocCompleteIndex, idleAsync, fail, futureContinue, addCallback, cancelSoon, cancelCallback=, cancel, noCancel, withTimeout, and, FutureSeq, cancelAndWait, Raising, FutureStr, allFinished, all, read, wait, cancelAndWait, internalRaiseIfError, waitFor, withTimeout, race, LocCreateIndex, error, cancelSoon, wait, waitFor, race, join, done, sleepAsync, wait, asyncCheck, join, allFutures, fail, wait, orImpl, read, tryCancel, stepsAsync, one, FutureCompletedError, wait, newInternalRaisesFuture, cancelSoon, cancelAndSchedule, sleepAsync, InternalRaisesFuture, or, internalRaiseIfError, readError, newFutureSeq, addCallback, callback=, waitFor, complete, asyncDiscard, callback=, newFutureStr, allFutures, Finished, waitFor, FuturePendingError, oneValue, read, oneIndex, LocFinishIndex, or, cancelSoon, asyncSpawn, removeCallback, readError, complete, newFuture, read, removeCallback, [], closeSocket, <=, ELIBACC, EHOSTUNREACH, EHOSTDOWN, ECONNRESET, EDQUOT, ECANCELED, EMLINK, milliseconds, setThreadDispatcher, +=, $, Second, getSrcLocation, FutureError, fromNow, weeks, ENOEXEC, ESPIPE, LocationKind, ==, id, <=, ESHUTDOWN, EREMOTEIO, addTimer, internalInitFutureBase, EPROTONOSUPPORT, nanoseconds, ==, addTimer, Moment, ECOMM, EPROTOTYPE, AsyncExceptionError, ENOCSI, milliseconds, getTrackerCounter, ENOENT, millis, removeTimer, InfiniteDuration, EBADE, EMFILE, TrackerBase, ENOTCONN, EBUSY, days, +=, await, AsyncTimeoutError, internalCallTick, CallbackFunc, EEXIST, isInfinite, ENOLINK, ENOMSG, isZero, SomeIntegerI64, ENOMEM, AsyncFD, ENOKEY, +, removeWriter2, trackCounter, EKEYEXPIRED, Week, isCounterLeaked, awaitne, EPFNOSUPPORT, EWOULDBLOCK, EREMOTE, EFAULT, untrackCounter, AsyncCallback, EHWPOISON, epochSeconds, newDispatcher, EPERM, microseconds, trackerCounters, >=, InternalFutureBase, weeks, finished, ETOOMANYREFS, $, EISCONN, callSoon, ESOCKTNOSUPPORT, setGlobalDispatcher, EXDEV, EBADF, EKEYREVOKED, micros, microseconds, hours, ENETDOWN, EACCES, ELOOP, ETIMEDOUT, >=, EINVAL, value, EBADFD, $, PDispatcher, ESRCH, EL2NSYNC, low, ESTRPIPE, -=, callIdle, getAsyncTimestamp, Hour, EIDRM, removeReader2, secs, getThreadDispatcher, ENOANO, asyncTimer, value, high, ==, Microsecond, ENOPKG, ELIBBAD, callSoon, EOWNERDEAD, ERANGE, ENONET, completed, callSoon, EBADSLT, EMSGSIZE, EALREADY, FutureBase, EILSEQ, ENOPROTOOPT, -, addTimer, FutureState, EBADR, nanos, location, FutureDefect, EDOTDOT, ENOBUFS, EKEYREJECTED, <, Minute, error, CancelledError, EISDIR, epochNanoSeconds, EOVERFLOW, -, ESRMNT, ENOTEMPTY, EPROTO, EMULTIHOP, EADDRNOTAVAIL, seconds, ENOTRECOVERABLE, EBFONT, callIdle, hours, AsyncError, EBADRQC, ENODEV, ENFILE, ECHRNG, EUNATCH, failed, nanoseconds, ERESTART, *, ETXTBSY, getTracker, unregisterAndCloseFd, flags, EUSERS, ENOTBLK, ENOTTY, EISNAM, EFBIG, Day, EUCLEAN, EDESTADDRREQ, +, completed, minutes, FutureFlags, getGlobalDispatcher, ELIBEXEC, micros, EINPROGRESS, E2BIG, -=, runForever, ENOMEDIUM, secs, toException, -, <, ENETRESET, fastEpochTime, Future, EDOM, EPIPE, EXFULL, ENAVAIL, SrcLoc, completed, TimerCallback, EAGAIN, raiseOsDefect, trackerCounterKeys, FutureFlag, TrackerCounter, async, EBADMSG, init, async, EREMCHG, ENXIO, clearTimer, low, ECHILD, init, ECONNABORTED, state, ENOTDIR, >, callIdle, removeTimer, setTimer, ENOSR, ETIME, ENOLCK, EDEADLK, unregister2, Duration, ELNRNG, millis, EMEDIUMTYPE, ZeroDuration, InternalAsyncCallback, ENETUNREACH, div, ENOSYS, ELIBSCN, EIO, EROFS, seconds, ELIBMAX, EL2HLT, EOPNOTSUPP, poll, register2, days, ENOSTR, EADDRINUSE, now, Nanosecond, ESTALE, await, ENODATA, init, +, minutes, ERFKILL, cancelled, EAFNOSUPPORT, EINTR, EDEADLOCK, MaxEventsCount, raiseAsDefect, ENOSPC, Millisecond, >, addReader2, failed, ENOTUNIQ, addTracker, ENOTSOCK, ECONNREFUSED, high, ENOTNAM, nanos, addWriter2, toString, removeTimer, internalCallTick, EL3HLT, closeHandle, EL3RST, EADV, *, ENAMETOOLONG, internalCallTick, AsyncExceptionError, AsyncError, AsyncTimeoutError, async, async, await, await, awaitne +
+ +
+
+ +
+ +
+
+
+ + + diff --git a/api/chronos/asyncsync.html b/api/chronos/asyncsync.html new file mode 100644 index 00000000..69c02fc5 --- /dev/null +++ b/api/chronos/asyncsync.html @@ -0,0 +1,1191 @@ + + + + + + + + + + + + + + + + + + +chronos/asyncsync + + + + + + + + +
+
+

chronos/asyncsync

+
+
+
+ +     Dark Mode +
+ +
+ Search: +
+
+ Group by: + +
+ + +
+   Source +  Edit + +
+
+ +

This module implements some core synchronization primitives.

+ +
+

Types

+
+
+
AsyncEvent = ref object of RootRef
+  flag: bool
+  waiters: seq[Future[void].Raising([CancelledError])]
+
+
+ +

A primitive event object.

+

An event manages a flag that can be set to true with the fire() procedure and reset to false with the clear() procedure. The wait() coroutine blocks until the flag is false.

+

If more than one coroutine blocked in wait() waiting for event state to be signaled, when event get fired, then all coroutines continue proceeds in order, they have entered waiting state.

+ +  Source +  Edit + +
+
+
+
AsyncEventQueue[T] = ref object of RootObj
+  readers: seq[EventQueueReader]
+  queue: Deque[T]
+  counter: uint64
+  limit: int
+  offset: int
+
+
+ + +  Source +  Edit + +
+
+
+
AsyncEventQueueFullError = object of AsyncError
+
+ + +  Source +  Edit + +
+
+
+
AsyncLock = ref object of RootRef
+  locked: bool
+  acquired: bool
+  waiters: seq[Future[void].Raising([CancelledError])]
+
+
+ +

A primitive lock is a synchronization primitive that is not owned by a particular coroutine when locked. A primitive lock is in one of two states, locked or unlocked.

+

When more than one coroutine is blocked in acquire() waiting for the state to turn to unlocked, only one coroutine proceeds when a release() call resets the state to unlocked; first coroutine which is blocked in acquire() is being processed.

+ +  Source +  Edit + +
+
+
+
AsyncLockError = object of AsyncError
+  
+
+ +AsyncLock is either locked or unlocked. +  Source +  Edit + +
+
+
+
AsyncQueue[T] = ref object of RootRef
+  getters: seq[Future[void].Raising([CancelledError])]
+  putters: seq[Future[void].Raising([CancelledError])]
+  queue: Deque[T]
+  maxsize: int
+
+
+ +

A queue, useful for coordinating producer and consumer coroutines.

+

If maxsize is less than or equal to zero, the queue size is infinite. If it is an integer greater than 0, then "await put()" will block when the queue reaches maxsize, until an item is removed by "await get()".

+ +  Source +  Edit + +
+
+
+
AsyncQueueEmptyError = object of AsyncError
+  
+
+ +AsyncQueue is empty. +  Source +  Edit + +
+
+
+
AsyncQueueFullError = object of AsyncError
+  
+
+ +AsyncQueue is full. +  Source +  Edit + +
+
+
+
EventQueueKey = distinct uint64
+
+ + +  Source +  Edit + +
+
+
+
EventQueueReader = object
+  key: EventQueueKey
+  offset: int
+  waiter: Future[void].Raising([CancelledError])
+  overflow: bool
+
+
+ + +  Source +  Edit + +
+
+ +
+
+

Procs

+
+
+
proc `$`[T](aq: AsyncQueue[T]): string {....raises: [].}
+
+ +Turn an async queue aq into its string representation. +  Source +  Edit + +
+
+
+
proc `[]=`[T](aq: AsyncQueue[T]; i: BackwardsIndex; item: T) {.inline,
+    ...raises: [].}
+
+ +Change the i-th element of aq. +  Source +  Edit + +
+
+
+
proc `[]=`[T](aq: AsyncQueue[T]; i: Natural; item: T) {.inline, ...raises: [].}
+
+ +Change the i-th element of aq. +  Source +  Edit + +
+
+
+
proc `[]`[T](aq: AsyncQueue[T]; i: BackwardsIndex): T {.inline, ...raises: [].}
+
+ +Access the i-th element of aq by order from first to last. aq[0] is the first element, aq[^1] is the last element. +  Source +  Edit + +
+
+
+
proc `[]`[T](aq: AsyncQueue[T]; i: Natural): T {.inline, ...raises: [].}
+
+ +Access the i-th element of aq by order from first to last. aq[0] is the first element, aq[^1] is the last element. +  Source +  Edit + +
+
+
+
proc acquire(lock: AsyncLock): InternalRaisesFuture[void, (CancelledError,)] {.
+    stackTrace: false, ...raises: [], gcsafe, raises: [], raises: [],
+    tags: [RootEffect].}
+
+ +

Acquire a lock lock.

+

This procedure blocks until the lock lock is unlocked, then sets it to locked and returns.

+ +  Source +  Edit + +
+
+
+
proc addFirst[T](aq: AsyncQueue[T]; item: T): InternalRaisesFuture[void,
+    (CancelledError,)] {.stackTrace: false, ...raises: [], gcsafe, raises: [],
+                         raises: [].}
+
+ +Put an item to the beginning of the queue aq. If the queue is full, wait until a free slot is available before adding item. +  Source +  Edit + +
+
+
+
proc addFirstNoWait[T](aq: AsyncQueue[T]; item: T) {.
+    ...raises: [AsyncQueueFullError], raises: [].}
+
+ +

Put an item item to the beginning of the queue aq immediately.

+

If queue aq is full, then AsyncQueueFullError exception raised.

+ +  Source +  Edit + +
+
+
+
proc addLast[T](aq: AsyncQueue[T]; item: T): InternalRaisesFuture[void,
+    (CancelledError,)] {.stackTrace: false, ...raises: [], gcsafe, raises: [],
+                         raises: [].}
+
+ +Put an item to the end of the queue aq. If the queue is full, wait until a free slot is available before adding item. +  Source +  Edit + +
+
+
+
proc addLastNoWait[T](aq: AsyncQueue[T]; item: T) {.
+    ...raises: [AsyncQueueFullError], raises: [].}
+
+ +

Put an item item at the end of the queue aq immediately.

+

If queue aq is full, then AsyncQueueFullError exception raised.

+ +  Source +  Edit + +
+
+
+
proc clear(event: AsyncEvent) {....raises: [], tags: [].}
+
+ +Reset the internal flag of event to false. Subsequently, tasks calling wait() will block until fire() is called to set the internal flag to true again. +  Source +  Edit + +
+
+
+
proc clear[T](aq: AsyncQueue[T]) {.inline, ...raises: [].}
+
+ +Clears all elements of queue aq. +  Source +  Edit + +
+
+
+
proc close(ab: AsyncEventQueue) {....raises: [], raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc closeWait(ab: AsyncEventQueue): InternalRaisesFuture[void, void] {.
+    stackTrace: false, ...raises: [], gcsafe, raises: [], raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc contains[T](aq: AsyncQueue[T]; item: T): bool {.inline, ...raises: [].}
+
+ +Return true if item is in aq or false if not found. Usually used via the in operator. +  Source +  Edit + +
+
+
+
proc emit[T](ab: AsyncEventQueue[T]; data: T) {....raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc empty[T](aq: AsyncQueue[T]): bool {.inline, ...raises: [].}
+
+ +Return true if the queue is empty, false otherwise. +  Source +  Edit + +
+
+
+
proc fire(event: AsyncEvent) {....raises: [], tags: [].}
+
+ +Set the internal flag of event to true. All tasks waiting for it to become true are awakened. Task that call wait() once the flag is true will not block at all. +  Source +  Edit + +
+
+
+
proc full[T](aq: AsyncQueue[T]): bool {.inline, ...raises: [].}
+
+ +

Return true if there are maxsize items in the queue.

+

Note: If the aq was initialized with maxsize = 0 (default), then full() is never true.

+ +  Source +  Edit + +
+
+
+
proc get[T](aq: AsyncQueue[T]): InternalRaisesFuture[T, (CancelledError,)] {.
+    stackTrace: false, ...raises: [], gcsafe, raises: [], raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc getNoWait[T](aq: AsyncQueue[T]): T {....raises: [AsyncQueueEmptyError],
+    raises: [].}
+
+ +Alias of popFirstNoWait(). +  Source +  Edit + +
+
+
+
proc isSet(event: AsyncEvent): bool {....raises: [], tags: [].}
+
+ +Return true if and only if the internal flag of event is true. +  Source +  Edit + +
+
+
+
proc len(ab: AsyncEventQueue): int {....raises: [], raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc len[T](aq: AsyncQueue[T]): int {.inline, ...raises: [].}
+
+ +Return the number of elements in aq. +  Source +  Edit + +
+
+
+
proc locked(lock: AsyncLock): bool {....raises: [], tags: [].}
+
+ +Return true if the lock lock is acquired, false otherwise. +  Source +  Edit + +
+
+
+
proc newAsyncEvent(): AsyncEvent {....raises: [], tags: [].}
+
+ +

Creates new asyncronous event AsyncEvent.

+

An event manages a flag that can be set to true with the fire() procedure and reset to false with the clear() procedure. The wait() procedure blocks until the flag is true. The flag is initially false.

+ +  Source +  Edit + +
+
+
+
proc newAsyncEventQueue[T](limitSize = 0): AsyncEventQueue[T] {....raises: [],
+    raises: [].}
+
+ +

Creates new AsyncEventBus maximum size of limitSize (default is 0 which means that there no limits).

+

When number of events emitted exceeds limitSize - emit() procedure will discard new events, consumers which has number of pending events more than limitSize will get AsyncEventQueueFullError error.

+ +  Source +  Edit + +
+
+
+
proc newAsyncLock(): AsyncLock {....raises: [], tags: [].}
+
+ +

Creates new asynchronous lock AsyncLock.

+

Lock is created in the unlocked state. When the state is unlocked, acquire() changes the state to locked and returns immediately. When the state is locked, acquire() blocks until a call to release() in another coroutine changes it to unlocked.

+

The release() procedure changes the state to unlocked and returns immediately.

+ +  Source +  Edit + +
+
+
+
proc newAsyncQueue[T](maxsize: int = 0): AsyncQueue[T] {....raises: [].}
+
+ +Creates a new asynchronous queue AsyncQueue. +  Source +  Edit + +
+
+
+
proc popFirst[T](aq: AsyncQueue[T]): InternalRaisesFuture[T, (CancelledError,)] {.
+    stackTrace: false, ...raises: [], gcsafe, raises: [], raises: [].}
+
+ +Remove and return an item from the beginning of the queue aq. If the queue is empty, wait until an item is available. +  Source +  Edit + +
+
+
+
proc popFirstNoWait[T](aq: AsyncQueue[T]): T {....raises: [AsyncQueueEmptyError],
+    raises: [].}
+
+ +

Get an item from the beginning of the queue aq immediately.

+

If queue aq is empty, then AsyncQueueEmptyError exception raised.

+ +  Source +  Edit + +
+
+
+
proc popLast[T](aq: AsyncQueue[T]): InternalRaisesFuture[T, (CancelledError,)] {.
+    stackTrace: false, ...raises: [], gcsafe, raises: [], raises: [].}
+
+ +Remove and return an item from the end of the queue aq. If the queue is empty, wait until an item is available. +  Source +  Edit + +
+
+
+
proc popLastNoWait[T](aq: AsyncQueue[T]): T {....raises: [AsyncQueueEmptyError],
+    raises: [].}
+
+ +

Get an item from the end of the queue aq immediately.

+

If queue aq is empty, then AsyncQueueEmptyError exception raised.

+ +  Source +  Edit + +
+
+
+
proc put[T](aq: AsyncQueue[T]; item: T): InternalRaisesFuture[void,
+    (CancelledError,)] {.stackTrace: false, ...raises: [], gcsafe, raises: [],
+                         raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc putNoWait[T](aq: AsyncQueue[T]; item: T) {....raises: [AsyncQueueFullError],
+    raises: [].}
+
+ +Alias of addLastNoWait(). +  Source +  Edit + +
+
+
+
proc register(ab: AsyncEventQueue): EventQueueKey {....raises: [], raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc release(lock: AsyncLock) {....raises: [AsyncLockError], raises: [], tags: [].}
+
+ +

Release a lock lock.

+

When the lock is locked, reset it to unlocked, and return. If any other coroutines are blocked waiting for the lock to become unlocked, allow exactly one of them to proceed.

+ +  Source +  Edit + +
+
+
+
proc size[T](aq: AsyncQueue[T]): int {.inline, ...raises: [].}
+
+ +Return the maximum number of elements in aq. +  Source +  Edit + +
+
+
+
proc unregister(ab: AsyncEventQueue; key: EventQueueKey) {....raises: [],
+    raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc wait(event: AsyncEvent): InternalRaisesFuture[void, (CancelledError,)] {.
+    stackTrace: false, ...raises: [], gcsafe, raises: [], raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc waitEvents[T](ab: AsyncEventQueue[T]; key: EventQueueKey; eventsCount = -1): InternalRaisesFuture[
+    seq[T], (AsyncEventQueueFullError, CancelledError)] {.stackTrace: false,
+    ...raises: [], gcsafe, raises: [], raises: [].}
+
+ +Wait for events +  Source +  Edit + +
+
+ +
+
+

Iterators

+
+
+
iterator items[T](aq: AsyncQueue[T]): T {.inline, ...raises: [].}
+
+ +Yield every element of aq. +  Source +  Edit + +
+
+
+
iterator mitems[T](aq: AsyncQueue[T]): var T {.inline, ...raises: [].}
+
+ +Yield every element of aq. +  Source +  Edit + +
+
+
+
iterator pairs[T](aq: AsyncQueue[T]): tuple[key: int, val: T] {.inline,
+    ...raises: [].}
+
+ +Yield every (position, value) of aq. +  Source +  Edit + +
+
+ +
+
+

Templates

+
+
+
template readerOverflow(ab: AsyncEventQueue; reader: EventQueueReader): bool
+
+ + +  Source +  Edit + +
+
+ +
+
+

Exports

+
+setThreadDispatcher, closeSocket, ENOSR, EHOSTUNREACH, EHOSTDOWN, ECONNRESET, EDQUOT, fail, ECANCELED, EMLINK, FuturePendingError, milliseconds, <=, +=, $, asyncTimer, internalRaiseIfError, getSrcLocation, FutureError, fromNow, weeks, ESPIPE, withTimeout, LocationKind, id, <=, FutureCompletedError, ENOEXEC, ESHUTDOWN, fail, EREMOTEIO, toString, EXFULL, waitFor, complete, ==, oneValue, internalInitFutureBase, EPROTONOSUPPORT, Nanosecond, epochNanoSeconds, cancelAndWait, addTimer, Moment, ECOMM, EPROTOTYPE, AsyncExceptionError, milliseconds, getTrackerCounter, ENOENT, millis, removeTimer, FutureFlag, ENOTCONN, EBUSY, init, ENOTUNIQ, days, +=, await, or, ZeroDuration, EKEYREVOKED, AsyncTimeoutError, EUCLEAN, Second, EEXIST, ENOLINK, newInternalRaisesFuture, idleAsync, ==, internalRaiseIfError, SomeIntegerI64, ENOMEM, ENOKEY, +, removeWriter2, ENOMSG, [], trackCounter, EKEYEXPIRED, Week, isCounterLeaked, awaitne, EAFNOSUPPORT, EWOULDBLOCK, EREMOTE, Finished, untrackCounter, AsyncCallback, EHWPOISON, epochSeconds, newDispatcher, EPERM, microseconds, trackerCounters, >=, weeks, Finished, cancelCallback=, ETOOMANYREFS, $, EISCONN, callSoon, ESOCKTNOSUPPORT, setGlobalDispatcher, EXDEV, EBADF, cancelSoon, allFinished, TrackerBase, hours, InternalAsyncCallback, EBFONT, ENETDOWN, EACCES, ELOOP, InfiniteDuration, ETIMEDOUT, >=, EINVAL, value, EBADFD, Future, completed, PDispatcher, ESRCH, EL2NSYNC, EFAULT, low, ESTRPIPE, -=, or, ENOTSOCK, getAsyncTimestamp, await, Hour, EIDRM, removeReader2, secs, getThreadDispatcher, futureContinue, ENOANO, EADV, CallbackFunc, ENFILE, FutureBase, waitFor, high, Microsecond, ENOPKG, ELIBBAD, callSoon, EOWNERDEAD, flags, ERANGE, done, ENONET, completed, callSoon, cancelSoon, EMSGSIZE, EALREADY, EBADMSG, EILSEQ, ENOPROTOOPT, SrcLoc, allFutures, -, complete, FutureState, EBADR, nanos, location, FutureDefect, EDOTDOT, ENOBUFS, EKEYREJECTED, <, Minute, error, ==, one, CancelledError, nanoseconds, EISDIR, EOVERFLOW, FutureSeq, cancelAndWait, micros, all, -, ESRMNT, ENOTEMPTY, EPROTO, TimerCallback, microseconds, error, ENOTRECOVERABLE, wait, callIdle, join, hours, AsyncError, EBADRQC, ENODEV, tryCancel, addTimer, ECHRNG, ENOTDIR, EUNATCH, cancelAndSchedule, failed, nanoseconds, ERESTART, *, ETXTBSY, getTracker, newFutureStr, EMFILE, LocFinishIndex, withTimeout, addTimer, race, EUSERS, ENOTBLK, ENOTTY, EISNAM, ELIBACC, ENAVAIL, init, race, internalCallTick, EDESTADDRREQ, +, cancelSoon, completed, minutes, cancel, FutureFlags, getGlobalDispatcher, ELIBEXEC, stepsAsync, micros, wait, EINPROGRESS, EPFNOSUPPORT, E2BIG, -=, runForever, ENOMEDIUM, secs, value, read, waitFor, EL3HLT, unregisterAndCloseFd, EBADSLT, InternalRaisesFuture, -, <, ENETRESET, fastEpochTime, ENXIO, isZero, EPIPE, allFutures, Day, wait, now, read, asyncSpawn, removeCallback, EAGAIN, raiseOsDefect, trackerCounterKeys, EADDRNOTAVAIL, read, removeCallback, TrackerCounter, async, addCallback, init, async, EREMCHG, finished, addCallback, seconds, noCancel, low, AsyncFD, ECHILD, Raising, init, ECONNABORTED, state, wait, >, callIdle, removeTimer, LocCreateIndex, addReader2, ETIME, ENOLCK, EDEADLK, asyncCheck, Duration, ELNRNG, EDOM, ENOCSI, millis, EBADE, EMEDIUMTYPE, readError, sleepAsync, isInfinite, asyncDiscard, callback=, ENETUNREACH, InternalFutureBase, callIdle, ENOSYS, ELIBSCN, EIO, EROFS, seconds, ELIBMAX, div, init, EL2HLT, EOPNOTSUPP, FutureStr, poll, oneIndex, clearTimer, register2, LocCompleteIndex, days, ENOSTR, EADDRINUSE, one, sleepAsync, ENAMETOOLONG, EMULTIHOP, ESTALE, race, ENODATA, EFBIG, +, minutes, ERFKILL, cancelled, $, toException, join, EDEADLOCK, allFutures, MaxEventsCount, wait, read, raiseAsDefect, ENOSPC, Millisecond, >, setTimer, cancelSoon, unregister2, failed, waitFor, newFutureSeq, addTracker, callback=, orImpl, ECONNREFUSED, high, ENOTNAM, nanos, addWriter2, removeTimer, internalCallTick, EINTR, and, closeHandle, EL3RST, readError, *, newFuture, internalCallTick +
+ +
+
+ +
+ +
+
+
+ + + diff --git a/api/chronos/asyncsync.idx b/api/chronos/asyncsync.idx new file mode 100644 index 00000000..cd1229ef --- /dev/null +++ b/api/chronos/asyncsync.idx @@ -0,0 +1,55 @@ +AsyncLock chronos/asyncsync.html#AsyncLock asyncsync: AsyncLock +AsyncEvent chronos/asyncsync.html#AsyncEvent asyncsync: AsyncEvent +AsyncQueue chronos/asyncsync.html#AsyncQueue asyncsync: AsyncQueue +AsyncQueueEmptyError chronos/asyncsync.html#AsyncQueueEmptyError asyncsync: AsyncQueueEmptyError +AsyncQueueFullError chronos/asyncsync.html#AsyncQueueFullError asyncsync: AsyncQueueFullError +AsyncLockError chronos/asyncsync.html#AsyncLockError asyncsync: AsyncLockError +AsyncEventQueueFullError chronos/asyncsync.html#AsyncEventQueueFullError asyncsync: AsyncEventQueueFullError +EventQueueKey chronos/asyncsync.html#EventQueueKey asyncsync: EventQueueKey +EventQueueReader chronos/asyncsync.html#EventQueueReader asyncsync: EventQueueReader +AsyncEventQueue chronos/asyncsync.html#AsyncEventQueue asyncsync: AsyncEventQueue +newAsyncLock chronos/asyncsync.html#newAsyncLock asyncsync: newAsyncLock(): AsyncLock +acquire chronos/asyncsync.html#acquire,AsyncLock asyncsync: acquire(lock: AsyncLock): InternalRaisesFuture[void, (CancelledError,)] +locked chronos/asyncsync.html#locked,AsyncLock asyncsync: locked(lock: AsyncLock): bool +release chronos/asyncsync.html#release,AsyncLock asyncsync: release(lock: AsyncLock) +newAsyncEvent chronos/asyncsync.html#newAsyncEvent asyncsync: newAsyncEvent(): AsyncEvent +wait chronos/asyncsync.html#wait,AsyncEvent asyncsync: wait(event: AsyncEvent): InternalRaisesFuture[void, (CancelledError,)] +fire chronos/asyncsync.html#fire,AsyncEvent asyncsync: fire(event: AsyncEvent) +clear chronos/asyncsync.html#clear,AsyncEvent asyncsync: clear(event: AsyncEvent) +isSet chronos/asyncsync.html#isSet,AsyncEvent asyncsync: isSet(event: AsyncEvent): bool +newAsyncQueue chronos/asyncsync.html#newAsyncQueue,int asyncsync: newAsyncQueue[T](maxsize: int = 0): AsyncQueue[T] +full chronos/asyncsync.html#full,AsyncQueue[T] asyncsync: full[T](aq: AsyncQueue[T]): bool +empty chronos/asyncsync.html#empty,AsyncQueue[T] asyncsync: empty[T](aq: AsyncQueue[T]): bool +addFirstNoWait chronos/asyncsync.html#addFirstNoWait,AsyncQueue[T],T asyncsync: addFirstNoWait[T](aq: AsyncQueue[T]; item: T) +addLastNoWait chronos/asyncsync.html#addLastNoWait,AsyncQueue[T],T asyncsync: addLastNoWait[T](aq: AsyncQueue[T]; item: T) +popFirstNoWait chronos/asyncsync.html#popFirstNoWait,AsyncQueue[T] asyncsync: popFirstNoWait[T](aq: AsyncQueue[T]): T +popLastNoWait chronos/asyncsync.html#popLastNoWait,AsyncQueue[T] asyncsync: popLastNoWait[T](aq: AsyncQueue[T]): T +addFirst chronos/asyncsync.html#addFirst,AsyncQueue[T],T asyncsync: addFirst[T](aq: AsyncQueue[T]; item: T): InternalRaisesFuture[void,\n (CancelledError,)] +addLast chronos/asyncsync.html#addLast,AsyncQueue[T],T asyncsync: addLast[T](aq: AsyncQueue[T]; item: T): InternalRaisesFuture[void,\n (CancelledError,)] +popFirst chronos/asyncsync.html#popFirst,AsyncQueue[T] asyncsync: popFirst[T](aq: AsyncQueue[T]): InternalRaisesFuture[T, (CancelledError,)] +popLast chronos/asyncsync.html#popLast,AsyncQueue[T] asyncsync: popLast[T](aq: AsyncQueue[T]): InternalRaisesFuture[T, (CancelledError,)] +putNoWait chronos/asyncsync.html#putNoWait,AsyncQueue[T],T asyncsync: putNoWait[T](aq: AsyncQueue[T]; item: T) +getNoWait chronos/asyncsync.html#getNoWait,AsyncQueue[T] asyncsync: getNoWait[T](aq: AsyncQueue[T]): T +put chronos/asyncsync.html#put,AsyncQueue[T],T asyncsync: put[T](aq: AsyncQueue[T]; item: T): InternalRaisesFuture[void, (CancelledError,)] +get chronos/asyncsync.html#get,AsyncQueue[T] asyncsync: get[T](aq: AsyncQueue[T]): InternalRaisesFuture[T, (CancelledError,)] +clear chronos/asyncsync.html#clear,AsyncQueue[T] asyncsync: clear[T](aq: AsyncQueue[T]) +len chronos/asyncsync.html#len,AsyncQueue[T] asyncsync: len[T](aq: AsyncQueue[T]): int +size chronos/asyncsync.html#size,AsyncQueue[T] asyncsync: size[T](aq: AsyncQueue[T]): int +`[]` chronos/asyncsync.html#[],AsyncQueue[T],Natural asyncsync: `[]`[T](aq: AsyncQueue[T]; i: Natural): T +`[]` chronos/asyncsync.html#[],AsyncQueue[T],BackwardsIndex asyncsync: `[]`[T](aq: AsyncQueue[T]; i: BackwardsIndex): T +`[]=` chronos/asyncsync.html#[]=,AsyncQueue[T],Natural,T asyncsync: `[]=`[T](aq: AsyncQueue[T]; i: Natural; item: T) +`[]=` chronos/asyncsync.html#[]=,AsyncQueue[T],BackwardsIndex,T asyncsync: `[]=`[T](aq: AsyncQueue[T]; i: BackwardsIndex; item: T) +items chronos/asyncsync.html#items.i,AsyncQueue[T] asyncsync: items[T](aq: AsyncQueue[T]): T +mitems chronos/asyncsync.html#mitems.i,AsyncQueue[T] asyncsync: mitems[T](aq: AsyncQueue[T]): var T +pairs chronos/asyncsync.html#pairs.i,AsyncQueue[T] asyncsync: pairs[T](aq: AsyncQueue[T]): tuple[key: int, val: T] +contains chronos/asyncsync.html#contains,AsyncQueue[T],T asyncsync: contains[T](aq: AsyncQueue[T]; item: T): bool +`$` chronos/asyncsync.html#$,AsyncQueue[T] asyncsync: `$`[T](aq: AsyncQueue[T]): string +newAsyncEventQueue chronos/asyncsync.html#newAsyncEventQueue,int asyncsync: newAsyncEventQueue[T](limitSize = 0): AsyncEventQueue[T] +len chronos/asyncsync.html#len,AsyncEventQueue asyncsync: len(ab: AsyncEventQueue): int +register chronos/asyncsync.html#register,AsyncEventQueue asyncsync: register(ab: AsyncEventQueue): EventQueueKey +unregister chronos/asyncsync.html#unregister,AsyncEventQueue,EventQueueKey asyncsync: unregister(ab: AsyncEventQueue; key: EventQueueKey) +close chronos/asyncsync.html#close,AsyncEventQueue asyncsync: close(ab: AsyncEventQueue) +closeWait chronos/asyncsync.html#closeWait,AsyncEventQueue asyncsync: closeWait(ab: AsyncEventQueue): InternalRaisesFuture[void, void] +readerOverflow chronos/asyncsync.html#readerOverflow.t,AsyncEventQueue,EventQueueReader asyncsync: readerOverflow(ab: AsyncEventQueue; reader: EventQueueReader): bool +emit chronos/asyncsync.html#emit,AsyncEventQueue[T],T asyncsync: emit[T](ab: AsyncEventQueue[T]; data: T) +waitEvents chronos/asyncsync.html#waitEvents,AsyncEventQueue[T],EventQueueKey,int asyncsync: waitEvents[T](ab: AsyncEventQueue[T]; key: EventQueueKey; eventsCount = -1): InternalRaisesFuture[\n seq[T], (AsyncEventQueueFullError, CancelledError)] diff --git a/api/chronos/bipbuffer.html b/api/chronos/bipbuffer.html new file mode 100644 index 00000000..07b33f3d --- /dev/null +++ b/api/chronos/bipbuffer.html @@ -0,0 +1,328 @@ + + + + + + + + + + + + + + + + + + +chronos/bipbuffer + + + + + + + + +
+
+

chronos/bipbuffer

+
+
+
+ +     Dark Mode +
+ +
+ Search: +
+
+ Group by: + +
+ + +
+   Source +  Edit + +
+
+ +

This module implements Bip Buffer (bi-partite circular buffer) by Simone Cooke.

+

The Bip-Buffer is like a circular buffer, but slightly different. Instead of keeping one head and tail pointer to the data in the buffer, it maintains two revolving regions, allowing for fast data access without having to worry about wrapping at the end of the buffer. Buffer allocations are always maintained as contiguous blocks, allowing the buffer to be used in a highly efficient manner with API calls, and also reducing the amount of copying which needs to be performed to put data into the buffer. Finally, a two-phase allocation system allows the user to pessimistically reserve an area of buffer space, and then trim back the buffer to commit to only the space which was used.

+

https://www.codeproject.com/Articles/3479/The-Bip-Buffer-The-Circular-Buffer-with-a-Twist

+

+
+

Types

+
+
+
BipBuffer = object
+  a, b, r: BipPos
+  data: seq[byte]
+
+
+ + +  Source +  Edit + +
+
+ +
+
+

Procs

+
+
+
func availSpace(bp: BipBuffer): Natural {....raises: [], tags: [].}
+
+ +Returns amount of space available for reserve in buffer bp. +  Source +  Edit + +
+
+
+
proc commit(bp: var BipBuffer; size: Natural) {....raises: [], tags: [].}
+
+ +Updates structure's pointers when new data inserted into buffer. +  Source +  Edit + +
+
+
+
proc consume(bp: var BipBuffer; size: Natural) {....raises: [], tags: [].}
+
+ +The procedure removes/frees size bytes from the buffer bp. +  Source +  Edit + +
+
+
+
proc init(t: typedesc[BipBuffer]; size: int): BipBuffer {....raises: [].}
+
+ +Creates new Bip Buffer with size size. +  Source +  Edit + +
+
+
+
func len(bp: BipBuffer): Natural {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc reserve(bp: var BipBuffer; size: Natural = 0): tuple[data: ptr byte,
+    size: Natural] {....raises: [], tags: [].}
+
+ +

Reserve size bytes in buffer.

+

If size == 0 (default) reserve all available space from buffer.

+

If there is not enough space in buffer for resevation - error will be returned.

+

Returns current reserved range as pointer of type pt and size of type st.

+ +  Source +  Edit + +
+
+ +
+
+

Iterators

+
+
+
iterator items(bp: BipBuffer): byte {....raises: [], tags: [].}
+
+ +Iterates over all the bytes in the buffer. +  Source +  Edit + +
+
+
+
iterator regions(bp: var BipBuffer): tuple[data: ptr byte, size: Natural] {.
+    ...raises: [], tags: [].}
+
+ +Iterates over all the regions (a and b) in the buffer. +  Source +  Edit + +
+
+ +
+ +
+
+ +
+ +
+
+
+ + + diff --git a/api/chronos/bipbuffer.idx b/api/chronos/bipbuffer.idx new file mode 100644 index 00000000..e7786417 --- /dev/null +++ b/api/chronos/bipbuffer.idx @@ -0,0 +1,9 @@ +BipBuffer chronos/bipbuffer.html#BipBuffer bipbuffer: BipBuffer +init chronos/bipbuffer.html#init,typedesc[BipBuffer],int bipbuffer: init(t: typedesc[BipBuffer]; size: int): BipBuffer +availSpace chronos/bipbuffer.html#availSpace,BipBuffer bipbuffer: availSpace(bp: BipBuffer): Natural +len chronos/bipbuffer.html#len,BipBuffer bipbuffer: len(bp: BipBuffer): Natural +reserve chronos/bipbuffer.html#reserve,BipBuffer,Natural bipbuffer: reserve(bp: var BipBuffer; size: Natural = 0): tuple[data: ptr byte,\n size: Natural] +commit chronos/bipbuffer.html#commit,BipBuffer,Natural bipbuffer: commit(bp: var BipBuffer; size: Natural) +consume chronos/bipbuffer.html#consume,BipBuffer,Natural bipbuffer: consume(bp: var BipBuffer; size: Natural) +items chronos/bipbuffer.html#items.i,BipBuffer bipbuffer: items(bp: BipBuffer): byte +regions chronos/bipbuffer.html#regions.i,BipBuffer bipbuffer: regions(bp: var BipBuffer): tuple[data: ptr byte, size: Natural] diff --git a/api/chronos/config.html b/api/chronos/config.html new file mode 100644 index 00000000..89baa782 --- /dev/null +++ b/api/chronos/config.html @@ -0,0 +1,374 @@ + + + + + + + + + + + + + + + + + + +chronos/config + + + + + + + + +
+
+

chronos/config

+
+ +   Source +  Edit + +
+
+ +

Compile-time configuration options for chronos that control the availability of various strictness and debuggability options. In general, debug helpers are enabled when debug is defined while strictness options are introduced in transition periods leading up to a breaking release that starts enforcing them and removes the option.

+

chronosPreviewV4 is a preview flag to enable v4 semantics - in particular, it enables strict exception checking and disables parts of the deprecated API and other changes being prepared for the upcoming release

+

chronosDebug can be defined to enable several debugging helpers that come with a runtime cost - it is recommeneded to not enable these in production code.

+

In this file we also declare feature flags starting with chronosHas... - these constants are declared when a feature exists in a particular release - each flag is declared as an integer starting at 0 during experimental development, 1 when feature complete and higher numbers when significant functionality has been added. If a feature ends up being removed (or changed in a backwards-incompatible way), the feature flag will be removed or renamed also - you can use when declared(chronosHasXxx): when chronosHasXxx >= N: to require a particular version.

+

+
+

Consts

+
+
+
chronosDumpAsync: bool = false
+
+ +Print code generated by {.async.} transformation +  Source +  Edit + +
+
+
+
chronosEventEngine: string = ""
+
+ +OS polling engine type which is going to be used by chronos. +  Source +  Edit + +
+
+
+
chronosEventsCount = 64
+
+ +Number of OS poll events retrieved by syscall (epoll, kqueue, poll). +  Source +  Edit + +
+
+
+
chronosFutureId: bool = false
+
+ +Generate a unique id for every future - when disabled, the address of the future will be used instead +  Source +  Edit + +
+
+
+
chronosFutureTracking: bool = false
+
+ +Keep track of all pending futures and allow iterating over them - useful for detecting hung tasks +  Source +  Edit + +
+
+
+
chronosHandleException: bool = false
+
+ +

Remap Exception to AsyncExceptionError for all async functions.

+

This modes provides backwards compatibility when using functions with inaccurate {.raises.} effects such as unannotated forward declarations, methods and proc types - it is recommened to annotate such code explicitly as the Exception handling mode may introduce surprising behavior in exception handlers, should Exception actually be raised.

+

The setting provides the default for the per-function-based handleException parameter which has precedence over this global setting.

+

Exception handling may be removed in future chronos versions.

+ +  Source +  Edit + +
+
+
+
chronosHasRaises = 0
+
+ +raises effect support via async: (raises: []) +  Source +  Edit + +
+
+
+
chronosInitialSize = 64
+
+ +Initial size of Selector[T]'s array of file descriptors. +  Source +  Edit + +
+
+
+
chronosProcShell: string = "/bin/sh"
+
+ +

Default shell binary path.

+

The shell is used as command for command line when process started using AsyncProcessOption.EvalCommand and API calls such as execCommand(command) and execCommandEx(command).

+ +  Source +  Edit + +
+
+
+
chronosStackTrace: bool = false
+
+ +Include stack traces in futures for creation and completion points +  Source +  Edit + +
+
+
+
chronosStreamDefaultBufferSize = 16384
+
+ +Default size of chronos async stream internal buffer. +  Source +  Edit + +
+
+
+
chronosStrictFutureAccess: bool = false
+
+ + +  Source +  Edit + +
+
+
+
chronosTLSSessionCacheBufferSize = 4096
+
+ +Default size of chronos TLS Session cache's internal buffer. +  Source +  Edit + +
+
+
+
chronosTransportDefaultBufferSize = 16384
+
+ +Default size of chronos transport internal buffer. +  Source +  Edit + +
+
+ +
+
+

Templates

+
+
+
template chronosMoveSink(val: auto): untyped
+
+ + +  Source +  Edit + +
+
+ +
+ +
+
+ +
+ +
+
+
+ + + diff --git a/api/chronos/config.idx b/api/chronos/config.idx new file mode 100644 index 00000000..c96f7c4a --- /dev/null +++ b/api/chronos/config.idx @@ -0,0 +1,15 @@ +chronosHandleException chronos/config.html#chronosHandleException config: chronosHandleException +chronosStrictFutureAccess chronos/config.html#chronosStrictFutureAccess config: chronosStrictFutureAccess +chronosStackTrace chronos/config.html#chronosStackTrace config: chronosStackTrace +chronosFutureId chronos/config.html#chronosFutureId config: chronosFutureId +chronosFutureTracking chronos/config.html#chronosFutureTracking config: chronosFutureTracking +chronosDumpAsync chronos/config.html#chronosDumpAsync config: chronosDumpAsync +chronosProcShell chronos/config.html#chronosProcShell config: chronosProcShell +chronosEventsCount chronos/config.html#chronosEventsCount config: chronosEventsCount +chronosInitialSize chronos/config.html#chronosInitialSize config: chronosInitialSize +chronosEventEngine chronos/config.html#chronosEventEngine config: chronosEventEngine +chronosHasRaises chronos/config.html#chronosHasRaises config: chronosHasRaises +chronosTransportDefaultBufferSize chronos/config.html#chronosTransportDefaultBufferSize config: chronosTransportDefaultBufferSize +chronosStreamDefaultBufferSize chronos/config.html#chronosStreamDefaultBufferSize config: chronosStreamDefaultBufferSize +chronosTLSSessionCacheBufferSize chronos/config.html#chronosTLSSessionCacheBufferSize config: chronosTLSSessionCacheBufferSize +chronosMoveSink chronos/config.html#chronosMoveSink.t,auto config: chronosMoveSink(val: auto): untyped diff --git a/api/chronos/debugutils.html b/api/chronos/debugutils.html new file mode 100644 index 00000000..a009958d --- /dev/null +++ b/api/chronos/debugutils.html @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + + + +chronos/debugutils + + + + + + + + +
+
+

chronos/debugutils

+
+
+
+ +     Dark Mode +
+ +
+ Search: +
+
+ Group by: + +
+ + +
+   Source +  Edit + +
+
+ +

+ +
+

Consts

+
+
+
AllFutureStates = {FutureState.Pending, FutureState.Cancelled,
+                   FutureState.Completed, FutureState.Failed}
+
+ + +  Source +  Edit + +
+
+
+
OnlyCompleted = {FutureState.Completed}
+
+ + +  Source +  Edit + +
+
+
+
OnlyPending = {FutureState.Pending}
+
+ + +  Source +  Edit + +
+
+
+
WithoutCompleted = {FutureState.Pending, FutureState.Cancelled,
+                    FutureState.Failed}
+
+ + +  Source +  Edit + +
+
+ +
+
+

Procs

+
+
+
proc dumpPendingFutures(filter = AllFutureStates): string {....raises: [], tags: [].}
+
+ +

Dump all pending Future[T] objects.

+

This list will contain:

+
  1. Future[T] objects with FutureState.Pending state (this Futures are not yet finished).
  2. +
  3. Future[T] objects with FutureState.Finished/Cancelled/Failed state which callbacks are scheduled, but not yet fully processed.
  4. +
+ +  Source +  Edit + +
+
+
+
proc pendingFuturesCount(filter: set[FutureState]): uint {....raises: [], tags: [].}
+
+ +

Returns number of pending Future[T] objects which satisfy the filter condition.

+

If filter is equal to AllFutureStates Operation's complexity is O(1), otherwise operation's complexity is O(n).

+ +  Source +  Edit + +
+
+ +
+
+

Exports

+
+setThreadDispatcher, closeSocket, ENOSR, EHOSTUNREACH, EHOSTDOWN, ECONNRESET, EDQUOT, fail, ECANCELED, EMLINK, FuturePendingError, milliseconds, <=, +=, $, asyncTimer, internalRaiseIfError, getSrcLocation, FutureError, fromNow, weeks, ESPIPE, withTimeout, LocationKind, id, <=, FutureCompletedError, ENOEXEC, ESHUTDOWN, fail, EREMOTEIO, toString, EXFULL, waitFor, complete, ==, oneValue, internalInitFutureBase, EPROTONOSUPPORT, Nanosecond, epochNanoSeconds, cancelAndWait, addTimer, Moment, ECOMM, EPROTOTYPE, AsyncExceptionError, milliseconds, getTrackerCounter, ENOENT, millis, removeTimer, FutureFlag, ENOTCONN, EBUSY, init, ENOTUNIQ, days, +=, await, or, ZeroDuration, EKEYREVOKED, AsyncTimeoutError, EUCLEAN, Second, EEXIST, ENOLINK, newInternalRaisesFuture, idleAsync, ==, internalRaiseIfError, SomeIntegerI64, ENOMEM, ENOKEY, +, removeWriter2, ENOMSG, [], trackCounter, EKEYEXPIRED, Week, isCounterLeaked, awaitne, EAFNOSUPPORT, EWOULDBLOCK, EREMOTE, Finished, untrackCounter, AsyncCallback, EHWPOISON, epochSeconds, newDispatcher, EPERM, microseconds, trackerCounters, >=, weeks, Finished, cancelCallback=, ETOOMANYREFS, $, EISCONN, callSoon, ESOCKTNOSUPPORT, setGlobalDispatcher, EXDEV, EBADF, cancelSoon, allFinished, TrackerBase, hours, InternalAsyncCallback, EBFONT, ENETDOWN, EACCES, ELOOP, InfiniteDuration, ETIMEDOUT, >=, EINVAL, value, EBADFD, Future, completed, PDispatcher, ESRCH, EL2NSYNC, EFAULT, low, ESTRPIPE, -=, or, ENOTSOCK, getAsyncTimestamp, await, Hour, EIDRM, removeReader2, secs, getThreadDispatcher, futureContinue, ENOANO, EADV, CallbackFunc, ENFILE, FutureBase, waitFor, high, Microsecond, ENOPKG, ELIBBAD, callSoon, EOWNERDEAD, flags, ERANGE, done, ENONET, completed, callSoon, cancelSoon, EMSGSIZE, EALREADY, EBADMSG, EILSEQ, ENOPROTOOPT, SrcLoc, allFutures, -, complete, FutureState, EBADR, nanos, location, FutureDefect, EDOTDOT, ENOBUFS, EKEYREJECTED, <, Minute, error, ==, one, CancelledError, nanoseconds, EISDIR, EOVERFLOW, FutureSeq, cancelAndWait, micros, all, -, ESRMNT, ENOTEMPTY, EPROTO, TimerCallback, microseconds, error, ENOTRECOVERABLE, wait, callIdle, join, hours, AsyncError, EBADRQC, ENODEV, tryCancel, addTimer, ECHRNG, ENOTDIR, EUNATCH, cancelAndSchedule, failed, nanoseconds, ERESTART, *, ETXTBSY, getTracker, newFutureStr, EMFILE, LocFinishIndex, withTimeout, addTimer, race, EUSERS, ENOTBLK, ENOTTY, EISNAM, ELIBACC, ENAVAIL, init, race, internalCallTick, EDESTADDRREQ, +, cancelSoon, completed, minutes, cancel, FutureFlags, getGlobalDispatcher, ELIBEXEC, stepsAsync, micros, wait, EINPROGRESS, EPFNOSUPPORT, E2BIG, -=, runForever, ENOMEDIUM, secs, value, read, waitFor, EL3HLT, unregisterAndCloseFd, EBADSLT, InternalRaisesFuture, -, <, ENETRESET, fastEpochTime, ENXIO, isZero, EPIPE, allFutures, Day, wait, now, read, asyncSpawn, removeCallback, EAGAIN, raiseOsDefect, trackerCounterKeys, EADDRNOTAVAIL, read, removeCallback, TrackerCounter, async, addCallback, init, async, EREMCHG, finished, addCallback, seconds, noCancel, low, AsyncFD, ECHILD, Raising, init, ECONNABORTED, state, wait, >, callIdle, removeTimer, LocCreateIndex, addReader2, ETIME, ENOLCK, EDEADLK, asyncCheck, Duration, ELNRNG, EDOM, ENOCSI, millis, EBADE, EMEDIUMTYPE, readError, sleepAsync, isInfinite, asyncDiscard, callback=, ENETUNREACH, InternalFutureBase, callIdle, ENOSYS, ELIBSCN, EIO, EROFS, seconds, ELIBMAX, div, init, EL2HLT, EOPNOTSUPP, FutureStr, poll, oneIndex, clearTimer, register2, LocCompleteIndex, days, ENOSTR, EADDRINUSE, one, sleepAsync, ENAMETOOLONG, EMULTIHOP, ESTALE, race, ENODATA, EFBIG, +, minutes, ERFKILL, cancelled, $, toException, join, EDEADLOCK, allFutures, MaxEventsCount, wait, read, raiseAsDefect, ENOSPC, Millisecond, >, setTimer, cancelSoon, unregister2, failed, waitFor, newFutureSeq, addTracker, callback=, orImpl, ECONNREFUSED, high, ENOTNAM, nanos, addWriter2, removeTimer, internalCallTick, EINTR, and, closeHandle, EL3RST, readError, *, newFuture, internalCallTick +
+ +
+
+ +
+ +
+
+
+ + + diff --git a/api/chronos/debugutils.idx b/api/chronos/debugutils.idx new file mode 100644 index 00000000..32c8fbf3 --- /dev/null +++ b/api/chronos/debugutils.idx @@ -0,0 +1,6 @@ +AllFutureStates chronos/debugutils.html#AllFutureStates debugutils: AllFutureStates +WithoutCompleted chronos/debugutils.html#WithoutCompleted debugutils: WithoutCompleted +OnlyPending chronos/debugutils.html#OnlyPending debugutils: OnlyPending +OnlyCompleted chronos/debugutils.html#OnlyCompleted debugutils: OnlyCompleted +dumpPendingFutures chronos/debugutils.html#dumpPendingFutures debugutils: dumpPendingFutures(filter = AllFutureStates): string +pendingFuturesCount chronos/debugutils.html#pendingFuturesCount,set[FutureState] debugutils: pendingFuturesCount(filter: set[FutureState]): uint diff --git a/api/chronos/futures.html b/api/chronos/futures.html new file mode 100644 index 00000000..99406f8e --- /dev/null +++ b/api/chronos/futures.html @@ -0,0 +1,743 @@ + + + + + + + + + + + + + + + + + + +chronos/futures + + + + + + + + +
+
+

chronos/futures

+
+
+
+ +     Dark Mode +
+ +
+ Search: +
+
+ Group by: + +
+ + +
+   Source +  Edit + +
+
+ +

+ +
+

Types

+
+
+
CallbackFunc = proc (arg: pointer) {....gcsafe, raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
CancelledError = object of FutureError
+  
+
+ +Exception raised when accessing the value of a cancelled future +  Source +  Edit + +
+
+
+
Future[T] = ref object of FutureBase
+  when T isnot void:
+      internalValue*: T      ## Stored value
+    
+  
+
+ +Typed future. +  Source +  Edit + +
+
+
+
FutureBase = ref object of InternalFutureBase
+  
+
+ +Untyped Future +  Source +  Edit + +
+
+
+
FutureDefect = object of Defect
+  cause*: FutureBase
+
+
+ + +  Source +  Edit + +
+
+
+
FutureError = object of CatchableError
+  future*: FutureBase
+
+
+ + +  Source +  Edit + +
+
+
+
FutureFlag {.pure.} = enum
+  OwnCancelSchedule ## When OwnCancelSchedule is set, the owner of the future is responsible
+                    ## for implementing cancellation in one of 3 ways:
+                    ## 
+                    ## * ensure that cancellation requests never reach the future by means of
+                    ##   not exposing it to user code, `await` and `tryCancel`
+                    ## * set `cancelCallback` to `nil` to stop cancellation propagation - this
+                    ##   is appropriate when it is expected that the future will be completed
+                    ##   in a regular way "soon"
+                    ## * set `cancelCallback` to a handler that implements cancellation in an
+                    ##   operation-specific way
+                    ## 
+                    ## If `cancelCallback` is not set and the future gets cancelled, a
+                    ## `Defect` will be raised.
+
+ + +  Source +  Edit + +
+
+
+
FutureFlags = set[FutureFlag]
+
+ + +  Source +  Edit + +
+
+
+
FutureState {.pure.} = enum
+  Pending, Completed, Cancelled, Failed
+
+ + +  Source +  Edit + +
+
+
+
InternalAsyncCallback = object
+  function*: CallbackFunc
+  udata*: pointer
+
+
+ + +  Source +  Edit + +
+
+
+
InternalFutureBase = object of RootObj
+  internalLocation*: array[LocationKind, ptr SrcLoc]
+  internalCallbacks*: seq[InternalAsyncCallback]
+  internalCancelcb*: CallbackFunc
+  internalChild*: FutureBase
+  internalState*: FutureState
+  internalFlags*: FutureFlags
+  internalError*: ref CatchableError ## Stored exception
+  internalClosure*: iterator (f: FutureBase): FutureBase {....raises: [], gcsafe.}
+  when chronosFutureId:
+      internalId*: uint
+
+  when chronosStackTrace:
+      internalErrorStackTrace*: StackTrace
+      internalStackTrace*: StackTrace ## For debugging purposes only.
+    
+  when chronosFutureTracking:
+      internalNext*: FutureBase
+      internalPrev*: FutureBase
+
+  
+
+ + +  Source +  Edit + +
+
+
+
LocationKind {.pure.} = enum
+  Create, Finish
+
+ + +  Source +  Edit + +
+
+ +
+
+

Procs

+
+
+
func cancelled(future: FutureBase): bool {.inline, ...raises: [], tags: [].}
+
+ +Determines whether future has cancelled. +  Source +  Edit + +
+
+
+
func completed(future: FutureBase): bool {.inline, ...raises: [], tags: [].}
+
+ +Determines whether future finished with a value. +  Source +  Edit + +
+
+
+
func error(future: FutureBase): ref CatchableError {....raises: [], tags: [].}
+
+ +

Return the error of future, or nil if future did not fail.

+

See readError for a version that raises a catchable error when the future has not failed.

+ +  Source +  Edit + +
+
+
+
func failed(future: FutureBase): bool {.inline, ...raises: [], tags: [].}
+
+ +Determines whether future finished with an error. +  Source +  Edit + +
+
+
+
func finished(future: FutureBase): bool {.inline, ...raises: [], tags: [].}
+
+ +Determines whether future has finished, i.e. future state changed from state Pending to one of the states (Finished, Cancelled, Failed). +  Source +  Edit + +
+
+
+
func flags(future: FutureBase): FutureFlags {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc internalInitFutureBase(fut: FutureBase; loc: ptr SrcLoc;
+                            state: FutureState; flags: FutureFlags) {.
+    ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
func location(future: FutureBase): array[LocationKind, ptr SrcLoc] {....raises: [],
+    tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
func state(future: FutureBase): FutureState {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
func value(future: Future[void]) {....raises: [], tags: [].}
+
+ +

Return the value in a completed future - raises Defect when fut.completed() is false.

+

See read for a version that raises a catchable error when future has not completed.

+ +  Source +  Edit + +
+
+
+
func value[T: not void](future: Future[T]): lent T {....raises: [].}
+
+ +

Return the value in a completed future - raises Defect when fut.completed() is false.

+

See read for a version that raises a catchable error when future has not completed.

+ +  Source +  Edit + +
+
+ +
+
+

Templates

+
+
+
template completed(F: type Future; fromProc: static[string] = ""): Future[void]
+
+ +Create a new completed future +  Source +  Edit + +
+
+
+
template completed[T: not void](F: type Future; valueParam: T;
+                                fromProc: static[string] = ""): Future[T]
+
+ +Create a new completed future +  Source +  Edit + +
+
+
+
template failed[T](F: type Future[T]; errorParam: ref CatchableError;
+                   fromProc: static[string] = ""): Future[T]
+
+ +Create a new failed future +  Source +  Edit + +
+
+
+
template id(fut: FutureBase): uint
+
+ + +  Source +  Edit + +
+
+
+
template init[T](F: type Future[T]; fromProc: static[string] = ""): Future[T]
+
+ +

Creates a new pending future.

+

Specifying fromProc, which is a string specifying the name of the proc that this future belongs to, is a good habit as it helps with debugging.

+ +  Source +  Edit + +
+
+
+
template init[T](F: type Future[T]; fromProc: static[string] = "";
+                 flags: static[FutureFlags]): Future[T]
+
+ +

Creates a new pending future.

+

Specifying fromProc, which is a string specifying the name of the proc that this future belongs to, is a good habit as it helps with debugging.

+ +  Source +  Edit + +
+
+ +
+ + +
+
+ +
+ +
+
+
+ + + diff --git a/api/chronos/futures.idx b/api/chronos/futures.idx new file mode 100644 index 00000000..84768d3e --- /dev/null +++ b/api/chronos/futures.idx @@ -0,0 +1,29 @@ +LocationKind chronos/futures.html#LocationKind futures: LocationKind +CallbackFunc chronos/futures.html#CallbackFunc futures: CallbackFunc +InternalAsyncCallback chronos/futures.html#InternalAsyncCallback futures: InternalAsyncCallback +FutureState chronos/futures.html#FutureState futures: FutureState +FutureFlag chronos/futures.html#FutureFlag futures: FutureFlag +FutureFlags chronos/futures.html#FutureFlags futures: FutureFlags +InternalFutureBase chronos/futures.html#InternalFutureBase futures: InternalFutureBase +FutureBase chronos/futures.html#FutureBase futures: FutureBase +Future chronos/futures.html#Future futures: Future +FutureDefect chronos/futures.html#FutureDefect futures: FutureDefect +FutureError chronos/futures.html#FutureError futures: FutureError +CancelledError chronos/futures.html#CancelledError futures: CancelledError +id chronos/futures.html#id.t,FutureBase futures: id(fut: FutureBase): uint +internalInitFutureBase chronos/futures.html#internalInitFutureBase,FutureBase,ptr.SrcLoc,FutureState,FutureFlags futures: internalInitFutureBase(fut: FutureBase; loc: ptr SrcLoc; state: FutureState;\n flags: FutureFlags) +init chronos/futures.html#init.t,typeFuture[T],static[string] futures: init[T](F: type Future[T]; fromProc: static[string] = ""): Future[T] +init chronos/futures.html#init.t,typeFuture[T],static[string],static[FutureFlags] futures: init[T](F: type Future[T]; fromProc: static[string] = "";\n flags: static[FutureFlags]): Future[T] +completed chronos/futures.html#completed.t,typeFuture,static[string] futures: completed(F: type Future; fromProc: static[string] = ""): Future[void] +completed chronos/futures.html#completed.t,typeFuture,T,static[string] futures: completed[T: not void](F: type Future; valueParam: T;\n fromProc: static[string] = ""): Future[T] +failed chronos/futures.html#failed.t,typeFuture[T],ref.CatchableError,static[string] futures: failed[T](F: type Future[T]; errorParam: ref CatchableError;\n fromProc: static[string] = ""): Future[T] +state chronos/futures.html#state,FutureBase futures: state(future: FutureBase): FutureState +flags chronos/futures.html#flags,FutureBase futures: flags(future: FutureBase): FutureFlags +finished chronos/futures.html#finished,FutureBase futures: finished(future: FutureBase): bool +cancelled chronos/futures.html#cancelled,FutureBase futures: cancelled(future: FutureBase): bool +failed chronos/futures.html#failed,FutureBase futures: failed(future: FutureBase): bool +completed chronos/futures.html#completed,FutureBase futures: completed(future: FutureBase): bool +location chronos/futures.html#location,FutureBase futures: location(future: FutureBase): array[LocationKind, ptr SrcLoc] +value chronos/futures.html#value,Future[T: not void] futures: value[T: not void](future: Future[T]): lent T +value chronos/futures.html#value,Future[void] futures: value(future: Future[void]) +error chronos/futures.html#error,FutureBase futures: error(future: FutureBase): ref CatchableError diff --git a/api/chronos/handles.html b/api/chronos/handles.html new file mode 100644 index 00000000..651a2e22 --- /dev/null +++ b/api/chronos/handles.html @@ -0,0 +1,648 @@ + + + + + + + + + + + + + + + + + + +chronos/handles + + + + + + + + +
+
+

chronos/handles

+
+
+
+ +     Dark Mode +
+ +
+ Search: +
+
+ Group by: + +
+ + +
+   Source +  Edit + +
+
+ +

+ +
+

Consts

+
+
+
asyncInvalidPipe = -1'i32
+
+ + +  Source +  Edit + +
+
+
+
asyncInvalidSocket = -1'i32
+
+ + +  Source +  Edit + +
+
+ +
+
+

Procs

+
+
+
proc createAsyncPipe(): tuple[read: AsyncFD, write: AsyncFD] {....raises: [],
+    tags: [].}
+
+ +Create new asynchronouse pipe. Returns tuple of read pipe handle and write pipe handleasyncInvalidPipe on error. +  Source +  Edit + +
+
+
+
proc createAsyncSocket(domain: Domain; sockType: SockType; protocol: Protocol;
+                       inherit = true): AsyncFD {....raises: [], tags: [].}
+
+ +Creates new asynchronous socket. Returns asyncInvalidSocket on error. +  Source +  Edit + +
+
+
+
proc createAsyncSocket2(domain: Domain; sockType: SockType; protocol: Protocol;
+                        inherit = true): Result[AsyncFD, OSErrorCode] {.
+    ...raises: [], tags: [].}
+
+ +Creates new asynchronous socket. +  Source +  Edit + +
+
+
+
proc getDualstack(fd: AsyncFD): Result[bool, OSErrorCode] {....raises: [], tags: [].}
+
+ +Returns true if IPV6_V6ONLY socket option set to false. +  Source +  Edit + +
+
+
+
proc getInheritable(fd: AsyncFD): Result[bool, OSErrorCode] {....raises: [],
+    tags: [].}
+
+ +Returns true if fd is inheritable handle. +  Source +  Edit + +
+
+
+
proc getMaxOpenFiles(): int {....raises: [OSError], raises: [], tags: [].}
+
+ +

Returns maximum file descriptor number that can be opened by this process.

+

Note: On Windows its impossible to obtain such number, so getMaxOpenFiles() will return constant value of 16384. You can get more information on this link https://docs.microsoft.com/en-us/archive/blogs/markrussinovich/pushing-the-limits-of-windows-handles

+ +  Source +  Edit + +
+
+
+
proc getMaxOpenFiles2(): Result[int, OSErrorCode] {....raises: [], tags: [].}
+
+ +

Returns maximum file descriptor number that can be opened by this process.

+

Note: On Windows its impossible to obtain such number, so getMaxOpenFiles() will return constant value of 16384. You can get more information on this link https://docs.microsoft.com/en-us/archive/blogs/markrussinovich/pushing-the-limits-of-windows-handles

+ +  Source +  Edit + +
+
+
+
proc getSocketError(socket: AsyncFD; err: var int): bool {.
+    ...deprecated: "Please use getSocketError() instead", raises: [], tags: [].}
+
+
+ Deprecated: Please use getSocketError() instead +
+ +Recover error code associated with socket handle socket. +  Source +  Edit + +
+
+
+
proc getSocketError2(socket: AsyncFD): Result[cint, OSErrorCode] {....raises: [],
+    tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc getSockOpt(socket: AsyncFD; level, optname: int; value: var int): bool {.
+    ...deprecated: "Please use getSockOpt2() instead", raises: [], tags: [].}
+
+
+ Deprecated: Please use getSockOpt2() instead +
+ +getsockopt() for integer options. Returns true on success, false on error. +  Source +  Edit + +
+
+
+
proc getSockOpt(socket: AsyncFD; level, optname: int; value: var pointer;
+                valuelen: var int): bool {.
+    ...deprecated: "Please use getSockOpt2() instead", raises: [], tags: [].}
+
+
+ Deprecated: Please use getSockOpt2() instead +
+ +getsockopt() for custom options (pointer and length). Returns true on success, false on error. +  Source +  Edit + +
+
+
+
proc getSockOpt2(socket: AsyncFD; level, optname: int): Result[cint, OSErrorCode] {.
+    ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc getSockOpt2(socket: AsyncFD; level, optname: int; T: type): Result[T,
+    OSErrorCode] {....raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc isAvailable(domain: Domain): bool {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc setDualstack(fd: AsyncFD; value: bool): Result[void, OSErrorCode] {.
+    ...raises: [], tags: [].}
+
+ +Sets IPV6_V6ONLY socket option value to false if value == true and to true if value == false. +  Source +  Edit + +
+
+
+
proc setMaxOpenFiles(count: int) {....raises: [OSError], raises: [], tags: [].}
+
+ +

Set maximum file descriptor number that can be opened by this process.

+

Note: On Windows its impossible to set this value, so it just a nop call.

+ +  Source +  Edit + +
+
+
+
proc setMaxOpenFiles2(count: int): Result[void, OSErrorCode] {....raises: [],
+    tags: [].}
+
+ +

Set maximum file descriptor number that can be opened by this process.

+

Note: On Windows its impossible to set this value, so it just a nop call.

+ +  Source +  Edit + +
+
+
+
proc setSocketBlocking(s: SocketHandle; blocking: bool): bool {.
+    ...deprecated: "Please use setDescriptorBlocking() instead", raises: [],
+    tags: [].}
+
+
+ Deprecated: Please use setDescriptorBlocking() instead +
+ +Sets blocking mode on socket. +  Source +  Edit + +
+
+
+
proc setSockOpt(socket: AsyncFD; level, optname, optval: int): bool {.
+    ...deprecated: "Please use setSockOpt2() instead", raises: [], tags: [].}
+
+
+ Deprecated: Please use setSockOpt2() instead +
+ +setsockopt() for integer options. Returns true on success, false on error. +  Source +  Edit + +
+
+
+
proc setSockOpt(socket: AsyncFD; level, optname: int; value: pointer;
+                valuelen: int): bool {....deprecated: "Please use setSockOpt2() instead",
+                                       raises: [], tags: [].}
+
+
+ Deprecated: Please use setSockOpt2() instead +
+ +setsockopt() for custom options (pointer and length). Returns true on success, false on error. +  Source +  Edit + +
+
+
+
proc setSockOpt2(socket: AsyncFD; level, optname, optval: int): Result[void,
+    OSErrorCode] {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc setSockOpt2(socket: AsyncFD; level, optname: int; value: pointer;
+                 valuelen: int): Result[void, OSErrorCode] {....raises: [],
+    tags: [].}
+
+ +setsockopt() for custom options (pointer and length). Returns true on success, false on error. +  Source +  Edit + +
+
+
+
proc wrapAsyncSocket(sock: cint | SocketHandle): AsyncFD {.
+    ...raises: [CatchableError], raises: [].}
+
+ +Wraps socket to asynchronous socket handle. Return asyncInvalidSocket on error. +  Source +  Edit + +
+
+
+
proc wrapAsyncSocket2(sock: cint | SocketHandle): Result[AsyncFD, OSErrorCode] {.
+    ...raises: [].}
+
+ +Wraps socket to asynchronous socket handle. +  Source +  Edit + +
+
+ +
+ +
+
+ +
+ +
+
+
+ + + diff --git a/api/chronos/handles.idx b/api/chronos/handles.idx new file mode 100644 index 00000000..b292e9f5 --- /dev/null +++ b/api/chronos/handles.idx @@ -0,0 +1,26 @@ +asyncInvalidSocket chronos/handles.html#asyncInvalidSocket handles: asyncInvalidSocket +asyncInvalidPipe chronos/handles.html#asyncInvalidPipe handles: asyncInvalidPipe +setSocketBlocking chronos/handles.html#setSocketBlocking,SocketHandle,bool handles: setSocketBlocking(s: SocketHandle; blocking: bool): bool +setSockOpt2 chronos/handles.html#setSockOpt2,AsyncFD,int,int,int handles: setSockOpt2(socket: AsyncFD; level, optname, optval: int): Result[void,\n OSErrorCode] +setSockOpt2 chronos/handles.html#setSockOpt2,AsyncFD,int,int,pointer,int handles: setSockOpt2(socket: AsyncFD; level, optname: int; value: pointer; valuelen: int): Result[\n void, OSErrorCode] +setSockOpt chronos/handles.html#setSockOpt,AsyncFD,int,int,int handles: setSockOpt(socket: AsyncFD; level, optname, optval: int): bool +setSockOpt chronos/handles.html#setSockOpt,AsyncFD,int,int,pointer,int handles: setSockOpt(socket: AsyncFD; level, optname: int; value: pointer; valuelen: int): bool +getSockOpt2 chronos/handles.html#getSockOpt2,AsyncFD,int,int handles: getSockOpt2(socket: AsyncFD; level, optname: int): Result[cint, OSErrorCode] +getSockOpt2 chronos/handles.html#getSockOpt2,AsyncFD,int,int,type handles: getSockOpt2(socket: AsyncFD; level, optname: int; T: type): Result[T,\n OSErrorCode] +getSockOpt chronos/handles.html#getSockOpt,AsyncFD,int,int,int handles: getSockOpt(socket: AsyncFD; level, optname: int; value: var int): bool +getSockOpt chronos/handles.html#getSockOpt,AsyncFD,int,int,pointer,int handles: getSockOpt(socket: AsyncFD; level, optname: int; value: var pointer;\n valuelen: var int): bool +getSocketError chronos/handles.html#getSocketError,AsyncFD,int handles: getSocketError(socket: AsyncFD; err: var int): bool +getSocketError2 chronos/handles.html#getSocketError2,AsyncFD handles: getSocketError2(socket: AsyncFD): Result[cint, OSErrorCode] +isAvailable chronos/handles.html#isAvailable,Domain handles: isAvailable(domain: Domain): bool +createAsyncSocket2 chronos/handles.html#createAsyncSocket2,Domain,SockType,Protocol handles: createAsyncSocket2(domain: Domain; sockType: SockType; protocol: Protocol;\n inherit = true): Result[AsyncFD, OSErrorCode] +wrapAsyncSocket2 chronos/handles.html#wrapAsyncSocket2 handles: wrapAsyncSocket2(sock: cint | SocketHandle): Result[AsyncFD, OSErrorCode] +createAsyncSocket chronos/handles.html#createAsyncSocket,Domain,SockType,Protocol handles: createAsyncSocket(domain: Domain; sockType: SockType; protocol: Protocol;\n inherit = true): AsyncFD +wrapAsyncSocket chronos/handles.html#wrapAsyncSocket handles: wrapAsyncSocket(sock: cint | SocketHandle): AsyncFD +getMaxOpenFiles2 chronos/handles.html#getMaxOpenFiles2 handles: getMaxOpenFiles2(): Result[int, OSErrorCode] +setMaxOpenFiles2 chronos/handles.html#setMaxOpenFiles2,int handles: setMaxOpenFiles2(count: int): Result[void, OSErrorCode] +getMaxOpenFiles chronos/handles.html#getMaxOpenFiles handles: getMaxOpenFiles(): int +setMaxOpenFiles chronos/handles.html#setMaxOpenFiles,int handles: setMaxOpenFiles(count: int) +getInheritable chronos/handles.html#getInheritable,AsyncFD handles: getInheritable(fd: AsyncFD): Result[bool, OSErrorCode] +createAsyncPipe chronos/handles.html#createAsyncPipe handles: createAsyncPipe(): tuple[read: AsyncFD, write: AsyncFD] +getDualstack chronos/handles.html#getDualstack,AsyncFD handles: getDualstack(fd: AsyncFD): Result[bool, OSErrorCode] +setDualstack chronos/handles.html#setDualstack,AsyncFD,bool handles: setDualstack(fd: AsyncFD; value: bool): Result[void, OSErrorCode] diff --git a/api/chronos/internal/asyncengine.html b/api/chronos/internal/asyncengine.html new file mode 100644 index 00000000..dcae44fe --- /dev/null +++ b/api/chronos/internal/asyncengine.html @@ -0,0 +1,1132 @@ + + + + + + + + + + + + + + + + + + +chronos/internal/asyncengine + + + + + + + + +
+
+

chronos/internal/asyncengine

+
+
+
+ +     Dark Mode +
+ +
+ Search: +
+
+ Group by: + +
+ + +
+   Source +  Edit + +
+
+ +

This module implements the core asynchronous engine / dispatcher.

+

For more information, see the Concepts chapter of the guide.

+

+ +
+

Types

+
+ +
+
AsyncFD = distinct cint
+
+ + +  Source +  Edit + +
+
+
+
PDispatcher = ref object of PDispatcherBase
+
+ + +  Source +  Edit + +
+
+
+
TimerCallback = ref object
+  finishAt*: Moment
+  function*: AsyncCallback
+
+
+ + +  Source +  Edit + +
+
+
+
TrackerBase = ref object of RootRef
+  id*: string
+  dump*: proc (): string {....gcsafe, raises: [].}
+  isLeaked*: proc (): bool {....gcsafe, raises: [].}
+
+
+ + +  Source +  Edit + +
+
+
+
TrackerCounter = object
+  opened*: uint64
+  closed*: uint64
+
+
+ + +  Source +  Edit + +
+
+ +
+
+

Consts

+
+
+
MaxEventsCount = 64
+
+ + +  Source +  Edit + +
+
+ +
+
+

Procs

+
+
+
proc `==`(x: AsyncFD; y: AsyncFD): bool {.borrow, ...gcsafe, raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc addReader2(fd: AsyncFD; cb: CallbackFunc; udata: pointer = nil): Result[
+    void, OSErrorCode] {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc addTimer(at: int64; cb: CallbackFunc; udata: pointer = nil) {.inline,
+    ...deprecated: "Use addTimer(Duration, cb, udata)", raises: [],
+    tags: [RootEffect].}
+
+
+ Deprecated: Use addTimer(Duration, cb, udata) +
+ + +  Source +  Edit + +
+
+
+
proc addTimer(at: Moment; cb: CallbackFunc; udata: pointer = nil) {.inline,
+    ...deprecated: "Use setTimer/clearTimer instead", raises: [],
+    tags: [RootEffect].}
+
+
+ Deprecated: Use setTimer/clearTimer instead +
+ +Arrange for the callback cb to be called at the given absolute timestamp at. You can also pass udata to callback. +  Source +  Edit + +
+
+
+
proc addTimer(at: uint64; cb: CallbackFunc; udata: pointer = nil) {.inline,
+    ...deprecated: "Use addTimer(Duration, cb, udata)", raises: [],
+    tags: [RootEffect].}
+
+
+ Deprecated: Use addTimer(Duration, cb, udata) +
+ + +  Source +  Edit + +
+
+
+
proc addTracker[T](id: string; tracker: T) {.
+    ...deprecated: "Please use trackCounter facility instead", raises: [].}
+
+
+ Deprecated: Please use trackCounter facility instead +
+ +Add new tracker object to current thread dispatcher with identifier id. +  Source +  Edit + +
+
+
+
proc addWriter2(fd: AsyncFD; cb: CallbackFunc; udata: pointer = nil): Result[
+    void, OSErrorCode] {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc callIdle(acb: AsyncCallback) {....raises: [], tags: [].}
+
+ +

Schedule cbproc to be called when there no pending network events available.

+

WARNING! Despite the name, "idle" callbacks called on every loop iteration if there no network events available, not when the loop is actually "idle".

+ +  Source +  Edit + +
+
+
+
proc callIdle(cbproc: CallbackFunc) {....raises: [], tags: [RootEffect].}
+
+ + +  Source +  Edit + +
+
+
+
proc callIdle(cbproc: CallbackFunc; data: pointer) {....raises: [], tags: [].}
+
+ +

Schedule cbproc to be called when there no pending network events available.

+

WARNING! Despite the name, "idle" callbacks called on every loop iteration if there no network events available, not when the loop is actually "idle".

+ +  Source +  Edit + +
+
+
+
proc callSoon(acb: AsyncCallback) {....raises: [], tags: [].}
+
+ +Schedule cbproc to be called as soon as possible. The callback is called when control returns to the event loop. +  Source +  Edit + +
+
+
+
proc callSoon(cbproc: CallbackFunc) {....raises: [], tags: [RootEffect].}
+
+ + +  Source +  Edit + +
+
+
+
proc callSoon(cbproc: CallbackFunc; data: pointer) {....gcsafe, raises: [],
+    tags: [].}
+
+ +Schedule cbproc to be called as soon as possible. The callback is called when control returns to the event loop. +  Source +  Edit + +
+
+
+
proc clearTimer(timer: TimerCallback) {.inline, ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc closeHandle(fd: AsyncFD; aftercb: CallbackFunc = nil) {....raises: [],
+    tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc closeSocket(fd: AsyncFD; aftercb: CallbackFunc = nil) {....raises: [],
+    tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
func getAsyncTimestamp(a: Duration): auto {.inline, ...raises: [], tags: [].}
+
+ +

Return rounded up value of duration with milliseconds resolution.

+

This function also take care on int32 overflow, because Linux and Windows accepts signed 32bit integer as timeout.

+ +  Source +  Edit + +
+
+
+
proc getGlobalDispatcher(): PDispatcher {....gcsafe,
+    deprecated: "Use getThreadDispatcher() instead", raises: [], tags: [].}
+
+
+ Deprecated: Use getThreadDispatcher() instead +
+ + +  Source +  Edit + +
+
+
+
proc getThreadDispatcher(): PDispatcher {....raises: [], tags: [].}
+
+ +Returns current thread's dispatcher instance. +  Source +  Edit + +
+
+
+
proc getTracker(id: string): TrackerBase {.
+    ...deprecated: "Please use getTrackerCounter() instead", raises: [], tags: [].}
+
+
+ Deprecated: Please use getTrackerCounter() instead +
+ +Get tracker from current thread dispatcher using identifier id. +  Source +  Edit + +
+
+
+
proc getTrackerCounter(name: string): TrackerCounter {.noinit, ...raises: [],
+    tags: [].}
+
+ +Return value of counter with name name. +  Source +  Edit + +
+
+
+
proc internalCallTick(acb: AsyncCallback) {....raises: [], tags: [].}
+
+ +Schedule cbproc to be called after all scheduled callbacks, but only when OS system queue finished processing events. +  Source +  Edit + +
+
+
+
proc internalCallTick(cbproc: CallbackFunc) {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc internalCallTick(cbproc: CallbackFunc; data: pointer) {....raises: [],
+    tags: [].}
+
+ +Schedule cbproc to be called after all scheduled callbacks when OS system queue processing is done. +  Source +  Edit + +
+
+
+
proc isCounterLeaked(name: string): bool {.noinit, ...raises: [], tags: [].}
+
+ +Returns true if leak is detected, number of opened not equal to number of closed requests. +  Source +  Edit + +
+
+
+
proc newDispatcher(): PDispatcher {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc poll() {....raises: [], tags: [].}
+
+ +

Perform single asynchronous step, processing timers and completing tasks. Blocks until at least one event has completed.

+

Exceptions raised during async task exection are stored as outcome in the corresponding Future - poll itself does not raise.

+ +  Source +  Edit + +
+
+
+
proc raiseAsDefect(exc: ref Exception; msg: string) {.noreturn, noinline,
+    ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc raiseOsDefect(error: OSErrorCode; msg = "") {.noreturn, noinline,
+    ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc register2(fd: AsyncFD): Result[void, OSErrorCode] {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc removeReader2(fd: AsyncFD): Result[void, OSErrorCode] {....raises: [],
+    tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc removeTimer(at: int64; cb: CallbackFunc; udata: pointer = nil) {.inline,
+    ...deprecated: "Use removeTimer(Duration, cb, udata)", raises: [],
+    tags: [RootEffect].}
+
+
+ Deprecated: Use removeTimer(Duration, cb, udata) +
+ + +  Source +  Edit + +
+
+
+
proc removeTimer(at: Moment; cb: CallbackFunc; udata: pointer = nil) {.
+    ...raises: [], tags: [].}
+
+ +Remove timer callback cb with absolute timestamp at from waiting queue. +  Source +  Edit + +
+
+
+
proc removeTimer(at: uint64; cb: CallbackFunc; udata: pointer = nil) {.inline,
+    ...deprecated: "Use removeTimer(Duration, cb, udata)", raises: [],
+    tags: [RootEffect].}
+
+
+ Deprecated: Use removeTimer(Duration, cb, udata) +
+ + +  Source +  Edit + +
+
+
+
proc removeWriter2(fd: AsyncFD): Result[void, OSErrorCode] {....raises: [],
+    tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc runForever() {....raises: [], tags: [].}
+
+ +Begins a never ending global dispatcher poll loop. Raises different exceptions depending on the platform. +  Source +  Edit + +
+
+
+
proc setGlobalDispatcher(disp: PDispatcher) {....gcsafe,
+    deprecated: "Use setThreadDispatcher() instead", raises: [], tags: [].}
+
+
+ Deprecated: Use setThreadDispatcher() instead +
+ + +  Source +  Edit + +
+
+
+
proc setThreadDispatcher(disp: PDispatcher) {....raises: [], tags: [].}
+
+ +Set current thread's dispatcher instance to disp. +  Source +  Edit + +
+
+
+
proc setTimer(at: Moment; cb: CallbackFunc; udata: pointer = nil): TimerCallback {.
+    ...raises: [], tags: [].}
+
+ +Arrange for the callback cb to be called at the given absolute timestamp at. You can also pass udata to callback. +  Source +  Edit + +
+
+
+
func toException(v: OSErrorCode): ref OSError {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc trackCounter(name: string) {.noinit, ...raises: [], tags: [].}
+
+ +Increase tracker counter with name name by 1. +  Source +  Edit + +
+
+
+
proc unregister2(fd: AsyncFD): Result[void, OSErrorCode] {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc unregisterAndCloseFd(fd: AsyncFD): Result[void, OSErrorCode] {....raises: [],
+    tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc untrackCounter(name: string) {.noinit, ...raises: [], tags: [].}
+
+ +Decrease tracker counter with name name by 1. +  Source +  Edit + +
+
+ +
+
+

Iterators

+
+
+
iterator trackerCounterKeys(loop: PDispatcher): string {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
iterator trackerCounters(loop: PDispatcher): tuple[name: string,
+    value: TrackerCounter] {....raises: [], tags: [].}
+
+ +Iterates over loop thread dispatcher tracker counter table, returns all the tracker counter's names and values. +  Source +  Edit + +
+
+ +
+
+

Exports

+
+AsyncExceptionError, AsyncError, AsyncTimeoutError, state, LocationKind, CallbackFunc, error, id, CancelledError, completed, value, FutureFlags, failed, Future, failed, $, InternalFutureBase, completed, cancelled, init, InternalAsyncCallback, internalInitFutureBase, FutureBase, value, finished, getSrcLocation, FutureError, FutureState, init, location, flags, FutureFlag, SrcLoc, FutureDefect, completed, Hour, init, fromNow, milliseconds, <, fastEpochTime, Minute, secs, Day, micros, >=, ==, nanoseconds, +, >=, nanos, minutes, <=, low, milliseconds, millis, $, micros, asyncTimer, +=, Nanosecond, -, -, Second, >, high, epochNanoSeconds, Microsecond, weeks, microseconds, secs, InfiniteDuration, -=, +, minutes, +=, microseconds, $, hours, toString, hours, Duration, now, <, weeks, Millisecond, <=, millis, >, ==, seconds, isZero, ZeroDuration, isInfinite, SomeIntegerI64, div, +, *, epochSeconds, high, nanoseconds, nanos, low, -, days, -=, Week, days, seconds, *, Moment, async, async, await, await, awaitne, EPERM, ENOBUFS, EFAULT, EKEYREJECTED, EHWPOISON, EHOSTDOWN, EDQUOT, EREMCHG, EISDIR, ESTRPIPE, EMLINK, ENXIO, ETOOMANYREFS, ENOMEDIUM, EOVERFLOW, EAFNOSUPPORT, ENOTCONN, ECHILD, ESOCKTNOSUPPORT, EBFONT, ESRMNT, ENOTEMPTY, ESTALE, EPROTO, EADDRNOTAVAIL, EXDEV, EBADF, EKEYREVOKED, ENOTDIR, EDEADLK, EALREADY, ESPIPE, ENOEXEC, ENETDOWN, EACCES, ELNRNG, ELOOP, ENODEV, ENFILE, ENOPKG, ENOCSI, ECHRNG, EL3HLT, EINVAL, EADDRINUSE, EUNATCH, EBADFD, EMEDIUMTYPE, ERESTART, ESRCH, ETXTBSY, ENETUNREACH, EPROTONOSUPPORT, ECANCELED, EBADMSG, EMFILE, ENOSYS, ERANGE, EDEADLOCK, ENOKEY, EILSEQ, EBUSY, EROFS, ENOTSOCK, ECONNREFUSED, ELIBMAX, EBADRQC, ECOMM, EL2HLT, EIDRM, ENOTBLK, ENOTTY, EOPNOTSUPP, EISNAM, ENOSR, EXFULL, EPROTOTYPE, EUCLEAN, ENOSTR, ENOTRECOVERABLE, ENOANO, ERFKILL, ENOENT, EISCONN, ELIBEXEC, EMULTIHOP, ELIBACC, ENOLCK, EHOSTUNREACH, ENETRESET, ECONNRESET, EINPROGRESS, E2BIG, EIO, ENODATA, ESHUTDOWN, EFBIG, ELIBBAD, EOWNERDEAD, ETIMEDOUT, ECONNABORTED, ENOSPC, EBADSLT, ETIME, EINTR, EEXIST, ENONET, EREMOTEIO, EPFNOSUPPORT, ENOLINK, ENOMSG, EDOM, EMSGSIZE, EPIPE, EBADE, ENOMEM, ELIBSCN, ENOPROTOOPT, EDESTADDRREQ, ENAVAIL, ENOTNAM, EADV, EDOTDOT, EUSERS, EKEYEXPIRED, EBADR, EL3RST, EAGAIN, ENOTUNIQ, EWOULDBLOCK, ENAMETOOLONG, EREMOTE, EL2NSYNC +
+ +
+
+ +
+ +
+
+
+ + + diff --git a/api/chronos/internal/asyncengine.idx b/api/chronos/internal/asyncengine.idx new file mode 100644 index 00000000..4b8d101d --- /dev/null +++ b/api/chronos/internal/asyncengine.idx @@ -0,0 +1,53 @@ +MaxEventsCount chronos/internal/asyncengine.html#MaxEventsCount asyncengine: MaxEventsCount +AsyncCallback chronos/internal/asyncengine.html#AsyncCallback asyncengine: AsyncCallback +TimerCallback chronos/internal/asyncengine.html#TimerCallback asyncengine: TimerCallback +TrackerBase chronos/internal/asyncengine.html#TrackerBase asyncengine: TrackerBase +TrackerCounter chronos/internal/asyncengine.html#TrackerCounter asyncengine: TrackerCounter +getAsyncTimestamp chronos/internal/asyncengine.html#getAsyncTimestamp,Duration asyncengine: getAsyncTimestamp(a: Duration): auto +raiseAsDefect chronos/internal/asyncengine.html#raiseAsDefect,ref.Exception,string asyncengine: raiseAsDefect(exc: ref Exception; msg: string) +raiseOsDefect chronos/internal/asyncengine.html#raiseOsDefect,OSErrorCode,string asyncengine: raiseOsDefect(error: OSErrorCode; msg = "") +toException chronos/internal/asyncengine.html#toException,OSErrorCode asyncengine: toException(v: OSErrorCode): ref OSError +PDispatcher chronos/internal/asyncengine.html#PDispatcher asyncengine: PDispatcher +AsyncFD chronos/internal/asyncengine.html#AsyncFD asyncengine: AsyncFD +newDispatcher chronos/internal/asyncengine.html#newDispatcher asyncengine: newDispatcher(): PDispatcher +poll chronos/internal/asyncengine.html#poll asyncengine: poll() +register2 chronos/internal/asyncengine.html#register2,AsyncFD asyncengine: register2(fd: AsyncFD): Result[void, OSErrorCode] +unregister2 chronos/internal/asyncengine.html#unregister2,AsyncFD asyncengine: unregister2(fd: AsyncFD): Result[void, OSErrorCode] +addReader2 chronos/internal/asyncengine.html#addReader2,AsyncFD,CallbackFunc,pointer asyncengine: addReader2(fd: AsyncFD; cb: CallbackFunc; udata: pointer = nil): Result[void,\n OSErrorCode] +removeReader2 chronos/internal/asyncengine.html#removeReader2,AsyncFD asyncengine: removeReader2(fd: AsyncFD): Result[void, OSErrorCode] +addWriter2 chronos/internal/asyncengine.html#addWriter2,AsyncFD,CallbackFunc,pointer asyncengine: addWriter2(fd: AsyncFD; cb: CallbackFunc; udata: pointer = nil): Result[void,\n OSErrorCode] +removeWriter2 chronos/internal/asyncengine.html#removeWriter2,AsyncFD asyncengine: removeWriter2(fd: AsyncFD): Result[void, OSErrorCode] +closeHandle chronos/internal/asyncengine.html#closeHandle,AsyncFD,CallbackFunc asyncengine: closeHandle(fd: AsyncFD; aftercb: CallbackFunc = nil) +closeSocket chronos/internal/asyncengine.html#closeSocket,AsyncFD,CallbackFunc asyncengine: closeSocket(fd: AsyncFD; aftercb: CallbackFunc = nil) +unregisterAndCloseFd chronos/internal/asyncengine.html#unregisterAndCloseFd,AsyncFD asyncengine: unregisterAndCloseFd(fd: AsyncFD): Result[void, OSErrorCode] +`==` chronos/internal/asyncengine.html#==,AsyncFD,AsyncFD asyncengine: `==`(x: AsyncFD; y: AsyncFD): bool +setThreadDispatcher chronos/internal/asyncengine.html#setThreadDispatcher,PDispatcher asyncengine: setThreadDispatcher(disp: PDispatcher) +getThreadDispatcher chronos/internal/asyncengine.html#getThreadDispatcher asyncengine: getThreadDispatcher(): PDispatcher +setGlobalDispatcher chronos/internal/asyncengine.html#setGlobalDispatcher,PDispatcher asyncengine: setGlobalDispatcher(disp: PDispatcher) +getGlobalDispatcher chronos/internal/asyncengine.html#getGlobalDispatcher asyncengine: getGlobalDispatcher(): PDispatcher +setTimer chronos/internal/asyncengine.html#setTimer,Moment,CallbackFunc,pointer asyncengine: setTimer(at: Moment; cb: CallbackFunc; udata: pointer = nil): TimerCallback +clearTimer chronos/internal/asyncengine.html#clearTimer,TimerCallback asyncengine: clearTimer(timer: TimerCallback) +addTimer chronos/internal/asyncengine.html#addTimer,Moment,CallbackFunc,pointer asyncengine: addTimer(at: Moment; cb: CallbackFunc; udata: pointer = nil) +addTimer chronos/internal/asyncengine.html#addTimer,int64,CallbackFunc,pointer asyncengine: addTimer(at: int64; cb: CallbackFunc; udata: pointer = nil) +addTimer chronos/internal/asyncengine.html#addTimer,uint64,CallbackFunc,pointer asyncengine: addTimer(at: uint64; cb: CallbackFunc; udata: pointer = nil) +removeTimer chronos/internal/asyncengine.html#removeTimer,Moment,CallbackFunc,pointer asyncengine: removeTimer(at: Moment; cb: CallbackFunc; udata: pointer = nil) +removeTimer chronos/internal/asyncengine.html#removeTimer,int64,CallbackFunc,pointer asyncengine: removeTimer(at: int64; cb: CallbackFunc; udata: pointer = nil) +removeTimer chronos/internal/asyncengine.html#removeTimer,uint64,CallbackFunc,pointer asyncengine: removeTimer(at: uint64; cb: CallbackFunc; udata: pointer = nil) +callSoon chronos/internal/asyncengine.html#callSoon,InternalAsyncCallback asyncengine: callSoon(acb: AsyncCallback) +callSoon chronos/internal/asyncengine.html#callSoon,CallbackFunc,pointer asyncengine: callSoon(cbproc: CallbackFunc; data: pointer) +callSoon chronos/internal/asyncengine.html#callSoon,CallbackFunc asyncengine: callSoon(cbproc: CallbackFunc) +callIdle chronos/internal/asyncengine.html#callIdle,InternalAsyncCallback asyncengine: callIdle(acb: AsyncCallback) +callIdle chronos/internal/asyncengine.html#callIdle,CallbackFunc,pointer asyncengine: callIdle(cbproc: CallbackFunc; data: pointer) +callIdle chronos/internal/asyncengine.html#callIdle,CallbackFunc asyncengine: callIdle(cbproc: CallbackFunc) +internalCallTick chronos/internal/asyncengine.html#internalCallTick,InternalAsyncCallback asyncengine: internalCallTick(acb: AsyncCallback) +internalCallTick chronos/internal/asyncengine.html#internalCallTick,CallbackFunc,pointer asyncengine: internalCallTick(cbproc: CallbackFunc; data: pointer) +internalCallTick chronos/internal/asyncengine.html#internalCallTick,CallbackFunc asyncengine: internalCallTick(cbproc: CallbackFunc) +runForever chronos/internal/asyncengine.html#runForever asyncengine: runForever() +addTracker chronos/internal/asyncengine.html#addTracker,string,T asyncengine: addTracker[T](id: string; tracker: T) +getTracker chronos/internal/asyncengine.html#getTracker,string asyncengine: getTracker(id: string): TrackerBase +trackCounter chronos/internal/asyncengine.html#trackCounter,string asyncengine: trackCounter(name: string) +untrackCounter chronos/internal/asyncengine.html#untrackCounter,string asyncengine: untrackCounter(name: string) +getTrackerCounter chronos/internal/asyncengine.html#getTrackerCounter,string asyncengine: getTrackerCounter(name: string): TrackerCounter +isCounterLeaked chronos/internal/asyncengine.html#isCounterLeaked,string asyncengine: isCounterLeaked(name: string): bool +trackerCounters chronos/internal/asyncengine.html#trackerCounters.i,PDispatcher asyncengine: trackerCounters(loop: PDispatcher): tuple[name: string, value: TrackerCounter] +trackerCounterKeys chronos/internal/asyncengine.html#trackerCounterKeys.i,PDispatcher asyncengine: trackerCounterKeys(loop: PDispatcher): string diff --git a/api/chronos/internal/asyncfutures.html b/api/chronos/internal/asyncfutures.html new file mode 100644 index 00000000..e002195a --- /dev/null +++ b/api/chronos/internal/asyncfutures.html @@ -0,0 +1,1696 @@ + + + + + + + + + + + + + + + + + + +chronos/internal/asyncfutures + + + + + + + + +
+
+

chronos/internal/asyncfutures

+
+
+
+ +     Dark Mode +
+ +
+ Search: +
+
+ Group by: + +
+ + +
+   Source +  Edit + +
+
+ +

Features and utilities for Future that integrate it with the dispatcher and the rest of the async machinery

+ +
+

Types

+
+
+
FutureCompletedError = object of FutureError
+  
+
+ +Error raised when trying access the error of a completed Future +  Source +  Edit + +
+
+
+
FuturePendingError = object of FutureError
+  
+
+ +Error raised when trying to read a Future that is still pending +  Source +  Edit + +
+
+
+
FutureSeq[A; B] = ref object of Future[A]
+  gcholder*: seq[B]
+
+
+ +Deprecated +  Source +  Edit + +
+
+
+
FutureStr[T] = ref object of Future[T]
+  gcholder*: string
+
+
+ +Deprecated +  Source +  Edit + +
+
+ +
+
+

Procs

+
+
+
func `[]`(loc: array[LocationKind, ptr SrcLoc]; v: int): ptr SrcLoc {.
+    ...deprecated: "use LocationKind", raises: [], tags: [].}
+
+
+ Deprecated: use LocationKind +
+ + +  Source +  Edit + +
+
+
+
proc `and`[T, Y](fut1: Future[T]; fut2: Future[Y]): Future[void] {.
+    ...deprecated: "Use allFutures[T](varargs[Future[T]])", raises: [].}
+
+
+ Deprecated: Use allFutures[T](varargs[Future[T]]) +
+ +

Returns a future which will complete once both fut1 and fut2 finish.

+

If cancelled, fut1 and fut2 futures WILL NOT BE cancelled.

+ +  Source +  Edit + +
+
+
+
proc `or`[T, Y, E1, E2](fut1: InternalRaisesFuture[T, E1];
+                        fut2: InternalRaisesFuture[Y, E2]): auto
+
+ + +  Source +  Edit + +
+
+
+
proc `or`[T, Y](fut1: Future[T]; fut2: Future[Y]): Future[void] {....raises: [].}
+
+ +

Returns a future which will complete once either fut1 or fut2 finish.

+

If fut1 or fut2 future is failed, the result future will also be failed with an error stored in fut1 or fut2 respectively.

+

If both fut1 and fut2 future are completed or failed, the result future will depend on the state of fut1 future. So if fut1 future is failed, the result future will also be failed, if fut1 future is completed, the result future will also be completed.

+

If cancelled, fut1 and fut2 futures WILL NOT BE cancelled.

+ +  Source +  Edit + +
+
+
+
proc addCallback(future: FutureBase; cb: CallbackFunc) {....raises: [],
+    tags: [RootEffect].}
+
+ +

Adds the callbacks proc to be called when the future completes.

+

If future has already completed then cb will be called immediately.

+ +  Source +  Edit + +
+
+
+
proc addCallback(future: FutureBase; cb: CallbackFunc; udata: pointer) {.
+    ...raises: [], tags: [RootEffect].}
+
+ +

Adds the callbacks proc to be called when the future completes.

+

If future has already completed then cb will be called immediately.

+ +  Source +  Edit + +
+
+
+
proc all[T](futs: varargs[Future[T]]): auto {.
+    ...deprecated: "Use allFutures(varargs[Future[T]])", raises: [].}
+
+
+ Deprecated: Use allFutures(varargs[Future[T]]) +
+ +

Returns a future which will complete once all futures in futs finish. If the argument is empty, the returned future completes immediately.

+

If the awaited futures are not Future[void], the returned future will hold the values of all awaited futures in a sequence.

+

If the awaited futures are Future[void], this proc returns Future[void].

+

Note, that if one of the futures in futs will fail, result of all() will also be failed with error from failed future.

+

TODO: This procedure has bug on handling cancelled futures from futs. So if future from futs list become cancelled, what must be returned? You can't cancel result retFuture because in such way infinite recursion will happen.

+ +  Source +  Edit + +
+
+
+
proc allFinished[F: SomeFuture](futs: varargs[F]): InternalRaisesFuture[seq[F],
+    (CancelledError,)] {.stackTrace: false, ...raises: [], gcsafe, raises: [],
+                         raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc allFutures(futs: varargs[FutureBase]): InternalRaisesFuture[void,
+    (CancelledError,)] {.stackTrace: false, ...raises: [], gcsafe, raises: [],
+                         raises: [], tags: [RootEffect].}
+
+ + +  Source +  Edit + +
+
+
+
proc allFutures[T, E](futs: varargs[InternalRaisesFuture[T, E]]): InternalRaisesFuture[
+    void, (CancelledError,)] {.stackTrace: false, ...raises: [], gcsafe,
+                               raises: [], raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc allFutures[T](futs: varargs[Future[T]]): InternalRaisesFuture[void,
+    (CancelledError,)] {.stackTrace: false, ...raises: [], gcsafe, raises: [],
+                         raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc asyncCheck[T](future: Future[T]) {....deprecated: "Raises Defect on future failure, fix your code and use asyncSpawn!",
+                                        raises: [].}
+
+
+ Deprecated: Raises Defect on future failure, fix your code and use asyncSpawn! +
+ +This function used to raise an exception through the poll call if the given future failed - there's no way to handle such exceptions so this function is now an alias for asyncSpawn +  Source +  Edit + +
+
+
+
proc asyncDiscard[T](future: Future[T]) {.
+    ...deprecated: "Use asyncSpawn or `discard await`", raises: [].}
+
+
+ Deprecated: Use asyncSpawn or `discard await` +
+ +asyncDiscard will discard the outcome of the operation - unlike discard it also throws away exceptions! Use asyncSpawn if you're sure your code doesn't raise exceptions, or discard await to ignore successful outcomes +  Source +  Edit + +
+
+
+
proc asyncSpawn(future: Future[void]) {....raises: [], tags: [RootEffect].}
+
+ +

Spawns a new concurrent async task.

+

Tasks may not raise exceptions or be cancelled - a Defect will be raised when this happens.

+

This should be used instead of discard and asyncCheck when calling an async procedure without await, to ensure exceptions in the returned future are not silently discarded.

+

Note, that if passed future is already finished, it will be checked and processed immediately.

+ +  Source +  Edit + +
+
+
+
proc callback=(future: FutureBase; cb: CallbackFunc) {....deprecated: "use addCallback/removeCallback/clearCallbacks instead to manage the callback list",
+    raises: [], raises: [], raises: [], tags: [RootEffect].}
+
+
+ Deprecated: use addCallback/removeCallback/clearCallbacks instead to manage the callback list +
+ +

Sets the callback proc to be called when the future completes.

+

If future has already completed then cb will be called immediately.

+ +  Source +  Edit + +
+
+
+
proc callback=(future: FutureBase; cb: CallbackFunc; udata: pointer) {....deprecated: "use addCallback/removeCallback/clearCallbacks to manage the callback list",
+    raises: [], tags: [RootEffect].}
+
+
+ Deprecated: use addCallback/removeCallback/clearCallbacks to manage the callback list +
+ +

Clears the list of callbacks and sets the callback proc to be called when the future completes.

+

If future has already completed then cb will be called immediately.

+

It's recommended to use addCallback or then instead.

+ +  Source +  Edit + +
+
+
+
proc cancelAndWait(future: FutureBase; loc: ptr SrcLoc): InternalRaisesFuture[
+    void, void] {.stackTrace: false, ...raises: [], gcsafe, raises: [], raises: [],
+                  tags: [RootEffect].}
+
+ + +  Source +  Edit + +
+
+
+
proc cancelCallback=(future: FutureBase; cb: CallbackFunc) {....raises: [],
+    tags: [].}
+
+ +

Sets the callback procedure to be called when the future is cancelled.

+

This callback will be called immediately as future.cancel() invoked and must be set before future is finished.

+ +  Source +  Edit + +
+
+
+
proc done(future: FutureBase): bool {....deprecated: "Use `completed` instead",
+                                      raises: [], tags: [].}
+
+
+ Deprecated: Use `completed` instead +
+ +This is an alias for completed(future) procedure. +  Source +  Edit + +
+
+
+
proc futureContinue(fut: FutureBase) {....raises: [], gcsafe, raises: [],
+                                       tags: [RootEffect].}
+
+ + +  Source +  Edit + +
+
+
+
proc idleAsync(): InternalRaisesFuture[void, (CancelledError,)] {.
+    stackTrace: false, ...raises: [], gcsafe, raises: [], raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc join(future: FutureBase): InternalRaisesFuture[void, (CancelledError,)] {.
+    stackTrace: false, ...raises: [], gcsafe, raises: [], raises: [],
+    tags: [RootEffect].}
+
+ + +  Source +  Edit + +
+
+
+
proc join(future: SomeFuture): InternalRaisesFuture[void, (CancelledError,)] {.
+    stackTrace: false, ...raises: [], gcsafe, raises: [], raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc noCancel[F: SomeFuture](future: F): auto {....raises: [].}
+
+ +

Prevent cancellation requests from propagating to future while forwarding its value or error when it finishes.

+

This procedure should be used when you need to perform operations which should not be cancelled at all cost, for example closing sockets, pipes, connections or servers. Usually it become useful in exception or finally blocks.

+ +  Source +  Edit + +
+
+
+
proc one[F: SomeFuture](fut0: F; futs: varargs[F]): InternalRaisesFuture[F,
+    (CancelledError,)] {.stackTrace: false, ...raises: [], gcsafe, raises: [],
+                         raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc one[F: SomeFuture](futs: openArray[F]): InternalRaisesFuture[F,
+    (ValueError, CancelledError)] {.stackTrace: false, ...raises: [], gcsafe,
+                                    raises: [], raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc oneIndex[T](futs: varargs[Future[T]]): Future[int] {.
+    ...deprecated: "Use one[T](varargs[Future[T]])", raises: [].}
+
+
+ Deprecated: Use one[T](varargs[Future[T]]) +
+ +

Returns a future which will complete once one of the futures in futs complete.

+

If the argument is empty, the returned future FAILS immediately.

+

Returned future will hold index of completed/failed future in futs argument.

+ +  Source +  Edit + +
+
+
+
proc oneValue[T](futs: varargs[Future[T]]): Future[T] {.
+    ...deprecated: "Use one[T](varargs[Future[T]])", raises: [].}
+
+
+ Deprecated: Use one[T](varargs[Future[T]]) +
+ +

Returns a future which will finish once one of the futures in futs finish.

+

If the argument is empty, returned future FAILS immediately.

+

Returned future will hold value of completed futs future, or error if future was failed.

+ +  Source +  Edit + +
+
+
+
proc race(fut0: FutureBase; futs: varargs[FutureBase]): InternalRaisesFuture[
+    FutureBase, (CancelledError,)] {.stackTrace: false, ...raises: [], gcsafe,
+                                     raises: [], raises: [], tags: [RootEffect].}
+
+ + +  Source +  Edit + +
+
+
+
proc race(futs: openArray[FutureBase]): InternalRaisesFuture[FutureBase,
+    (ValueError, CancelledError)] {.stackTrace: false, ...raises: [], gcsafe,
+                                    raises: [], raises: [], tags: [RootEffect].}
+
+ + +  Source +  Edit + +
+
+
+
proc race(futs: openArray[SomeFuture]): InternalRaisesFuture[FutureBase,
+    (ValueError, CancelledError)] {.stackTrace: false, ...raises: [], gcsafe,
+                                    raises: [], raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc read(fut: Future[void]) {....raises: [CatchableError], raises: [], tags: [].}
+
+ +

Checks that fut completed.

+

If the future failed or was cancelled, the corresponding exception will be raised.

+

If the future is still pending, FuturePendingError will be raised.

+ +  Source +  Edit + +
+
+
+
proc read[E](fut: InternalRaisesFuture[void, E])
+
+ +

Checks that fut completed.

+

If the future failed or was cancelled, the corresponding exception will be raised.

+

If the future is still pending, FuturePendingError will be raised.

+ +  Source +  Edit + +
+
+
+
proc read[T: not void; E](fut: InternalRaisesFuture[T, E]): lent T
+
+ +

Retrieves the value of fut.

+

If the future failed or was cancelled, the corresponding exception will be raised.

+

If the future is still pending, FuturePendingError will be raised.

+ +  Source +  Edit + +
+
+
+
proc read[T: not void](fut: Future[T]): lent T {....raises: [CatchableError],
+    raises: [].}
+
+ +

Retrieves the value of fut.

+

If the future failed or was cancelled, the corresponding exception will be raised.

+

If the future is still pending, FuturePendingError will be raised.

+ +  Source +  Edit + +
+
+
+
proc readError(fut: FutureBase): ref CatchableError {....raises: [FutureError],
+    raises: [], tags: [].}
+
+ +

Retrieves the exception of the failed or cancelled fut.

+

If the future was completed with a value, FutureCompletedError will be raised.

+

If the future is still pending, FuturePendingError will be raised.

+ +  Source +  Edit + +
+
+
+
proc removeCallback(future: FutureBase; cb: CallbackFunc) {....raises: [],
+    tags: [RootEffect].}
+
+ + +  Source +  Edit + +
+
+
+
proc removeCallback(future: FutureBase; cb: CallbackFunc; udata: pointer) {.
+    ...raises: [], tags: [].}
+
+ +Remove future from list of callbacks - this operation may be slow if there are many registered callbacks! +  Source +  Edit + +
+
+
+
proc sleepAsync(duration: Duration): InternalRaisesFuture[void,
+    (CancelledError,)] {.stackTrace: false, ...raises: [], gcsafe, raises: [],
+                         raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc sleepAsync(ms: int): InternalRaisesFuture[void, (CancelledError,)] {.
+    inline, ...deprecated: "Use sleepAsync(Duration)", stackTrace: false,
+    ...raises: [], gcsafe, raises: [], raises: [], tags: [].}
+
+
+ Deprecated: Use sleepAsync(Duration) +
+ + +  Source +  Edit + +
+
+
+
proc stepsAsync(number: int): InternalRaisesFuture[void, (CancelledError,)] {.
+    stackTrace: false, ...raises: [], gcsafe, raises: [], raises: [],
+    tags: [RootEffect].}
+
+ + +  Source +  Edit + +
+
+
+
proc wait(fut: InternalRaisesFuture; deadline: SomeFuture): auto
+
+ + +  Source +  Edit + +
+
+
+
proc wait(fut: InternalRaisesFuture; timeout = InfiniteDuration): auto
+
+ + +  Source +  Edit + +
+
+
+
proc wait[T](fut: Future[T]; deadline: SomeFuture): Future[T] {....raises: [].}
+
+ +

Returns a future which will complete once future fut completes or if deadline future completes.

+

If deadline future completes before future fut - AsyncTimeoutError exception will be raised.

+

Note: deadline future will not be cancelled and/or failed.

+

Note: While waitUntil(future) operation is pending, please avoid any attempts to cancel future fut. If it happens waitUntil() could introduce undefined behavior - it could raiseCancelledError or AsyncTimeoutError.

+

If you need to cancel future - cancel waitUntil(future) instead.

+ +  Source +  Edit + +
+
+
+
proc wait[T](fut: Future[T]; timeout = -1): Future[T] {.inline,
+    ...deprecated: "Use wait(Future[T], Duration)", raises: [].}
+
+
+ Deprecated: Use wait(Future[T], Duration) +
+ + +  Source +  Edit + +
+
+
+
proc wait[T](fut: Future[T]; timeout = InfiniteDuration): Future[T] {....raises: [].}
+
+ +

Returns a future which will complete once future fut completes or if timeout of timeout milliseconds has been expired.

+

If timeout is -1, then statement await wait(fut) is equal to await fut.

+

TODO: In case when fut got cancelled, what result Future[T] should return, because it can't be cancelled too.

+ +  Source +  Edit + +
+
+
+
proc waitFor(fut: Future[void]) {....raises: [CatchableError], raises: [],
+                                  tags: [RootEffect].}
+
+ +

Blocks the current thread of execution until fut has finished.

+

If the future failed or was cancelled, the corresponding exception will be raised.

+

Must not be called recursively (from inside async procedures).

+

See also await, Future.read

+ +  Source +  Edit + +
+
+
+
proc waitFor[E](fut: InternalRaisesFuture[void, E])
+
+ +

Blocks the current thread of execution until fut has finished.

+

If the future failed or was cancelled, the corresponding exception will be raised.

+

Must not be called recursively (from inside async procedures).

+

See also await, Future.read

+ +  Source +  Edit + +
+
+
+
proc waitFor[T: not void; E](fut: InternalRaisesFuture[T, E]): lent T
+
+ +

Blocks the current thread of execution until fut has finished, returning its value.

+

If the future failed or was cancelled, the corresponding exception will be raised.

+

Must not be called recursively (from inside async procedures).

+

See also await, Future.read

+ +  Source +  Edit + +
+
+
+
proc waitFor[T: not void](fut: Future[T]): lent T {....raises: [CatchableError],
+    raises: [].}
+
+ +

Blocks the current thread of execution until fut has finished, returning its value.

+

If the future failed or was cancelled, the corresponding exception will be raised.

+

Must not be called recursively (from inside async procedures).

+

See also await, Future.read

+ +  Source +  Edit + +
+
+
+
proc withTimeout[T](fut: Future[T]; timeout: Duration): InternalRaisesFuture[
+    bool, (CancelledError,)] {.stackTrace: false, ...raises: [], gcsafe,
+                               raises: [], raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc withTimeout[T](fut: Future[T]; timeout: int): Future[bool] {.inline,
+    ...deprecated: "Use withTimeout(Future[T], Duration)", raises: [].}
+
+
+ Deprecated: Use withTimeout(Future[T], Duration) +
+ + +  Source +  Edit + +
+
+ +
+
+

Macros

+
+
+
macro internalRaiseIfError(fut: FutureBase; info: typed) {....raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
macro internalRaiseIfError(fut: InternalRaisesFuture; raises, info: typed) {.
+    ...raises: [].}
+
+ + +  Source +  Edit + +
+
+ +
+
+

Templates

+
+
+
template cancel(future: FutureBase) {....deprecated: "Please use cancelSoon() or cancelAndWait() instead".}
+
+
+ Deprecated: Please use cancelSoon() or cancelAndWait() instead +
+ +Cancel future. +  Source +  Edit + +
+
+
+
template cancelAndSchedule(future: FutureBase)
+
+ + +  Source +  Edit + +
+
+
+
template cancelAndWait(future: FutureBase): Future[void].Raising([])
+
+ +Cancel future. +  Source +  Edit + +
+
+
+
template cancelSoon(fut: FutureBase)
+
+ + +  Source +  Edit + +
+
+
+
template cancelSoon(fut: FutureBase; acb: AsyncCallback)
+
+ + +  Source +  Edit + +
+
+
+
template cancelSoon(fut: FutureBase; cb: CallbackFunc)
+
+ + +  Source +  Edit + +
+
+
+
template cancelSoon(fut: FutureBase; cb: CallbackFunc; udata: pointer)
+
+ + +  Source +  Edit + +
+
+
+
template complete(future: Future[void])
+
+ +Completes a void future. +  Source +  Edit + +
+
+
+
template complete[T](future: Future[T]; val: T)
+
+ +Completes future with value val. +  Source +  Edit + +
+
+
+
template fail[T, E](future: InternalRaisesFuture[T, E];
+                    error: ref CatchableError; warn: static bool = true)
+
+ + +  Source +  Edit + +
+
+
+
template fail[T](future: Future[T]; error: ref CatchableError;
+                 warn: static bool = false)
+
+ +Completes future with error. +  Source +  Edit + +
+
+
+
template Finished() {....deprecated: "Use Completed instead".}
+
+
+ Deprecated: Use Completed instead +
+ + +  Source +  Edit + +
+
+
+
template Finished(T: type FutureState): FutureState {.
+    ...deprecated: "Use FutureState.Completed instead".}
+
+
+ Deprecated: Use FutureState.Completed instead +
+ + +  Source +  Edit + +
+
+
+
template LocCompleteIndex(): untyped {....deprecated: "LocationKind.Finish".}
+
+
+ Deprecated: LocationKind.Finish +
+ + +  Source +  Edit + +
+
+
+
template LocCreateIndex(): auto {....deprecated: "LocationKind.Create".}
+
+
+ Deprecated: LocationKind.Create +
+ + +  Source +  Edit + +
+
+
+
template LocFinishIndex(): auto {....deprecated: "LocationKind.Finish".}
+
+
+ Deprecated: LocationKind.Finish +
+ + +  Source +  Edit + +
+
+
+
template newFuture[T](fromProc: static[string] = "";
+                      flags: static[FutureFlags] = {}): auto
+
+ +

Creates a new future.

+

Specifying fromProc, which is a string specifying the name of the proc that this future belongs to, is a good habit as it helps with debugging.

+ +  Source +  Edit + +
+
+
+
template newFutureSeq[A, B](fromProc: static[string] = ""): FutureSeq[A, B] {.
+    ...deprecated.}
+
+
+ Deprecated +
+ +

Create a new future which can hold/preserve GC sequence until future will not be completed.

+

Specifying fromProc, which is a string specifying the name of the proc that this future belongs to, is a good habit as it helps with debugging.

+ +  Source +  Edit + +
+
+
+
template newFutureStr[T](fromProc: static[string] = ""): FutureStr[T] {.
+    ...deprecated.}
+
+
+ Deprecated +
+ +

Create a new future which can hold/preserve GC string until future will not be completed.

+

Specifying fromProc, which is a string specifying the name of the proc that this future belongs to, is a good habit as it helps with debugging.

+ +  Source +  Edit + +
+
+
+
template newInternalRaisesFuture[T, E](fromProc: static[string] = ""): auto
+
+ +

Creates a new future.

+

Specifying fromProc, which is a string specifying the name of the proc that this future belongs to, is a good habit as it helps with debugging.

+ +  Source +  Edit + +
+
+
+
template orImpl[T, Y](fut1: Future[T]; fut2: Future[Y]): untyped
+
+ + +  Source +  Edit + +
+
+
+
template tryCancel(future: FutureBase): bool
+
+ + +  Source +  Edit + +
+
+ +
+ + +
+
+ +
+ +
+
+
+ + + diff --git a/api/chronos/internal/asyncfutures.idx b/api/chronos/internal/asyncfutures.idx new file mode 100644 index 00000000..178f9ed2 --- /dev/null +++ b/api/chronos/internal/asyncfutures.idx @@ -0,0 +1,80 @@ +LocCreateIndex chronos/internal/asyncfutures.html#LocCreateIndex.t asyncfutures: LocCreateIndex(): auto +LocFinishIndex chronos/internal/asyncfutures.html#LocFinishIndex.t asyncfutures: LocFinishIndex(): auto +LocCompleteIndex chronos/internal/asyncfutures.html#LocCompleteIndex.t asyncfutures: LocCompleteIndex(): untyped +`[]` chronos/internal/asyncfutures.html#[],array[LocationKind,ptr.SrcLoc],int asyncfutures: `[]`(loc: array[LocationKind, ptr SrcLoc]; v: int): ptr SrcLoc +FutureStr chronos/internal/asyncfutures.html#FutureStr asyncfutures: FutureStr +FutureSeq chronos/internal/asyncfutures.html#FutureSeq asyncfutures: FutureSeq +FuturePendingError chronos/internal/asyncfutures.html#FuturePendingError asyncfutures: FuturePendingError +FutureCompletedError chronos/internal/asyncfutures.html#FutureCompletedError asyncfutures: FutureCompletedError +Finished chronos/internal/asyncfutures.html#Finished.t asyncfutures: Finished() +Finished chronos/internal/asyncfutures.html#Finished.t,typeFutureState asyncfutures: Finished(T: type FutureState): FutureState +newFuture chronos/internal/asyncfutures.html#newFuture.t,static[string],static[FutureFlags] asyncfutures: newFuture[T](fromProc: static[string] = ""; flags: static[FutureFlags] = {}): auto +newInternalRaisesFuture chronos/internal/asyncfutures.html#newInternalRaisesFuture.t,static[string] asyncfutures: newInternalRaisesFuture[T, E](fromProc: static[string] = ""): auto +newFutureSeq chronos/internal/asyncfutures.html#newFutureSeq.t,static[string] asyncfutures: newFutureSeq[A, B](fromProc: static[string] = ""): FutureSeq[A, B] +newFutureStr chronos/internal/asyncfutures.html#newFutureStr.t,static[string] asyncfutures: newFutureStr[T](fromProc: static[string] = ""): FutureStr[T] +done chronos/internal/asyncfutures.html#done,FutureBase asyncfutures: done(future: FutureBase): bool +complete chronos/internal/asyncfutures.html#complete.t,Future[T],T asyncfutures: complete[T](future: Future[T]; val: T) +complete chronos/internal/asyncfutures.html#complete.t,Future[void] asyncfutures: complete(future: Future[void]) +fail chronos/internal/asyncfutures.html#fail.t,Future[T],ref.CatchableError,staticbool asyncfutures: fail[T](future: Future[T]; error: ref CatchableError; warn: static bool = false) +fail chronos/internal/asyncfutures.html#fail.t,InternalRaisesFuture[T,E],ref.CatchableError,staticbool asyncfutures: fail[T, E](future: InternalRaisesFuture[T, E]; error: ref CatchableError;\n warn: static bool = true) +cancelAndSchedule chronos/internal/asyncfutures.html#cancelAndSchedule.t,FutureBase asyncfutures: cancelAndSchedule(future: FutureBase) +tryCancel chronos/internal/asyncfutures.html#tryCancel.t,FutureBase asyncfutures: tryCancel(future: FutureBase): bool +addCallback chronos/internal/asyncfutures.html#addCallback,FutureBase,CallbackFunc,pointer asyncfutures: addCallback(future: FutureBase; cb: CallbackFunc; udata: pointer) +addCallback chronos/internal/asyncfutures.html#addCallback,FutureBase,CallbackFunc asyncfutures: addCallback(future: FutureBase; cb: CallbackFunc) +removeCallback chronos/internal/asyncfutures.html#removeCallback,FutureBase,CallbackFunc,pointer asyncfutures: removeCallback(future: FutureBase; cb: CallbackFunc; udata: pointer) +removeCallback chronos/internal/asyncfutures.html#removeCallback,FutureBase,CallbackFunc asyncfutures: removeCallback(future: FutureBase; cb: CallbackFunc) +callback= chronos/internal/asyncfutures.html#callback=,FutureBase,CallbackFunc,pointer asyncfutures: callback=(future: FutureBase; cb: CallbackFunc; udata: pointer) +callback= chronos/internal/asyncfutures.html#callback=,FutureBase,CallbackFunc asyncfutures: callback=(future: FutureBase; cb: CallbackFunc) +cancelCallback= chronos/internal/asyncfutures.html#cancelCallback=,FutureBase,CallbackFunc asyncfutures: cancelCallback=(future: FutureBase; cb: CallbackFunc) +futureContinue chronos/internal/asyncfutures.html#futureContinue,FutureBase asyncfutures: futureContinue(fut: FutureBase) +internalRaiseIfError chronos/internal/asyncfutures.html#internalRaiseIfError.m,FutureBase,typed asyncfutures: internalRaiseIfError(fut: FutureBase; info: typed) +internalRaiseIfError chronos/internal/asyncfutures.html#internalRaiseIfError.m,InternalRaisesFuture,typed,typed asyncfutures: internalRaiseIfError(fut: InternalRaisesFuture; raises, info: typed) +read chronos/internal/asyncfutures.html#read,Future[T: not void] asyncfutures: read[T: not void](fut: Future[T]): lent T +read chronos/internal/asyncfutures.html#read,Future[void] asyncfutures: read(fut: Future[void]) +readError chronos/internal/asyncfutures.html#readError,FutureBase asyncfutures: readError(fut: FutureBase): ref CatchableError +waitFor chronos/internal/asyncfutures.html#waitFor,Future[T: not void] asyncfutures: waitFor[T: not void](fut: Future[T]): lent T +waitFor chronos/internal/asyncfutures.html#waitFor,Future[void] asyncfutures: waitFor(fut: Future[void]) +asyncSpawn chronos/internal/asyncfutures.html#asyncSpawn,Future[void] asyncfutures: asyncSpawn(future: Future[void]) +asyncCheck chronos/internal/asyncfutures.html#asyncCheck,Future[T] asyncfutures: asyncCheck[T](future: Future[T]) +asyncDiscard chronos/internal/asyncfutures.html#asyncDiscard,Future[T] asyncfutures: asyncDiscard[T](future: Future[T]) +`and` chronos/internal/asyncfutures.html#and,Future[T],Future[Y] asyncfutures: `and`[T, Y](fut1: Future[T]; fut2: Future[Y]): Future[void] +orImpl chronos/internal/asyncfutures.html#orImpl.t,Future[T],Future[Y] asyncfutures: orImpl[T, Y](fut1: Future[T]; fut2: Future[Y]): untyped +`or` chronos/internal/asyncfutures.html#or,Future[T],Future[Y] asyncfutures: `or`[T, Y](fut1: Future[T]; fut2: Future[Y]): Future[void] +all chronos/internal/asyncfutures.html#all,varargs[Future[T]] asyncfutures: all[T](futs: varargs[Future[T]]): auto +oneIndex chronos/internal/asyncfutures.html#oneIndex,varargs[Future[T]] asyncfutures: oneIndex[T](futs: varargs[Future[T]]): Future[int] +oneValue chronos/internal/asyncfutures.html#oneValue,varargs[Future[T]] asyncfutures: oneValue[T](futs: varargs[Future[T]]): Future[T] +cancelSoon chronos/internal/asyncfutures.html#cancelSoon.t,FutureBase,CallbackFunc,pointer asyncfutures: cancelSoon(fut: FutureBase; cb: CallbackFunc; udata: pointer) +cancelSoon chronos/internal/asyncfutures.html#cancelSoon.t,FutureBase,CallbackFunc asyncfutures: cancelSoon(fut: FutureBase; cb: CallbackFunc) +cancelSoon chronos/internal/asyncfutures.html#cancelSoon.t,FutureBase,InternalAsyncCallback asyncfutures: cancelSoon(fut: FutureBase; acb: AsyncCallback) +cancelSoon chronos/internal/asyncfutures.html#cancelSoon.t,FutureBase asyncfutures: cancelSoon(fut: FutureBase) +cancel chronos/internal/asyncfutures.html#cancel.t,FutureBase asyncfutures: cancel(future: FutureBase) +cancelAndWait chronos/internal/asyncfutures.html#cancelAndWait,FutureBase,ptr.SrcLoc asyncfutures: cancelAndWait(future: FutureBase; loc: ptr SrcLoc): InternalRaisesFuture[void,\n void] +cancelAndWait chronos/internal/asyncfutures.html#cancelAndWait.t,FutureBase asyncfutures: cancelAndWait(future: FutureBase): Future[void].Raising([]) +noCancel chronos/internal/asyncfutures.html#noCancel,F asyncfutures: noCancel[F: SomeFuture](future: F): auto +allFutures chronos/internal/asyncfutures.html#allFutures,varargs[FutureBase] asyncfutures: allFutures(futs: varargs[FutureBase]): InternalRaisesFuture[void,\n (CancelledError,)] +allFutures chronos/internal/asyncfutures.html#allFutures,varargs[Future[T]] asyncfutures: allFutures[T](futs: varargs[Future[T]]): InternalRaisesFuture[void,\n (CancelledError,)] +allFutures chronos/internal/asyncfutures.html#allFutures,varargs[InternalRaisesFuture[T,E]] asyncfutures: allFutures[T, E](futs: varargs[InternalRaisesFuture[T, E]]): InternalRaisesFuture[\n void, (CancelledError,)] +allFinished chronos/internal/asyncfutures.html#allFinished,varargs[F] asyncfutures: allFinished[F: SomeFuture](futs: varargs[F]): InternalRaisesFuture[seq[F],\n (CancelledError,)] +one chronos/internal/asyncfutures.html#one,F,varargs[F] asyncfutures: one[F: SomeFuture](fut0: F; futs: varargs[F]): InternalRaisesFuture[F,\n (CancelledError,)] +one chronos/internal/asyncfutures.html#one,openArray[F] asyncfutures: one[F: SomeFuture](futs: openArray[F]): InternalRaisesFuture[F,\n (ValueError, CancelledError)] +race chronos/internal/asyncfutures.html#race,FutureBase,varargs[FutureBase] asyncfutures: race(fut0: FutureBase; futs: varargs[FutureBase]): InternalRaisesFuture[\n FutureBase, (CancelledError,)] +race chronos/internal/asyncfutures.html#race,openArray[FutureBase] asyncfutures: race(futs: openArray[FutureBase]): InternalRaisesFuture[FutureBase,\n (ValueError, CancelledError)] +race chronos/internal/asyncfutures.html#race,openArray[SomeFuture] asyncfutures: race(futs: openArray[SomeFuture]): InternalRaisesFuture[FutureBase,\n (ValueError, CancelledError)] +sleepAsync chronos/internal/asyncfutures.html#sleepAsync,Duration asyncfutures: sleepAsync(duration: Duration): InternalRaisesFuture[void, (CancelledError,)] +sleepAsync chronos/internal/asyncfutures.html#sleepAsync,int asyncfutures: sleepAsync(ms: int): InternalRaisesFuture[void, (CancelledError,)] +stepsAsync chronos/internal/asyncfutures.html#stepsAsync,int asyncfutures: stepsAsync(number: int): InternalRaisesFuture[void, (CancelledError,)] +idleAsync chronos/internal/asyncfutures.html#idleAsync asyncfutures: idleAsync(): InternalRaisesFuture[void, (CancelledError,)] +withTimeout chronos/internal/asyncfutures.html#withTimeout,Future[T],Duration asyncfutures: withTimeout[T](fut: Future[T]; timeout: Duration): InternalRaisesFuture[bool,\n (CancelledError,)] +withTimeout chronos/internal/asyncfutures.html#withTimeout,Future[T],int asyncfutures: withTimeout[T](fut: Future[T]; timeout: int): Future[bool] +wait chronos/internal/asyncfutures.html#wait,Future[T] asyncfutures: wait[T](fut: Future[T]; timeout = InfiniteDuration): Future[T] +wait chronos/internal/asyncfutures.html#wait,Future[T],int asyncfutures: wait[T](fut: Future[T]; timeout = -1): Future[T] +wait chronos/internal/asyncfutures.html#wait,Future[T],SomeFuture asyncfutures: wait[T](fut: Future[T]; deadline: SomeFuture): Future[T] +join chronos/internal/asyncfutures.html#join,FutureBase asyncfutures: join(future: FutureBase): InternalRaisesFuture[void, (CancelledError,)] +join chronos/internal/asyncfutures.html#join,SomeFuture asyncfutures: join(future: SomeFuture): InternalRaisesFuture[void, (CancelledError,)] +read chronos/internal/asyncfutures.html#read,InternalRaisesFuture[T: not void,E] asyncfutures: read[T: not void; E](fut: InternalRaisesFuture[T, E]): lent T +read chronos/internal/asyncfutures.html#read,InternalRaisesFuture[void,E] asyncfutures: read[E](fut: InternalRaisesFuture[void, E]) +waitFor chronos/internal/asyncfutures.html#waitFor,InternalRaisesFuture[T: not void,E] asyncfutures: waitFor[T: not void; E](fut: InternalRaisesFuture[T, E]): lent T +waitFor chronos/internal/asyncfutures.html#waitFor,InternalRaisesFuture[void,E] asyncfutures: waitFor[E](fut: InternalRaisesFuture[void, E]) +`or` chronos/internal/asyncfutures.html#or,InternalRaisesFuture[T,E1],InternalRaisesFuture[Y,E2] asyncfutures: `or`[T, Y, E1, E2](fut1: InternalRaisesFuture[T, E1];\n fut2: InternalRaisesFuture[Y, E2]): auto +wait chronos/internal/asyncfutures.html#wait,InternalRaisesFuture asyncfutures: wait(fut: InternalRaisesFuture; timeout = InfiniteDuration): auto +wait chronos/internal/asyncfutures.html#wait,InternalRaisesFuture,SomeFuture asyncfutures: wait(fut: InternalRaisesFuture; deadline: SomeFuture): auto diff --git a/api/chronos/internal/asyncmacro.html b/api/chronos/internal/asyncmacro.html new file mode 100644 index 00000000..bc7dedb5 --- /dev/null +++ b/api/chronos/internal/asyncmacro.html @@ -0,0 +1,247 @@ + + + + + + + + + + + + + + + + + + +chronos/internal/asyncmacro + + + + + + + + +
+
+

chronos/internal/asyncmacro

+
+
+
+ +     Dark Mode +
+ +
+ Search: +
+
+ Group by: + +
+ + +
+   Source +  Edit + +
+
+ +

+ +
+

Macros

+
+
+
macro async(params, prc: untyped): untyped
+
+ +Macro which processes async procedures into the appropriate iterators and yield statements. +  Source +  Edit + +
+
+
+
macro async(prc: untyped): untyped
+
+ +Macro which processes async procedures into the appropriate iterators and yield statements. +  Source +  Edit + +
+
+ +
+
+

Templates

+
+
+
template await[T, E](fut: InternalRaisesFuture[T, E]): T
+
+ +

Ensure that the given Future is finished, then return its value.

+

If the Future failed or was cancelled, the corresponding exception will be raised instead.

+

If the Future is pending, execution of the current async procedure will be suspended until the Future is finished.

+ +  Source +  Edit + +
+
+
+
template await[T](f: Future[T]): T
+
+ +

Ensure that the given Future is finished, then return its value.

+

If the Future failed or was cancelled, the corresponding exception will be raised instead.

+

If the Future is pending, execution of the current async procedure will be suspended until the Future is finished.

+ +  Source +  Edit + +
+
+
+
template awaitne[T](f: Future[T]): Future[T]
+
+ + +  Source +  Edit + +
+
+ +
+ +
+
+ +
+ +
+
+
+ + + diff --git a/api/chronos/internal/asyncmacro.idx b/api/chronos/internal/asyncmacro.idx new file mode 100644 index 00000000..a5879170 --- /dev/null +++ b/api/chronos/internal/asyncmacro.idx @@ -0,0 +1,5 @@ +await chronos/internal/asyncmacro.html#await.t,Future[T] asyncmacro: await[T](f: Future[T]): T +await chronos/internal/asyncmacro.html#await.t,InternalRaisesFuture[T,E] asyncmacro: await[T, E](fut: InternalRaisesFuture[T, E]): T +awaitne chronos/internal/asyncmacro.html#awaitne.t,Future[T] asyncmacro: awaitne[T](f: Future[T]): Future[T] +async chronos/internal/asyncmacro.html#async.m,untyped,untyped asyncmacro: async(params, prc: untyped): untyped +async chronos/internal/asyncmacro.html#async.m,untyped asyncmacro: async(prc: untyped): untyped diff --git a/api/chronos/internal/errors.html b/api/chronos/internal/errors.html new file mode 100644 index 00000000..00c1f916 --- /dev/null +++ b/api/chronos/internal/errors.html @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + +chronos/internal/errors + + + + + + + + +
+
+

chronos/internal/errors

+
+
+
+ +     Dark Mode +
+ +
+ Search: +
+
+ Group by: + +
+ + +
+   Source +  Edit + +
+
+ +

+
+

Types

+
+
+
AsyncError = object of CatchableError
+  
+
+ +Generic async exception +  Source +  Edit + +
+
+
+
AsyncExceptionError = object of AsyncError
+  
+
+ +Error raised in handleException mode - the original exception is available from the parent field. +  Source +  Edit + +
+
+
+
AsyncTimeoutError = object of AsyncError
+  
+
+ +Timeout exception +  Source +  Edit + +
+
+ +
+ +
+
+ +
+ +
+
+
+ + + diff --git a/api/chronos/internal/errors.idx b/api/chronos/internal/errors.idx new file mode 100644 index 00000000..03510754 --- /dev/null +++ b/api/chronos/internal/errors.idx @@ -0,0 +1,3 @@ +AsyncError chronos/internal/errors.html#AsyncError errors: AsyncError +AsyncTimeoutError chronos/internal/errors.html#AsyncTimeoutError errors: AsyncTimeoutError +AsyncExceptionError chronos/internal/errors.html#AsyncExceptionError errors: AsyncExceptionError diff --git a/api/chronos/internal/raisesfutures.html b/api/chronos/internal/raisesfutures.html new file mode 100644 index 00000000..d14f61c7 --- /dev/null +++ b/api/chronos/internal/raisesfutures.html @@ -0,0 +1,449 @@ + + + + + + + + + + + + + + + + + + +chronos/internal/raisesfutures + + + + + + + + +
+
+

chronos/internal/raisesfutures

+
+ +   Source +  Edit + +
+
+ +

+ +
+

Types

+
+
+
InternalRaisesFuture[T; E] = ref object of Future[T]
+  when E is void:
+      dummy: E
+
+  else:
+      dummy: array[0, E]
+
+  
+
+ +

Future with a tuple of possible exception types eg InternalRaisesFuture[void, (ValueError, OSError)]

+

This type gets injected by async: (raises: ...) and similar utilities and should not be used manually as the internal exception representation is subject to change in future chronos versions.

+ +  Source +  Edit + +
+
+ +
+
+

Procs

+
+
+
func error[T](future: InternalRaisesFuture[T, void]): ref CatchableError {.
+    ...raises: [], raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
func failed[T](future: InternalRaisesFuture[T, void]): bool {.inline, ...raises: [].}
+
+ +Determines whether future finished with an error. +  Source +  Edit + +
+
+
+
proc getRaisesTypes(raises: NimNode): NimNode {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc isNoRaises(n: NimNode): bool {.compileTime, ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc makeNoRaises(): NimNode {.compileTime, ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
func readError[T](future: InternalRaisesFuture[T, void]): ref CatchableError {.
+    ...raises: [ValueError], raises: [].}
+
+ + +  Source +  Edit + +
+
+ +
+
+

Macros

+
+
+
macro checkRaises[T: CatchableError](future: InternalRaisesFuture;
+                                     raises: typed; error: ref T;
+                                     warn: static bool = true): untyped {.
+    ...raises: [].}
+
+ +

Generate code that checks that the given error is compatible with the raises restrictions of future.

+

This check is done either at compile time or runtime depending on the information available at compile time - in particular, if the raises inherit from error, we end up with the equivalent of a downcast which raises a Defect if it fails.

+ +  Source +  Edit + +
+
+
+
macro prepend(tup: typedesc; typs: varargs[typed]): typedesc {....raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
macro Raising[T](F: typedesc[Future[T]]; E: typed): untyped {....raises: [].}
+
+ +

Given a Future type instance, return a type storing {.raises.} information

+

Note; this type may change in the future

+ +  Source +  Edit + +
+
+
+
macro remove(tup: typedesc; typs: varargs[typed]): typedesc {....raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
macro union(tup0: typedesc; tup1: typedesc): typedesc {....raises: [].}
+
+ +Join the types of the two tuples deduplicating the entries +  Source +  Edit + +
+
+ +
+
+

Templates

+
+
+
template init[T, E](F: type InternalRaisesFuture[T, E];
+                    fromProc: static[string] = ""): F:type
+
+ +

Creates a new pending future.

+

Specifying fromProc, which is a string specifying the name of the proc that this future belongs to, is a good habit as it helps with debugging.

+ +  Source +  Edit + +
+
+
+
template init[T, E](F: type InternalRaisesFuture[T, E];
+                    fromProc: static[string] = ""; flags: static[FutureFlags]): F:type
+
+ +

Creates a new pending future.

+

Specifying fromProc, which is a string specifying the name of the proc that this future belongs to, is a good habit as it helps with debugging.

+ +  Source +  Edit + +
+
+ +
+ +
+
+ +
+ +
+
+
+ + + diff --git a/api/chronos/internal/raisesfutures.idx b/api/chronos/internal/raisesfutures.idx new file mode 100644 index 00000000..5a01fe79 --- /dev/null +++ b/api/chronos/internal/raisesfutures.idx @@ -0,0 +1,14 @@ +InternalRaisesFuture chronos/internal/raisesfutures.html#InternalRaisesFuture raisesfutures: InternalRaisesFuture +makeNoRaises chronos/internal/raisesfutures.html#makeNoRaises raisesfutures: makeNoRaises(): NimNode +isNoRaises chronos/internal/raisesfutures.html#isNoRaises,NimNode raisesfutures: isNoRaises(n: NimNode): bool +Raising chronos/internal/raisesfutures.html#Raising.m,typedesc[Future[T]],typed raisesfutures: Raising[T](F: typedesc[Future[T]]; E: typed): untyped +init chronos/internal/raisesfutures.html#init.t,typeInternalRaisesFuture[T,E],static[string] raisesfutures: init[T, E](F: type InternalRaisesFuture[T, E]; fromProc: static[string] = ""): F:type +init chronos/internal/raisesfutures.html#init.t,typeInternalRaisesFuture[T,E],static[string],static[FutureFlags] raisesfutures: init[T, E](F: type InternalRaisesFuture[T, E]; fromProc: static[string] = "";\n flags: static[FutureFlags]): F:type +prepend chronos/internal/raisesfutures.html#prepend.m,typedesc,varargs[typed] raisesfutures: prepend(tup: typedesc; typs: varargs[typed]): typedesc +remove chronos/internal/raisesfutures.html#remove.m,typedesc,varargs[typed] raisesfutures: remove(tup: typedesc; typs: varargs[typed]): typedesc +union chronos/internal/raisesfutures.html#union.m,typedesc,typedesc raisesfutures: union(tup0: typedesc; tup1: typedesc): typedesc +getRaisesTypes chronos/internal/raisesfutures.html#getRaisesTypes,NimNode raisesfutures: getRaisesTypes(raises: NimNode): NimNode +checkRaises chronos/internal/raisesfutures.html#checkRaises.m,InternalRaisesFuture,typed,ref.T,staticbool raisesfutures: checkRaises[T: CatchableError](future: InternalRaisesFuture; raises: typed;\n error: ref T; warn: static bool = true): untyped +failed chronos/internal/raisesfutures.html#failed,InternalRaisesFuture[T,void] raisesfutures: failed[T](future: InternalRaisesFuture[T, void]): bool +error chronos/internal/raisesfutures.html#error,InternalRaisesFuture[T,void] raisesfutures: error[T](future: InternalRaisesFuture[T, void]): ref CatchableError +readError chronos/internal/raisesfutures.html#readError,InternalRaisesFuture[T,void] raisesfutures: readError[T](future: InternalRaisesFuture[T, void]): ref CatchableError diff --git a/api/chronos/osdefs.html b/api/chronos/osdefs.html new file mode 100644 index 00000000..ae059b8f --- /dev/null +++ b/api/chronos/osdefs.html @@ -0,0 +1,2630 @@ + + + + + + + + + + + + + + + + + + +chronos/osdefs + + + + + + + + +
+
+

chronos/osdefs

+
+
+
+ +     Dark Mode +
+ +
+ Search: +
+
+ Group by: + +
+ + +
+   Source +  Edit + +
+
+ +

+ +
+

Types

+
+
+
EpollData {.importc: "epoll_data_t", header: "<sys/epoll.h>", pure, final, union.} = object
+  `ptr`* {.importc: "ptr".}: pointer
+  fd* {.importc: "fd".}: cint
+  u32* {.importc: "u32".}: uint32
+  u64* {.importc: "u64".}: uint64
+
+
+ + +  Source +  Edit + +
+
+
+
EpollEvent {.importc: "struct epoll_event", header: "<sys/epoll.h>", pure,
+             final, packed.} = object
+  events*: uint32
+  data*: EpollData
+
+
+ + +  Source +  Edit + +
+
+
+
IfAddrMessage = object
+  ifa_family*: byte
+  ifa_prefixlen*: byte
+  ifa_flags*: byte
+  ifa_scope*: byte
+  ifa_index*: uint32
+
+
+ + +  Source +  Edit + +
+
+
+
IfInfoMessage = object
+  ifi_family*: byte
+  ifi_pad*: byte
+  ifi_type*: cushort
+  ifi_index*: cint
+  ifi_flags*: cuint
+  ifi_change*: cuint
+
+
+ + +  Source +  Edit + +
+
+
+
NlMsgHeader = object
+  nlmsg_len*: uint32
+  nlmsg_type*: uint16
+  nlmsg_flags*: uint16
+  nlmsg_seq*: uint32
+  nlmsg_pid*: uint32
+
+
+ + +  Source +  Edit + +
+
+
+
NLReq = object
+  hdr*: NlMsgHeader
+  msg*: RtGenMsg
+
+
+ + +  Source +  Edit + +
+
+
+
NLRouteReq = object
+  hdr*: NlMsgHeader
+  msg*: RtMessage
+
+
+ + +  Source +  Edit + +
+
+
+
PosixSpawnAttr {.importc: "posix_spawnattr_t", header: "<spawn.h>", final, pure.} = object
+  flags*: cshort
+  pgrp*: Pid
+  sd*: Sigset
+  ss*: Sigset
+  sp*: SchedParam
+  policy*: cint
+  pad*: array[16, cint]
+
+
+ + +  Source +  Edit + +
+
+
+
PosixSpawnFileActions {.importc: "posix_spawn_file_actions_t",
+                        header: "<spawn.h>", final, pure.} = object
+  allocated*: cint
+  used*: cint
+  actions*: pointer
+  pad*: array[16, cint]
+
+
+ + +  Source +  Edit + +
+
+
+
RtAttr = object
+  rta_len*: cushort
+  rta_type*: cushort
+
+
+ + +  Source +  Edit + +
+
+
+
RtGenMsg = object
+  rtgen_family*: byte
+
+
+ + +  Source +  Edit + +
+
+
+
RtMessage = object
+  rtm_family*: byte
+  rtm_dst_len*: byte
+  rtm_src_len*: byte
+  rtm_tos*: byte
+  rtm_table*: byte
+  rtm_protocol*: byte
+  rtm_scope*: byte
+  rtm_type*: byte
+  rtm_flags*: cuint
+
+
+ + +  Source +  Edit + +
+
+
+
SchedParam {.importc: "struct sched_param", header: "<sched.h>", final, pure.} = object
+  sched_priority*: cint
+  sched_ss_low_priority*: cint ## Low scheduling priority for
+                               ## sporadic server.
+  sched_ss_repl_period*: Timespec ## Replenishment period for
+                                  ## sporadic server.
+  sched_ss_init_budget*: Timespec ## Initial budget for sporadic server.
+  sched_ss_max_repl*: cint   ## Maximum pending replenishments for
+                             ## sporadic server.
+  
+
+ +struct sched_param +  Source +  Edit + +
+
+
+
SignalFdInfo {.importc: "struct signalfd_siginfo", header: "<sys/signalfd.h>",
+               pure, final.} = object
+  ssi_signo*: uint32
+  ssi_errno*: int32
+  ssi_code*: int32
+  ssi_pid*: uint32
+  ssi_uid*: uint32
+  ssi_fd*: int32
+  ssi_tid*: uint32
+  ssi_band*: uint32
+  ssi_overrun*: uint32
+  ssi_trapno*: uint32
+  ssi_status*: int32
+  ssi_int*: int32
+  ssi_ptr*: uint64
+  ssi_utime*: uint64
+  ssi_stime*: uint64
+  ssi_addr*: uint64
+  pad* {.importc: "__pad".}: array[0 .. 47, uint8]
+
+
+ + +  Source +  Edit + +
+
+
+
Sockaddr_nl = object
+  family*: cushort
+  pad*: cushort
+  pid*: uint32
+  groups*: uint32
+
+
+ + +  Source +  Edit + +
+
+ +
+
+

Consts

+
+ +
+
AF_PACKET = 17'i32
+
+ + +  Source +  Edit + +
+
+
+
ARPHRD_ARCNET = 7
+
+ + +  Source +  Edit + +
+
+
+
ARPHRD_ATM = 19
+
+ + +  Source +  Edit + +
+
+
+
ARPHRD_CISCO = 513
+
+ + +  Source +  Edit + +
+
+
+
ARPHRD_CSLIP = 257
+
+ + +  Source +  Edit + +
+
+
+
ARPHRD_CSLIP6 = 259
+
+ + +  Source +  Edit + +
+
+
+
ARPHRD_EETHER = 2
+
+ + +  Source +  Edit + +
+
+
+
ARPHRD_ETHER = 1
+
+ + +  Source +  Edit + +
+
+
+
ARPHRD_FRAD = 770
+
+ + +  Source +  Edit + +
+
+
+
ARPHRD_HDLC = 513
+
+ + +  Source +  Edit + +
+
+
+
ARPHRD_HIPPI = 780
+
+ + +  Source +  Edit + +
+
+
+
ARPHRD_IEEE1394 = 24
+
+ + +  Source +  Edit + +
+
+
+
ARPHRD_IEEE80211 = 801
+
+ + +  Source +  Edit + +
+
+
+
ARPHRD_IEEE80211_PRISM = 802
+
+ + +  Source +  Edit + +
+
+
+
ARPHRD_IEEE80211_RADIOTAP = 803
+
+ + +  Source +  Edit + +
+
+
+
ARPHRD_LAPB = 516
+
+ + +  Source +  Edit + +
+
+
+
ARPHRD_LOOPBACK = 772
+
+ + +  Source +  Edit + +
+
+
+
ARPHRD_PPP = 512
+
+ + +  Source +  Edit + +
+
+
+
ARPHRD_SLIP = 256
+
+ + +  Source +  Edit + +
+
+
+
ARPHRD_SLIP6 = 258
+
+ + +  Source +  Edit + +
+
+
+
EFD_CLOEXEC = 524288'i32
+
+ + +  Source +  Edit + +
+
+
+
EFD_NONBLOCK = 2048'i32
+
+ + +  Source +  Edit + +
+
+
+
EPOLL_CTL_ADD = 1
+
+ + +  Source +  Edit + +
+
+
+
EPOLL_CTL_DEL = 2
+
+ + +  Source +  Edit + +
+
+
+
EPOLL_CTL_MOD = 3
+
+ + +  Source +  Edit + +
+
+
+
EPOLLERR = 0x00000008
+
+ + +  Source +  Edit + +
+
+
+
EPOLLET = 2147483648
+
+ + +  Source +  Edit + +
+
+
+
EPOLLEXCLUSIVE = 268435456
+
+ + +  Source +  Edit + +
+
+
+
EPOLLHUP = 0x00000010
+
+ + +  Source +  Edit + +
+
+
+
EPOLLIN = 0x00000001
+
+ + +  Source +  Edit + +
+
+
+
EPOLLMSG = 0x00000400
+
+ + +  Source +  Edit + +
+
+
+
EPOLLONESHOT = 1073741824
+
+ + +  Source +  Edit + +
+
+
+
EPOLLOUT = 0x00000004
+
+ + +  Source +  Edit + +
+
+
+
EPOLLPRI = 0x00000002
+
+ + +  Source +  Edit + +
+
+
+
EPOLLRDBAND = 0x00000080
+
+ + +  Source +  Edit + +
+
+
+
EPOLLRDHUP = 0x00002000
+
+ + +  Source +  Edit + +
+
+
+
EPOLLRDNORM = 0x00000040
+
+ + +  Source +  Edit + +
+
+
+
EPOLLWAKEUP = 536870912
+
+ + +  Source +  Edit + +
+
+
+
EPOLLWRBAND = 0x00000200
+
+ + +  Source +  Edit + +
+
+
+
EPOLLWRNORM = 0x00000100
+
+ + +  Source +  Edit + +
+
+
+
IFA_ADDRESS = 1
+
+ + +  Source +  Edit + +
+
+
+
IFA_LOCAL = 2
+
+ + +  Source +  Edit + +
+
+
+
IFLA_ADDRESS = 1
+
+ + +  Source +  Edit + +
+
+
+
IFLA_IFNAME = 3
+
+ + +  Source +  Edit + +
+
+
+
IFLA_MTU = 4
+
+ + +  Source +  Edit + +
+
+
+
IFLA_OPERSTATE = 16
+
+ + +  Source +  Edit + +
+
+
+
IFLIST_REPLY_BUFFER = 8192
+
+ + +  Source +  Edit + +
+
+
+
INVALID_HANDLE_VALUE = -1'i32
+
+ + +  Source +  Edit + +
+
+
+
INVALID_SOCKET = -1'i32
+
+ + +  Source +  Edit + +
+
+
+
InvalidSocketHandle = -1'i32
+
+ + +  Source +  Edit + +
+
+
+
IP_MULTICAST_TTL: cint = 33
+
+ + +  Source +  Edit + +
+
+
+
IPPROTO_TCP = 6
+
+ + +  Source +  Edit + +
+
+
+
IPV6_V6ONLY = 26
+
+ + +  Source +  Edit + +
+
+ +
+
NLM_F_DUMP = 768
+
+ + +  Source +  Edit + +
+
+
+
NLM_F_MATCH = 0x00000200
+
+ + +  Source +  Edit + +
+
+
+
NLM_F_REQUEST = 1
+
+ + +  Source +  Edit + +
+
+
+
NLM_F_ROOT = 0x00000100
+
+ + +  Source +  Edit + +
+
+
+
NLMSG_ALIGNTO = 4'u
+
+ + +  Source +  Edit + +
+
+
+
NLMSG_DONE = 0x00000003
+
+ + +  Source +  Edit + +
+
+
+
NLMSG_ERROR = 0x00000002
+
+ + +  Source +  Edit + +
+
+
+
O_CLOEXEC = 0x00080000
+
+ + +  Source +  Edit + +
+
+
+
P_PID = 1'i32
+
+ + +  Source +  Edit + +
+
+
+
POSIX_SPAWN_RESETIDS = 0x00000001
+
+ + +  Source +  Edit + +
+
+
+
POSIX_SPAWN_SETPGROUP = 0x00000002
+
+ + +  Source +  Edit + +
+
+
+
POSIX_SPAWN_SETSCHEDPARAM = 0x00000004
+
+ + +  Source +  Edit + +
+
+
+
POSIX_SPAWN_SETSCHEDULER = 0x00000008
+
+ + +  Source +  Edit + +
+
+
+
POSIX_SPAWN_SETSIGDEF = 0x00000010
+
+ + +  Source +  Edit + +
+
+
+
POSIX_SPAWN_SETSIGMASK = 0x00000020
+
+ + +  Source +  Edit + +
+
+
+
POSIX_SPAWN_USEVFORK = 0x00000040
+
+ + +  Source +  Edit + +
+
+
+
RTA_ALIGNTO = 4'u
+
+ + +  Source +  Edit + +
+
+
+
RTA_DST = 1'u16
+
+ + +  Source +  Edit + +
+
+
+
RTA_GATEWAY = 5'u16
+
+ + +  Source +  Edit + +
+
+
+
RTA_OIF = 4'u16
+
+ + +  Source +  Edit + +
+
+
+
RTA_PREFSRC = 7'u16
+
+ + +  Source +  Edit + +
+
+
+
RTM_F_LOOKUP_TABLE = 0x00001000
+
+ + +  Source +  Edit + +
+
+
+
RTM_GETADDR = 22
+
+ + +  Source +  Edit + +
+
+ +
+
RTM_GETROUTE = 26
+
+ + +  Source +  Edit + +
+
+ +
+
RTM_NEWROUTE = 24'u16
+
+ + +  Source +  Edit + +
+
+
+
SFD_CLOEXEC = 524288'i32
+
+ + +  Source +  Edit + +
+
+
+
SFD_NONBLOCK = 2048'i32
+
+ + +  Source +  Edit + +
+
+
+
SOCK_CLOEXEC = 0x00080000
+
+ + +  Source +  Edit + +
+
+
+
SOCK_NONBLOCK = 0x00000800
+
+ + +  Source +  Edit + +
+
+
+
TCP_NODELAY = 1'i32
+
+ + +  Source +  Edit + +
+
+
+
TFD_CLOEXEC = 524288'i32
+
+ + +  Source +  Edit + +
+
+
+
TFD_NONBLOCK = 2048'i32
+
+ + +  Source +  Edit + +
+
+
+
WEXITED = 4'i32
+
+ + +  Source +  Edit + +
+
+
+
WNOHANG = 1'i32
+
+ + +  Source +  Edit + +
+
+
+
WNOWAIT = 16777216'i32
+
+ + +  Source +  Edit + +
+
+
+
WSTOPPED = 2'i32
+
+ + +  Source +  Edit + +
+
+ +
+
+

Procs

+
+
+
proc `==`(x: SocketHandle; y: int): bool {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc `==`(x: SocketHandle; y: SocketHandle): bool {.borrow, ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc accept4(a1: cint; a2: ptr SockAddr; a3: ptr SockLen; a4: cint): cint {.
+    importc, header: "<sys/socket.h>", sideEffect, ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc epoll_create(size: cint): cint {.importc: "epoll_create",
+                                      header: "<sys/epoll.h>", sideEffect,
+                                      ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc epoll_create1(flags: cint): cint {.importc: "epoll_create1",
+                                        header: "<sys/epoll.h>", sideEffect,
+                                        ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc epoll_ctl(epfd: cint; op: cint; fd: cint; event: ptr EpollEvent): cint {.
+    importc: "epoll_ctl", header: "<sys/epoll.h>", sideEffect, ...raises: [],
+    tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc epoll_wait(epfd: cint; events: ptr EpollEvent; maxevents: cint;
+                timeout: cint): cint {.importc: "epoll_wait",
+                                       header: "<sys/epoll.h>", sideEffect,
+                                       ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc eventfd(count: cuint; flags: cint): cint {.cdecl, importc: "eventfd",
+    header: "<sys/eventfd.h>", ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc pipe2(a: array[0 .. 1, cint]; flags: cint): cint {.importc,
+    header: "<unistd.h>", sideEffect, ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc posixSpawn(a1: var Pid; a2: cstring; a3: var PosixSpawnFileActions;
+                a4: var PosixSpawnAttr; a5, a6: cstringArray): cint {.
+    importc: "posix_spawn", header: "<spawn.h>", sideEffect, ...raises: [],
+    tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc posixSpawnAttrDestroy(a1: var PosixSpawnAttr): cint {.
+    importc: "posix_spawnattr_destroy", header: "<spawn.h>", sideEffect,
+    ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc posixSpawnAttrGetFlags(a1: var PosixSpawnAttr; a2: var cshort): cint {.
+    importc: "posix_spawnattr_getflags", header: "<spawn.h>", sideEffect,
+    ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc posixSpawnAttrGetPgroup(a1: var PosixSpawnAttr; a2: var Pid): cint {.
+    importc: "posix_spawnattr_getpgroup", header: "<spawn.h>", sideEffect,
+    ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc posixSpawnAttrGetSchedParam(a1: var PosixSpawnAttr; a2: var SchedParam): cint {.
+    importc: "posix_spawnattr_getschedparam", header: "<spawn.h>", sideEffect,
+    ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc posixSpawnAttrGetSchedPolicy(a1: var PosixSpawnAttr; a2: var cint): cint {.
+    importc: "posix_spawnattr_getschedpolicy", header: "<spawn.h>", sideEffect,
+    ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc posixSpawnAttrGetSigDefault(a1: var PosixSpawnAttr; a2: var Sigset): cint {.
+    importc: "posix_spawnattr_getsigdefault", header: "<spawn.h>", sideEffect,
+    ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc posixSpawnAttrGetSigMask(a1: var PosixSpawnAttr; a2: var Sigset): cint {.
+    importc: "posix_spawnattr_getsigmask", header: "<spawn.h>", sideEffect,
+    ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc posixSpawnAttrInit(a1: var PosixSpawnAttr): cint {.
+    importc: "posix_spawnattr_init", header: "<spawn.h>", sideEffect,
+    ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc posixSpawnAttrSetFlags(a1: var PosixSpawnAttr; a2: cint): cint {.
+    importc: "posix_spawnattr_setflags", header: "<spawn.h>", sideEffect,
+    ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc posixSpawnAttrSetPgroup(a1: var PosixSpawnAttr; a2: Pid): cint {.
+    importc: "posix_spawnattr_setpgroup", header: "<spawn.h>", sideEffect,
+    ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc posixSpawnAttrSetSchedParam(a1: var PosixSpawnAttr; a2: var SchedParam): cint {.
+    importc: "posix_spawnattr_setschedparam", header: "<spawn.h>", sideEffect,
+    ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc posixSpawnAttrSetSchedPolicy(a1: var PosixSpawnAttr; a2: cint): cint {.
+    importc: "posix_spawnattr_setschedpolicy", header: "<spawn.h>", sideEffect,
+    ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc posixSpawnAttrSetSigDefault(a1: var PosixSpawnAttr; a2: var Sigset): cint {.
+    importc: "posix_spawnattr_setsigdefault", header: "<spawn.h>", sideEffect,
+    ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc posixSpawnAttrSetSigMask(a1: var PosixSpawnAttr; a2: var Sigset): cint {.
+    importc: "posix_spawnattr_setsigmask", header: "<spawn.h>", sideEffect,
+    ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc posixSpawnFileActionsAddClose(a1: var PosixSpawnFileActions; a2: cint): cint {.
+    importc: "posix_spawn_file_actions_addclose", header: "<spawn.h>",
+    sideEffect, ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc posixSpawnFileActionsAddDup2(a1: var PosixSpawnFileActions; a2, a3: cint): cint {.
+    importc: "posix_spawn_file_actions_adddup2", header: "<spawn.h>",
+    sideEffect, ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc posixSpawnFileActionsAddOpen(a1: var PosixSpawnFileActions; a2: cint;
+                                  a3: cstring; a4: cint; a5: Mode): cint {.
+    importc: "posix_spawn_file_actions_addopen", header: "<spawn.h>",
+    sideEffect, ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc posixSpawnFileActionsDestroy(a1: var PosixSpawnFileActions): cint {.
+    importc: "posix_spawn_file_actions_destroy", header: "<spawn.h>",
+    sideEffect, ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc posixSpawnFileActionsInit(a1: var PosixSpawnFileActions): cint {.
+    importc: "posix_spawn_file_actions_init", header: "<spawn.h>", sideEffect,
+    ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc posixSpawnp(a1: var Pid; a2: cstring; a3: var PosixSpawnFileActions;
+                 a4: var PosixSpawnAttr; a5, a6: cstringArray): cint {.
+    importc: "posix_spawnp", header: "<spawn.h>", sideEffect, ...raises: [],
+    tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc signalfd(fd: cint; mask: var Sigset; flags: cint): cint {.cdecl,
+    importc: "signalfd", header: "<sys/signalfd.h>", ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc timerfd_create(clock_id: ClockId; flags: cint): cint {.cdecl,
+    importc: "timerfd_create", header: "<sys/timerfd.h>", ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc timerfd_settime(ufd: cint; flags: cint; utmr: var Itimerspec;
+                     otmr: var Itimerspec): cint {.cdecl,
+    importc: "timerfd_settime", header: "<sys/timerfd.h>", ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+ +
+
+

Templates

+
+
+
template WAITEXITSTATUS(s: cint): cint
+
+ + +  Source +  Edit + +
+
+
+
template WAITIFCONTINUED(s: cint): bool
+
+ + +  Source +  Edit + +
+
+
+
template WAITIFEXITED(s: cint): bool
+
+ + +  Source +  Edit + +
+
+
+
template WAITIFSIGNALED(s: cint): bool
+
+ + +  Source +  Edit + +
+
+
+
template WAITIFSTOPPED(s: cint): bool
+
+ + +  Source +  Edit + +
+
+
+
template WAITSTOPSIG(s: cint): cint
+
+ + +  Source +  Edit + +
+
+
+
template WAITTERMSIG(s: cint): cint
+
+ + +  Source +  Edit + +
+
+ +
+ + +
+
+ +
+ +
+
+
+ + + diff --git a/api/chronos/osdefs.idx b/api/chronos/osdefs.idx new file mode 100644 index 00000000..d130de4f --- /dev/null +++ b/api/chronos/osdefs.idx @@ -0,0 +1,148 @@ +IP_MULTICAST_TTL chronos/osdefs.html#IP_MULTICAST_TTL osdefs: IP_MULTICAST_TTL +EPOLLIN chronos/osdefs.html#EPOLLIN osdefs: EPOLLIN +EPOLLPRI chronos/osdefs.html#EPOLLPRI osdefs: EPOLLPRI +EPOLLOUT chronos/osdefs.html#EPOLLOUT osdefs: EPOLLOUT +EPOLLERR chronos/osdefs.html#EPOLLERR osdefs: EPOLLERR +EPOLLHUP chronos/osdefs.html#EPOLLHUP osdefs: EPOLLHUP +EPOLLRDNORM chronos/osdefs.html#EPOLLRDNORM osdefs: EPOLLRDNORM +EPOLLRDBAND chronos/osdefs.html#EPOLLRDBAND osdefs: EPOLLRDBAND +EPOLLWRNORM chronos/osdefs.html#EPOLLWRNORM osdefs: EPOLLWRNORM +EPOLLWRBAND chronos/osdefs.html#EPOLLWRBAND osdefs: EPOLLWRBAND +EPOLLMSG chronos/osdefs.html#EPOLLMSG osdefs: EPOLLMSG +EPOLLRDHUP chronos/osdefs.html#EPOLLRDHUP osdefs: EPOLLRDHUP +EPOLLEXCLUSIVE chronos/osdefs.html#EPOLLEXCLUSIVE osdefs: EPOLLEXCLUSIVE +EPOLLWAKEUP chronos/osdefs.html#EPOLLWAKEUP osdefs: EPOLLWAKEUP +EPOLLONESHOT chronos/osdefs.html#EPOLLONESHOT osdefs: EPOLLONESHOT +EPOLLET chronos/osdefs.html#EPOLLET osdefs: EPOLLET +SFD_CLOEXEC chronos/osdefs.html#SFD_CLOEXEC osdefs: SFD_CLOEXEC +SFD_NONBLOCK chronos/osdefs.html#SFD_NONBLOCK osdefs: SFD_NONBLOCK +EFD_CLOEXEC chronos/osdefs.html#EFD_CLOEXEC osdefs: EFD_CLOEXEC +EFD_NONBLOCK chronos/osdefs.html#EFD_NONBLOCK osdefs: EFD_NONBLOCK +TFD_CLOEXEC chronos/osdefs.html#TFD_CLOEXEC osdefs: TFD_CLOEXEC +TFD_NONBLOCK chronos/osdefs.html#TFD_NONBLOCK osdefs: TFD_NONBLOCK +EPOLL_CTL_ADD chronos/osdefs.html#EPOLL_CTL_ADD osdefs: EPOLL_CTL_ADD +EPOLL_CTL_DEL chronos/osdefs.html#EPOLL_CTL_DEL osdefs: EPOLL_CTL_DEL +EPOLL_CTL_MOD chronos/osdefs.html#EPOLL_CTL_MOD osdefs: EPOLL_CTL_MOD +EpollData chronos/osdefs.html#EpollData osdefs: EpollData +EpollEvent chronos/osdefs.html#EpollEvent osdefs: EpollEvent +SignalFdInfo chronos/osdefs.html#SignalFdInfo osdefs: SignalFdInfo +epoll_create chronos/osdefs.html#epoll_create,cint osdefs: epoll_create(size: cint): cint +epoll_create1 chronos/osdefs.html#epoll_create1,cint osdefs: epoll_create1(flags: cint): cint +epoll_ctl chronos/osdefs.html#epoll_ctl,cint,cint,cint,ptr.EpollEvent osdefs: epoll_ctl(epfd: cint; op: cint; fd: cint; event: ptr EpollEvent): cint +epoll_wait chronos/osdefs.html#epoll_wait,cint,ptr.EpollEvent,cint,cint osdefs: epoll_wait(epfd: cint; events: ptr EpollEvent; maxevents: cint; timeout: cint): cint +timerfd_create chronos/osdefs.html#timerfd_create,ClockId,cint osdefs: timerfd_create(clock_id: ClockId; flags: cint): cint +timerfd_settime chronos/osdefs.html#timerfd_settime,cint,cint,Itimerspec,Itimerspec osdefs: timerfd_settime(ufd: cint; flags: cint; utmr: var Itimerspec;\n otmr: var Itimerspec): cint +eventfd chronos/osdefs.html#eventfd,cuint,cint osdefs: eventfd(count: cuint; flags: cint): cint +signalfd chronos/osdefs.html#signalfd,cint,Sigset,cint osdefs: signalfd(fd: cint; mask: var Sigset; flags: cint): cint +pipe2 chronos/osdefs.html#pipe2,array[,cint],cint osdefs: pipe2(a: array[0 .. 1, cint]; flags: cint): cint +accept4 chronos/osdefs.html#accept4,cint,ptr.SockAddr,ptr.SockLen,cint osdefs: accept4(a1: cint; a2: ptr SockAddr; a3: ptr SockLen; a4: cint): cint +SOCK_NONBLOCK chronos/osdefs.html#SOCK_NONBLOCK osdefs: SOCK_NONBLOCK +SOCK_CLOEXEC chronos/osdefs.html#SOCK_CLOEXEC osdefs: SOCK_CLOEXEC +TCP_NODELAY chronos/osdefs.html#TCP_NODELAY osdefs: TCP_NODELAY +IPPROTO_TCP chronos/osdefs.html#IPPROTO_TCP osdefs: IPPROTO_TCP +O_CLOEXEC chronos/osdefs.html#O_CLOEXEC osdefs: O_CLOEXEC +POSIX_SPAWN_USEVFORK chronos/osdefs.html#POSIX_SPAWN_USEVFORK osdefs: POSIX_SPAWN_USEVFORK +IPV6_V6ONLY chronos/osdefs.html#IPV6_V6ONLY osdefs: IPV6_V6ONLY +POSIX_SPAWN_RESETIDS chronos/osdefs.html#POSIX_SPAWN_RESETIDS osdefs: POSIX_SPAWN_RESETIDS +POSIX_SPAWN_SETPGROUP chronos/osdefs.html#POSIX_SPAWN_SETPGROUP osdefs: POSIX_SPAWN_SETPGROUP +POSIX_SPAWN_SETSCHEDPARAM chronos/osdefs.html#POSIX_SPAWN_SETSCHEDPARAM osdefs: POSIX_SPAWN_SETSCHEDPARAM +POSIX_SPAWN_SETSCHEDULER chronos/osdefs.html#POSIX_SPAWN_SETSCHEDULER osdefs: POSIX_SPAWN_SETSCHEDULER +POSIX_SPAWN_SETSIGDEF chronos/osdefs.html#POSIX_SPAWN_SETSIGDEF osdefs: POSIX_SPAWN_SETSIGDEF +POSIX_SPAWN_SETSIGMASK chronos/osdefs.html#POSIX_SPAWN_SETSIGMASK osdefs: POSIX_SPAWN_SETSIGMASK +SchedParam chronos/osdefs.html#SchedParam osdefs: SchedParam +PosixSpawnAttr chronos/osdefs.html#PosixSpawnAttr osdefs: PosixSpawnAttr +PosixSpawnFileActions chronos/osdefs.html#PosixSpawnFileActions osdefs: PosixSpawnFileActions +posixSpawn chronos/osdefs.html#posixSpawn,Pid,cstring,PosixSpawnFileActions,PosixSpawnAttr,cstringArray,cstringArray osdefs: posixSpawn(a1: var Pid; a2: cstring; a3: var PosixSpawnFileActions;\n a4: var PosixSpawnAttr; a5, a6: cstringArray): cint +posixSpawnp chronos/osdefs.html#posixSpawnp,Pid,cstring,PosixSpawnFileActions,PosixSpawnAttr,cstringArray,cstringArray osdefs: posixSpawnp(a1: var Pid; a2: cstring; a3: var PosixSpawnFileActions;\n a4: var PosixSpawnAttr; a5, a6: cstringArray): cint +posixSpawnFileActionsInit chronos/osdefs.html#posixSpawnFileActionsInit,PosixSpawnFileActions osdefs: posixSpawnFileActionsInit(a1: var PosixSpawnFileActions): cint +posixSpawnFileActionsDestroy chronos/osdefs.html#posixSpawnFileActionsDestroy,PosixSpawnFileActions osdefs: posixSpawnFileActionsDestroy(a1: var PosixSpawnFileActions): cint +posixSpawnFileActionsAddClose chronos/osdefs.html#posixSpawnFileActionsAddClose,PosixSpawnFileActions,cint osdefs: posixSpawnFileActionsAddClose(a1: var PosixSpawnFileActions; a2: cint): cint +posixSpawnFileActionsAddDup2 chronos/osdefs.html#posixSpawnFileActionsAddDup2,PosixSpawnFileActions,cint,cint osdefs: posixSpawnFileActionsAddDup2(a1: var PosixSpawnFileActions; a2, a3: cint): cint +posixSpawnFileActionsAddOpen chronos/osdefs.html#posixSpawnFileActionsAddOpen,PosixSpawnFileActions,cint,cstring,cint,Mode osdefs: posixSpawnFileActionsAddOpen(a1: var PosixSpawnFileActions; a2: cint;\n a3: cstring; a4: cint; a5: Mode): cint +posixSpawnAttrInit chronos/osdefs.html#posixSpawnAttrInit,PosixSpawnAttr osdefs: posixSpawnAttrInit(a1: var PosixSpawnAttr): cint +posixSpawnAttrDestroy chronos/osdefs.html#posixSpawnAttrDestroy,PosixSpawnAttr osdefs: posixSpawnAttrDestroy(a1: var PosixSpawnAttr): cint +posixSpawnAttrGetSigDefault chronos/osdefs.html#posixSpawnAttrGetSigDefault,PosixSpawnAttr,Sigset osdefs: posixSpawnAttrGetSigDefault(a1: var PosixSpawnAttr; a2: var Sigset): cint +posixSpawnAttrSetSigDefault chronos/osdefs.html#posixSpawnAttrSetSigDefault,PosixSpawnAttr,Sigset osdefs: posixSpawnAttrSetSigDefault(a1: var PosixSpawnAttr; a2: var Sigset): cint +posixSpawnAttrGetFlags chronos/osdefs.html#posixSpawnAttrGetFlags,PosixSpawnAttr,cshort osdefs: posixSpawnAttrGetFlags(a1: var PosixSpawnAttr; a2: var cshort): cint +posixSpawnAttrSetFlags chronos/osdefs.html#posixSpawnAttrSetFlags,PosixSpawnAttr,cint osdefs: posixSpawnAttrSetFlags(a1: var PosixSpawnAttr; a2: cint): cint +posixSpawnAttrGetPgroup chronos/osdefs.html#posixSpawnAttrGetPgroup,PosixSpawnAttr,Pid osdefs: posixSpawnAttrGetPgroup(a1: var PosixSpawnAttr; a2: var Pid): cint +posixSpawnAttrSetPgroup chronos/osdefs.html#posixSpawnAttrSetPgroup,PosixSpawnAttr,Pid osdefs: posixSpawnAttrSetPgroup(a1: var PosixSpawnAttr; a2: Pid): cint +posixSpawnAttrGetSchedParam chronos/osdefs.html#posixSpawnAttrGetSchedParam,PosixSpawnAttr,SchedParam osdefs: posixSpawnAttrGetSchedParam(a1: var PosixSpawnAttr; a2: var SchedParam): cint +posixSpawnAttrSetSchedParam chronos/osdefs.html#posixSpawnAttrSetSchedParam,PosixSpawnAttr,SchedParam osdefs: posixSpawnAttrSetSchedParam(a1: var PosixSpawnAttr; a2: var SchedParam): cint +posixSpawnAttrGetSchedPolicy chronos/osdefs.html#posixSpawnAttrGetSchedPolicy,PosixSpawnAttr,cint osdefs: posixSpawnAttrGetSchedPolicy(a1: var PosixSpawnAttr; a2: var cint): cint +posixSpawnAttrSetSchedPolicy chronos/osdefs.html#posixSpawnAttrSetSchedPolicy,PosixSpawnAttr,cint osdefs: posixSpawnAttrSetSchedPolicy(a1: var PosixSpawnAttr; a2: cint): cint +posixSpawnAttrGetSigMask chronos/osdefs.html#posixSpawnAttrGetSigMask,PosixSpawnAttr,Sigset osdefs: posixSpawnAttrGetSigMask(a1: var PosixSpawnAttr; a2: var Sigset): cint +posixSpawnAttrSetSigMask chronos/osdefs.html#posixSpawnAttrSetSigMask,PosixSpawnAttr,Sigset osdefs: posixSpawnAttrSetSigMask(a1: var PosixSpawnAttr; a2: var Sigset): cint +P_PID chronos/osdefs.html#P_PID osdefs: P_PID +WNOHANG chronos/osdefs.html#WNOHANG osdefs: WNOHANG +WSTOPPED chronos/osdefs.html#WSTOPPED osdefs: WSTOPPED +WEXITED chronos/osdefs.html#WEXITED osdefs: WEXITED +WNOWAIT chronos/osdefs.html#WNOWAIT osdefs: WNOWAIT +WAITEXITSTATUS chronos/osdefs.html#WAITEXITSTATUS.t,cint osdefs: WAITEXITSTATUS(s: cint): cint +WAITTERMSIG chronos/osdefs.html#WAITTERMSIG.t,cint osdefs: WAITTERMSIG(s: cint): cint +WAITSTOPSIG chronos/osdefs.html#WAITSTOPSIG.t,cint osdefs: WAITSTOPSIG(s: cint): cint +WAITIFEXITED chronos/osdefs.html#WAITIFEXITED.t,cint osdefs: WAITIFEXITED(s: cint): bool +WAITIFSIGNALED chronos/osdefs.html#WAITIFSIGNALED.t,cint osdefs: WAITIFSIGNALED(s: cint): bool +WAITIFSTOPPED chronos/osdefs.html#WAITIFSTOPPED.t,cint osdefs: WAITIFSTOPPED(s: cint): bool +WAITIFCONTINUED chronos/osdefs.html#WAITIFCONTINUED.t,cint osdefs: WAITIFCONTINUED(s: cint): bool +INVALID_SOCKET chronos/osdefs.html#INVALID_SOCKET osdefs: INVALID_SOCKET +INVALID_HANDLE_VALUE chronos/osdefs.html#INVALID_HANDLE_VALUE osdefs: INVALID_HANDLE_VALUE +`==` chronos/osdefs.html#==,SocketHandle,int osdefs: `==`(x: SocketHandle; y: int): bool +`==` chronos/osdefs.html#==,SocketHandle,SocketHandle osdefs: `==`(x: SocketHandle; y: SocketHandle): bool +AF_NETLINK chronos/osdefs.html#AF_NETLINK osdefs: AF_NETLINK +AF_PACKET chronos/osdefs.html#AF_PACKET osdefs: AF_PACKET +NETLINK_ROUTE chronos/osdefs.html#NETLINK_ROUTE osdefs: NETLINK_ROUTE +NLMSG_ALIGNTO chronos/osdefs.html#NLMSG_ALIGNTO osdefs: NLMSG_ALIGNTO +RTA_ALIGNTO chronos/osdefs.html#RTA_ALIGNTO osdefs: RTA_ALIGNTO +RTA_DST chronos/osdefs.html#RTA_DST osdefs: RTA_DST +RTA_OIF chronos/osdefs.html#RTA_OIF osdefs: RTA_OIF +RTA_GATEWAY chronos/osdefs.html#RTA_GATEWAY osdefs: RTA_GATEWAY +RTA_PREFSRC chronos/osdefs.html#RTA_PREFSRC osdefs: RTA_PREFSRC +RTM_NEWLINK chronos/osdefs.html#RTM_NEWLINK osdefs: RTM_NEWLINK +RTM_NEWROUTE chronos/osdefs.html#RTM_NEWROUTE osdefs: RTM_NEWROUTE +RTM_F_LOOKUP_TABLE chronos/osdefs.html#RTM_F_LOOKUP_TABLE osdefs: RTM_F_LOOKUP_TABLE +RTM_GETLINK chronos/osdefs.html#RTM_GETLINK osdefs: RTM_GETLINK +RTM_GETADDR chronos/osdefs.html#RTM_GETADDR osdefs: RTM_GETADDR +RTM_GETROUTE chronos/osdefs.html#RTM_GETROUTE osdefs: RTM_GETROUTE +NLM_F_REQUEST chronos/osdefs.html#NLM_F_REQUEST osdefs: NLM_F_REQUEST +NLM_F_ROOT chronos/osdefs.html#NLM_F_ROOT osdefs: NLM_F_ROOT +NLM_F_MATCH chronos/osdefs.html#NLM_F_MATCH osdefs: NLM_F_MATCH +NLM_F_DUMP chronos/osdefs.html#NLM_F_DUMP osdefs: NLM_F_DUMP +IFLIST_REPLY_BUFFER chronos/osdefs.html#IFLIST_REPLY_BUFFER osdefs: IFLIST_REPLY_BUFFER +InvalidSocketHandle chronos/osdefs.html#InvalidSocketHandle osdefs: InvalidSocketHandle +NLMSG_DONE chronos/osdefs.html#NLMSG_DONE osdefs: NLMSG_DONE +NLMSG_ERROR chronos/osdefs.html#NLMSG_ERROR osdefs: NLMSG_ERROR +IFLA_ADDRESS chronos/osdefs.html#IFLA_ADDRESS osdefs: IFLA_ADDRESS +IFLA_IFNAME chronos/osdefs.html#IFLA_IFNAME osdefs: IFLA_IFNAME +IFLA_MTU chronos/osdefs.html#IFLA_MTU osdefs: IFLA_MTU +IFLA_OPERSTATE chronos/osdefs.html#IFLA_OPERSTATE osdefs: IFLA_OPERSTATE +IFA_ADDRESS chronos/osdefs.html#IFA_ADDRESS osdefs: IFA_ADDRESS +IFA_LOCAL chronos/osdefs.html#IFA_LOCAL osdefs: IFA_LOCAL +ARPHRD_ETHER chronos/osdefs.html#ARPHRD_ETHER osdefs: ARPHRD_ETHER +ARPHRD_EETHER chronos/osdefs.html#ARPHRD_EETHER osdefs: ARPHRD_EETHER +ARPHRD_ARCNET chronos/osdefs.html#ARPHRD_ARCNET osdefs: ARPHRD_ARCNET +ARPHRD_ATM chronos/osdefs.html#ARPHRD_ATM osdefs: ARPHRD_ATM +ARPHRD_IEEE1394 chronos/osdefs.html#ARPHRD_IEEE1394 osdefs: ARPHRD_IEEE1394 +ARPHRD_SLIP chronos/osdefs.html#ARPHRD_SLIP osdefs: ARPHRD_SLIP +ARPHRD_CSLIP chronos/osdefs.html#ARPHRD_CSLIP osdefs: ARPHRD_CSLIP +ARPHRD_SLIP6 chronos/osdefs.html#ARPHRD_SLIP6 osdefs: ARPHRD_SLIP6 +ARPHRD_CSLIP6 chronos/osdefs.html#ARPHRD_CSLIP6 osdefs: ARPHRD_CSLIP6 +ARPHRD_PPP chronos/osdefs.html#ARPHRD_PPP osdefs: ARPHRD_PPP +ARPHRD_CISCO chronos/osdefs.html#ARPHRD_CISCO osdefs: ARPHRD_CISCO +ARPHRD_HDLC chronos/osdefs.html#ARPHRD_HDLC osdefs: ARPHRD_HDLC +ARPHRD_LAPB chronos/osdefs.html#ARPHRD_LAPB osdefs: ARPHRD_LAPB +ARPHRD_FRAD chronos/osdefs.html#ARPHRD_FRAD osdefs: ARPHRD_FRAD +ARPHRD_LOOPBACK chronos/osdefs.html#ARPHRD_LOOPBACK osdefs: ARPHRD_LOOPBACK +ARPHRD_HIPPI chronos/osdefs.html#ARPHRD_HIPPI osdefs: ARPHRD_HIPPI +ARPHRD_IEEE80211 chronos/osdefs.html#ARPHRD_IEEE80211 osdefs: ARPHRD_IEEE80211 +ARPHRD_IEEE80211_PRISM chronos/osdefs.html#ARPHRD_IEEE80211_PRISM osdefs: ARPHRD_IEEE80211_PRISM +ARPHRD_IEEE80211_RADIOTAP chronos/osdefs.html#ARPHRD_IEEE80211_RADIOTAP osdefs: ARPHRD_IEEE80211_RADIOTAP +Sockaddr_nl chronos/osdefs.html#Sockaddr_nl osdefs: Sockaddr_nl +NlMsgHeader chronos/osdefs.html#NlMsgHeader osdefs: NlMsgHeader +IfInfoMessage chronos/osdefs.html#IfInfoMessage osdefs: IfInfoMessage +IfAddrMessage chronos/osdefs.html#IfAddrMessage osdefs: IfAddrMessage +RtMessage chronos/osdefs.html#RtMessage osdefs: RtMessage +RtAttr chronos/osdefs.html#RtAttr osdefs: RtAttr +RtGenMsg chronos/osdefs.html#RtGenMsg osdefs: RtGenMsg +NLReq chronos/osdefs.html#NLReq osdefs: NLReq +NLRouteReq chronos/osdefs.html#NLRouteReq osdefs: NLRouteReq diff --git a/api/chronos/oserrno.html b/api/chronos/oserrno.html new file mode 100644 index 00000000..189021e9 --- /dev/null +++ b/api/chronos/oserrno.html @@ -0,0 +1,2005 @@ + + + + + + + + + + + + + + + + + + +chronos/oserrno + + + + + + + + +
+
+

chronos/oserrno

+
+
+
+ +     Dark Mode +
+ +
+ Search: +
+
+ Group by: + +
+ + +
+   Source +  Edit + +
+
+ +

Source: https://github.com/torvalds/linux/blob/master/include/uapi/asm-generic/errno-base.h
+
https://github.com/torvalds/linux/blob/master/include/uapi/asm-generic/errno.h
+
+

+
+

Consts

+
+
+
E2BIG = 7'i32
+
+ + +  Source +  Edit + +
+
+
+
EACCES = 13'i32
+
+ + +  Source +  Edit + +
+
+
+
EADDRINUSE = 98'i32
+
+ + +  Source +  Edit + +
+
+
+
EADDRNOTAVAIL = 99'i32
+
+ + +  Source +  Edit + +
+
+
+
EADV = 68'i32
+
+ + +  Source +  Edit + +
+
+
+
EAFNOSUPPORT = 97'i32
+
+ + +  Source +  Edit + +
+
+
+
EAGAIN = 11'i32
+
+ + +  Source +  Edit + +
+
+
+
EALREADY = 114'i32
+
+ + +  Source +  Edit + +
+
+
+
EBADE = 52'i32
+
+ + +  Source +  Edit + +
+
+
+
EBADF = 9'i32
+
+ + +  Source +  Edit + +
+
+
+
EBADFD = 77'i32
+
+ + +  Source +  Edit + +
+
+
+
EBADMSG = 74'i32
+
+ + +  Source +  Edit + +
+
+
+
EBADR = 53'i32
+
+ + +  Source +  Edit + +
+
+
+
EBADRQC = 56'i32
+
+ + +  Source +  Edit + +
+
+
+
EBADSLT = 57'i32
+
+ + +  Source +  Edit + +
+
+
+
EBFONT = 59'i32
+
+ + +  Source +  Edit + +
+
+
+
EBUSY = 16'i32
+
+ + +  Source +  Edit + +
+
+
+
ECANCELED = 125'i32
+
+ + +  Source +  Edit + +
+
+
+
ECHILD = 10'i32
+
+ + +  Source +  Edit + +
+
+
+
ECHRNG = 44'i32
+
+ + +  Source +  Edit + +
+
+
+
ECOMM = 70'i32
+
+ + +  Source +  Edit + +
+
+
+
ECONNABORTED = 103'i32
+
+ + +  Source +  Edit + +
+
+
+
ECONNREFUSED = 111'i32
+
+ + +  Source +  Edit + +
+
+
+
ECONNRESET = 104'i32
+
+ + +  Source +  Edit + +
+
+
+
EDEADLK = 35'i32
+
+ + +  Source +  Edit + +
+
+
+
EDEADLOCK = 35'i32
+
+ + +  Source +  Edit + +
+
+
+
EDESTADDRREQ = 89'i32
+
+ + +  Source +  Edit + +
+
+
+
EDOM = 33'i32
+
+ + +  Source +  Edit + +
+
+
+
EDOTDOT = 73'i32
+
+ + +  Source +  Edit + +
+
+
+
EDQUOT = 122'i32
+
+ + +  Source +  Edit + +
+
+
+
EEXIST = 17'i32
+
+ + +  Source +  Edit + +
+
+
+
EFAULT = 14'i32
+
+ + +  Source +  Edit + +
+
+
+
EFBIG = 27'i32
+
+ + +  Source +  Edit + +
+
+
+
EHOSTDOWN = 112'i32
+
+ + +  Source +  Edit + +
+
+
+
EHOSTUNREACH = 113'i32
+
+ + +  Source +  Edit + +
+
+
+
EHWPOISON = 133'i32
+
+ + +  Source +  Edit + +
+
+
+
EIDRM = 43'i32
+
+ + +  Source +  Edit + +
+
+
+
EILSEQ = 84'i32
+
+ + +  Source +  Edit + +
+
+
+
EINPROGRESS = 115'i32
+
+ + +  Source +  Edit + +
+
+
+
EINTR = 4'i32
+
+ + +  Source +  Edit + +
+
+
+
EINVAL = 22'i32
+
+ + +  Source +  Edit + +
+
+
+
EIO = 5'i32
+
+ + +  Source +  Edit + +
+
+
+
EISCONN = 106'i32
+
+ + +  Source +  Edit + +
+
+
+
EISDIR = 21'i32
+
+ + +  Source +  Edit + +
+
+
+
EISNAM = 120'i32
+
+ + +  Source +  Edit + +
+
+
+
EKEYEXPIRED = 127'i32
+
+ + +  Source +  Edit + +
+
+
+
EKEYREJECTED = 129'i32
+
+ + +  Source +  Edit + +
+
+
+
EKEYREVOKED = 128'i32
+
+ + +  Source +  Edit + +
+
+
+
EL2HLT = 51'i32
+
+ + +  Source +  Edit + +
+
+
+
EL2NSYNC = 45'i32
+
+ + +  Source +  Edit + +
+
+
+
EL3HLT = 46'i32
+
+ + +  Source +  Edit + +
+
+
+
EL3RST = 47'i32
+
+ + +  Source +  Edit + +
+
+
+
ELIBACC = 79'i32
+
+ + +  Source +  Edit + +
+
+
+
ELIBBAD = 80'i32
+
+ + +  Source +  Edit + +
+
+
+
ELIBEXEC = 83'i32
+
+ + +  Source +  Edit + +
+
+
+
ELIBMAX = 82'i32
+
+ + +  Source +  Edit + +
+
+
+
ELIBSCN = 81'i32
+
+ + +  Source +  Edit + +
+
+
+
ELNRNG = 48'i32
+
+ + +  Source +  Edit + +
+
+
+
ELOOP = 40'i32
+
+ + +  Source +  Edit + +
+
+
+
EMEDIUMTYPE = 124'i32
+
+ + +  Source +  Edit + +
+
+
+
EMFILE = 24'i32
+
+ + +  Source +  Edit + +
+
+ +
+
EMSGSIZE = 90'i32
+
+ + +  Source +  Edit + +
+
+
+
EMULTIHOP = 72'i32
+
+ + +  Source +  Edit + +
+
+
+
ENAMETOOLONG = 36'i32
+
+ + +  Source +  Edit + +
+
+
+
ENAVAIL = 119'i32
+
+ + +  Source +  Edit + +
+
+
+
ENETDOWN = 100'i32
+
+ + +  Source +  Edit + +
+
+
+
ENETRESET = 102'i32
+
+ + +  Source +  Edit + +
+
+
+
ENETUNREACH = 101'i32
+
+ + +  Source +  Edit + +
+
+
+
ENFILE = 23'i32
+
+ + +  Source +  Edit + +
+
+
+
ENOANO = 55'i32
+
+ + +  Source +  Edit + +
+
+
+
ENOBUFS = 105'i32
+
+ + +  Source +  Edit + +
+
+
+
ENOCSI = 50'i32
+
+ + +  Source +  Edit + +
+
+
+
ENODATA = 61'i32
+
+ + +  Source +  Edit + +
+
+
+
ENODEV = 19'i32
+
+ + +  Source +  Edit + +
+
+
+
ENOENT = 2'i32
+
+ + +  Source +  Edit + +
+
+
+
ENOEXEC = 8'i32
+
+ + +  Source +  Edit + +
+
+
+
ENOKEY = 126'i32
+
+ + +  Source +  Edit + +
+
+
+
ENOLCK = 37'i32
+
+ + +  Source +  Edit + +
+
+ +
+
ENOMEDIUM = 123'i32
+
+ + +  Source +  Edit + +
+
+
+
ENOMEM = 12'i32
+
+ + +  Source +  Edit + +
+
+
+
ENOMSG = 42'i32
+
+ + +  Source +  Edit + +
+
+
+
ENONET = 64'i32
+
+ + +  Source +  Edit + +
+
+
+
ENOPKG = 65'i32
+
+ + +  Source +  Edit + +
+
+
+
ENOPROTOOPT = 92'i32
+
+ + +  Source +  Edit + +
+
+
+
ENOSPC = 28'i32
+
+ + +  Source +  Edit + +
+
+
+
ENOSR = 63'i32
+
+ + +  Source +  Edit + +
+
+
+
ENOSTR = 60'i32
+
+ + +  Source +  Edit + +
+
+
+
ENOSYS = 38'i32
+
+ + +  Source +  Edit + +
+
+
+
ENOTBLK = 15'i32
+
+ + +  Source +  Edit + +
+
+
+
ENOTCONN = 107'i32
+
+ + +  Source +  Edit + +
+
+
+
ENOTDIR = 20'i32
+
+ + +  Source +  Edit + +
+
+
+
ENOTEMPTY = 39'i32
+
+ + +  Source +  Edit + +
+
+
+
ENOTNAM = 118'i32
+
+ + +  Source +  Edit + +
+
+
+
ENOTRECOVERABLE = 131'i32
+
+ + +  Source +  Edit + +
+
+
+
ENOTSOCK = 88'i32
+
+ + +  Source +  Edit + +
+
+
+
ENOTTY = 25'i32
+
+ + +  Source +  Edit + +
+
+
+
ENOTUNIQ = 76'i32
+
+ + +  Source +  Edit + +
+
+
+
ENXIO = 6'i32
+
+ + +  Source +  Edit + +
+
+
+
EOPNOTSUPP = 95'i32
+
+ + +  Source +  Edit + +
+
+
+
EOVERFLOW = 75'i32
+
+ + +  Source +  Edit + +
+
+
+
EOWNERDEAD = 130'i32
+
+ + +  Source +  Edit + +
+
+
+
EPERM = 1'i32
+
+ + +  Source +  Edit + +
+
+
+
EPFNOSUPPORT = 96'i32
+
+ + +  Source +  Edit + +
+
+
+
EPIPE = 32'i32
+
+ + +  Source +  Edit + +
+
+
+
EPROTO = 71'i32
+
+ + +  Source +  Edit + +
+
+
+
EPROTONOSUPPORT = 93'i32
+
+ + +  Source +  Edit + +
+
+
+
EPROTOTYPE = 91'i32
+
+ + +  Source +  Edit + +
+
+
+
ERANGE = 34'i32
+
+ + +  Source +  Edit + +
+
+
+
EREMCHG = 78'i32
+
+ + +  Source +  Edit + +
+
+
+
EREMOTE = 66'i32
+
+ + +  Source +  Edit + +
+
+
+
EREMOTEIO = 121'i32
+
+ + +  Source +  Edit + +
+
+
+
ERESTART = 85'i32
+
+ + +  Source +  Edit + +
+
+
+
ERFKILL = 132'i32
+
+ + +  Source +  Edit + +
+
+
+
EROFS = 30'i32
+
+ + +  Source +  Edit + +
+
+
+
ESHUTDOWN = 108'i32
+
+ + +  Source +  Edit + +
+
+
+
ESOCKTNOSUPPORT = 94'i32
+
+ + +  Source +  Edit + +
+
+
+
ESPIPE = 29'i32
+
+ + +  Source +  Edit + +
+
+
+
ESRCH = 3'i32
+
+ + +  Source +  Edit + +
+
+
+
ESRMNT = 69'i32
+
+ + +  Source +  Edit + +
+
+
+
ESTALE = 116'i32
+
+ + +  Source +  Edit + +
+
+
+
ESTRPIPE = 86'i32
+
+ + +  Source +  Edit + +
+
+
+
ETIME = 62'i32
+
+ + +  Source +  Edit + +
+
+
+
ETIMEDOUT = 110'i32
+
+ + +  Source +  Edit + +
+
+
+
ETOOMANYREFS = 109'i32
+
+ + +  Source +  Edit + +
+
+
+
ETXTBSY = 26'i32
+
+ + +  Source +  Edit + +
+
+
+
EUCLEAN = 117'i32
+
+ + +  Source +  Edit + +
+
+
+
EUNATCH = 49'i32
+
+ + +  Source +  Edit + +
+
+
+
EUSERS = 87'i32
+
+ + +  Source +  Edit + +
+
+
+
EWOULDBLOCK = 11'i32
+
+ + +  Source +  Edit + +
+
+
+
EXDEV = 18'i32
+
+ + +  Source +  Edit + +
+
+
+
EXFULL = 54'i32
+
+ + +  Source +  Edit + +
+
+ +
+ +
+
+ +
+ +
+
+
+ + + diff --git a/api/chronos/oserrno.idx b/api/chronos/oserrno.idx new file mode 100644 index 00000000..3661f765 --- /dev/null +++ b/api/chronos/oserrno.idx @@ -0,0 +1,133 @@ +EPERM chronos/oserrno.html#EPERM oserrno: EPERM +ENOENT chronos/oserrno.html#ENOENT oserrno: ENOENT +ESRCH chronos/oserrno.html#ESRCH oserrno: ESRCH +EINTR chronos/oserrno.html#EINTR oserrno: EINTR +EIO chronos/oserrno.html#EIO oserrno: EIO +ENXIO chronos/oserrno.html#ENXIO oserrno: ENXIO +E2BIG chronos/oserrno.html#E2BIG oserrno: E2BIG +ENOEXEC chronos/oserrno.html#ENOEXEC oserrno: ENOEXEC +EBADF chronos/oserrno.html#EBADF oserrno: EBADF +ECHILD chronos/oserrno.html#ECHILD oserrno: ECHILD +EAGAIN chronos/oserrno.html#EAGAIN oserrno: EAGAIN +ENOMEM chronos/oserrno.html#ENOMEM oserrno: ENOMEM +EACCES chronos/oserrno.html#EACCES oserrno: EACCES +EFAULT chronos/oserrno.html#EFAULT oserrno: EFAULT +ENOTBLK chronos/oserrno.html#ENOTBLK oserrno: ENOTBLK +EBUSY chronos/oserrno.html#EBUSY oserrno: EBUSY +EEXIST chronos/oserrno.html#EEXIST oserrno: EEXIST +EXDEV chronos/oserrno.html#EXDEV oserrno: EXDEV +ENODEV chronos/oserrno.html#ENODEV oserrno: ENODEV +ENOTDIR chronos/oserrno.html#ENOTDIR oserrno: ENOTDIR +EISDIR chronos/oserrno.html#EISDIR oserrno: EISDIR +EINVAL chronos/oserrno.html#EINVAL oserrno: EINVAL +ENFILE chronos/oserrno.html#ENFILE oserrno: ENFILE +EMFILE chronos/oserrno.html#EMFILE oserrno: EMFILE +ENOTTY chronos/oserrno.html#ENOTTY oserrno: ENOTTY +ETXTBSY chronos/oserrno.html#ETXTBSY oserrno: ETXTBSY +EFBIG chronos/oserrno.html#EFBIG oserrno: EFBIG +ENOSPC chronos/oserrno.html#ENOSPC oserrno: ENOSPC +ESPIPE chronos/oserrno.html#ESPIPE oserrno: ESPIPE +EROFS chronos/oserrno.html#EROFS oserrno: EROFS +EMLINK chronos/oserrno.html#EMLINK oserrno: EMLINK +EPIPE chronos/oserrno.html#EPIPE oserrno: EPIPE +EDOM chronos/oserrno.html#EDOM oserrno: EDOM +ERANGE chronos/oserrno.html#ERANGE oserrno: ERANGE +EDEADLK chronos/oserrno.html#EDEADLK oserrno: EDEADLK +ENAMETOOLONG chronos/oserrno.html#ENAMETOOLONG oserrno: ENAMETOOLONG +ENOLCK chronos/oserrno.html#ENOLCK oserrno: ENOLCK +ENOSYS chronos/oserrno.html#ENOSYS oserrno: ENOSYS +ENOTEMPTY chronos/oserrno.html#ENOTEMPTY oserrno: ENOTEMPTY +ELOOP chronos/oserrno.html#ELOOP oserrno: ELOOP +EWOULDBLOCK chronos/oserrno.html#EWOULDBLOCK oserrno: EWOULDBLOCK +ENOMSG chronos/oserrno.html#ENOMSG oserrno: ENOMSG +EIDRM chronos/oserrno.html#EIDRM oserrno: EIDRM +ECHRNG chronos/oserrno.html#ECHRNG oserrno: ECHRNG +EL2NSYNC chronos/oserrno.html#EL2NSYNC oserrno: EL2NSYNC +EL3HLT chronos/oserrno.html#EL3HLT oserrno: EL3HLT +EL3RST chronos/oserrno.html#EL3RST oserrno: EL3RST +ELNRNG chronos/oserrno.html#ELNRNG oserrno: ELNRNG +EUNATCH chronos/oserrno.html#EUNATCH oserrno: EUNATCH +ENOCSI chronos/oserrno.html#ENOCSI oserrno: ENOCSI +EL2HLT chronos/oserrno.html#EL2HLT oserrno: EL2HLT +EBADE chronos/oserrno.html#EBADE oserrno: EBADE +EBADR chronos/oserrno.html#EBADR oserrno: EBADR +EXFULL chronos/oserrno.html#EXFULL oserrno: EXFULL +ENOANO chronos/oserrno.html#ENOANO oserrno: ENOANO +EBADRQC chronos/oserrno.html#EBADRQC oserrno: EBADRQC +EBADSLT chronos/oserrno.html#EBADSLT oserrno: EBADSLT +EDEADLOCK chronos/oserrno.html#EDEADLOCK oserrno: EDEADLOCK +EBFONT chronos/oserrno.html#EBFONT oserrno: EBFONT +ENOSTR chronos/oserrno.html#ENOSTR oserrno: ENOSTR +ENODATA chronos/oserrno.html#ENODATA oserrno: ENODATA +ETIME chronos/oserrno.html#ETIME oserrno: ETIME +ENOSR chronos/oserrno.html#ENOSR oserrno: ENOSR +ENONET chronos/oserrno.html#ENONET oserrno: ENONET +ENOPKG chronos/oserrno.html#ENOPKG oserrno: ENOPKG +EREMOTE chronos/oserrno.html#EREMOTE oserrno: EREMOTE +ENOLINK chronos/oserrno.html#ENOLINK oserrno: ENOLINK +EADV chronos/oserrno.html#EADV oserrno: EADV +ESRMNT chronos/oserrno.html#ESRMNT oserrno: ESRMNT +ECOMM chronos/oserrno.html#ECOMM oserrno: ECOMM +EPROTO chronos/oserrno.html#EPROTO oserrno: EPROTO +EMULTIHOP chronos/oserrno.html#EMULTIHOP oserrno: EMULTIHOP +EDOTDOT chronos/oserrno.html#EDOTDOT oserrno: EDOTDOT +EBADMSG chronos/oserrno.html#EBADMSG oserrno: EBADMSG +EOVERFLOW chronos/oserrno.html#EOVERFLOW oserrno: EOVERFLOW +ENOTUNIQ chronos/oserrno.html#ENOTUNIQ oserrno: ENOTUNIQ +EBADFD chronos/oserrno.html#EBADFD oserrno: EBADFD +EREMCHG chronos/oserrno.html#EREMCHG oserrno: EREMCHG +ELIBACC chronos/oserrno.html#ELIBACC oserrno: ELIBACC +ELIBBAD chronos/oserrno.html#ELIBBAD oserrno: ELIBBAD +ELIBSCN chronos/oserrno.html#ELIBSCN oserrno: ELIBSCN +ELIBMAX chronos/oserrno.html#ELIBMAX oserrno: ELIBMAX +ELIBEXEC chronos/oserrno.html#ELIBEXEC oserrno: ELIBEXEC +EILSEQ chronos/oserrno.html#EILSEQ oserrno: EILSEQ +ERESTART chronos/oserrno.html#ERESTART oserrno: ERESTART +ESTRPIPE chronos/oserrno.html#ESTRPIPE oserrno: ESTRPIPE +EUSERS chronos/oserrno.html#EUSERS oserrno: EUSERS +ENOTSOCK chronos/oserrno.html#ENOTSOCK oserrno: ENOTSOCK +EDESTADDRREQ chronos/oserrno.html#EDESTADDRREQ oserrno: EDESTADDRREQ +EMSGSIZE chronos/oserrno.html#EMSGSIZE oserrno: EMSGSIZE +EPROTOTYPE chronos/oserrno.html#EPROTOTYPE oserrno: EPROTOTYPE +ENOPROTOOPT chronos/oserrno.html#ENOPROTOOPT oserrno: ENOPROTOOPT +EPROTONOSUPPORT chronos/oserrno.html#EPROTONOSUPPORT oserrno: EPROTONOSUPPORT +ESOCKTNOSUPPORT chronos/oserrno.html#ESOCKTNOSUPPORT oserrno: ESOCKTNOSUPPORT +EOPNOTSUPP chronos/oserrno.html#EOPNOTSUPP oserrno: EOPNOTSUPP +EPFNOSUPPORT chronos/oserrno.html#EPFNOSUPPORT oserrno: EPFNOSUPPORT +EAFNOSUPPORT chronos/oserrno.html#EAFNOSUPPORT oserrno: EAFNOSUPPORT +EADDRINUSE chronos/oserrno.html#EADDRINUSE oserrno: EADDRINUSE +EADDRNOTAVAIL chronos/oserrno.html#EADDRNOTAVAIL oserrno: EADDRNOTAVAIL +ENETDOWN chronos/oserrno.html#ENETDOWN oserrno: ENETDOWN +ENETUNREACH chronos/oserrno.html#ENETUNREACH oserrno: ENETUNREACH +ENETRESET chronos/oserrno.html#ENETRESET oserrno: ENETRESET +ECONNABORTED chronos/oserrno.html#ECONNABORTED oserrno: ECONNABORTED +ECONNRESET chronos/oserrno.html#ECONNRESET oserrno: ECONNRESET +ENOBUFS chronos/oserrno.html#ENOBUFS oserrno: ENOBUFS +EISCONN chronos/oserrno.html#EISCONN oserrno: EISCONN +ENOTCONN chronos/oserrno.html#ENOTCONN oserrno: ENOTCONN +ESHUTDOWN chronos/oserrno.html#ESHUTDOWN oserrno: ESHUTDOWN +ETOOMANYREFS chronos/oserrno.html#ETOOMANYREFS oserrno: ETOOMANYREFS +ETIMEDOUT chronos/oserrno.html#ETIMEDOUT oserrno: ETIMEDOUT +ECONNREFUSED chronos/oserrno.html#ECONNREFUSED oserrno: ECONNREFUSED +EHOSTDOWN chronos/oserrno.html#EHOSTDOWN oserrno: EHOSTDOWN +EHOSTUNREACH chronos/oserrno.html#EHOSTUNREACH oserrno: EHOSTUNREACH +EALREADY chronos/oserrno.html#EALREADY oserrno: EALREADY +EINPROGRESS chronos/oserrno.html#EINPROGRESS oserrno: EINPROGRESS +ESTALE chronos/oserrno.html#ESTALE oserrno: ESTALE +EUCLEAN chronos/oserrno.html#EUCLEAN oserrno: EUCLEAN +ENOTNAM chronos/oserrno.html#ENOTNAM oserrno: ENOTNAM +ENAVAIL chronos/oserrno.html#ENAVAIL oserrno: ENAVAIL +EISNAM chronos/oserrno.html#EISNAM oserrno: EISNAM +EREMOTEIO chronos/oserrno.html#EREMOTEIO oserrno: EREMOTEIO +EDQUOT chronos/oserrno.html#EDQUOT oserrno: EDQUOT +ENOMEDIUM chronos/oserrno.html#ENOMEDIUM oserrno: ENOMEDIUM +EMEDIUMTYPE chronos/oserrno.html#EMEDIUMTYPE oserrno: EMEDIUMTYPE +ECANCELED chronos/oserrno.html#ECANCELED oserrno: ECANCELED +ENOKEY chronos/oserrno.html#ENOKEY oserrno: ENOKEY +EKEYEXPIRED chronos/oserrno.html#EKEYEXPIRED oserrno: EKEYEXPIRED +EKEYREVOKED chronos/oserrno.html#EKEYREVOKED oserrno: EKEYREVOKED +EKEYREJECTED chronos/oserrno.html#EKEYREJECTED oserrno: EKEYREJECTED +EOWNERDEAD chronos/oserrno.html#EOWNERDEAD oserrno: EOWNERDEAD +ENOTRECOVERABLE chronos/oserrno.html#ENOTRECOVERABLE oserrno: ENOTRECOVERABLE +ERFKILL chronos/oserrno.html#ERFKILL oserrno: ERFKILL +EHWPOISON chronos/oserrno.html#EHWPOISON oserrno: EHWPOISON diff --git a/api/chronos/osutils.html b/api/chronos/osutils.html new file mode 100644 index 00000000..b591d631 --- /dev/null +++ b/api/chronos/osutils.html @@ -0,0 +1,446 @@ + + + + + + + + + + + + + + + + + + +chronos/osutils + + + + + + + + +
+
+

chronos/osutils

+
+ +   Source +  Edit + +
+
+ +

+ +
+

Types

+
+
+
DescriptorFlag {.pure.} = enum
+  CloseOnExec, NonBlock
+
+ + +  Source +  Edit + +
+
+ +
+
+

Consts

+
+
+
AsyncDescriptorDefault = {DescriptorFlag.CloseOnExec, DescriptorFlag.NonBlock}
+
+ + +  Source +  Edit + +
+
+
+
MaxSignalEventLength = 64
+
+ + +  Source +  Edit + +
+
+
+
MaxSignalSuffixLength = 21
+
+ + +  Source +  Edit + +
+
+
+
PipeHeaderName = r"\\.\pipe\LOCAL\chronos\"
+
+ + +  Source +  Edit + +
+
+
+
SignalPrefixName = r"Local\chronos-events-"
+
+ + +  Source +  Edit + +
+
+ +
+
+

Procs

+
+
+
proc acceptConn(a1: cint; a2: ptr SockAddr; a3: ptr SockLen;
+                a4: set[DescriptorFlag]): Result[cint, OSErrorCode] {.
+    ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc closeFd(s: cint): int {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc closeFd(s: SocketHandle): int {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc createOsPipe(readset, writeset: set[DescriptorFlag]): Result[
+    tuple[read: cint, write: cint], OSErrorCode] {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc getDescriptorInheritance(s: cint): Result[bool, OSErrorCode] {....raises: [],
+    tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc setDescriptorBlocking(s: cint; value: bool): Result[void, OSErrorCode] {.
+    ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc setDescriptorBlocking(s: SocketHandle; value: bool): Result[void,
+    OSErrorCode] {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc setDescriptorFlags(s: cint; nonblock, cloexec: bool): Result[void,
+    OSErrorCode] {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc setDescriptorInheritance(s: cint; value: bool): Result[void, OSErrorCode] {.
+    ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+ +
+
+

Templates

+
+
+
template handleEintr(body: untyped): untyped
+
+ + +  Source +  Edit + +
+
+ +
+ +
+
+ +
+ +
+
+
+ + + diff --git a/api/chronos/osutils.idx b/api/chronos/osutils.idx new file mode 100644 index 00000000..d98c7185 --- /dev/null +++ b/api/chronos/osutils.idx @@ -0,0 +1,16 @@ +PipeHeaderName chronos/osutils.html#PipeHeaderName osutils: PipeHeaderName +SignalPrefixName chronos/osutils.html#SignalPrefixName osutils: SignalPrefixName +MaxSignalEventLength chronos/osutils.html#MaxSignalEventLength osutils: MaxSignalEventLength +MaxSignalSuffixLength chronos/osutils.html#MaxSignalSuffixLength osutils: MaxSignalSuffixLength +DescriptorFlag chronos/osutils.html#DescriptorFlag osutils: DescriptorFlag +AsyncDescriptorDefault chronos/osutils.html#AsyncDescriptorDefault osutils: AsyncDescriptorDefault +handleEintr chronos/osutils.html#handleEintr.t,untyped osutils: handleEintr(body: untyped): untyped +setDescriptorBlocking chronos/osutils.html#setDescriptorBlocking,cint,bool osutils: setDescriptorBlocking(s: cint; value: bool): Result[void, OSErrorCode] +setDescriptorBlocking chronos/osutils.html#setDescriptorBlocking,SocketHandle,bool osutils: setDescriptorBlocking(s: SocketHandle; value: bool): Result[void, OSErrorCode] +setDescriptorInheritance chronos/osutils.html#setDescriptorInheritance,cint,bool osutils: setDescriptorInheritance(s: cint; value: bool): Result[void, OSErrorCode] +getDescriptorInheritance chronos/osutils.html#getDescriptorInheritance,cint osutils: getDescriptorInheritance(s: cint): Result[bool, OSErrorCode] +setDescriptorFlags chronos/osutils.html#setDescriptorFlags,cint,bool,bool osutils: setDescriptorFlags(s: cint; nonblock, cloexec: bool): Result[void, OSErrorCode] +closeFd chronos/osutils.html#closeFd,cint osutils: closeFd(s: cint): int +closeFd chronos/osutils.html#closeFd,SocketHandle osutils: closeFd(s: SocketHandle): int +acceptConn chronos/osutils.html#acceptConn,cint,ptr.SockAddr,ptr.SockLen,set[DescriptorFlag] osutils: acceptConn(a1: cint; a2: ptr SockAddr; a3: ptr SockLen; a4: set[DescriptorFlag]): Result[\n cint, OSErrorCode] +createOsPipe chronos/osutils.html#createOsPipe,set[DescriptorFlag],set[DescriptorFlag] osutils: createOsPipe(readset, writeset: set[DescriptorFlag]): Result[\n tuple[read: cint, write: cint], OSErrorCode] diff --git a/api/chronos/selectors2.html b/api/chronos/selectors2.html new file mode 100644 index 00000000..206bd4aa --- /dev/null +++ b/api/chronos/selectors2.html @@ -0,0 +1,724 @@ + + + + + + + + + + + + + + + + + + +chronos/selectors2 + + + + + + + + +
+
+

chronos/selectors2

+
+
+
+ +     Dark Mode +
+ +
+ Search: +
+
+ Group by: + +
+ + +
+   Source +  Edit + +
+
+ +

This module allows high-level and efficient I/O multiplexing.

+

Supported OS primitives: epoll, kqueue, poll and Windows select.

+

To use threadsafe version of this module, it needs to be compiled with both -d:threadsafe and --threads:on options.

+

Supported features: files, sockets, pipes, timers, processes, signals and user events.

+

Fully supported OS: MacOSX, FreeBSD, OpenBSD, NetBSD, Linux (except for Android).

+

Partially supported OS: Windows (only sockets and user events), Solaris (files, sockets, handles and user events). Android (files, sockets, handles and user events).

+

TODO: /dev/poll, event ports and filesystem events.

+

+ +
+

Types

+
+
+
Event {.pure.} = enum
+  Read,                     ## Descriptor is available for read
+  Write,                    ## Descriptor is available for write
+  Timer,                    ## Timer descriptor is completed
+  Signal,                   ## Signal is raised
+  Process,                  ## Process is finished
+  Vnode,                    ## BSD specific file change
+  User,                     ## User event is raised
+  Error,                    ## Error occurred while waiting for descriptor
+  VnodeWrite,               ## NOTE_WRITE (BSD specific, write to file occurred)
+  VnodeDelete,              ## NOTE_DELETE (BSD specific, unlink of file occurred)
+  VnodeExtend,              ## NOTE_EXTEND (BSD specific, file extended)
+  VnodeAttrib,              ## NOTE_ATTRIB (BSD specific, file attributes changed)
+  VnodeLink,                ## NOTE_LINK (BSD specific, file link count changed)
+  VnodeRename,              ## NOTE_RENAME (BSD specific, file renamed)
+  VnodeRevoke                ## NOTE_REVOKE (BSD specific, file revoke occurred)
+
+ +An enum which hold event types +  Source +  Edit + +
+
+
+
IOSelectorsException = object of CatchableError
+
+ + +  Source +  Edit + +
+
+
+
ReadyKey = object
+  fd*: int                   ## file/socket descriptor
+  events*: set[Event]        ## set of events
+  errorCode*: OSErrorCode    ## additional error code information for
+                             ## Error events
+  
+
+ +An object which holds result for descriptor +  Source +  Edit + +
+
+
+
SelectEvent = object
+  
+
+ +An object which holds user defined event +  Source +  Edit + +
+
+
+
Selector[T] = ref object
+  
+
+ +An object which holds descriptors to be checked for read/write status +  Source +  Edit + +
+
+ +
+
+

Procs

+
+
+
proc close(ev: SelectEvent) {....raises: [], tags: [].}
+
+ +Closes user-defined event ev. +  Source +  Edit + +
+
+
+
proc close[T](s: Selector[T])
+
+ +Closes the selector. +  Source +  Edit + +
+
+
+
proc contains[T](s: Selector[T]; fd: SocketHandle | int): bool {.inline.}
+
+ +Determines whether selector contains a file descriptor. +  Source +  Edit + +
+
+
+
proc getData[T](s: Selector[T]; fd: SocketHandle | int): var T
+
+ +Retrieves application-defined data associated with descriptor fd. If specified descriptor fd is not registered, empty/default value will be returned. +  Source +  Edit + +
+
+
+
proc getFd[T](s: Selector[T]): int
+
+ +

Retrieves the underlying selector's file descriptor.

+

For poll and select selectors -1 is returned.

+ +  Source +  Edit + +
+
+
+
proc newSelectEvent(): SelectEvent {....raises: [], tags: [].}
+
+ +Creates a new user-defined event. +  Source +  Edit + +
+
+
+
proc newSelector[T](): Selector[T]
+
+ +Creates a new selector +  Source +  Edit + +
+
+
+
proc registerEvent[T](s: Selector[T]; ev: SelectEvent; data: T)
+
+ +

Registers selector event ev in selector s.

+

The data is application-defined data, which will be passed when ev happens.

+ +  Source +  Edit + +
+
+
+
proc registerHandle[T](s: Selector[T]; fd: int | SocketHandle;
+                       events: set[Event]; data: T)
+
+ +Registers file/socket descriptor fd to selector s with events set in events. The data is application-defined data, which will be passed when an event is triggered. +  Source +  Edit + +
+
+
+
proc registerProcess[T](s: Selector[T]; pid: int; data: T): int {.discardable.}
+
+ +

Registers a process id (pid) notification (when process has exited) in selector s.

+

The data is application-defined data, which will be passed when process with pid has exited.

+

Returns the file descriptor for the registered signal.

+ +  Source +  Edit + +
+
+
+
proc registerSignal[T](s: Selector[T]; signal: int; data: T): int {.discardable.}
+
+ +

Registers Unix signal notification with signal to selector s.

+

The data is application-defined data, which will be passed when signal raises.

+

Returns the file descriptor for the registered signal.

+

Note: This function is not supported on Windows.

+ +  Source +  Edit + +
+
+
+
proc registerTimer[T](s: Selector[T]; timeout: int; oneshot: bool; data: T): int {.
+    discardable.}
+
+ +

Registers timer notification with timeout (in milliseconds) to selector s.

+

If oneshot is true, timer will be notified only once.

+

Set oneshot to false if you want periodic notifications.

+

The data is application-defined data, which will be passed, when the timer is triggered.

+

Returns the file descriptor for the registered timer.

+ +  Source +  Edit + +
+
+
+
proc registerVnode[T](s: Selector[T]; fd: cint; events: set[Event]; data: T)
+
+ +

Registers selector BSD/MacOSX specific vnode events for file descriptor fd and events events. data application-defined data, which to be passed, when vnode event happens.

+

Note: This function is supported only by BSD and MacOSX.

+ +  Source +  Edit + +
+
+
+
proc select[T](s: Selector[T]; timeout: int): seq[ReadyKey]
+
+ +

Waits for events registered in selector s.

+

The timeout argument specifies the maximum number of milliseconds the function will be blocked for if no events are ready. Specifying a timeout of -1 causes the function to block indefinitely.

+

Returns a list of triggered events.

+ +  Source +  Edit + +
+
+
+
proc selectInto[T](s: Selector[T]; timeout: int;
+                   results: var openArray[ReadyKey]): int
+
+ +

Waits for events registered in selector s.

+

The timeout argument specifies the maximum number of milliseconds the function will be blocked for if no events are ready. Specifying a timeout of -1 causes the function to block indefinitely. All available events will be stored in results array.

+

Returns number of triggered events.

+ +  Source +  Edit + +
+
+
+
proc setData[T](s: Selector[T]; fd: SocketHandle | int; data: var T): bool
+
+ +

Associate application-defined data with descriptor fd.

+

Returns true, if data was successfully updated, false otherwise.

+ +  Source +  Edit + +
+
+
+
proc trigger(ev: SelectEvent) {....raises: [], tags: [].}
+
+ +Trigger event ev. +  Source +  Edit + +
+
+
+
proc unregister[T](s: Selector[T]; ev: SelectEvent)
+
+ +Unregisters user-defined event ev from selector s. +  Source +  Edit + +
+
+
+
proc unregister[T](s: Selector[T]; fd: int | SocketHandle | cint)
+
+ +Unregisters file/socket descriptor fd from selector s. +  Source +  Edit + +
+
+
+
proc updateHandle[T](s: Selector[T]; fd: int | SocketHandle; events: set[Event])
+
+ +Update file/socket descriptor fd, registered in selector s with new events set event. +  Source +  Edit + +
+
+ +
+
+

Templates

+
+
+
template isEmpty[T](s: Selector[T]): bool
+
+ +Returns true, if there are no registered events or descriptors in selector. +  Source +  Edit + +
+
+
+
template withData[T](s: Selector[T]; fd: SocketHandle | int;
+                     value, body1, body2: untyped)
+
+ +Retrieves the application-data assigned with descriptor fd to value. This value can be modified in the scope of the withData call.
s.withData(fd, value) do:
+  # block is executed only if ``fd`` registered in selector ``s``.
+  value.uid = 1000
+do:
+  # block is executed if ``fd`` not registered in selector ``s``.
+  raise
+  Source +  Edit + +
+
+
+
template withData[T](s: Selector[T]; fd: SocketHandle | int;
+                     value, body: untyped)
+
+ +Retrieves the application-data assigned with descriptor fd to value. This value can be modified in the scope of the withData call.
s.withData(fd, value) do:
+  # block is executed only if ``fd`` registered in selector ``s``
+  value.uid = 1000
+  Source +  Edit + +
+
+ +
+ + +
+
+ +
+ +
+
+
+ + + diff --git a/api/chronos/selectors2.idx b/api/chronos/selectors2.idx new file mode 100644 index 00000000..78c83e0b --- /dev/null +++ b/api/chronos/selectors2.idx @@ -0,0 +1,28 @@ +Selector chronos/selectors2.html#Selector selectors2: Selector +Event chronos/selectors2.html#Event selectors2: Event +IOSelectorsException chronos/selectors2.html#IOSelectorsException selectors2: IOSelectorsException +ReadyKey chronos/selectors2.html#ReadyKey selectors2: ReadyKey +SelectEvent chronos/selectors2.html#SelectEvent selectors2: SelectEvent +newSelector chronos/selectors2.html#newSelector selectors2: newSelector[T](): Selector[T] +close chronos/selectors2.html#close,Selector[T] selectors2: close[T](s: Selector[T]) +registerHandle chronos/selectors2.html#registerHandle,Selector[T],,set[Event],T selectors2: registerHandle[T](s: Selector[T]; fd: int | SocketHandle; events: set[Event];\n data: T) +updateHandle chronos/selectors2.html#updateHandle,Selector[T],,set[Event] selectors2: updateHandle[T](s: Selector[T]; fd: int | SocketHandle; events: set[Event]) +registerTimer chronos/selectors2.html#registerTimer,Selector[T],int,bool,T selectors2: registerTimer[T](s: Selector[T]; timeout: int; oneshot: bool; data: T): int +registerSignal chronos/selectors2.html#registerSignal,Selector[T],int,T selectors2: registerSignal[T](s: Selector[T]; signal: int; data: T): int +registerProcess chronos/selectors2.html#registerProcess,Selector[T],int,T selectors2: registerProcess[T](s: Selector[T]; pid: int; data: T): int +registerEvent chronos/selectors2.html#registerEvent,Selector[T],SelectEvent,T selectors2: registerEvent[T](s: Selector[T]; ev: SelectEvent; data: T) +registerVnode chronos/selectors2.html#registerVnode,Selector[T],cint,set[Event],T selectors2: registerVnode[T](s: Selector[T]; fd: cint; events: set[Event]; data: T) +newSelectEvent chronos/selectors2.html#newSelectEvent selectors2: newSelectEvent(): SelectEvent +trigger chronos/selectors2.html#trigger,SelectEvent selectors2: trigger(ev: SelectEvent) +close chronos/selectors2.html#close,SelectEvent selectors2: close(ev: SelectEvent) +unregister chronos/selectors2.html#unregister,Selector[T],SelectEvent selectors2: unregister[T](s: Selector[T]; ev: SelectEvent) +unregister chronos/selectors2.html#unregister,Selector[T], selectors2: unregister[T](s: Selector[T]; fd: int | SocketHandle | cint) +selectInto chronos/selectors2.html#selectInto,Selector[T],int,openArray[ReadyKey] selectors2: selectInto[T](s: Selector[T]; timeout: int; results: var openArray[ReadyKey]): int +select chronos/selectors2.html#select,Selector[T],int selectors2: select[T](s: Selector[T]; timeout: int): seq[ReadyKey] +getData chronos/selectors2.html#getData,Selector[T], selectors2: getData[T](s: Selector[T]; fd: SocketHandle | int): var T +setData chronos/selectors2.html#setData,Selector[T],,T selectors2: setData[T](s: Selector[T]; fd: SocketHandle | int; data: var T): bool +isEmpty chronos/selectors2.html#isEmpty.t,Selector[T] selectors2: isEmpty[T](s: Selector[T]): bool +withData chronos/selectors2.html#withData.t,Selector[T],,untyped,untyped selectors2: withData[T](s: Selector[T]; fd: SocketHandle | int; value, body: untyped) +withData chronos/selectors2.html#withData.t,Selector[T],,untyped,untyped,untyped selectors2: withData[T](s: Selector[T]; fd: SocketHandle | int; value, body1, body2: untyped) +contains chronos/selectors2.html#contains,Selector[T], selectors2: contains[T](s: Selector[T]; fd: SocketHandle | int): bool +getFd chronos/selectors2.html#getFd,Selector[T] selectors2: getFd[T](s: Selector[T]): int diff --git a/api/chronos/sendfile.html b/api/chronos/sendfile.html new file mode 100644 index 00000000..1d338aa1 --- /dev/null +++ b/api/chronos/sendfile.html @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + +chronos/sendfile + + + + + + + + +
+
+

chronos/sendfile

+
+
+
+ +     Dark Mode +
+ +
+ Search: +
+
+ Group by: + +
+ + +
+   Source +  Edit + +
+
+ +

This module provides cross-platform wrapper for sendfile() syscall.

+
+

Procs

+
+
+
proc sendfile(outfd, infd: int; offset: int; count: var int): int {....raises: [],
+    tags: [].}
+
+ +

Copies data between file descriptor infd and outfd. Because this copying is done within the kernel, sendfile() is more efficient than the combination of read(2) and write(2), which would require transferring data to and from user space.

+

infd should be a file descriptor opened for reading and outfd should be a descriptor opened for writing.

+

The infd argument must correspond to a file which supports mmap(2)-like operations (i.e., it cannot be a socket).

+

offset the file offset from which sendfile() will start reading data from infd.

+

count is the number of bytes to copy between the file descriptors. On exit count will hold number of bytes actually transferred between file descriptors. May be >0 even in the case of error return, if some bytes were sent before the error occurred.

+

If the transfer was successful, the number of bytes written to outfd is stored in count, and 0 returned. Note that a successful call to sendfile() may write fewer bytes than requested; the caller should be prepared to retry the call if there were unsent bytes.

+

On error, -1 is returned.

+ +  Source +  Edit + +
+
+ +
+ +
+
+ +
+ +
+
+
+ + + diff --git a/api/chronos/sendfile.idx b/api/chronos/sendfile.idx new file mode 100644 index 00000000..c2fe1aa2 --- /dev/null +++ b/api/chronos/sendfile.idx @@ -0,0 +1 @@ +sendfile chronos/sendfile.html#sendfile,int,int,int,int sendfile: sendfile(outfd, infd: int; offset: int; count: var int): int diff --git a/api/chronos/srcloc.html b/api/chronos/srcloc.html new file mode 100644 index 00000000..1de51603 --- /dev/null +++ b/api/chronos/srcloc.html @@ -0,0 +1,217 @@ + + + + + + + + + + + + + + + + + + +chronos/srcloc + + + + + + + + +
+
+

chronos/srcloc

+
+
+
+ +     Dark Mode +
+ +
+ Search: +
+
+ Group by: + +
+ + +
+   Source +  Edit + +
+
+ +

+
+

Types

+
+
+
SrcLoc = object
+  procedure*: cstring
+  file*: cstring
+  line*: int
+
+
+ + +  Source +  Edit + +
+
+ +
+
+

Procs

+
+
+
proc `$`(loc: ptr SrcLoc): string {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+ +
+
+

Templates

+
+
+
template getSrcLocation(procedure: static string = ""): ptr SrcLoc
+
+ + +  Source +  Edit + +
+
+ +
+ +
+
+ +
+ +
+
+
+ + + diff --git a/api/chronos/srcloc.idx b/api/chronos/srcloc.idx new file mode 100644 index 00000000..1e02a60d --- /dev/null +++ b/api/chronos/srcloc.idx @@ -0,0 +1,3 @@ +SrcLoc chronos/srcloc.html#SrcLoc srcloc: SrcLoc +`$` chronos/srcloc.html#$,ptr.SrcLoc srcloc: `$`(loc: ptr SrcLoc): string +getSrcLocation chronos/srcloc.html#getSrcLocation.t,staticstring srcloc: getSrcLocation(procedure: static string = ""): ptr SrcLoc diff --git a/api/chronos/streams/asyncstream.html b/api/chronos/streams/asyncstream.html new file mode 100644 index 00000000..75ab5fd3 --- /dev/null +++ b/api/chronos/streams/asyncstream.html @@ -0,0 +1,1790 @@ + + + + + + + + + + + + + + + + + + +chronos/streams/asyncstream + + + + + + + + +
+
+

chronos/streams/asyncstream

+
+
+
+ +     Dark Mode +
+ +
+ Search: +
+
+ Group by: + +
+ + +
+   Source +  Edit + +
+
+ +

+ +
+

Types

+
+
+
AsyncBuffer = object
+  backend*: BipBuffer
+  events*: array[2, AsyncEvent]
+
+
+ + +  Source +  Edit + +
+
+
+
AsyncBufferRef = ref AsyncBuffer
+
+ + +  Source +  Edit + +
+
+
+
AsyncStream = object of RootObj
+  reader*: AsyncStreamReader
+  writer*: AsyncStreamWriter
+
+
+ + +  Source +  Edit + +
+
+
+
AsyncStreamError = object of AsyncError
+
+ + +  Source +  Edit + +
+
+
+
AsyncStreamIncompleteError = object of AsyncStreamError
+
+ + +  Source +  Edit + +
+
+
+
AsyncStreamIncorrectDefect = object of Defect
+
+ + +  Source +  Edit + +
+
+
+
AsyncStreamLimitError = object of AsyncStreamError
+
+ + +  Source +  Edit + +
+
+
+
AsyncStreamReader = ref object of RootRef
+  rsource*: AsyncStreamReader
+  tsource*: StreamTransport
+  readerLoop*: StreamReaderLoop
+  state*: AsyncStreamState
+  buffer*: AsyncBufferRef
+  udata: pointer
+  error*: ref AsyncStreamError
+  bytesCount*: uint64
+  future: Future[void].Raising([])
+
+
+ + +  Source +  Edit + +
+
+
+
AsyncStreamReadError = object of AsyncStreamError
+
+ + +  Source +  Edit + +
+
+ +
+
AsyncStreamState = enum
+  Running,                  ## Stream is online and working
+  Error,                    ## Stream has stored error
+  Stopped,                  ## Stream was closed while working
+  Finished,                 ## Stream was properly finished
+  Closing,                  ## Stream is closing
+  Closed                     ## Stream was closed
+
+ + +  Source +  Edit + +
+
+
+
AsyncStreamUseClosedError = object of AsyncStreamError
+
+ + +  Source +  Edit + +
+
+
+
AsyncStreamWriteEOFError = object of AsyncStreamWriteError
+
+ + +  Source +  Edit + +
+
+
+
AsyncStreamWriteError = object of AsyncStreamError
+
+ + +  Source +  Edit + +
+
+
+
AsyncStreamWriter = ref object of RootRef
+  wsource*: AsyncStreamWriter
+  tsource*: StreamTransport
+  writerLoop*: StreamWriterLoop
+  state*: AsyncStreamState
+  queue*: AsyncQueue[WriteItem]
+  error*: ref AsyncStreamError
+  udata: pointer
+  bytesCount*: uint64
+  future: Future[void].Raising([])
+
+
+ + +  Source +  Edit + +
+
+
+
StreamReaderLoop = proc (stream: AsyncStreamReader): Future[void] {.
+    async: (...raises: []).}
+
+ +Main read loop for read streams. +  Source +  Edit + +
+
+
+
StreamWriterLoop = proc (stream: AsyncStreamWriter): Future[void] {.
+    async: (...raises: []).}
+
+ +Main write loop for write streams. +  Source +  Edit + +
+
+
+
WriteItem = object
+  case kind*: WriteType
+  of Pointer:
+      dataPtr*: pointer
+
+  of Sequence:
+      dataSeq*: seq[byte]
+
+  of String:
+      dataStr*: string
+
+  size*: int
+  offset*: int
+  future*: Future[void].Raising([CancelledError, AsyncStreamError])
+
+
+ + +  Source +  Edit + +
+
+
+
WriteType = enum
+  Pointer, Sequence, String
+
+ + +  Source +  Edit + +
+
+ +
+
+

Consts

+
+
+
AsyncStreamDefaultBufferSize = 16384
+
+ +Default reading stream internal buffer size. +  Source +  Edit + +
+
+
+
AsyncStreamDefaultQueueSize = 0
+
+ +Default writing stream internal queue size. +  Source +  Edit + +
+
+
+
AsyncStreamReaderTrackerName = "async.stream.reader"
+
+ +AsyncStreamReader leaks tracker name +  Source +  Edit + +
+
+
+
AsyncStreamWriterTrackerName = "async.stream.writer"
+
+ +AsyncStreamWriter leaks tracker name +  Source +  Edit + +
+
+ +
+
+

Procs

+
+
+
proc atEof(rstream: AsyncStreamReader): bool {....raises: [], tags: [].}
+
+ +Returns true is reading stream is closed or finished and internal buffer do not have any bytes left. +  Source +  Edit + +
+
+
+
proc atEof(wstream: AsyncStreamWriter): bool {....raises: [], tags: [].}
+
+ +Returns true is writing stream wstream closed or finished. +  Source +  Edit + +
+
+
+
proc close(rw: AsyncStreamRW) {....raises: [].}
+
+ +

Close and frees resources of stream rw.

+

Note close() procedure is not completed immediately!

+ +  Source +  Edit + +
+
+
+
proc closed(rw: AsyncStreamRW): bool {....raises: [].}
+
+ +Returns true is reading/writing stream is closed. +  Source +  Edit + +
+
+
+
proc closeWait(rw: AsyncStreamRW): InternalRaisesFuture[void, void] {.
+    stackTrace: false, ...raises: [], gcsafe, raises: [], raises: [].}
+
+ +Close and frees resources of stream rw. +  Source +  Edit + +
+
+
+
proc consume(rstream: AsyncStreamReader): InternalRaisesFuture[int,
+    (CancelledError, AsyncStreamError)] {.stackTrace: false, ...raises: [], gcsafe,
+    raises: [], raises: [], tags: [RootEffect].}
+
+ +

Consume (discard) all bytes from read-only stream rstream.

+

Return number of bytes actually consumed (discarded).

+ +  Source +  Edit + +
+
+
+
proc consume(rstream: AsyncStreamReader; n: int): InternalRaisesFuture[int,
+    (CancelledError, AsyncStreamError)] {.stackTrace: false, ...raises: [], gcsafe,
+    raises: [], raises: [], tags: [RootEffect].}
+
+ +

Consume (discard) all bytes (n <= 0) or n bytes from read-only stream rstream.

+

Return number of bytes actually consumed (discarded).

+ +  Source +  Edit + +
+
+
+
proc failed(rw: AsyncStreamRW): bool {....raises: [].}
+
+ +Returns true if reading/writing stream is in failed state. +  Source +  Edit + +
+
+
+
proc finish(wstream: AsyncStreamWriter): InternalRaisesFuture[void,
+    (CancelledError, AsyncStreamError)] {.stackTrace: false, ...raises: [], gcsafe,
+    raises: [], raises: [], tags: [RootEffect].}
+
+ +Finish write stream wstream. +  Source +  Edit + +
+
+
+
proc finished(rw: AsyncStreamRW): bool {....raises: [].}
+
+ +Returns true if reading/writing stream is finished (completed). +  Source +  Edit + +
+
+
+
proc forget(sb: AsyncBufferRef) {.inline, ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc getUserData[T](rw: AsyncStreamRW): T {.inline, ...raises: [].}
+
+ +Obtain user data associated with AsyncStreamReader or AsyncStreamWriter object rw. +  Source +  Edit + +
+
+
+
proc init(child, rsource: AsyncStreamReader) {....raises: [], tags: [RootEffect].}
+
+ +Initialize newly allocated object child with AsyncStreamReader parameters. +  Source +  Edit + +
+
+
+
proc init(child, rsource: AsyncStreamReader; loop: StreamReaderLoop;
+          bufferSize = AsyncStreamDefaultBufferSize) {....raises: [],
+    tags: [RootEffect].}
+
+ +Initialize newly allocated object child with AsyncStreamReader parameters. +  Source +  Edit + +
+
+
+
proc init(child, wsource: AsyncStreamWriter) {....raises: [], tags: [RootEffect].}
+
+ +Initialize newly allocated object child with AsyncStreamWriter parameters. +  Source +  Edit + +
+
+
+
proc init(child, wsource: AsyncStreamWriter; loop: StreamWriterLoop;
+          queueSize = AsyncStreamDefaultQueueSize) {....raises: [],
+    tags: [RootEffect].}
+
+ +Initialize newly allocated object child with AsyncStreamWriter parameters. +  Source +  Edit + +
+
+
+
proc init(child: AsyncStreamReader; tsource: StreamTransport) {....raises: [],
+    tags: [RootEffect].}
+
+ +Initialize newly allocated object child with AsyncStreamReader parameters. +  Source +  Edit + +
+
+
+
proc init(child: AsyncStreamWriter; tsource: StreamTransport) {....raises: [],
+    tags: [RootEffect].}
+
+ +Initialize newly allocated object child with AsyncStreamWriter parameters. +  Source +  Edit + +
+
+
+
proc init[T](child, rsource: AsyncStreamReader; loop: StreamReaderLoop;
+             bufferSize = AsyncStreamDefaultBufferSize; udata: ref T) {.
+    ...raises: [].}
+
+ +Initialize newly allocated object child with AsyncStreamReader parameters. +  Source +  Edit + +
+
+
+
proc init[T](child, rsource: AsyncStreamReader; udata: ref T) {....raises: [].}
+
+ +Initialize newly allocated object child with AsyncStreamReader parameters. +  Source +  Edit + +
+
+
+
proc init[T](child, wsource: AsyncStreamWriter; loop: StreamWriterLoop;
+             queueSize = AsyncStreamDefaultQueueSize; udata: ref T) {....raises: [].}
+
+ +Initialize newly allocated object child with AsyncStreamWriter parameters. +  Source +  Edit + +
+
+
+
proc init[T](child, wsource: AsyncStreamWriter; udata: ref T) {....raises: [].}
+
+ +Initialize newly allocated object child with AsyncStreamWriter parameters. +  Source +  Edit + +
+
+
+
proc init[T](child: AsyncStreamReader; tsource: StreamTransport; udata: ref T) {.
+    ...raises: [].}
+
+ +Initialize newly allocated object child with AsyncStreamReader parameters. +  Source +  Edit + +
+
+
+
proc init[T](child: AsyncStreamWriter; tsource: StreamTransport; udata: ref T) {.
+    ...raises: [].}
+
+ +Initialize newly allocated object child with AsyncStreamWriter parameters. +  Source +  Edit + +
+
+
+
proc join(rw: AsyncStreamRW): InternalRaisesFuture[void, (CancelledError,)] {.
+    stackTrace: false, ...raises: [], gcsafe, raises: [], raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc new(t: typedesc[AsyncBufferRef]; size: int): AsyncBufferRef {....raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc newAsyncStreamIncompleteError(): ref AsyncStreamIncompleteError {.noinline,
+    ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc newAsyncStreamLimitError(): ref AsyncStreamLimitError {.noinline,
+    ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc newAsyncStreamReader(rsource: AsyncStreamReader): AsyncStreamReader {.
+    ...raises: [], tags: [RootEffect].}
+
+ +Create copy of AsyncStreamReader object rsource. +  Source +  Edit + +
+
+
+
proc newAsyncStreamReader(rsource: AsyncStreamReader; loop: StreamReaderLoop;
+                          bufferSize = AsyncStreamDefaultBufferSize): AsyncStreamReader {.
+    ...raises: [], tags: [RootEffect].}
+
+ +

Create new AsyncStreamReader object, which will use other async stream reader rsource as source data channel.

+

loop is main reading loop procedure.

+

bufferSize is internal buffer size.

+ +  Source +  Edit + +
+
+
+
proc newAsyncStreamReader(tsource: StreamTransport): AsyncStreamReader {.
+    ...raises: [], tags: [RootEffect].}
+
+ +Create new AsyncStreamReader object, which will use stream transport tsource as source data channel. +  Source +  Edit + +
+
+
+
proc newAsyncStreamReader[T](rsource: AsyncStreamReader; loop: StreamReaderLoop;
+                             bufferSize = AsyncStreamDefaultBufferSize;
+                             udata: ref T): AsyncStreamReader {....raises: [].}
+
+ +

Create new AsyncStreamReader object, which will use other async stream reader rsource as source data channel.

+

loop is main reading loop procedure.

+

bufferSize is internal buffer size.

+

udata - user object which will be associated with new AsyncStreamReader object.

+ +  Source +  Edit + +
+
+
+
proc newAsyncStreamReader[T](rsource: AsyncStreamReader; udata: ref T): AsyncStreamReader {.
+    ...raises: [].}
+
+ +

Create copy of AsyncStreamReader object rsource.

+

udata - user object which will be associated with new AsyncStreamReader object.

+ +  Source +  Edit + +
+
+
+
proc newAsyncStreamReader[T](tsource: StreamTransport; udata: ref T): AsyncStreamReader {.
+    ...raises: [].}
+
+ +

Create new AsyncStreamReader object, which will use stream transport tsource as source data channel.

+

udata - user object which will be associated with new AsyncStreamWriter object.

+ +  Source +  Edit + +
+
+
+
proc newAsyncStreamUseClosedError(): ref AsyncStreamUseClosedError {.noinline,
+    ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc newAsyncStreamWriter(tsource: StreamTransport): AsyncStreamWriter {.
+    ...raises: [], tags: [RootEffect].}
+
+ +Create new AsyncStreamWriter object which will use stream transport tsource as data channel. +  Source +  Edit + +
+
+
+
proc newAsyncStreamWriter(wsource: AsyncStreamWriter): AsyncStreamWriter {.
+    ...raises: [], tags: [RootEffect].}
+
+ +Create copy of AsyncStreamWriter object wsource. +  Source +  Edit + +
+
+
+
proc newAsyncStreamWriter(wsource: AsyncStreamWriter; loop: StreamWriterLoop;
+                          queueSize = AsyncStreamDefaultQueueSize): AsyncStreamWriter {.
+    ...raises: [], tags: [RootEffect].}
+
+ +

Create new AsyncStreamWriter object which will use other AsyncStreamWriter object wsource as data channel.

+

loop is main writing loop procedure.

+

queueSize is writing queue size (default size is unlimited).

+ +  Source +  Edit + +
+
+
+
proc newAsyncStreamWriter[T](tsource: StreamTransport; udata: ref T): AsyncStreamWriter {.
+    ...raises: [].}
+
+ +

Create new AsyncStreamWriter object which will use stream transport tsource as data channel.

+

udata - user object which will be associated with new AsyncStreamWriter object.

+ +  Source +  Edit + +
+
+
+
proc newAsyncStreamWriter[T](wsource: AsyncStreamWriter; loop: StreamWriterLoop;
+                             queueSize = AsyncStreamDefaultQueueSize;
+                             udata: ref T): AsyncStreamWriter {....raises: [].}
+
+ +

Create new AsyncStreamWriter object which will use other AsyncStreamWriter object wsource as data channel.

+

loop is main writing loop procedure.

+

queueSize is writing queue size (default size is unlimited).

+

udata - user object which will be associated with new AsyncStreamWriter object.

+ +  Source +  Edit + +
+
+
+
proc newAsyncStreamWriter[T](wsource: AsyncStreamWriter; udata: ref T): AsyncStreamWriter {.
+    ...raises: [].}
+
+ +

Create copy of AsyncStreamWriter object wsource.

+

udata - user object which will be associated with new AsyncStreamWriter object.

+ +  Source +  Edit + +
+
+
+
proc raiseAsyncStreamIncompleteError() {.noinline, noreturn,
+    ...raises: [AsyncStreamIncompleteError], raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc raiseAsyncStreamLimitError() {.noinline, noreturn,
+                                    ...raises: [AsyncStreamLimitError], raises: [],
+                                    tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc raiseAsyncStreamUseClosedError() {.noinline, noreturn,
+                                        ...raises: [AsyncStreamUseClosedError],
+                                        raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc raiseAsyncStreamWriteEOFError() {.noinline, noreturn,
+                                       ...raises: [AsyncStreamWriteEOFError],
+                                       raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc raiseEmptyMessageDefect() {.noinline, noreturn, ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc read(rstream: AsyncStreamReader): InternalRaisesFuture[seq[byte],
+    (CancelledError, AsyncStreamError)] {.stackTrace: false, ...raises: [], gcsafe,
+    raises: [], raises: [], tags: [RootEffect].}
+
+ +

Read all bytes from read-only stream rstream.

+

This procedure allocates buffer seq[byte] and return it as result.

+ +  Source +  Edit + +
+
+
+
proc read(rstream: AsyncStreamReader; n: int): InternalRaisesFuture[seq[byte],
+    (CancelledError, AsyncStreamError)] {.stackTrace: false, ...raises: [], gcsafe,
+    raises: [], raises: [], tags: [RootEffect].}
+
+ +

Read all bytes (n <= 0) or exactly n bytes from read-only stream rstream.

+

This procedure allocates buffer seq[byte] and return it as result.

+ +  Source +  Edit + +
+
+
+
proc readExactly(rstream: AsyncStreamReader; pbytes: pointer; nbytes: int): InternalRaisesFuture[
+    void, (CancelledError, AsyncStreamError)] {.stackTrace: false, ...raises: [],
+    gcsafe, raises: [], raises: [], tags: [RootEffect].}
+
+ +

Read exactly nbytes bytes from read-only stream rstream and store it to pbytes.

+

If EOF is received and nbytes is not yet read, the procedure will raise AsyncStreamIncompleteError.

+ +  Source +  Edit + +
+
+
+
proc readLine(rstream: AsyncStreamReader; limit = 0; sep = "\r\n"): InternalRaisesFuture[
+    string, (CancelledError, AsyncStreamError)] {.stackTrace: false, ...raises: [],
+    gcsafe, raises: [], raises: [], tags: [RootEffect].}
+
+ +

Read one line from read-only stream rstream, where "line" is a sequence of bytes ending with sep (default is "\r\n").

+

If EOF is received, and sep was not found, the method will return the partial read bytes.

+

If the EOF was received and the internal buffer is empty, return an empty string.

+

If limit more then 0, then result string will be limited to limit bytes.

+ +  Source +  Edit + +
+
+
+
proc readMessage(rstream: AsyncStreamReader; pred: ReadMessagePredicate): InternalRaisesFuture[
+    void, (CancelledError, AsyncStreamError)] {.stackTrace: false, ...raises: [],
+    gcsafe, raises: [], raises: [], tags: [RootEffect].}
+
+ +

Read all bytes from stream rstream until predicate callback will not be satisfied.

+

predicate callback should return tuple (consumed, result), where consumed is the number of bytes processed and result is a completion flag (true if readMessage() should stop reading data, or false if readMessage() should continue to read data from stream).

+

predicate callback must copy all the data from data array and return number of bytes it is going to consume. predicate callback will receive (zero-length) openArray, if stream is at EOF.

+ +  Source +  Edit + +
+
+
+
proc readOnce(rstream: AsyncStreamReader; pbytes: pointer; nbytes: int): InternalRaisesFuture[
+    int, (CancelledError, AsyncStreamError)] {.stackTrace: false, ...raises: [],
+    gcsafe, raises: [], raises: [], tags: [RootEffect].}
+
+ +

Perform one read operation on read-only stream rstream.

+

If internal buffer is not empty, nbytes bytes will be transferred from internal buffer, otherwise it will wait until some bytes will be available.

+ +  Source +  Edit + +
+
+
+
proc readUntil(rstream: AsyncStreamReader; pbytes: pointer; nbytes: int;
+               sep: seq[byte]): InternalRaisesFuture[int,
+    (CancelledError, AsyncStreamError)] {.stackTrace: false, ...raises: [], gcsafe,
+    raises: [], raises: [], tags: [RootEffect].}
+
+ +

Read data from the read-only stream rstream until separator sep is found.

+

On success, the data and separator will be removed from the internal buffer (consumed). Returned data will include the separator at the end.

+

If EOF is received, and sep was not found, procedure will raise AsyncStreamIncompleteError.

+

If nbytes bytes has been received and sep was not found, procedure will raise AsyncStreamLimitError.

+

Procedure returns actual number of bytes read.

+ +  Source +  Edit + +
+
+
+
proc running(rw: AsyncStreamRW): bool {....raises: [].}
+
+ +Returns true if reading/writing stream is still pending. +  Source +  Edit + +
+
+
+
proc stopped(rw: AsyncStreamRW): bool {....raises: [].}
+
+ +Returns true if reading/writing stream is stopped (interrupted). +  Source +  Edit + +
+
+
+
proc upload(sb: AsyncBufferRef; pbytes: ptr byte; nbytes: int): InternalRaisesFuture[
+    void, (CancelledError,)] {.stackTrace: false, ...raises: [], gcsafe,
+                               raises: [], raises: [], tags: [RootEffect].}
+
+ +You can upload any amount of bytes to the buffer. If size of internal buffer is not enough to fit all the data at once, data will be uploaded via chunks of size up to internal buffer size. +  Source +  Edit + +
+
+
+
proc write(wstream: AsyncStreamWriter; pbytes: pointer; nbytes: int): InternalRaisesFuture[
+    void, (CancelledError, AsyncStreamError)] {.stackTrace: false, ...raises: [],
+    gcsafe, raises: [], raises: [], tags: [RootEffect].}
+
+ +

Write sequence of bytes pointed by pbytes of length nbytes to writer stream wstream.

+

nbytes must be more then zero.

+ +  Source +  Edit + +
+
+
+
proc write(wstream: AsyncStreamWriter; sbytes: seq[byte]; msglen = -1): InternalRaisesFuture[
+    void, (CancelledError, AsyncStreamError)] {.stackTrace: false, ...raises: [],
+    gcsafe, raises: [], raises: [], tags: [RootEffect].}
+
+ +

Write sequence of bytes sbytes of length msglen to writer stream wstream.

+

Sequence of bytes sbytes must not be zero-length.

+

If msglen < 0 whole sequence sbytes will be writen to stream. If msglen > len(sbytes) only len(sbytes) bytes will be written to stream.

+ +  Source +  Edit + +
+
+
+
proc write(wstream: AsyncStreamWriter; sbytes: string; msglen = -1): InternalRaisesFuture[
+    void, (CancelledError, AsyncStreamError)] {.stackTrace: false, ...raises: [],
+    gcsafe, raises: [], raises: [], tags: [RootEffect].}
+
+ +

Write string sbytes of length msglen to writer stream wstream.

+

String sbytes must not be zero-length.

+

If msglen < 0 whole string sbytes will be writen to stream. If msglen > len(sbytes) only len(sbytes) bytes will be written to stream.

+ +  Source +  Edit + +
+
+ +
+
+

Templates

+
+
+
template checkStreamClosed(t: untyped)
+
+ + +  Source +  Edit + +
+
+
+
template checkStreamFinished(t: untyped)
+
+ + +  Source +  Edit + +
+
+
+
template copyOut(dest: pointer; item: WriteItem; length: int)
+
+ + +  Source +  Edit + +
+
+
+
template transfer(sb: AsyncBufferRef): untyped
+
+ + +  Source +  Edit + +
+
+
+
template wait(sb: AsyncBufferRef): untyped
+
+ + +  Source +  Edit + +
+
+ +
+
+

Exports

+
+setThreadDispatcher, closeSocket, ENOSR, EHOSTUNREACH, EHOSTDOWN, ECONNRESET, EDQUOT, fail, ECANCELED, EMLINK, FuturePendingError, milliseconds, <=, +=, $, asyncTimer, internalRaiseIfError, getSrcLocation, FutureError, fromNow, weeks, ESPIPE, withTimeout, LocationKind, id, <=, FutureCompletedError, ENOEXEC, ESHUTDOWN, fail, EREMOTEIO, toString, EXFULL, waitFor, complete, ==, oneValue, internalInitFutureBase, EPROTONOSUPPORT, Nanosecond, epochNanoSeconds, cancelAndWait, addTimer, Moment, ECOMM, EPROTOTYPE, AsyncExceptionError, milliseconds, getTrackerCounter, ENOENT, millis, removeTimer, FutureFlag, ENOTCONN, EBUSY, init, ENOTUNIQ, days, +=, await, or, ZeroDuration, EKEYREVOKED, AsyncTimeoutError, EUCLEAN, Second, EEXIST, ENOLINK, newInternalRaisesFuture, idleAsync, ==, internalRaiseIfError, SomeIntegerI64, ENOMEM, ENOKEY, +, removeWriter2, ENOMSG, [], trackCounter, EKEYEXPIRED, Week, isCounterLeaked, awaitne, EAFNOSUPPORT, EWOULDBLOCK, EREMOTE, Finished, untrackCounter, AsyncCallback, EHWPOISON, epochSeconds, newDispatcher, EPERM, microseconds, trackerCounters, >=, weeks, Finished, cancelCallback=, ETOOMANYREFS, $, EISCONN, callSoon, ESOCKTNOSUPPORT, setGlobalDispatcher, EXDEV, EBADF, cancelSoon, allFinished, TrackerBase, hours, InternalAsyncCallback, EBFONT, ENETDOWN, EACCES, ELOOP, InfiniteDuration, ETIMEDOUT, >=, EINVAL, value, EBADFD, Future, completed, PDispatcher, ESRCH, EL2NSYNC, EFAULT, low, ESTRPIPE, -=, or, ENOTSOCK, getAsyncTimestamp, await, Hour, EIDRM, removeReader2, secs, getThreadDispatcher, futureContinue, ENOANO, EADV, CallbackFunc, ENFILE, FutureBase, waitFor, high, Microsecond, ENOPKG, ELIBBAD, callSoon, EOWNERDEAD, flags, ERANGE, done, ENONET, completed, callSoon, cancelSoon, EMSGSIZE, EALREADY, EBADMSG, EILSEQ, ENOPROTOOPT, SrcLoc, allFutures, -, complete, FutureState, EBADR, nanos, location, FutureDefect, EDOTDOT, ENOBUFS, EKEYREJECTED, <, Minute, error, ==, one, CancelledError, nanoseconds, EISDIR, EOVERFLOW, FutureSeq, cancelAndWait, micros, all, -, ESRMNT, ENOTEMPTY, EPROTO, TimerCallback, microseconds, error, ENOTRECOVERABLE, wait, callIdle, join, hours, AsyncError, EBADRQC, ENODEV, tryCancel, addTimer, ECHRNG, ENOTDIR, EUNATCH, cancelAndSchedule, failed, nanoseconds, ERESTART, *, ETXTBSY, getTracker, newFutureStr, EMFILE, LocFinishIndex, withTimeout, addTimer, race, EUSERS, ENOTBLK, ENOTTY, EISNAM, ELIBACC, ENAVAIL, init, race, internalCallTick, EDESTADDRREQ, +, cancelSoon, completed, minutes, cancel, FutureFlags, getGlobalDispatcher, ELIBEXEC, stepsAsync, micros, wait, EINPROGRESS, EPFNOSUPPORT, E2BIG, -=, runForever, ENOMEDIUM, secs, value, read, waitFor, EL3HLT, unregisterAndCloseFd, EBADSLT, InternalRaisesFuture, -, <, ENETRESET, fastEpochTime, ENXIO, isZero, EPIPE, allFutures, Day, wait, now, read, asyncSpawn, removeCallback, EAGAIN, raiseOsDefect, trackerCounterKeys, EADDRNOTAVAIL, read, removeCallback, TrackerCounter, async, addCallback, init, async, EREMCHG, finished, addCallback, seconds, noCancel, low, AsyncFD, ECHILD, Raising, init, ECONNABORTED, state, wait, >, callIdle, removeTimer, LocCreateIndex, addReader2, ETIME, ENOLCK, EDEADLK, asyncCheck, Duration, ELNRNG, EDOM, ENOCSI, millis, EBADE, EMEDIUMTYPE, readError, sleepAsync, isInfinite, asyncDiscard, callback=, ENETUNREACH, InternalFutureBase, callIdle, ENOSYS, ELIBSCN, EIO, EROFS, seconds, ELIBMAX, div, init, EL2HLT, EOPNOTSUPP, FutureStr, poll, oneIndex, clearTimer, register2, LocCompleteIndex, days, ENOSTR, EADDRINUSE, one, sleepAsync, ENAMETOOLONG, EMULTIHOP, ESTALE, race, ENODATA, EFBIG, +, minutes, ERFKILL, cancelled, $, toException, join, EDEADLOCK, allFutures, MaxEventsCount, wait, read, raiseAsDefect, ENOSPC, Millisecond, >, setTimer, cancelSoon, unregister2, failed, waitFor, newFutureSeq, addTracker, callback=, orImpl, ECONNREFUSED, high, ENOTNAM, nanos, addWriter2, removeTimer, internalCallTick, EINTR, and, closeHandle, EL3RST, readError, *, newFuture, internalCallTick, []=, EDQUOT, Second, closeSocket, EHOSTUNREACH, EHOSTDOWN, closeWait, ECONNRESET, ==, fail, ECANCELED, EMLINK, milliseconds, FutureBase, <=, +=, $, asyncTimer, internalRaiseIfError, getSrcLocation, FutureError, fromNow, close, weeks, LocFinishIndex, ESPIPE, withTimeout, LocationKind, id, isSet, <=, FutureCompletedError, SomeIntegerI64, fail, EREMOTEIO, waitFor, addTimer, ==, oneValue, internalInitFutureBase, EPROTONOSUPPORT, nanoseconds, cancelAndWait, addTimer, Moment, ECOMM, addFirst, register, EPROTOTYPE, [], AsyncExceptionError, and, SrcLoc, ENOCSI, milliseconds, getTrackerCounter, ENOENT, millis, removeTimer, ELIBACC, EADDRNOTAVAIL, ENOTCONN, EBUSY, init, waitFor, days, +=, await, EAFNOSUPPORT, cancelSoon, AsyncTimeoutError, internalCallTick, []=, setThreadDispatcher, EEXIST, isInfinite, ENOLINK, newInternalRaisesFuture, idleAsync, internalRaiseIfError, ESHUTDOWN, ENOMEM, ENOKEY, +, removeWriter2, ENOMSG, [], trackCounter, EKEYEXPIRED, Week, isCounterLeaked, awaitne, $, EWOULDBLOCK, EREMOTE, unregister, Finished, untrackCounter, AsyncCallback, EHWPOISON, epochSeconds, newDispatcher, EPERM, microseconds, trackerCounters, >=, sleepAsync, addCallback, weeks, EFAULT, callIdle, cancelCallback=, ETOOMANYREFS, mitems, EISCONN, callSoon, ESOCKTNOSUPPORT, newAsyncQueue, setGlobalDispatcher, AsyncQueue, EXDEV, EBADF, EKEYREVOKED, micros, microseconds, hours, wait, ENETDOWN, EACCES, AsyncEvent, AsyncEventQueue, ELOOP, InfiniteDuration, ETIMEDOUT, >=, clear, EINVAL, ==, EBADFD, Future, addCallback, len, completed, PDispatcher, ESRCH, EL2NSYNC, Finished, low, popFirst, ESTRPIPE, -=, contains, getAsyncTimestamp, div, race, Hour, EIDRM, removeReader2, EventQueueReader, secs, getThreadDispatcher, EventQueueKey, futureContinue, popFirstNoWait, join, ENOANO, readError, CallbackFunc, $, FutureStr, addLastNoWait, ENOEXEC, waitFor, high, Microsecond, complete, $, pairs, ELIBBAD, callSoon, EOWNERDEAD, oneIndex, ERANGE, done, clearTimer, popLastNoWait, ENONET, completed, callSoon, release, cancelSoon, EMSGSIZE, EBADMSG, EILSEQ, ENOPROTOOPT, Day, allFutures, empty, -, complete, FutureState, addFirstNoWait, EBADR, nanos, location, FutureDefect, EDOTDOT, ENOBUFS, put, EKEYREJECTED, <, Minute, error, epochNanoSeconds, one, CancelledError, EISDIR, EOVERFLOW, FutureSeq, cancelAndWait, micros, all, -, ESRMNT, ENOTEMPTY, EPROTO, TimerCallback, TrackerBase, ENOTRECOVERABLE, EBFONT, callIdle, EDOM, value, hours, AsyncError, EBADRQC, ENODEV, ENFILE, ENOPKG, callback=, ECHRNG, wait, EUNATCH, cancelAndSchedule, failed, nanoseconds, ERESTART, *, ETXTBSY, getTracker, newFutureStr, full, EMFILE, orImpl, withTimeout, addTimer, race, EUSERS, ENOTBLK, ENOTTY, EISNAM, ENOSR, init, EXFULL, EUCLEAN, EDESTADDRREQ, +, cancelSoon, minutes, cancel, FutureFlags, getGlobalDispatcher, ELIBEXEC, stepsAsync, error, allFinished, wait, clear, value, EINPROGRESS, completed, E2BIG, -=, runForever, ENOMEDIUM, secs, AsyncQueueEmptyError, read, waitFor, EINTR, unregisterAndCloseFd, EBADSLT, or, [], -, EALREADY, <, ENETRESET, fastEpochTime, waitEvents, seconds, isZero, FuturePendingError, EPIPE, AsyncLockError, InternalFutureBase, getNoWait, allFutures, len, race, ENAVAIL, EPFNOSUPPORT, wait, EMULTIHOP, read, asyncSpawn, removeCallback, EAGAIN, raiseOsDefect, trackerCounterKeys, FutureFlag, read, removeCallback, TrackerCounter, async, AsyncLock, init, popLast, async, EREMCHG, finished, fire, ENXIO, or, seconds, noCancel, low, AsyncFD, ECHILD, init, ECONNABORTED, state, ENOTDIR, >, callIdle, removeTimer, LocCreateIndex, setTimer, ETIME, InternalRaisesFuture, EBADE, EDEADLK, items, cancelSoon, asyncCheck, unregister2, Duration, ELNRNG, locked, join, millis, EMEDIUMTYPE, readError, ZeroDuration, newFutureSeq, newAsyncEventQueue, asyncDiscard, InternalAsyncCallback, ENETUNREACH, get, ENOSYS, acquire, ELIBSCN, EIO, EROFS, AsyncEventQueueFullError, ELIBMAX, newAsyncEvent, ENOLCK, EFBIG, EL2HLT, AsyncQueueFullError, EOPNOTSUPP, emit, tryCancel, poll, readerOverflow, flags, register2, LocCompleteIndex, newAsyncLock, sleepAsync, days, ENOSTR, EADDRINUSE, one, size, newFuture, now, putNoWait, Nanosecond, wait, ESTALE, Raising, await, ENODATA, init, +, minutes, ERFKILL, cancelled, toException, EDEADLOCK, allFutures, MaxEventsCount, wait, read, raiseAsDefect, ENOSPC, Millisecond, addLast, >, addReader2, failed, ENOTUNIQ, addTracker, callback=, ENOTSOCK, ECONNREFUSED, high, ENOTNAM, nanos, addWriter2, toString, removeTimer, internalCallTick, EL3HLT, closeHandle, EL3RST, EADV, *, ENAMETOOLONG, internalCallTick, localAddress2, close, createStreamServer, createStreamServer, start2, StreamCallback2, closeWait, fromPipe, readLine, TransportFlags, ReadMessagePredicate, TransportInitCallback, localAddress, createStreamServer, running, StreamTransportTrackerName, StreamCallback, getUserData, createStreamServer, connect, join, finished, readExactly, start, localAddress, TransportKind, write, write, writeFile, SocketFlags, atEof, createStreamServer, readMessage, shutdownWait, closed, StreamServer, accept, remoteAddress2, createStreamServer, close, readOnce, DefaultBacklogSize, write, createStreamServer, closed, connect, toUnchecked, consume, toException, readUntil, read, createStreamServer, stop2, createStreamServer, consume, failed, createStreamServer, closeWait, join, StreamServerTrackerName, StreamTransport, stop, remoteAddress, fromPipe2, read, ==, DualStackType, toHex, getAutoAddress, address, ==, resolveTAddress, TransportAddress, TransportIncompleteError, getAutoAddresses, ==, initTAddress, AddressFamily, ServerStatus, host, getTransportOsError, getTransportOsError, $, getTransportTooManyError, windowsAnyAddressFix, setDualstack, toIpAddress, $, $, TransportNoSupport, TransportUseClosedError, TransportUseEofError, ServerFlags, resolveTAddress, TransportAbortedError, ==, initTAddress, $, setDualstack, resolveTAddress, getConnectionAbortedError, toSAddr, TransportError, AnyAddress, resolveTAddress, ==, getDomain, getServerUseClosedError, resolveTAddress, fromSAddr, TransportTooManyError, checkClosed, ServerCommand, getTransportUseClosedError, getTransportError, resolveTAddress, initTAddress, raiseTransportOsError, TransportOsError, getDomain, resolveTAddress, checkWriteEof, resolveTAddress, isAvailable, SocketServer, ==, DefaultDatagramBufferSize, getError, TransportAddressError, TransportLimitError, DefaultStreamBufferSize, getConnectionAbortedError, raiseTransportError, AnyAddress6, checkClosed, TransportState, initTAddress +
+ +
+
+ +
+ +
+
+
+ + + diff --git a/api/chronos/streams/asyncstream.idx b/api/chronos/streams/asyncstream.idx new file mode 100644 index 00000000..8b388f49 --- /dev/null +++ b/api/chronos/streams/asyncstream.idx @@ -0,0 +1,96 @@ +AsyncStreamDefaultBufferSize chronos/streams/asyncstream.html#AsyncStreamDefaultBufferSize asyncstream: AsyncStreamDefaultBufferSize +AsyncStreamDefaultQueueSize chronos/streams/asyncstream.html#AsyncStreamDefaultQueueSize asyncstream: AsyncStreamDefaultQueueSize +AsyncStreamReaderTrackerName chronos/streams/asyncstream.html#AsyncStreamReaderTrackerName asyncstream: AsyncStreamReaderTrackerName +AsyncStreamWriterTrackerName chronos/streams/asyncstream.html#AsyncStreamWriterTrackerName asyncstream: AsyncStreamWriterTrackerName +AsyncStreamError chronos/streams/asyncstream.html#AsyncStreamError asyncstream: AsyncStreamError +AsyncStreamIncorrectDefect chronos/streams/asyncstream.html#AsyncStreamIncorrectDefect asyncstream: AsyncStreamIncorrectDefect +AsyncStreamIncompleteError chronos/streams/asyncstream.html#AsyncStreamIncompleteError asyncstream: AsyncStreamIncompleteError +AsyncStreamLimitError chronos/streams/asyncstream.html#AsyncStreamLimitError asyncstream: AsyncStreamLimitError +AsyncStreamUseClosedError chronos/streams/asyncstream.html#AsyncStreamUseClosedError asyncstream: AsyncStreamUseClosedError +AsyncStreamReadError chronos/streams/asyncstream.html#AsyncStreamReadError asyncstream: AsyncStreamReadError +AsyncStreamWriteError chronos/streams/asyncstream.html#AsyncStreamWriteError asyncstream: AsyncStreamWriteError +AsyncStreamWriteEOFError chronos/streams/asyncstream.html#AsyncStreamWriteEOFError asyncstream: AsyncStreamWriteEOFError +AsyncBuffer chronos/streams/asyncstream.html#AsyncBuffer asyncstream: AsyncBuffer +AsyncBufferRef chronos/streams/asyncstream.html#AsyncBufferRef asyncstream: AsyncBufferRef +Pointer chronos/streams/asyncstream.html#Pointer WriteType.Pointer +Sequence chronos/streams/asyncstream.html#Sequence WriteType.Sequence +String chronos/streams/asyncstream.html#String WriteType.String +WriteType chronos/streams/asyncstream.html#WriteType asyncstream: WriteType +WriteItem chronos/streams/asyncstream.html#WriteItem asyncstream: WriteItem +Running chronos/streams/asyncstream.html#Running AsyncStreamState.Running +Error chronos/streams/asyncstream.html#Error AsyncStreamState.Error +Stopped chronos/streams/asyncstream.html#Stopped AsyncStreamState.Stopped +Finished chronos/streams/asyncstream.html#Finished AsyncStreamState.Finished +Closing chronos/streams/asyncstream.html#Closing AsyncStreamState.Closing +Closed chronos/streams/asyncstream.html#Closed AsyncStreamState.Closed +AsyncStreamState chronos/streams/asyncstream.html#AsyncStreamState asyncstream: AsyncStreamState +StreamReaderLoop chronos/streams/asyncstream.html#StreamReaderLoop asyncstream: StreamReaderLoop +StreamWriterLoop chronos/streams/asyncstream.html#StreamWriterLoop asyncstream: StreamWriterLoop +AsyncStreamReader chronos/streams/asyncstream.html#AsyncStreamReader asyncstream: AsyncStreamReader +AsyncStreamWriter chronos/streams/asyncstream.html#AsyncStreamWriter asyncstream: AsyncStreamWriter +AsyncStream chronos/streams/asyncstream.html#AsyncStream asyncstream: AsyncStream +AsyncStreamRW chronos/streams/asyncstream.html#AsyncStreamRW asyncstream: AsyncStreamRW +new chronos/streams/asyncstream.html#new,typedesc[AsyncBufferRef],int asyncstream: new(t: typedesc[AsyncBufferRef]; size: int): AsyncBufferRef +wait chronos/streams/asyncstream.html#wait.t,AsyncBufferRef asyncstream: wait(sb: AsyncBufferRef): untyped +transfer chronos/streams/asyncstream.html#transfer.t,AsyncBufferRef asyncstream: transfer(sb: AsyncBufferRef): untyped +forget chronos/streams/asyncstream.html#forget,AsyncBufferRef asyncstream: forget(sb: AsyncBufferRef) +upload chronos/streams/asyncstream.html#upload,AsyncBufferRef,ptr.byte,int asyncstream: upload(sb: AsyncBufferRef; pbytes: ptr byte; nbytes: int): InternalRaisesFuture[\n void, (CancelledError,)] +copyOut chronos/streams/asyncstream.html#copyOut.t,pointer,WriteItem,int asyncstream: copyOut(dest: pointer; item: WriteItem; length: int) +newAsyncStreamIncompleteError chronos/streams/asyncstream.html#newAsyncStreamIncompleteError asyncstream: newAsyncStreamIncompleteError(): ref AsyncStreamIncompleteError +newAsyncStreamLimitError chronos/streams/asyncstream.html#newAsyncStreamLimitError asyncstream: newAsyncStreamLimitError(): ref AsyncStreamLimitError +newAsyncStreamUseClosedError chronos/streams/asyncstream.html#newAsyncStreamUseClosedError asyncstream: newAsyncStreamUseClosedError(): ref AsyncStreamUseClosedError +raiseAsyncStreamUseClosedError chronos/streams/asyncstream.html#raiseAsyncStreamUseClosedError asyncstream: raiseAsyncStreamUseClosedError() +raiseAsyncStreamLimitError chronos/streams/asyncstream.html#raiseAsyncStreamLimitError asyncstream: raiseAsyncStreamLimitError() +raiseAsyncStreamIncompleteError chronos/streams/asyncstream.html#raiseAsyncStreamIncompleteError asyncstream: raiseAsyncStreamIncompleteError() +raiseEmptyMessageDefect chronos/streams/asyncstream.html#raiseEmptyMessageDefect asyncstream: raiseEmptyMessageDefect() +raiseAsyncStreamWriteEOFError chronos/streams/asyncstream.html#raiseAsyncStreamWriteEOFError asyncstream: raiseAsyncStreamWriteEOFError() +atEof chronos/streams/asyncstream.html#atEof,AsyncStreamReader asyncstream: atEof(rstream: AsyncStreamReader): bool +atEof chronos/streams/asyncstream.html#atEof,AsyncStreamWriter asyncstream: atEof(wstream: AsyncStreamWriter): bool +closed chronos/streams/asyncstream.html#closed,AsyncStreamRW asyncstream: closed(rw: AsyncStreamRW): bool +finished chronos/streams/asyncstream.html#finished,AsyncStreamRW asyncstream: finished(rw: AsyncStreamRW): bool +stopped chronos/streams/asyncstream.html#stopped,AsyncStreamRW asyncstream: stopped(rw: AsyncStreamRW): bool +running chronos/streams/asyncstream.html#running,AsyncStreamRW asyncstream: running(rw: AsyncStreamRW): bool +failed chronos/streams/asyncstream.html#failed,AsyncStreamRW asyncstream: failed(rw: AsyncStreamRW): bool +checkStreamClosed chronos/streams/asyncstream.html#checkStreamClosed.t,untyped asyncstream: checkStreamClosed(t: untyped) +checkStreamFinished chronos/streams/asyncstream.html#checkStreamFinished.t,untyped asyncstream: checkStreamFinished(t: untyped) +readExactly chronos/streams/asyncstream.html#readExactly,AsyncStreamReader,pointer,int asyncstream: readExactly(rstream: AsyncStreamReader; pbytes: pointer; nbytes: int): InternalRaisesFuture[\n void, (CancelledError, AsyncStreamError)] +readOnce chronos/streams/asyncstream.html#readOnce,AsyncStreamReader,pointer,int asyncstream: readOnce(rstream: AsyncStreamReader; pbytes: pointer; nbytes: int): InternalRaisesFuture[\n int, (CancelledError, AsyncStreamError)] +readUntil chronos/streams/asyncstream.html#readUntil,AsyncStreamReader,pointer,int,seq[byte] asyncstream: readUntil(rstream: AsyncStreamReader; pbytes: pointer; nbytes: int;\n sep: seq[byte]): InternalRaisesFuture[int,\n (CancelledError, AsyncStreamError)] +readLine chronos/streams/asyncstream.html#readLine,AsyncStreamReader,int,string asyncstream: readLine(rstream: AsyncStreamReader; limit = 0; sep = "\r\n"): InternalRaisesFuture[\n string, (CancelledError, AsyncStreamError)] +read chronos/streams/asyncstream.html#read,AsyncStreamReader asyncstream: read(rstream: AsyncStreamReader): InternalRaisesFuture[seq[byte],\n (CancelledError, AsyncStreamError)] +read chronos/streams/asyncstream.html#read,AsyncStreamReader,int asyncstream: read(rstream: AsyncStreamReader; n: int): InternalRaisesFuture[seq[byte],\n (CancelledError, AsyncStreamError)] +consume chronos/streams/asyncstream.html#consume,AsyncStreamReader asyncstream: consume(rstream: AsyncStreamReader): InternalRaisesFuture[int,\n (CancelledError, AsyncStreamError)] +consume chronos/streams/asyncstream.html#consume,AsyncStreamReader,int asyncstream: consume(rstream: AsyncStreamReader; n: int): InternalRaisesFuture[int,\n (CancelledError, AsyncStreamError)] +readMessage chronos/streams/asyncstream.html#readMessage,AsyncStreamReader,ReadMessagePredicate asyncstream: readMessage(rstream: AsyncStreamReader; pred: ReadMessagePredicate): InternalRaisesFuture[\n void, (CancelledError, AsyncStreamError)] +write chronos/streams/asyncstream.html#write,AsyncStreamWriter,pointer,int asyncstream: write(wstream: AsyncStreamWriter; pbytes: pointer; nbytes: int): InternalRaisesFuture[\n void, (CancelledError, AsyncStreamError)] +write chronos/streams/asyncstream.html#write,AsyncStreamWriter,seq[byte],int asyncstream: write(wstream: AsyncStreamWriter; sbytes: seq[byte]; msglen = -1): InternalRaisesFuture[\n void, (CancelledError, AsyncStreamError)] +write chronos/streams/asyncstream.html#write,AsyncStreamWriter,string,int asyncstream: write(wstream: AsyncStreamWriter; sbytes: string; msglen = -1): InternalRaisesFuture[\n void, (CancelledError, AsyncStreamError)] +finish chronos/streams/asyncstream.html#finish,AsyncStreamWriter asyncstream: finish(wstream: AsyncStreamWriter): InternalRaisesFuture[void,\n (CancelledError, AsyncStreamError)] +join chronos/streams/asyncstream.html#join,AsyncStreamRW asyncstream: join(rw: AsyncStreamRW): InternalRaisesFuture[void, (CancelledError,)] +close chronos/streams/asyncstream.html#close,AsyncStreamRW asyncstream: close(rw: AsyncStreamRW) +closeWait chronos/streams/asyncstream.html#closeWait,AsyncStreamRW asyncstream: closeWait(rw: AsyncStreamRW): InternalRaisesFuture[void, void] +init chronos/streams/asyncstream.html#init,AsyncStreamWriter,AsyncStreamWriter,StreamWriterLoop asyncstream: init(child, wsource: AsyncStreamWriter; loop: StreamWriterLoop;\n queueSize = AsyncStreamDefaultQueueSize) +init chronos/streams/asyncstream.html#init,AsyncStreamWriter,AsyncStreamWriter,StreamWriterLoop,ref.T asyncstream: init[T](child, wsource: AsyncStreamWriter; loop: StreamWriterLoop;\n queueSize = AsyncStreamDefaultQueueSize; udata: ref T) +init chronos/streams/asyncstream.html#init,AsyncStreamReader,AsyncStreamReader,StreamReaderLoop asyncstream: init(child, rsource: AsyncStreamReader; loop: StreamReaderLoop;\n bufferSize = AsyncStreamDefaultBufferSize) +init chronos/streams/asyncstream.html#init,AsyncStreamReader,AsyncStreamReader,StreamReaderLoop,ref.T asyncstream: init[T](child, rsource: AsyncStreamReader; loop: StreamReaderLoop;\n bufferSize = AsyncStreamDefaultBufferSize; udata: ref T) +init chronos/streams/asyncstream.html#init,AsyncStreamWriter,StreamTransport asyncstream: init(child: AsyncStreamWriter; tsource: StreamTransport) +init chronos/streams/asyncstream.html#init,AsyncStreamWriter,StreamTransport,ref.T asyncstream: init[T](child: AsyncStreamWriter; tsource: StreamTransport; udata: ref T) +init chronos/streams/asyncstream.html#init,AsyncStreamWriter,AsyncStreamWriter asyncstream: init(child, wsource: AsyncStreamWriter) +init chronos/streams/asyncstream.html#init,AsyncStreamWriter,AsyncStreamWriter,ref.T asyncstream: init[T](child, wsource: AsyncStreamWriter; udata: ref T) +init chronos/streams/asyncstream.html#init,AsyncStreamReader,StreamTransport asyncstream: init(child: AsyncStreamReader; tsource: StreamTransport) +init chronos/streams/asyncstream.html#init,AsyncStreamReader,StreamTransport,ref.T asyncstream: init[T](child: AsyncStreamReader; tsource: StreamTransport; udata: ref T) +init chronos/streams/asyncstream.html#init,AsyncStreamReader,AsyncStreamReader asyncstream: init(child, rsource: AsyncStreamReader) +init chronos/streams/asyncstream.html#init,AsyncStreamReader,AsyncStreamReader,ref.T asyncstream: init[T](child, rsource: AsyncStreamReader; udata: ref T) +newAsyncStreamReader chronos/streams/asyncstream.html#newAsyncStreamReader,AsyncStreamReader,StreamReaderLoop,ref.T asyncstream: newAsyncStreamReader[T](rsource: AsyncStreamReader; loop: StreamReaderLoop;\n bufferSize = AsyncStreamDefaultBufferSize; udata: ref T): AsyncStreamReader +newAsyncStreamReader chronos/streams/asyncstream.html#newAsyncStreamReader,AsyncStreamReader,StreamReaderLoop asyncstream: newAsyncStreamReader(rsource: AsyncStreamReader; loop: StreamReaderLoop;\n bufferSize = AsyncStreamDefaultBufferSize): AsyncStreamReader +newAsyncStreamReader chronos/streams/asyncstream.html#newAsyncStreamReader,StreamTransport,ref.T asyncstream: newAsyncStreamReader[T](tsource: StreamTransport; udata: ref T): AsyncStreamReader +newAsyncStreamReader chronos/streams/asyncstream.html#newAsyncStreamReader,StreamTransport asyncstream: newAsyncStreamReader(tsource: StreamTransport): AsyncStreamReader +newAsyncStreamReader chronos/streams/asyncstream.html#newAsyncStreamReader,AsyncStreamReader,ref.T asyncstream: newAsyncStreamReader[T](rsource: AsyncStreamReader; udata: ref T): AsyncStreamReader +newAsyncStreamReader chronos/streams/asyncstream.html#newAsyncStreamReader,AsyncStreamReader asyncstream: newAsyncStreamReader(rsource: AsyncStreamReader): AsyncStreamReader +newAsyncStreamWriter chronos/streams/asyncstream.html#newAsyncStreamWriter,AsyncStreamWriter,StreamWriterLoop,ref.T asyncstream: newAsyncStreamWriter[T](wsource: AsyncStreamWriter; loop: StreamWriterLoop;\n queueSize = AsyncStreamDefaultQueueSize; udata: ref T): AsyncStreamWriter +newAsyncStreamWriter chronos/streams/asyncstream.html#newAsyncStreamWriter,AsyncStreamWriter,StreamWriterLoop asyncstream: newAsyncStreamWriter(wsource: AsyncStreamWriter; loop: StreamWriterLoop;\n queueSize = AsyncStreamDefaultQueueSize): AsyncStreamWriter +newAsyncStreamWriter chronos/streams/asyncstream.html#newAsyncStreamWriter,StreamTransport,ref.T asyncstream: newAsyncStreamWriter[T](tsource: StreamTransport; udata: ref T): AsyncStreamWriter +newAsyncStreamWriter chronos/streams/asyncstream.html#newAsyncStreamWriter,StreamTransport asyncstream: newAsyncStreamWriter(tsource: StreamTransport): AsyncStreamWriter +newAsyncStreamWriter chronos/streams/asyncstream.html#newAsyncStreamWriter,AsyncStreamWriter,ref.T asyncstream: newAsyncStreamWriter[T](wsource: AsyncStreamWriter; udata: ref T): AsyncStreamWriter +newAsyncStreamWriter chronos/streams/asyncstream.html#newAsyncStreamWriter,AsyncStreamWriter asyncstream: newAsyncStreamWriter(wsource: AsyncStreamWriter): AsyncStreamWriter +getUserData chronos/streams/asyncstream.html#getUserData,AsyncStreamRW asyncstream: getUserData[T](rw: AsyncStreamRW): T diff --git a/api/chronos/streams/chunkstream.html b/api/chronos/streams/chunkstream.html new file mode 100644 index 00000000..2b75471e --- /dev/null +++ b/api/chronos/streams/chunkstream.html @@ -0,0 +1,412 @@ + + + + + + + + + + + + + + + + + + +chronos/streams/chunkstream + + + + + + + + +
+
+

chronos/streams/chunkstream

+
+ +   Source +  Edit + +
+
+ +

This module implements HTTP/1.1 chunked-encoded stream reading and writing.

+ +
+

Types

+
+
+
ChunkedStreamError = object of AsyncStreamError
+
+ + +  Source +  Edit + +
+
+
+
ChunkedStreamIncompleteError = object of ChunkedStreamError
+
+ + +  Source +  Edit + +
+
+
+
ChunkedStreamProtocolError = object of ChunkedStreamError
+
+ + +  Source +  Edit + +
+
+
+
ChunkedStreamReader = ref object of AsyncStreamReader
+
+ + +  Source +  Edit + +
+
+
+
ChunkedStreamWriter = ref object of AsyncStreamWriter
+
+ + +  Source +  Edit + +
+
+ +
+
+

Procs

+
+
+
proc hexValue(c: byte): int {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc init(child: ChunkedStreamReader; rsource: AsyncStreamReader;
+          bufferSize = ChunkBufferSize) {....raises: [], tags: [RootEffect].}
+
+ + +  Source +  Edit + +
+
+
+
proc init(child: ChunkedStreamWriter; wsource: AsyncStreamWriter;
+          queueSize = AsyncStreamDefaultQueueSize) {....raises: [],
+    tags: [RootEffect].}
+
+ + +  Source +  Edit + +
+
+
+
proc init[T](child: ChunkedStreamReader; rsource: AsyncStreamReader;
+             bufferSize = ChunkBufferSize; udata: ref T) {....raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc init[T](child: ChunkedStreamWriter; wsource: AsyncStreamWriter;
+             queueSize = AsyncStreamDefaultQueueSize; udata: ref T) {....raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc newChunkedStreamReader(rsource: AsyncStreamReader;
+                            bufferSize = AsyncStreamDefaultBufferSize): ChunkedStreamReader {.
+    ...raises: [], tags: [RootEffect].}
+
+ + +  Source +  Edit + +
+
+
+
proc newChunkedStreamReader[T](rsource: AsyncStreamReader;
+                               bufferSize = AsyncStreamDefaultBufferSize;
+                               udata: ref T): ChunkedStreamReader {....raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc newChunkedStreamWriter(wsource: AsyncStreamWriter;
+                            queueSize = AsyncStreamDefaultQueueSize): ChunkedStreamWriter {.
+    ...raises: [], tags: [RootEffect].}
+
+ + +  Source +  Edit + +
+
+
+
proc newChunkedStreamWriter[T](wsource: AsyncStreamWriter;
+                               queueSize = AsyncStreamDefaultQueueSize;
+                               udata: ref T): ChunkedStreamWriter {....raises: [].}
+
+ + +  Source +  Edit + +
+
+ +
+
+

Exports

+
+setThreadDispatcher, closeSocket, ENOSR, EHOSTUNREACH, EHOSTDOWN, ECONNRESET, EDQUOT, fail, ECANCELED, EMLINK, FuturePendingError, milliseconds, <=, +=, $, asyncTimer, internalRaiseIfError, getSrcLocation, FutureError, fromNow, weeks, ESPIPE, withTimeout, LocationKind, id, <=, FutureCompletedError, ENOEXEC, ESHUTDOWN, fail, EREMOTEIO, toString, EXFULL, waitFor, complete, ==, oneValue, internalInitFutureBase, EPROTONOSUPPORT, Nanosecond, epochNanoSeconds, cancelAndWait, addTimer, Moment, ECOMM, EPROTOTYPE, AsyncExceptionError, milliseconds, getTrackerCounter, ENOENT, millis, removeTimer, FutureFlag, ENOTCONN, EBUSY, init, ENOTUNIQ, days, +=, await, or, ZeroDuration, EKEYREVOKED, AsyncTimeoutError, EUCLEAN, Second, EEXIST, ENOLINK, newInternalRaisesFuture, idleAsync, ==, internalRaiseIfError, SomeIntegerI64, ENOMEM, ENOKEY, +, removeWriter2, ENOMSG, [], trackCounter, EKEYEXPIRED, Week, isCounterLeaked, awaitne, EAFNOSUPPORT, EWOULDBLOCK, EREMOTE, Finished, untrackCounter, AsyncCallback, EHWPOISON, epochSeconds, newDispatcher, EPERM, microseconds, trackerCounters, >=, weeks, Finished, cancelCallback=, ETOOMANYREFS, $, EISCONN, callSoon, ESOCKTNOSUPPORT, setGlobalDispatcher, EXDEV, EBADF, cancelSoon, allFinished, TrackerBase, hours, InternalAsyncCallback, EBFONT, ENETDOWN, EACCES, ELOOP, InfiniteDuration, ETIMEDOUT, >=, EINVAL, value, EBADFD, Future, completed, PDispatcher, ESRCH, EL2NSYNC, EFAULT, low, ESTRPIPE, -=, or, ENOTSOCK, getAsyncTimestamp, await, Hour, EIDRM, removeReader2, secs, getThreadDispatcher, futureContinue, ENOANO, EADV, CallbackFunc, ENFILE, FutureBase, waitFor, high, Microsecond, ENOPKG, ELIBBAD, callSoon, EOWNERDEAD, flags, ERANGE, done, ENONET, completed, callSoon, cancelSoon, EMSGSIZE, EALREADY, EBADMSG, EILSEQ, ENOPROTOOPT, SrcLoc, allFutures, -, complete, FutureState, EBADR, nanos, location, FutureDefect, EDOTDOT, ENOBUFS, EKEYREJECTED, <, Minute, error, ==, one, CancelledError, nanoseconds, EISDIR, EOVERFLOW, FutureSeq, cancelAndWait, micros, all, -, ESRMNT, ENOTEMPTY, EPROTO, TimerCallback, microseconds, error, ENOTRECOVERABLE, wait, callIdle, join, hours, AsyncError, EBADRQC, ENODEV, tryCancel, addTimer, ECHRNG, ENOTDIR, EUNATCH, cancelAndSchedule, failed, nanoseconds, ERESTART, *, ETXTBSY, getTracker, newFutureStr, EMFILE, LocFinishIndex, withTimeout, addTimer, race, EUSERS, ENOTBLK, ENOTTY, EISNAM, ELIBACC, ENAVAIL, init, race, internalCallTick, EDESTADDRREQ, +, cancelSoon, completed, minutes, cancel, FutureFlags, getGlobalDispatcher, ELIBEXEC, stepsAsync, micros, wait, EINPROGRESS, EPFNOSUPPORT, E2BIG, -=, runForever, ENOMEDIUM, secs, value, read, waitFor, EL3HLT, unregisterAndCloseFd, EBADSLT, InternalRaisesFuture, -, <, ENETRESET, fastEpochTime, ENXIO, isZero, EPIPE, allFutures, Day, wait, now, read, asyncSpawn, removeCallback, EAGAIN, raiseOsDefect, trackerCounterKeys, EADDRNOTAVAIL, read, removeCallback, TrackerCounter, async, addCallback, init, async, EREMCHG, finished, addCallback, seconds, noCancel, low, AsyncFD, ECHILD, Raising, init, ECONNABORTED, state, wait, >, callIdle, removeTimer, LocCreateIndex, addReader2, ETIME, ENOLCK, EDEADLK, asyncCheck, Duration, ELNRNG, EDOM, ENOCSI, millis, EBADE, EMEDIUMTYPE, readError, sleepAsync, isInfinite, asyncDiscard, callback=, ENETUNREACH, InternalFutureBase, callIdle, ENOSYS, ELIBSCN, EIO, EROFS, seconds, ELIBMAX, div, init, EL2HLT, EOPNOTSUPP, FutureStr, poll, oneIndex, clearTimer, register2, LocCompleteIndex, days, ENOSTR, EADDRINUSE, one, sleepAsync, ENAMETOOLONG, EMULTIHOP, ESTALE, race, ENODATA, EFBIG, +, minutes, ERFKILL, cancelled, $, toException, join, EDEADLOCK, allFutures, MaxEventsCount, wait, read, raiseAsDefect, ENOSPC, Millisecond, >, setTimer, cancelSoon, unregister2, failed, waitFor, newFutureSeq, addTracker, callback=, orImpl, ECONNREFUSED, high, ENOTNAM, nanos, addWriter2, removeTimer, internalCallTick, EINTR, and, closeHandle, EL3RST, readError, *, newFuture, internalCallTick, EDQUOT, AsyncStreamError, createStreamServer, milliseconds, ==, createStreamServer, EMLINK, createStreamServer, milliseconds, EMFILE, $, fromNow, close, weeks, LocFinishIndex, getTransportOsError, read, id, <=, FutureCompletedError, waitFor, finished, EPROTONOSUPPORT, cancelAndWait, createStreamServer, windowsAnyAddressFix, failed, createStreamServer, newAsyncStreamWriter, removeTimer, race, EAFNOSUPPORT, ENOSPC, TransportUseClosedError, idleAsync, init, initTAddress, ENOKEY, Week, cancelSoon, awaitne, [], EREMOTE, EFAULT, epochSeconds, close, microseconds, AsyncEvent, weeks, cancelCallback=, ETOOMANYREFS, and, raiseAsyncStreamLimitError, TransportInitCallback, localAddress, StreamServerTrackerName, micros, wait, ENETDOWN, EACCES, EINVAL, full, EBADFD, seconds, AsyncStreamWriteError, read, raiseTransportOsError, finish, start, join, AsyncStreamIncorrectDefect, <=, init, completed, FutureBase, ELIBBAD, TransportLimitError, or, cancelSoon, EILSEQ, allFutures, EADV, -, newAsyncStreamWriter, location, addFirstNoWait, ENOLCK, FutureSeq, cancelAndWait, all, EPROTO, getConnectionAbortedError, callIdle, value, ENODEV, close, ECHRNG, ERFKILL, setTimer, nanoseconds, closeWait, get, running, addTimer, ENOTTY, EISNAM, init, createStreamServer, +, FutureFlags, getGlobalDispatcher, ELIBEXEC, $, E2BIG, -=, AsyncStreamReader, AsyncQueueEmptyError, newAsyncStreamWriter, <, checkWriteEof, fastEpochTime, resolveTAddress, read, toHex, fromPipe2, TrackerCounter, write, localAddress2, start2, async, EREMCHG, finished, StreamServer, SocketFlags, low, stopped, removeTimer, createStreamServer, release, Duration, failed, ==, AsyncStreamDefaultQueueSize, initTAddress, getUserData, localAddress, orImpl, EROFS, seconds, init, readerOverflow, nanos, atEof, consume, Nanosecond, race, ENODATA, init, +, $, DefaultStreamBufferSize, read, resolveTAddress, createStreamServer, failed, ELIBSCN, ENOTNAM, nanos, closeHandle, ENOTUNIQ, newFuture, popFirstNoWait, closeSocket, ECONNRESET, [], Second, getSrcLocation, FutureError, getTransportTooManyError, init, withTimeout, EREMOTEIO, oneIndex, oneValue, ENOENT, AsyncStreamReadError, []=, []=, setThreadDispatcher, EEXIST, ENOMSG, ESHUTDOWN, removeWriter2, [], setDualstack, isCounterLeaked, EWOULDBLOCK, Finished, untrackCounter, readMessage, setGlobalDispatcher, TrackerBase, >=, AsyncEventQueue, addCallback, TransportError, ESTRPIPE, $, EISCONN, callSoon, getServerUseClosedError, readUntil, close, EBADF, microseconds, ETIMEDOUT, Future, EL2NSYNC, ETIME, getDomain, EL2HLT, EIDRM, removeReader2, futureContinue, ENOANO, DefaultBacklogSize, register, closed, ERANGE, done, popLastNoWait, init, ENONET, completed, EMSGSIZE, EBADMSG, ENOPROTOOPT, initTAddress, newAsyncStreamWriter, EDOTDOT, one, Minute, CancelledError, readLine, EOVERFLOW, raiseTransportError, newAsyncStreamReader, AnyAddress6, ENOTEMPTY, TimerCallback, EADDRNOTAVAIL, wait, AsyncStreamIncompleteError, WriteType, checkClosed, size, EUNATCH, newAsyncLock, div, ERESTART, newFutureStr, FuturePendingError, unregisterAndCloseFd, newAsyncQueue, newAsyncEvent, ENOTBLK, race, InternalRaisesFuture, cancelSoon, cancel, micros, wait, unregister, EINPROGRESS, -, remoteAddress, new, AsyncStreamDefaultBufferSize, EDOM, EPIPE, AsyncLockError, getNoWait, len, EDESTADDRREQ, shutdownWait, removeCallback, EAGAIN, FutureFlag, read, async, resolveTAddress, emit, ENXIO, noCancel, consume, init, ECONNABORTED, state, EBFONT, EDEADLK, ENOEXEC, asyncCheck, locked, readError, ZeroDuration, ENOSYS, EventQueueKey, ELIBMAX, EOPNOTSUPP, ENOSTR, one, getTransportError, newAsyncStreamReader, AsyncStream, checkClosed, Raising, popFirst, join, read, items, Millisecond, consume, callIdle, ECONNREFUSED, addWriter2, EL3HLT, join, readError, *, asyncTimer, EHOSTUNREACH, EHOSTDOWN, ECANCELED, init, +=, EPFNOSUPPORT, internalRaiseIfError, newInternalRaisesFuture, ESPIPE, LocationKind, TransportAddress, SomeIntegerI64, complete, AsyncBufferRef, internalInitFutureBase, AddressFamily, nanoseconds, host, ECOMM, init, closed, join, getTrackerCounter, millis, AsyncBuffer, ENOTCONN, EBUSY, days, sleepAsync, +=, consume, internalCallTick, checkStreamFinished, isZero, StreamReaderLoop, internalRaiseIfError, ENOMEM, addFirst, EKEYEXPIRED, or, EPERM, AsyncCallback, trackerCounters, fromPipe, newAsyncEventQueue, DefaultDatagramBufferSize, ESOCKTNOSUPPORT, EHWPOISON, AsyncQueue, EXDEV, EKEYREVOKED, toIpAddress, hours, TransportIncompleteError, InfiniteDuration, setDualstack, >=, clear, value, ESRCH, fire, fromSAddr, ENOMEDIUM, secs, getThreadDispatcher, write, isAvailable, AsyncStreamRW, waitFor, isSet, SocketServer, FutureStr, addLastNoWait, getTransportOsError, read, checkStreamClosed, waitFor, epochNanoSeconds, ENOPKG, newAsyncStreamWriter, callSoon, WriteItem, EBADE, len, getAsyncTimestamp, FutureState, EBADR, put, EKEYREJECTED, init, EISDIR, address, StreamWriterLoop, ESRMNT, ENAVAIL, error, write, AsyncError, EBADRQC, ENFILE, createStreamServer, failed, getAutoAddresses, mitems, getUserData, ETXTBSY, withTimeout, flags, ELIBACC, Day, minutes, DualStackType, ReadMessagePredicate, AsyncStreamWriter, runForever, toException, init, EBADSLT, closed, TransportUseEofError, ENETRESET, waitEvents, upload, AsyncStreamState, wait, asyncSpawn, removeCallback, AsyncLock, getConnectionAbortedError, init, addCallback, clearTimer, newAsyncStreamReader, AsyncFD, ECHILD, newAsyncStreamUseClosedError, >, callIdle, LocCreateIndex, AsyncStreamWriterTrackerName, ==, StreamTransportTrackerName, getError, join, millis, EMEDIUMTYPE, sleepAsync, getDomain, asyncDiscard, callback=, EIO, write, tryCancel, high, poll, days, ==, ESTALE, minutes, toException, MaxEventsCount, wait, raiseAsDefect, newAsyncStreamReader, >, addReader2, unregister2, addTracker, callback=, high, toString, internalCallTick, EINTR, internalCallTick, raiseAsyncStreamWriteEOFError, closeWait, fail, popLast, transfer, AsyncStreamWriteEOFError, StreamCallback, readOnce, closeWait, AsyncStreamLimitError, connect, fail, addTimer, Moment, EPROTOTYPE, AsyncExceptionError, SrcLoc, ENOCSI, init, now, await, AsyncTimeoutError, createStreamServer, ENOLINK, +, StreamTransport, newAsyncStreamLimitError, trackCounter, init, newDispatcher, StreamCallback2, TransportFlags, completed, readOnce, newAsyncStreamWriter, error, ServerFlags, TransportTooManyError, readExactly, ELOOP, ENOSR, $, AsyncStreamReaderTrackerName, allFinished, ServerCommand, resolveTAddress, PDispatcher, trackerCounterKeys, Finished, low, toUnchecked, -=, ==, TransportKind, stop2, Hour, init, writeFile, atEof, resolveTAddress, addLast, CallbackFunc, contains, Microsecond, pairs, EOWNERDEAD, connect, readMessage, callSoon, readUntil, EALREADY, TransportOsError, addTimer, initTAddress, FutureDefect, ENOBUFS, <, cancelSoon, -, resolveTAddress, ENOTRECOVERABLE, ENOTDIR, hours, ==, wait, cancelAndSchedule, *, getTracker, getAutoAddress, readLine, ServerStatus, complete, EUSERS, EXFULL, EUCLEAN, raiseEmptyMessageDefect, accept, stepsAsync, clear, EventQueueReader, secs, read, waitFor, newAsyncStreamReader, TransportNoSupport, empty, closeWait, write, raiseAsyncStreamIncompleteError, allFutures, copyOut, raiseOsDefect, toSAddr, acquire, AsyncQueueFullError, write, TransportAbortedError, wait, newAsyncStreamReader, ELNRNG, raiseAsyncStreamUseClosedError, isInfinite, finished, AsyncStreamUseClosedError, InternalAsyncCallback, ENETUNREACH, InternalFutureBase, readExactly, getTransportUseClosedError, resolveTAddress, AsyncEventQueueFullError, init, atEof, resolveTAddress, register2, LocCompleteIndex, forget, EADDRINUSE, EMULTIHOP, putNoWait, AnyAddress, await, EFBIG, TransportAddressError, cancelled, EDEADLOCK, allFutures, running, newFutureSeq, newAsyncStreamIncompleteError, ENOTSOCK, TransportState, remoteAddress2, removeTimer, stop, EL3RST, ENAMETOOLONG, localAddress2, close, createStreamServer, createStreamServer, start2, StreamCallback2, closeWait, fromPipe, readLine, TransportFlags, ReadMessagePredicate, TransportInitCallback, localAddress, createStreamServer, running, StreamTransportTrackerName, StreamCallback, getUserData, createStreamServer, connect, join, finished, readExactly, start, localAddress, TransportKind, write, write, writeFile, SocketFlags, atEof, createStreamServer, readMessage, shutdownWait, closed, StreamServer, accept, remoteAddress2, createStreamServer, close, readOnce, DefaultBacklogSize, write, createStreamServer, closed, connect, toUnchecked, consume, toException, readUntil, read, createStreamServer, stop2, createStreamServer, consume, failed, createStreamServer, closeWait, join, StreamServerTrackerName, StreamTransport, stop, remoteAddress, fromPipe2, read, Hour, init, fromNow, milliseconds, <, fastEpochTime, Minute, secs, Day, micros, >=, ==, nanoseconds, +, >=, nanos, minutes, <=, low, milliseconds, millis, $, micros, asyncTimer, +=, Nanosecond, -, -, Second, >, high, epochNanoSeconds, Microsecond, weeks, microseconds, secs, InfiniteDuration, -=, +, minutes, +=, microseconds, $, hours, toString, hours, Duration, now, <, weeks, Millisecond, <=, millis, >, ==, seconds, isZero, ZeroDuration, isInfinite, SomeIntegerI64, div, +, *, epochSeconds, high, nanoseconds, nanos, low, -, days, -=, Week, days, seconds, *, Moment, ==, DualStackType, toHex, getAutoAddress, address, ==, resolveTAddress, TransportAddress, TransportIncompleteError, getAutoAddresses, ==, initTAddress, AddressFamily, ServerStatus, host, getTransportOsError, getTransportOsError, $, getTransportTooManyError, windowsAnyAddressFix, setDualstack, toIpAddress, $, $, TransportNoSupport, TransportUseClosedError, TransportUseEofError, ServerFlags, resolveTAddress, TransportAbortedError, ==, initTAddress, $, setDualstack, resolveTAddress, getConnectionAbortedError, toSAddr, TransportError, AnyAddress, resolveTAddress, ==, getDomain, getServerUseClosedError, resolveTAddress, fromSAddr, TransportTooManyError, checkClosed, ServerCommand, getTransportUseClosedError, getTransportError, resolveTAddress, initTAddress, raiseTransportOsError, TransportOsError, getDomain, resolveTAddress, checkWriteEof, resolveTAddress, isAvailable, SocketServer, ==, DefaultDatagramBufferSize, getError, TransportAddressError, TransportLimitError, DefaultStreamBufferSize, getConnectionAbortedError, raiseTransportError, AnyAddress6, checkClosed, TransportState, initTAddress +
+ +
+
+ +
+ +
+
+
+ + + diff --git a/api/chronos/streams/chunkstream.idx b/api/chronos/streams/chunkstream.idx new file mode 100644 index 00000000..c99c50bd --- /dev/null +++ b/api/chronos/streams/chunkstream.idx @@ -0,0 +1,14 @@ +ChunkedStreamReader chronos/streams/chunkstream.html#ChunkedStreamReader chunkstream: ChunkedStreamReader +ChunkedStreamWriter chronos/streams/chunkstream.html#ChunkedStreamWriter chunkstream: ChunkedStreamWriter +ChunkedStreamError chronos/streams/chunkstream.html#ChunkedStreamError chunkstream: ChunkedStreamError +ChunkedStreamProtocolError chronos/streams/chunkstream.html#ChunkedStreamProtocolError chunkstream: ChunkedStreamProtocolError +ChunkedStreamIncompleteError chronos/streams/chunkstream.html#ChunkedStreamIncompleteError chunkstream: ChunkedStreamIncompleteError +hexValue chronos/streams/chunkstream.html#hexValue,byte chunkstream: hexValue(c: byte): int +init chronos/streams/chunkstream.html#init,ChunkedStreamReader,AsyncStreamReader,ref.T chunkstream: init[T](child: ChunkedStreamReader; rsource: AsyncStreamReader;\n bufferSize = ChunkBufferSize; udata: ref T) +init chronos/streams/chunkstream.html#init,ChunkedStreamReader,AsyncStreamReader chunkstream: init(child: ChunkedStreamReader; rsource: AsyncStreamReader;\n bufferSize = ChunkBufferSize) +newChunkedStreamReader chronos/streams/chunkstream.html#newChunkedStreamReader,AsyncStreamReader,ref.T chunkstream: newChunkedStreamReader[T](rsource: AsyncStreamReader;\n bufferSize = AsyncStreamDefaultBufferSize;\n udata: ref T): ChunkedStreamReader +newChunkedStreamReader chronos/streams/chunkstream.html#newChunkedStreamReader,AsyncStreamReader chunkstream: newChunkedStreamReader(rsource: AsyncStreamReader;\n bufferSize = AsyncStreamDefaultBufferSize): ChunkedStreamReader +init chronos/streams/chunkstream.html#init,ChunkedStreamWriter,AsyncStreamWriter,ref.T chunkstream: init[T](child: ChunkedStreamWriter; wsource: AsyncStreamWriter;\n queueSize = AsyncStreamDefaultQueueSize; udata: ref T) +init chronos/streams/chunkstream.html#init,ChunkedStreamWriter,AsyncStreamWriter chunkstream: init(child: ChunkedStreamWriter; wsource: AsyncStreamWriter;\n queueSize = AsyncStreamDefaultQueueSize) +newChunkedStreamWriter chronos/streams/chunkstream.html#newChunkedStreamWriter,AsyncStreamWriter,ref.T chunkstream: newChunkedStreamWriter[T](wsource: AsyncStreamWriter;\n queueSize = AsyncStreamDefaultQueueSize; udata: ref T): ChunkedStreamWriter +newChunkedStreamWriter chronos/streams/chunkstream.html#newChunkedStreamWriter,AsyncStreamWriter chunkstream: newChunkedStreamWriter(wsource: AsyncStreamWriter;\n queueSize = AsyncStreamDefaultQueueSize): ChunkedStreamWriter diff --git a/api/chronos/timer.html b/api/chronos/timer.html new file mode 100644 index 00000000..43fda9b8 --- /dev/null +++ b/api/chronos/timer.html @@ -0,0 +1,1376 @@ + + + + + + + + + + + + + + + + + + +chronos/timer + + + + + + + + +
+
+

chronos/timer

+
+
+
+ +     Dark Mode +
+ +
+ Search: +
+
+ Group by: + +
+ + +
+   Source +  Edit + +
+
+ +

This module implements cross-platform system timer with milliseconds resolution.

+

Timer supports two types of clocks: system uses the most fast OS primitive to obtain wall clock time. mono uses monotonic clock time (default).

+

system clock is affected by discontinuous jumps in the system time. This clock is significantly faster then mono clock in most of the cases.

+

mono clock is not affected by discontinuous jumps in the system time. This clock is slower then system clock.

+

You can specify which timer you want to use -d:asyncTimer=<system/mono>.

+

+ +
+

Types

+
+
+
Duration = object
+  value: int64
+
+
+ +A Duration is the interval between to points in time. +  Source +  Edit + +
+
+
+
Moment = object
+  value: int64
+
+
+ +A Moment in time. Its value has no direct meaning, but can be compared with other Moments. Moments are captured using a monotonically non-decreasing clock (by default). +  Source +  Edit + +
+
+
+
SomeIntegerI64 = SomeSignedInt | uint8 | uint16 | uint32
+
+ + +  Source +  Edit + +
+
+ +
+
+

Consts

+
+
+
asyncTimer = "mono"
+
+ + +  Source +  Edit + +
+
+
+
Day = (value: 86400000000000)
+
+ + +  Source +  Edit + +
+
+
+
Hour = (value: 3600000000000)
+
+ + +  Source +  Edit + +
+
+
+
InfiniteDuration = (value: 9223372036854775807)
+
+ + +  Source +  Edit + +
+
+
+
Microsecond = (value: 1000)
+
+ + +  Source +  Edit + +
+
+
+
Millisecond = (value: 1000000)
+
+ + +  Source +  Edit + +
+
+
+
Minute = (value: 60000000000)
+
+ + +  Source +  Edit + +
+
+
+
Nanosecond = (value: 1)
+
+ + +  Source +  Edit + +
+
+
+
Second = (value: 1000000000)
+
+ + +  Source +  Edit + +
+
+
+
Week = (value: 604800000000000)
+
+ + +  Source +  Edit + +
+
+
+
ZeroDuration = (value: 0)
+
+ + +  Source +  Edit + +
+
+ +
+
+

Procs

+
+
+
func `$`(a: Duration): string {.inline, ...raises: [], tags: [].}
+
+ +Returns string representation of Duration a. +  Source +  Edit + +
+
+
+
func `$`(a: Moment): string {.inline, ...raises: [], tags: [].}
+
+ +Returns string representation of Moment a as nanoseconds value. +  Source +  Edit + +
+
+
+
func `*`(a: Duration; b: SomeIntegerI64): Duration {.inline, ...raises: [].}
+
+ +Returns Duration multiplied by scalar integer. +  Source +  Edit + +
+
+
+
func `*`(a: SomeIntegerI64; b: Duration): Duration {.inline, ...raises: [].}
+
+ +Returns Duration multiplied by scalar integer. +  Source +  Edit + +
+
+
+
func `+=`(a: var Duration; b: Duration) {.inline, ...raises: [], tags: [].}
+
+ +Duration += Duration +  Source +  Edit + +
+
+
+
func `+=`(a: var Moment; b: Duration) {.inline, ...raises: [], tags: [].}
+
+ +Moment += Duration +  Source +  Edit + +
+
+
+
func `+`(a: Duration; b: Duration): Duration {.inline, ...raises: [], tags: [].}
+
+ +Duration + Duration = Duration +  Source +  Edit + +
+
+
+
func `+`(a: Duration; b: Moment): Moment {.inline, ...raises: [], tags: [].}
+
+ +Duration + Moment = Moment +  Source +  Edit + +
+
+
+
func `+`(a: Moment; b: Duration): Moment {.inline, ...raises: [], tags: [].}
+
+ +Moment + Duration = Moment +  Source +  Edit + +
+
+
+
func `-=`(a: var Duration; b: Duration) {.inline, ...raises: [], tags: [].}
+
+ +Duration -= Duration +  Source +  Edit + +
+
+
+
func `-=`(a: var Moment; b: Duration) {.inline, ...raises: [], tags: [].}
+
+ +Moment -= Duration +  Source +  Edit + +
+
+
+
func `-`(a, b: Moment): Duration {.inline, ...raises: [], tags: [].}
+
+ +

Moment - Moment = Duration

+

Note: Duration can't be negative.

+ +  Source +  Edit + +
+
+
+
func `-`(a: Duration; b: Duration): Duration {.inline, ...raises: [], tags: [].}
+
+ +

Duration - Duration = Duration

+

Note: Duration can't be negative.

+ +  Source +  Edit + +
+
+
+
func `-`(a: Moment; b: Duration): Moment {.inline, ...raises: [], tags: [].}
+
+ +

Moment - Duration = Moment

+

Note: Moment can be negative

+ +  Source +  Edit + +
+
+
+
func `<=`(a, b: Duration): bool {.inline, ...raises: [], tags: [].}
+
+ +Returns true if a less or equal b. +  Source +  Edit + +
+
+
+
func `<=`(a, b: Moment): bool {.inline, ...raises: [], tags: [].}
+
+ +Returns true if a less or equal b. +  Source +  Edit + +
+
+
+
func `<`(a, b: Duration): bool {.inline, ...raises: [], tags: [].}
+
+ +Returns true if a less then b. +  Source +  Edit + +
+
+
+
func `<`(a, b: Moment): bool {.inline, ...raises: [], tags: [].}
+
+ +Returns true if a less then b. +  Source +  Edit + +
+
+
+
func `==`(a, b: Duration): bool {.inline, ...raises: [], tags: [].}
+
+ +Returns true if a equal to b. +  Source +  Edit + +
+
+
+
func `==`(a, b: Moment): bool {.inline, ...raises: [], tags: [].}
+
+ +Returns true if a equal to b. +  Source +  Edit + +
+
+
+
func `>=`(a, b: Duration): bool {.inline, ...raises: [], tags: [].}
+
+ +Returns true if a bigger or equal b. +  Source +  Edit + +
+
+
+
func `>=`(a, b: Moment): bool {.inline, ...raises: [], tags: [].}
+
+ +Returns true if a bigger or equal b. +  Source +  Edit + +
+
+
+
func `>`(a, b: Duration): bool {.inline, ...raises: [], tags: [].}
+
+ +Returns true if a bigger then b. +  Source +  Edit + +
+
+
+
func `>`(a, b: Moment): bool {.inline, ...raises: [], tags: [].}
+
+ +Returns true if a bigger then b. +  Source +  Edit + +
+
+
+
func `div`(a: Duration; b: SomeIntegerI64): Duration {.inline, ...raises: [].}
+
+ +Returns Duration which is result of dividing a Duration by scalar integer. +  Source +  Edit + +
+
+
+
func days(v: Duration): int64 {.inline, ...raises: [], tags: [].}
+
+ +Round Duration v to days. +  Source +  Edit + +
+
+
+
func days(v: SomeIntegerI64): Duration {.inline, ...raises: [].}
+
+ +Initialize Duration with days value v. +  Source +  Edit + +
+
+
+
func epochNanoSeconds(moment: Moment): int64 {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
func epochSeconds(moment: Moment): int64 {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc fastEpochTime(): uint64 {.inline, ...deprecated: "Use Moment.now()",
+                               raises: [], tags: [].}
+
+
+ Deprecated: Use Moment.now() +
+ +Procedure's resolution is millisecond. +  Source +  Edit + +
+
+
+
proc fromNow(t: typedesc[Moment]; a: Duration): Moment {.inline, ...raises: [].}
+
+ +Returns moment in time which is equal to current moment + Duration. +  Source +  Edit + +
+
+
+
func hours(v: Duration): int64 {.inline, ...raises: [], tags: [].}
+
+ +Round Duration v to hours. +  Source +  Edit + +
+
+
+
func hours(v: SomeIntegerI64): Duration {.inline, ...raises: [].}
+
+ +Initialize Duration with hours value v. +  Source +  Edit + +
+
+
+
func init(t: typedesc[Moment]; value: int64; precision: Duration): Moment {.
+    ...raises: [].}
+
+ +Initialize Moment with absolute time value value with precision precision. +  Source +  Edit + +
+
+
+
func isInfinite(a: Duration): bool {.inline, ...raises: [], tags: [].}
+
+ +Returns true if Duration a is infinite. +  Source +  Edit + +
+
+
+
func isZero(a: Duration): bool {.inline, ...raises: [], tags: [].}
+
+ +Returns true if Duration a is 0. +  Source +  Edit + +
+
+
+
func micros(v: Duration): int64 {.inline, ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
func micros(v: SomeIntegerI64): Duration {.inline, ...raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
func microseconds(v: Duration): int64 {.inline, ...raises: [], tags: [].}
+
+ +Round Duration v to microseconds. +  Source +  Edit + +
+
+
+
func microseconds(v: SomeIntegerI64): Duration {.inline, ...raises: [].}
+
+ +Initialize Duration with microseconds value v. +  Source +  Edit + +
+
+
+
func millis(v: Duration): int64 {.inline, ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
func millis(v: SomeIntegerI64): Duration {.inline, ...raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
func milliseconds(v: Duration): int64 {.inline, ...raises: [], tags: [].}
+
+ +Round Duration v to milliseconds. +  Source +  Edit + +
+
+
+
func milliseconds(v: SomeIntegerI64): Duration {.inline, ...raises: [].}
+
+ +Initialize Duration with milliseconds value v. +  Source +  Edit + +
+
+
+
func minutes(v: Duration): int64 {.inline, ...raises: [], tags: [].}
+
+ +Round Duration v to minutes. +  Source +  Edit + +
+
+
+
func minutes(v: SomeIntegerI64): Duration {.inline, ...raises: [].}
+
+ +Initialize Duration with minutes value v. +  Source +  Edit + +
+
+
+
func nanos(v: Duration): int64 {.inline, ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
func nanos(v: SomeIntegerI64): Duration {.inline, ...raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
func nanoseconds(v: Duration): int64 {.inline, ...raises: [], tags: [].}
+
+ +Round Duration v to nanoseconds. +  Source +  Edit + +
+
+
+
func nanoseconds(v: SomeIntegerI64): Duration {.inline, ...raises: [].}
+
+ +Initialize Duration with nanoseconds value v. +  Source +  Edit + +
+
+
+
proc now(t: typedesc[Moment]): Moment {.inline, ...raises: [].}
+
+ +Returns current moment in time as Moment. +  Source +  Edit + +
+
+
+
func seconds(v: Duration): int64 {.inline, ...raises: [], tags: [].}
+
+ +Round Duration v to seconds. +  Source +  Edit + +
+
+
+
func seconds(v: SomeIntegerI64): Duration {.inline, ...raises: [].}
+
+ +Initialize Duration with seconds value v. +  Source +  Edit + +
+
+
+
func secs(v: Duration): int64 {.inline, ...raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
func secs(v: SomeIntegerI64): Duration {.inline, ...raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
func toString(a: timer.Duration; parts = int.high): string {....raises: [],
+    tags: [].}
+
+ +Returns a pretty string representation of Duration a - the number of parts returned can be limited thus truncating the output to an approximation that grows more precise as the duration becomes smaller +  Source +  Edit + +
+
+
+
func weeks(v: Duration): int64 {.inline, ...raises: [], tags: [].}
+
+ +Round Duration v to weeks. +  Source +  Edit + +
+
+
+
func weeks(v: SomeIntegerI64): Duration {.inline, ...raises: [].}
+
+ +Initialize Duration with weeks value v. +  Source +  Edit + +
+
+ +
+
+

Templates

+
+
+
template high(T: typedesc[Duration]): Duration
+
+ + +  Source +  Edit + +
+
+
+
template high(T: typedesc[Moment]): Moment
+
+ + +  Source +  Edit + +
+
+
+
template low(T: typedesc[Duration]): Duration
+
+ + +  Source +  Edit + +
+
+
+
template low(T: typedesc[Moment]): Moment
+
+ + +  Source +  Edit + +
+
+ +
+ +
+
+ +
+ +
+
+
+ + + diff --git a/api/chronos/timer.idx b/api/chronos/timer.idx new file mode 100644 index 00000000..909d37c6 --- /dev/null +++ b/api/chronos/timer.idx @@ -0,0 +1,76 @@ +asyncTimer chronos/timer.html#asyncTimer timer: asyncTimer +fastEpochTime chronos/timer.html#fastEpochTime timer: fastEpochTime(): uint64 +Moment chronos/timer.html#Moment timer: Moment +Duration chronos/timer.html#Duration timer: Duration +SomeIntegerI64 chronos/timer.html#SomeIntegerI64 timer: SomeIntegerI64 +`+` chronos/timer.html#+,Duration,Duration timer: `+`(a: Duration; b: Duration): Duration +`+` chronos/timer.html#+,Duration,Moment timer: `+`(a: Duration; b: Moment): Moment +`+` chronos/timer.html#+,Moment,Duration timer: `+`(a: Moment; b: Duration): Moment +`+=` chronos/timer.html#+=,Moment,Duration timer: `+=`(a: var Moment; b: Duration) +`+=` chronos/timer.html#+=,Duration,Duration timer: `+=`(a: var Duration; b: Duration) +`-` chronos/timer.html#-,Moment,Moment timer: `-`(a, b: Moment): Duration +`-` chronos/timer.html#-,Moment,Duration timer: `-`(a: Moment; b: Duration): Moment +`-` chronos/timer.html#-,Duration,Duration timer: `-`(a: Duration; b: Duration): Duration +`-=` chronos/timer.html#-=,Duration,Duration timer: `-=`(a: var Duration; b: Duration) +`-=` chronos/timer.html#-=,Moment,Duration timer: `-=`(a: var Moment; b: Duration) +`==` chronos/timer.html#==,Duration,Duration timer: `==`(a, b: Duration): bool +`==` chronos/timer.html#==,Moment,Moment timer: `==`(a, b: Moment): bool +`<` chronos/timer.html#<,Duration,Duration timer: `<`(a, b: Duration): bool +`<` chronos/timer.html#<,Moment,Moment timer: `<`(a, b: Moment): bool +`<=` chronos/timer.html#<=,Duration,Duration timer: `<=`(a, b: Duration): bool +`<=` chronos/timer.html#<=,Moment,Moment timer: `<=`(a, b: Moment): bool +`>` chronos/timer.html#>,Duration,Duration timer: `>`(a, b: Duration): bool +`>` chronos/timer.html#>,Moment,Moment timer: `>`(a, b: Moment): bool +`>=` chronos/timer.html#>=,Duration,Duration timer: `>=`(a, b: Duration): bool +`>=` chronos/timer.html#>=,Moment,Moment timer: `>=`(a, b: Moment): bool +`*` chronos/timer.html#*,Duration,SomeIntegerI64 timer: `*`(a: Duration; b: SomeIntegerI64): Duration +`*` chronos/timer.html#*,SomeIntegerI64,Duration timer: `*`(a: SomeIntegerI64; b: Duration): Duration +`div` chronos/timer.html#div,Duration,SomeIntegerI64 timer: `div`(a: Duration; b: SomeIntegerI64): Duration +Nanosecond chronos/timer.html#Nanosecond timer: Nanosecond +Microsecond chronos/timer.html#Microsecond timer: Microsecond +Millisecond chronos/timer.html#Millisecond timer: Millisecond +Second chronos/timer.html#Second timer: Second +Minute chronos/timer.html#Minute timer: Minute +Hour chronos/timer.html#Hour timer: Hour +Day chronos/timer.html#Day timer: Day +Week chronos/timer.html#Week timer: Week +ZeroDuration chronos/timer.html#ZeroDuration timer: ZeroDuration +InfiniteDuration chronos/timer.html#InfiniteDuration timer: InfiniteDuration +high chronos/timer.html#high.t,typedesc[Moment] timer: high(T: typedesc[Moment]): Moment +low chronos/timer.html#low.t,typedesc[Moment] timer: low(T: typedesc[Moment]): Moment +high chronos/timer.html#high.t,typedesc[Duration] timer: high(T: typedesc[Duration]): Duration +low chronos/timer.html#low.t,typedesc[Duration] timer: low(T: typedesc[Duration]): Duration +nanoseconds chronos/timer.html#nanoseconds,SomeIntegerI64 timer: nanoseconds(v: SomeIntegerI64): Duration +microseconds chronos/timer.html#microseconds,SomeIntegerI64 timer: microseconds(v: SomeIntegerI64): Duration +milliseconds chronos/timer.html#milliseconds,SomeIntegerI64 timer: milliseconds(v: SomeIntegerI64): Duration +seconds chronos/timer.html#seconds,SomeIntegerI64 timer: seconds(v: SomeIntegerI64): Duration +minutes chronos/timer.html#minutes,SomeIntegerI64 timer: minutes(v: SomeIntegerI64): Duration +hours chronos/timer.html#hours,SomeIntegerI64 timer: hours(v: SomeIntegerI64): Duration +days chronos/timer.html#days,SomeIntegerI64 timer: days(v: SomeIntegerI64): Duration +weeks chronos/timer.html#weeks,SomeIntegerI64 timer: weeks(v: SomeIntegerI64): Duration +nanoseconds chronos/timer.html#nanoseconds,Duration timer: nanoseconds(v: Duration): int64 +microseconds chronos/timer.html#microseconds,Duration timer: microseconds(v: Duration): int64 +milliseconds chronos/timer.html#milliseconds,Duration timer: milliseconds(v: Duration): int64 +seconds chronos/timer.html#seconds,Duration timer: seconds(v: Duration): int64 +minutes chronos/timer.html#minutes,Duration timer: minutes(v: Duration): int64 +hours chronos/timer.html#hours,Duration timer: hours(v: Duration): int64 +days chronos/timer.html#days,Duration timer: days(v: Duration): int64 +weeks chronos/timer.html#weeks,Duration timer: weeks(v: Duration): int64 +nanos chronos/timer.html#nanos,SomeIntegerI64 timer: nanos(v: SomeIntegerI64): Duration +micros chronos/timer.html#micros,SomeIntegerI64 timer: micros(v: SomeIntegerI64): Duration +millis chronos/timer.html#millis,SomeIntegerI64 timer: millis(v: SomeIntegerI64): Duration +secs chronos/timer.html#secs,SomeIntegerI64 timer: secs(v: SomeIntegerI64): Duration +nanos chronos/timer.html#nanos,Duration timer: nanos(v: Duration): int64 +micros chronos/timer.html#micros,Duration timer: micros(v: Duration): int64 +millis chronos/timer.html#millis,Duration timer: millis(v: Duration): int64 +secs chronos/timer.html#secs,Duration timer: secs(v: Duration): int64 +toString chronos/timer.html#toString timer: toString(a: timer.Duration; parts = int.high): string +`$` chronos/timer.html#$,Duration timer: `$`(a: Duration): string +`$` chronos/timer.html#$,Moment timer: `$`(a: Moment): string +isZero chronos/timer.html#isZero,Duration timer: isZero(a: Duration): bool +isInfinite chronos/timer.html#isInfinite,Duration timer: isInfinite(a: Duration): bool +now chronos/timer.html#now,typedesc[Moment] timer: now(t: typedesc[Moment]): Moment +init chronos/timer.html#init,typedesc[Moment],int64,Duration timer: init(t: typedesc[Moment]; value: int64; precision: Duration): Moment +epochSeconds chronos/timer.html#epochSeconds,Moment timer: epochSeconds(moment: Moment): int64 +epochNanoSeconds chronos/timer.html#epochNanoSeconds,Moment timer: epochNanoSeconds(moment: Moment): int64 +fromNow chronos/timer.html#fromNow,typedesc[Moment],Duration timer: fromNow(t: typedesc[Moment]; a: Duration): Moment diff --git a/api/chronos/transport.html b/api/chronos/transport.html new file mode 100644 index 00000000..017dc5fa --- /dev/null +++ b/api/chronos/transport.html @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + +chronos/transport + + + + + + + + +
+
+

chronos/transport

+
+
+
+ +     Dark Mode +
+ +
+ Search: +
+
+ Group by: + +
+ + +
+   Source +  Edit + +
+
+ +

+ +
+

Exports

+
+UnsafeDatagramCallback, getMessage, localAddress2, newDatagramTransport, getUserData, close, newDatagramTransport6, newDatagramTransport, newDatagramTransport, peekMessage, newDatagramTransport6, newDatagramTransport, newDatagramTransport, closeWait, localAddress, sendTo, send, DatagramCallback, sendTo, closed, send, DatagramTransport, newDatagramTransport, sendTo, newDatagramTransport6, send, newDatagramTransport, join, newDatagramTransport6, remoteAddress, newDatagramTransport, remoteAddress2, DgramTransportTrackerName, ==, DualStackType, toHex, getAutoAddress, address, ==, resolveTAddress, TransportAddress, TransportIncompleteError, getAutoAddresses, ==, initTAddress, AddressFamily, ServerStatus, host, getTransportOsError, getTransportOsError, $, getTransportTooManyError, windowsAnyAddressFix, setDualstack, toIpAddress, $, $, TransportNoSupport, TransportUseClosedError, TransportUseEofError, ServerFlags, resolveTAddress, TransportAbortedError, ==, initTAddress, $, setDualstack, resolveTAddress, getConnectionAbortedError, toSAddr, TransportError, AnyAddress, resolveTAddress, ==, getDomain, getServerUseClosedError, resolveTAddress, fromSAddr, TransportTooManyError, checkClosed, ServerCommand, getTransportUseClosedError, getTransportError, resolveTAddress, initTAddress, raiseTransportOsError, TransportOsError, getDomain, resolveTAddress, checkWriteEof, resolveTAddress, isAvailable, SocketServer, ==, DefaultDatagramBufferSize, getError, TransportAddressError, TransportLimitError, DefaultStreamBufferSize, getConnectionAbortedError, raiseTransportError, AnyAddress6, checkClosed, TransportState, initTAddress, localAddress2, close, createStreamServer, createStreamServer, start2, StreamCallback2, closeWait, fromPipe, readLine, TransportFlags, ReadMessagePredicate, TransportInitCallback, localAddress, createStreamServer, running, StreamTransportTrackerName, StreamCallback, getUserData, createStreamServer, connect, join, finished, readExactly, start, localAddress, TransportKind, write, write, writeFile, SocketFlags, atEof, createStreamServer, readMessage, shutdownWait, closed, StreamServer, accept, remoteAddress2, createStreamServer, close, readOnce, DefaultBacklogSize, write, createStreamServer, closed, connect, toUnchecked, consume, toException, readUntil, read, createStreamServer, stop2, createStreamServer, consume, failed, createStreamServer, closeWait, join, StreamServerTrackerName, StreamTransport, stop, remoteAddress, fromPipe2, read, DualStackType, ==, AddressFamily, toHex, ==, toIPv6, TransportTooManyError, init, address, getError, isLoopback, isLinkLocalMulticast, ip, resolveTAddress, -, getTransportTooManyError, checkClosed, getTransportError, TransportAddress, isLinkLocalUnicast, contains, getAutoAddresses, initTAddress, getAutoAddress, checkWriteEof, ServerStatus, host, isMulticast, init, isV4Mapped, isUniqueLocal, TransportAddressError, isInterfaceLocalMulticast, ==, AnyAddress, getTransportOsError, $, $, setDualstack, init, TransportLimitError, $, ==, TransportNoSupport, TransportUseClosedError, broadcast, TransportUseEofError, isUnspecified, resolveTAddress, isZero, isSiteLocal, initTAddress, isShared, +, isAnyLocal, $, setDualstack, inc, ==, isDocumentation, isPrivate, getConnectionAbortedError, checkClosed, toSAddr, isUnicastLinkLocal, isLinkLocal, subnetMask, TransportError, ==, getDomain, TransportAbortedError, isNone, getConnectionAbortedError, getServerUseClosedError, mask, isReserved, ServerFlags, toIpAddress, isGlobal, TransportIncompleteError, and, resolveTAddress, getTransportOsError, ServerCommand, resolveTAddress, toIPv4, initTAddress, $, isUnicast, fromSAddr, raiseTransportOsError, getTransportUseClosedError, resolveTAddress, ==, init, prefix, isBroadcast, resolveTAddress, not, init, ==, resolveTAddress, isAvailable, $, init, SocketServer, dec, DefaultDatagramBufferSize, init, windowsAnyAddressFix, IpMask, network, DefaultStreamBufferSize, initIp, raiseTransportError, getDomain, AnyAddress6, IpNet, resolveTAddress, TransportOsError, TransportState, isBenchmarking, isGlobalMulticast, or, subnetMask, initTAddress, toHex, init, SocketServer, getTransportTooManyError, getTransportOsError, TransportAddress, ==, contains, initTAddress, AddressFamily, host, TransportAddressError, InterfaceState, isV4Mapped, isInterfaceLocalMulticast, NetworkInterface, ==, setDualstack, init, network, TransportUseClosedError, isZero, initTAddress, ==, +, isAnyLocal, setDualstack, $, TransportError, RTA_ALIGN, $, $, isNone, DefaultDatagramBufferSize, RTA_PAYLOAD, getServerUseClosedError, mask, isReserved, ServerFlags, toIpAddress, TransportIncompleteError, ServerCommand, ==, resolveTAddress, isSiteLocal, subnetMask, MaxAdapterAddressLength, ==, fromSAddr, raiseTransportOsError, getDomain, prefix, resolveTAddress, isAvailable, ip, dec, getTransportOsError, netmask, IpMask, TransportLimitError, network, isUnicastLinkLocal, isLinkLocal, ==, TransportOsError, isGlobalMulticast, initTAddress, DualStackType, or, toIPv6, TransportTooManyError, broadcast, address, -, $, isUnspecified, getConnectionAbortedError, getError, getInterfaces, Route, checkClosed, IpNet, getAutoAddresses, isLoopback, getAutoAddress, ServerStatus, getTransportError, isLinkLocalUnicast, $, $, init, isUniqueLocal, isMulticast, $, AnyAddress, isUnicast, $, raiseTransportError, isShared, TransportNoSupport, AnyAddress6, TransportUseEofError, checkWriteEof, isLinkLocalMulticast, resolveTAddress, and, isBenchmarking, $, isDocumentation, getConnectionAbortedError, init, toSAddr, subnetMask, resolveTAddress, resolveTAddress, TransportAbortedError, init, ==, getDomain, toIPv4, initTAddress, resolveTAddress, getTransportUseClosedError, resolveTAddress, InterfaceAddress, init, isBroadcast, resolveTAddress, not, init, broadcast, isPrivate, inc, checkClosed, init, windowsAnyAddressFix, ==, DefaultStreamBufferSize, InterfaceType, initIp, getBestRoute, isGlobal, cmp, TransportState, EDQUOT, AsyncStreamError, createStreamServer, milliseconds, ==, createStreamServer, EMLINK, createStreamServer, milliseconds, EMFILE, $, fromNow, close, weeks, LocFinishIndex, getTransportOsError, read, id, <=, FutureCompletedError, waitFor, finished, EPROTONOSUPPORT, cancelAndWait, createStreamServer, windowsAnyAddressFix, failed, createStreamServer, newAsyncStreamWriter, removeTimer, race, EAFNOSUPPORT, ENOSPC, TransportUseClosedError, idleAsync, init, initTAddress, ENOKEY, Week, cancelSoon, awaitne, [], EREMOTE, EFAULT, epochSeconds, close, microseconds, AsyncEvent, weeks, cancelCallback=, ETOOMANYREFS, and, raiseAsyncStreamLimitError, TransportInitCallback, localAddress, StreamServerTrackerName, micros, wait, ENETDOWN, EACCES, EINVAL, full, EBADFD, seconds, AsyncStreamWriteError, read, raiseTransportOsError, finish, start, join, AsyncStreamIncorrectDefect, <=, init, completed, FutureBase, ELIBBAD, TransportLimitError, or, cancelSoon, EILSEQ, allFutures, EADV, -, newAsyncStreamWriter, location, addFirstNoWait, ENOLCK, FutureSeq, cancelAndWait, all, EPROTO, getConnectionAbortedError, callIdle, value, ENODEV, close, ECHRNG, ERFKILL, setTimer, nanoseconds, closeWait, get, running, addTimer, ENOTTY, EISNAM, init, createStreamServer, +, FutureFlags, getGlobalDispatcher, ELIBEXEC, $, E2BIG, -=, AsyncStreamReader, AsyncQueueEmptyError, newAsyncStreamWriter, <, checkWriteEof, fastEpochTime, resolveTAddress, read, toHex, fromPipe2, TrackerCounter, write, localAddress2, start2, async, EREMCHG, finished, StreamServer, SocketFlags, low, stopped, removeTimer, createStreamServer, release, Duration, failed, ==, AsyncStreamDefaultQueueSize, initTAddress, getUserData, localAddress, orImpl, EROFS, seconds, init, readerOverflow, nanos, atEof, consume, Nanosecond, race, ENODATA, init, +, $, DefaultStreamBufferSize, read, resolveTAddress, createStreamServer, failed, ELIBSCN, ENOTNAM, nanos, closeHandle, ENOTUNIQ, newFuture, popFirstNoWait, closeSocket, ECONNRESET, [], Second, getSrcLocation, FutureError, getTransportTooManyError, init, withTimeout, EREMOTEIO, oneIndex, oneValue, ENOENT, AsyncStreamReadError, []=, []=, setThreadDispatcher, EEXIST, ENOMSG, ESHUTDOWN, removeWriter2, [], setDualstack, isCounterLeaked, EWOULDBLOCK, Finished, untrackCounter, readMessage, setGlobalDispatcher, TrackerBase, >=, AsyncEventQueue, addCallback, TransportError, ESTRPIPE, $, EISCONN, callSoon, getServerUseClosedError, readUntil, close, EBADF, microseconds, ETIMEDOUT, Future, EL2NSYNC, ETIME, getDomain, EL2HLT, EIDRM, removeReader2, futureContinue, ENOANO, DefaultBacklogSize, register, closed, ERANGE, done, popLastNoWait, init, ENONET, completed, EMSGSIZE, EBADMSG, ENOPROTOOPT, initTAddress, newAsyncStreamWriter, EDOTDOT, one, Minute, CancelledError, readLine, EOVERFLOW, raiseTransportError, newAsyncStreamReader, AnyAddress6, ENOTEMPTY, TimerCallback, EADDRNOTAVAIL, wait, AsyncStreamIncompleteError, WriteType, checkClosed, size, EUNATCH, newAsyncLock, div, ERESTART, newFutureStr, FuturePendingError, unregisterAndCloseFd, newAsyncQueue, newAsyncEvent, ENOTBLK, race, InternalRaisesFuture, cancelSoon, cancel, micros, wait, unregister, EINPROGRESS, -, remoteAddress, new, AsyncStreamDefaultBufferSize, EDOM, EPIPE, AsyncLockError, getNoWait, len, EDESTADDRREQ, shutdownWait, removeCallback, EAGAIN, FutureFlag, read, async, resolveTAddress, emit, ENXIO, noCancel, consume, init, ECONNABORTED, state, EBFONT, EDEADLK, ENOEXEC, asyncCheck, locked, readError, ZeroDuration, ENOSYS, EventQueueKey, ELIBMAX, EOPNOTSUPP, ENOSTR, one, getTransportError, newAsyncStreamReader, AsyncStream, checkClosed, Raising, popFirst, join, read, items, Millisecond, consume, callIdle, ECONNREFUSED, addWriter2, EL3HLT, join, readError, *, asyncTimer, EHOSTUNREACH, EHOSTDOWN, ECANCELED, init, +=, EPFNOSUPPORT, internalRaiseIfError, newInternalRaisesFuture, ESPIPE, LocationKind, TransportAddress, SomeIntegerI64, complete, AsyncBufferRef, internalInitFutureBase, AddressFamily, nanoseconds, host, ECOMM, init, closed, join, getTrackerCounter, millis, AsyncBuffer, ENOTCONN, EBUSY, days, sleepAsync, +=, consume, internalCallTick, checkStreamFinished, isZero, StreamReaderLoop, internalRaiseIfError, ENOMEM, addFirst, EKEYEXPIRED, or, EPERM, AsyncCallback, trackerCounters, fromPipe, newAsyncEventQueue, DefaultDatagramBufferSize, ESOCKTNOSUPPORT, EHWPOISON, AsyncQueue, EXDEV, EKEYREVOKED, toIpAddress, hours, TransportIncompleteError, InfiniteDuration, setDualstack, >=, clear, value, ESRCH, fire, fromSAddr, ENOMEDIUM, secs, getThreadDispatcher, write, isAvailable, AsyncStreamRW, waitFor, isSet, SocketServer, FutureStr, addLastNoWait, getTransportOsError, read, checkStreamClosed, waitFor, epochNanoSeconds, ENOPKG, newAsyncStreamWriter, callSoon, WriteItem, EBADE, len, getAsyncTimestamp, FutureState, EBADR, put, EKEYREJECTED, init, EISDIR, address, StreamWriterLoop, ESRMNT, ENAVAIL, error, write, AsyncError, EBADRQC, ENFILE, createStreamServer, failed, getAutoAddresses, mitems, getUserData, ETXTBSY, withTimeout, flags, ELIBACC, Day, minutes, DualStackType, ReadMessagePredicate, AsyncStreamWriter, runForever, toException, init, EBADSLT, closed, TransportUseEofError, ENETRESET, waitEvents, upload, AsyncStreamState, wait, asyncSpawn, removeCallback, AsyncLock, getConnectionAbortedError, init, addCallback, clearTimer, newAsyncStreamReader, AsyncFD, ECHILD, newAsyncStreamUseClosedError, >, callIdle, LocCreateIndex, AsyncStreamWriterTrackerName, ==, StreamTransportTrackerName, getError, join, millis, EMEDIUMTYPE, sleepAsync, getDomain, asyncDiscard, callback=, EIO, write, tryCancel, high, poll, days, ==, ESTALE, minutes, toException, MaxEventsCount, wait, raiseAsDefect, newAsyncStreamReader, >, addReader2, unregister2, addTracker, callback=, high, toString, internalCallTick, EINTR, internalCallTick, raiseAsyncStreamWriteEOFError, closeWait, fail, popLast, transfer, AsyncStreamWriteEOFError, StreamCallback, readOnce, closeWait, AsyncStreamLimitError, connect, fail, addTimer, Moment, EPROTOTYPE, AsyncExceptionError, SrcLoc, ENOCSI, init, now, await, AsyncTimeoutError, createStreamServer, ENOLINK, +, StreamTransport, newAsyncStreamLimitError, trackCounter, init, newDispatcher, StreamCallback2, TransportFlags, completed, readOnce, newAsyncStreamWriter, error, ServerFlags, TransportTooManyError, readExactly, ELOOP, ENOSR, $, AsyncStreamReaderTrackerName, allFinished, ServerCommand, resolveTAddress, PDispatcher, trackerCounterKeys, Finished, low, toUnchecked, -=, ==, TransportKind, stop2, Hour, init, writeFile, atEof, resolveTAddress, addLast, CallbackFunc, contains, Microsecond, pairs, EOWNERDEAD, connect, readMessage, callSoon, readUntil, EALREADY, TransportOsError, addTimer, initTAddress, FutureDefect, ENOBUFS, <, cancelSoon, -, resolveTAddress, ENOTRECOVERABLE, ENOTDIR, hours, ==, wait, cancelAndSchedule, *, getTracker, getAutoAddress, readLine, ServerStatus, complete, EUSERS, EXFULL, EUCLEAN, raiseEmptyMessageDefect, accept, stepsAsync, clear, EventQueueReader, secs, read, waitFor, newAsyncStreamReader, TransportNoSupport, empty, closeWait, write, raiseAsyncStreamIncompleteError, allFutures, copyOut, raiseOsDefect, toSAddr, acquire, AsyncQueueFullError, write, TransportAbortedError, wait, newAsyncStreamReader, ELNRNG, raiseAsyncStreamUseClosedError, isInfinite, finished, AsyncStreamUseClosedError, InternalAsyncCallback, ENETUNREACH, InternalFutureBase, readExactly, getTransportUseClosedError, resolveTAddress, AsyncEventQueueFullError, init, atEof, resolveTAddress, register2, LocCompleteIndex, forget, EADDRINUSE, EMULTIHOP, putNoWait, AnyAddress, await, EFBIG, TransportAddressError, cancelled, EDEADLOCK, allFutures, running, newFutureSeq, newAsyncStreamIncompleteError, ENOTSOCK, TransportState, remoteAddress2, removeTimer, stop, EL3RST, ENAMETOOLONG, EDQUOT, AsyncStreamError, createStreamServer, milliseconds, ==, createStreamServer, EMLINK, createStreamServer, milliseconds, EMFILE, ==, fromNow, FutureStr, weeks, LocFinishIndex, getTransportOsError, read, id, <=, FutureCompletedError, waitFor, finished, EPROTONOSUPPORT, cancelAndWait, createStreamServer, +, failed, createStreamServer, newAsyncStreamWriter, ChunkedStreamError, removeTimer, unregister, ==, race, ENOSPC, TransportUseClosedError, EAFNOSUPPORT, idleAsync, init, initTAddress, ENOKEY, Week, cancelSoon, awaitne, [], EREMOTE, EFAULT, epochSeconds, close, microseconds, getUserData, weeks, cancelCallback=, ETOOMANYREFS, and, raiseAsyncStreamLimitError, TransportInitCallback, localAddress, StreamServerTrackerName, micros, wait, ENETDOWN, EACCES, trackCounter, EINVAL, full, EBADFD, seconds, AsyncStreamWriteError, read, raiseTransportOsError, finish, mitems, join, AsyncStreamIncorrectDefect, <=, init, completed, FutureBase, ELIBBAD, TransportLimitError, or, cancelSoon, EILSEQ, allFutures, waitFor, -, newAsyncStreamWriter, location, addFirstNoWait, ENOLCK, FutureSeq, cancelAndWait, all, EPROTO, getConnectionAbortedError, callIdle, EDOM, value, ENODEV, tryCancel, ECHRNG, ERFKILL, setTimer, nanoseconds, init, closeWait, get, running, addTimer, ENOTTY, EISNAM, init, createStreamServer, +, $, FutureFlags, getGlobalDispatcher, ELIBEXEC, $, E2BIG, -=, AsyncStreamReader, AsyncQueueEmptyError, newAsyncStreamWriter, <, checkWriteEof, fastEpochTime, resolveTAddress, read, PDispatcher, fromPipe2, TrackerCounter, write, localAddress2, start2, async, EREMCHG, Finished, resolveTAddress, StreamServer, SocketFlags, low, removeTimer, createStreamServer, release, Duration, failed, hexValue, ==, AsyncStreamDefaultQueueSize, initTAddress, getUserData, localAddress, orImpl, EROFS, seconds, start, init, writeFile, nanos, atEof, consume, Nanosecond, ChunkedStreamWriter, race, ENODATA, init, +, $, DefaultStreamBufferSize, read, createStreamServer, failed, ELIBSCN, ENOTNAM, nanos, closeHandle, addLast, ENOTUNIQ, newFuture, popFirstNoWait, closeSocket, ECONNRESET, ChunkedStreamReader, Second, newChunkedStreamWriter, getSrcLocation, FutureError, getTransportTooManyError, init, withTimeout, contains, EREMOTEIO, oneIndex, oneValue, ENOENT, readError, AsyncStreamReadError, []=, setThreadDispatcher, EEXIST, ENOMSG, ESHUTDOWN, removeWriter2, [], setDualstack, isCounterLeaked, EWOULDBLOCK, Finished, untrackCounter, readMessage, setGlobalDispatcher, TrackerBase, >=, AsyncEventQueue, addCallback, TransportError, ESTRPIPE, EISCONN, callSoon, WriteItem, readUntil, close, EBADF, microseconds, AsyncEvent, ETIMEDOUT, Future, EL2NSYNC, ETIME, getDomain, EL2HLT, EIDRM, removeReader2, futureContinue, ENOANO, ChunkedStreamIncompleteError, DefaultBacklogSize, register, ERANGE, done, popLastNoWait, init, ENONET, EPFNOSUPPORT, EMSGSIZE, EBADMSG, ENOPROTOOPT, initTAddress, FutureDefect, closed, initTAddress, one, ChunkedStreamProtocolError, Minute, CancelledError, readLine, EOVERFLOW, raiseTransportError, newAsyncStreamReader, AnyAddress6, ENOTEMPTY, TimerCallback, EADDRNOTAVAIL, wait, AsyncStreamIncompleteError, WriteType, checkClosed, wait, EUNATCH, newAsyncLock, div, ERESTART, newFutureStr, FuturePendingError, unregisterAndCloseFd, newAsyncQueue, popFirst, ENOTBLK, race, InternalRaisesFuture, cancelSoon, cancel, micros, size, EINPROGRESS, -, remoteAddress, new, AsyncStreamDefaultBufferSize, join, EPIPE, AsyncLockError, getNoWait, len, EDESTADDRREQ, shutdownWait, removeCallback, EAGAIN, FutureFlag, read, async, resolveTAddress, emit, stopped, ENXIO, noCancel, consume, init, ECONNABORTED, state, EBFONT, [], EDEADLK, ENOEXEC, asyncCheck, locked, readError, ZeroDuration, []=, ENOSYS, *, EventQueueKey, ELIBMAX, EOPNOTSUPP, ENOSTR, one, getTransportError, newAsyncStreamReader, AsyncStream, checkClosed, Raising, newAsyncEvent, join, read, items, Millisecond, consume, callIdle, ECONNREFUSED, addWriter2, EL3HLT, join, LocCreateIndex, asyncTimer, EHOSTUNREACH, EHOSTDOWN, ECANCELED, init, +=, completed, internalRaiseIfError, newInternalRaisesFuture, ESPIPE, LocationKind, TransportAddress, SomeIntegerI64, complete, AsyncBufferRef, internalInitFutureBase, AddressFamily, nanoseconds, host, ECOMM, $, init, closed, join, getTrackerCounter, millis, AsyncBuffer, ENOTCONN, EBUSY, days, sleepAsync, +=, consume, internalCallTick, getDomain, isZero, StreamReaderLoop, internalRaiseIfError, ENOMEM, EKEYEXPIRED, or, EPERM, AsyncCallback, trackerCounters, fromPipe, finished, DefaultDatagramBufferSize, ESOCKTNOSUPPORT, EHWPOISON, AsyncQueue, EXDEV, EKEYREVOKED, toIpAddress, hours, TransportIncompleteError, InfiniteDuration, setDualstack, >=, clear, value, ==, ESRCH, fire, fromSAddr, atEof, secs, getThreadDispatcher, write, isAvailable, AsyncStreamRW, EADV, isSet, $, SocketServer, close, addLastNoWait, getTransportOsError, read, checkStreamClosed, waitFor, epochNanoSeconds, ENOPKG, newAsyncStreamWriter, callSoon, getServerUseClosedError, EBADE, len, getAsyncTimestamp, FutureState, EBADR, put, EKEYREJECTED, init, EISDIR, address, StreamWriterLoop, ESRMNT, ENAVAIL, error, write, AsyncError, EBADRQC, ENFILE, createStreamServer, failed, getAutoAddresses, ETXTBSY, withTimeout, flags, ELIBACC, Day, minutes, DualStackType, ReadMessagePredicate, AsyncStreamWriter, runForever, toException, init, EBADSLT, TransportUseEofError, ENETRESET, waitEvents, upload, MaxEventsCount, wait, asyncSpawn, removeCallback, AsyncLock, getConnectionAbortedError, init, addCallback, clearTimer, newAsyncStreamReader, AsyncFD, ECHILD, newAsyncStreamUseClosedError, >, callIdle, AsyncStreamWriterTrackerName, StreamTransportTrackerName, getError, millis, EMEDIUMTYPE, sleepAsync, checkStreamFinished, asyncDiscard, callback=, init, EIO, AsyncQueueFullError, write, close, high, poll, days, ESTALE, minutes, toException, AsyncStreamState, wait, raiseAsDefect, newAsyncStreamReader, >, addReader2, unregister2, addTracker, callback=, init, high, toString, internalCallTick, EINTR, init, internalCallTick, raiseAsyncStreamWriteEOFError, closeWait, fail, popLast, transfer, AsyncStreamWriteEOFError, StreamCallback, readOnce, toHex, AsyncStreamLimitError, newChunkedStreamReader, connect, fail, addTimer, Moment, addFirst, EPROTOTYPE, AsyncExceptionError, SrcLoc, ENOCSI, init, now, await, AsyncTimeoutError, createStreamServer, ENOLINK, newAsyncEventQueue, windowsAnyAddressFix, StreamTransport, newAsyncStreamLimitError, init, newDispatcher, StreamCallback2, TransportFlags, completed, readOnce, newAsyncStreamWriter, error, ServerFlags, TransportTooManyError, readExactly, ELOOP, ENOSR, AsyncStreamReaderTrackerName, allFinished, ServerCommand, resolveTAddress, closeWait, trackerCounterKeys, low, toUnchecked, -=, TransportKind, stop2, Hour, init, readerOverflow, EventQueueReader, resolveTAddress, CallbackFunc, newChunkedStreamWriter, Microsecond, newChunkedStreamReader, pairs, EOWNERDEAD, connect, readMessage, callSoon, readUntil, EALREADY, TransportOsError, addTimer, closed, EDOTDOT, newAsyncStreamWriter, ENOBUFS, <, cancelSoon, -, resolveTAddress, ENOTRECOVERABLE, ENOTDIR, hours, AnyAddress, cancelAndSchedule, *, getTracker, getAutoAddress, readLine, ServerStatus, complete, EUSERS, EXFULL, EUCLEAN, raiseEmptyMessageDefect, accept, stepsAsync, clear, ENOMEDIUM, secs, read, waitFor, newAsyncStreamReader, TransportNoSupport, empty, closeWait, ==, write, raiseAsyncStreamIncompleteError, allFutures, copyOut, raiseOsDefect, toSAddr, acquire, write, TransportAbortedError, wait, newAsyncStreamReader, ELNRNG, raiseAsyncStreamUseClosedError, isInfinite, finished, AsyncStreamUseClosedError, InternalAsyncCallback, ENETUNREACH, InternalFutureBase, readExactly, getTransportUseClosedError, resolveTAddress, AsyncEventQueueFullError, init, atEof, resolveTAddress, register2, LocCompleteIndex, forget, remoteAddress2, EMULTIHOP, putNoWait, wait, await, EFBIG, TransportAddressError, cancelled, stop, EDEADLOCK, allFutures, running, newFutureSeq, newAsyncStreamIncompleteError, ENOTSOCK, TransportState, EADDRINUSE, removeTimer, EL3RST, ENAMETOOLONG +
+ +
+
+ +
+ +
+
+
+ + + diff --git a/api/chronos/transports/common.html b/api/chronos/transports/common.html new file mode 100644 index 00000000..fd21ab14 --- /dev/null +++ b/api/chronos/transports/common.html @@ -0,0 +1,1335 @@ + + + + + + + + + + + + + + + + + + +chronos/transports/common + + + + + + + + +
+
+

chronos/transports/common

+
+
+
+ +     Dark Mode +
+ +
+ Search: +
+
+ Group by: + +
+ + +
+   Source +  Edit + +
+
+ +

+ +
+

Types

+
+
+
AddressFamily {.pure.} = enum
+  None, IPv4, IPv6, Unix
+
+ + +  Source +  Edit + +
+
+
+
DualStackType {.pure.} = enum
+  Auto, Enabled, Disabled, Default
+
+ + +  Source +  Edit + +
+
+
+
ServerCommand = enum
+  Start, Pause, Stop
+
+ +Server's commands +  Source +  Edit + +
+
+
+
ServerFlags = enum
+  ReuseAddr, ReusePort, TcpNoDelay, NoAutoRead, GCUserData, FirstPipe,
+  NoPipeFlash, Broadcast, V4Mapped
+
+ +Server's flags +  Source +  Edit + +
+
+
+
ServerStatus = enum
+  Starting, Stopped, Running, Closed
+
+ +Server's statuses +  Source +  Edit + +
+
+
+
SocketServer = ref object of RootRef
+  sock*: AsyncFD
+  local*: TransportAddress
+  status*: ServerStatus
+  udata*: pointer
+  flags*: set[ServerFlags]
+  bufferSize*: int
+  loopFuture*: Future[void].Raising([])
+  domain*: Domain
+  apending*: bool
+  asock*: AsyncFD
+  errorCode*: OSErrorCode
+  abuffer*: array[128, byte]
+  dualstack*: DualStackType
+  when defined(windows):
+      aovl*: CustomOverlapped
+
+  
+
+ +Socket server object +  Source +  Edit + +
+
+
+
TransportAbortedError = object of TransportError
+  
+
+ +Remote client disconnected before server accepts connection +  Source +  Edit + +
+
+
+
TransportAddress = object
+  case family*: AddressFamily
+  of AddressFamily.None:
+      nil
+
+  of AddressFamily.IPv4:
+      address_v4*: array[4, uint8]
+
+  of AddressFamily.IPv6:
+      address_v6*: array[16, uint8]
+
+  of AddressFamily.Unix:
+      address_un*: array[108, uint8]
+
+  port*: Port
+
+
+ +Transport network address +  Source +  Edit + +
+
+
+
TransportAddressError = object of TransportError
+  code*: OSErrorCode
+
+
+ +Transport's address specific exception +  Source +  Edit + +
+
+
+
TransportError = object of AsyncError
+  
+
+ +Transport's specific exception +  Source +  Edit + +
+
+
+
TransportIncompleteError = object of TransportError
+  
+
+ +Transport's incomplete data received exception +  Source +  Edit + +
+
+
+
TransportLimitError = object of TransportError
+  
+
+ +Transport's data limit reached exception +  Source +  Edit + +
+
+
+
TransportNoSupport = object of TransportError
+  
+
+ +Transport's capability not supported exception +  Source +  Edit + +
+
+
+
TransportOsError = object of TransportError
+  code*: OSErrorCode
+
+
+ +Transport's OS specific exception +  Source +  Edit + +
+
+
+
TransportState = enum
+  ReadPending, ReadPaused, ReadClosed, ReadEof, ReadError, WritePending,
+  WritePaused, WriteClosed, WriteEof, WriteError
+
+ +Transport's state +  Source +  Edit + +
+
+
+
TransportTooManyError = object of TransportError
+  
+
+ +Too many open file descriptors exception +  Source +  Edit + +
+
+
+
TransportUseClosedError = object of TransportError
+  
+
+ +Usage after transport close exception +  Source +  Edit + +
+
+
+
TransportUseEofError = object of TransportError
+  
+
+ +Usage after transport half-close exception +  Source +  Edit + +
+
+ +
+
+

Vars

+
+
+
AnyAddress = TransportAddress(family: AddressFamily.IPv4, port: Port(0))
+
+ +Default INADDR_ANY address for IPv4 +  Source +  Edit + +
+
+
+
AnyAddress6 = TransportAddress(family: AddressFamily.IPv6, port: Port(0))
+
+ +Default INADDR_ANY address for IPv6 +  Source +  Edit + +
+
+ +
+
+

Consts

+
+
+
DefaultDatagramBufferSize = 65536
+
+ +Default buffer size for datagram transports +  Source +  Edit + +
+
+
+
DefaultStreamBufferSize = 16384
+
+ +Default buffer size for stream transports +  Source +  Edit + +
+
+ +
+
+

Procs

+
+
+
proc `$`(address: TransportAddress): string {....raises: [], tags: [].}
+
+ +Returns string representation of address. +  Source +  Edit + +
+
+
+
proc `==`(lhs, rhs: TransportAddress): bool {....raises: [], tags: [].}
+
+ +Compare two transport addresses lhs and rhs. Return true if addresses are equal. +  Source +  Edit + +
+
+
+
proc address(ta: TransportAddress): IpAddress {....raises: [ValueError],
+    raises: [], tags: [].}
+
+ +

Converts TransportAddress to net.IpAddress object.

+

Note its impossible to convert TransportAddress of Unix family, because IpAddress supports only IPv4, IPv6 addresses.

+ +  Source +  Edit + +
+
+
+
proc fromSAddr(sa: ptr Sockaddr_storage; sl: SockLen;
+               address: var TransportAddress) {....raises: [], tags: [].}
+
+ +Set transport address address with value from OS specific socket address storage. +  Source +  Edit + +
+
+
+
proc getAutoAddress(port: Port): TransportAddress {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc getAutoAddresses(localPort: Port; remotePort: Port): tuple[
+    local: TransportAddress, remote: TransportAddress] {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc getDomain(address: TransportAddress): Domain {....raises: [], tags: [].}
+
+ +Returns OS specific Domain from TransportAddress. +  Source +  Edit + +
+
+
+
proc getDomain(socket: AsyncFD): Result[AddressFamily, OSErrorCode] {.
+    ...raises: [], tags: [].}
+
+ +

Returns address family which is used to create socket socket.

+

Note: chronos supports only AF_INET, AF_INET6 and AF_UNIX sockets. For all other types of sockets this procedure returns EAFNOSUPPORT/WSAEAFNOSUPPORT error.

+ +  Source +  Edit + +
+
+
+
proc host(ta: TransportAddress): string {....raises: [], raises: [], tags: [].}
+
+ +

Returns host of TransportAddress ta.

+

For IPv4 and IPv6 addresses it will return IP address as string, or empty string for Unix address.

+ +  Source +  Edit + +
+
+
+
proc initTAddress(address: IpAddress; port: Port): TransportAddress {.
+    ...raises: [], tags: [].}
+
+ +Initialize TransportAddress with net.nim IpAddress and port number port. +  Source +  Edit + +
+
+
+
proc initTAddress(address: string): TransportAddress {.
+    ...raises: [TransportAddressError], raises: [], tags: [].}
+
+ +

Parses string representation of address. address can be IPv4, IPv6 or Unix domain address.

+

IPv4 transport address format is a.b.c.d:port. IPv6 transport address format is [::]:port. Unix transport address format is /address.

+ +  Source +  Edit + +
+
+
+
proc initTAddress(address: string; port: int): TransportAddress {.
+    ...raises: [TransportAddressError], raises: [], tags: [].}
+
+ +Initialize TransportAddress with IP (IPv4 or IPv6) address address and port number port. +  Source +  Edit + +
+
+
+
proc initTAddress(address: string; port: Port): TransportAddress {.
+    ...raises: [TransportAddressError], raises: [], tags: [].}
+
+ +Initialize TransportAddress with IP (IPv4 or IPv6) address address and port number port. +  Source +  Edit + +
+
+
+
proc isAvailable(family: AddressFamily): bool {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc raiseTransportError(ecode: OSErrorCode) {.
+    ...raises: [TransportAbortedError, TransportTooManyError, TransportOsError],
+    noreturn, ...raises: [], tags: [].}
+
+ +Raises transport specific OS error. +  Source +  Edit + +
+
+
+
proc raiseTransportOsError(err: OSErrorCode) {....raises: [TransportOsError],
+    raises: [], tags: [].}
+
+ +Raises transport specific OS error. +  Source +  Edit + +
+
+
+
proc resolveTAddress(address: string): seq[TransportAddress] {.
+    ...raises: [TransportAddressError], raises: [], tags: [].}
+
+ +

Resolve string representation of address.

+

Supported formats are: IPv4 numeric address a.b.c.d:port IPv6 numeric address [::]:port Hostname address hostname:port

+

If hostname address is detected, then network address translation via DNS will be performed.

+ +  Source +  Edit + +
+
+
+
proc resolveTAddress(address: string; domain: Domain): seq[TransportAddress] {.
+    ...raises: [TransportAddressError], raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc resolveTAddress(address: string; family: AddressFamily): seq[
+    TransportAddress] {....raises: [TransportAddressError], raises: [], tags: [].}
+
+ +

Resolve string representation of address.

+

Supported formats are: IPv4 numeric address a.b.c.d:port IPv6 numeric address [::]:port Hostname address hostname:port

+

If hostname address is detected, then network address translation via DNS will be performed.

+ +  Source +  Edit + +
+
+
+
proc resolveTAddress(address: string; family: IpAddressFamily): seq[
+    TransportAddress] {....deprecated, raises: [TransportAddressError], raises: [],
+                        tags: [].}
+
+
+ Deprecated +
+ + +  Source +  Edit + +
+
+
+
proc resolveTAddress(address: string; port: Port): seq[TransportAddress] {.
+    ...raises: [TransportAddressError], raises: [], tags: [].}
+
+ +

Resolve string representation of address.

+

Supported formats are: IPv4 numeric address a.b.c.d:port IPv6 numeric address [::]:port Hostname address hostname:port

+

If hostname address is detected, then network address translation via DNS will be performed.

+ +  Source +  Edit + +
+
+
+
proc resolveTAddress(address: string; port: Port; domain: Domain): seq[
+    TransportAddress] {....raises: [TransportAddressError], raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc resolveTAddress(address: string; port: Port; family: AddressFamily): seq[
+    TransportAddress] {....raises: [TransportAddressError], raises: [], tags: [].}
+
+ +

Resolve string representation of address.

+

address could be dot IPv4/IPv6 address or hostname.

+

If hostname address is detected, then network address translation via DNS will be performed.

+ +  Source +  Edit + +
+
+
+
proc resolveTAddress(address: string; port: Port; family: IpAddressFamily): seq[
+    TransportAddress] {....deprecated, raises: [TransportAddressError], raises: [],
+                        tags: [].}
+
+
+ Deprecated +
+ + +  Source +  Edit + +
+
+
+
proc setDualstack(socket: AsyncFD; family: AddressFamily; flag: DualStackType): Result[
+    void, OSErrorCode] {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc setDualstack(socket: AsyncFD; flag: DualStackType): Result[void,
+    OSErrorCode] {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc toHex(address: TransportAddress): string {....raises: [], tags: [].}
+
+ +Returns hexadecimal representation of address. +  Source +  Edit + +
+
+
+
proc toIpAddress(address: TransportAddress): IpAddress {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc toSAddr(address: TransportAddress; sa: var Sockaddr_storage;
+             sl: var SockLen) {....raises: [], tags: [].}
+
+ +Set socket OS specific socket address storage with address from transport address address. +  Source +  Edit + +
+
+
+
proc windowsAnyAddressFix(a: TransportAddress): TransportAddress {....raises: [],
+    tags: [].}
+
+ +BSD Sockets on *nix systems are able to perform connections to 0.0.0.0 or ::0 which are equal to 127.0.0.1 or ::1. +  Source +  Edit + +
+
+ +
+
+

Templates

+
+
+
template checkClosed(t: untyped)
+
+ + +  Source +  Edit + +
+
+
+
template checkClosed(t: untyped; future: untyped)
+
+ + +  Source +  Edit + +
+
+
+
template checkWriteEof(t: untyped; future: untyped)
+
+ + +  Source +  Edit + +
+
+
+
template getConnectionAbortedError(code: OSErrorCode): ref TransportAbortedError
+
+ + +  Source +  Edit + +
+
+
+
template getConnectionAbortedError(m: string = ""): ref TransportAbortedError
+
+ + +  Source +  Edit + +
+
+
+
template getError(t: untyped): ref TransportError
+
+ + +  Source +  Edit + +
+
+
+
template getServerUseClosedError(): ref TransportUseClosedError
+
+ + +  Source +  Edit + +
+
+
+
template getTransportError(ecode: OSErrorCode): untyped
+
+ + +  Source +  Edit + +
+
+
+
template getTransportOsError(err: cint): ref TransportOsError
+
+ + +  Source +  Edit + +
+
+
+
template getTransportOsError(err: OSErrorCode): ref TransportOsError
+
+ + +  Source +  Edit + +
+
+
+
template getTransportTooManyError(code = OSErrorCode(0)): ref TransportTooManyError
+
+ + +  Source +  Edit + +
+
+
+
template getTransportUseClosedError(): ref TransportUseClosedError
+
+ + +  Source +  Edit + +
+
+ +
+
+

Exports

+
+==, ==, ==, ==, ==, $, $, $ +
+ +
+
+ +
+ +
+
+
+ + + diff --git a/api/chronos/transports/common.idx b/api/chronos/transports/common.idx new file mode 100644 index 00000000..24fb5bfa --- /dev/null +++ b/api/chronos/transports/common.idx @@ -0,0 +1,90 @@ +DefaultStreamBufferSize chronos/transports/common.html#DefaultStreamBufferSize common: DefaultStreamBufferSize +DefaultDatagramBufferSize chronos/transports/common.html#DefaultDatagramBufferSize common: DefaultDatagramBufferSize +ReuseAddr chronos/transports/common.html#ReuseAddr ServerFlags.ReuseAddr +ReusePort chronos/transports/common.html#ReusePort ServerFlags.ReusePort +TcpNoDelay chronos/transports/common.html#TcpNoDelay ServerFlags.TcpNoDelay +NoAutoRead chronos/transports/common.html#NoAutoRead ServerFlags.NoAutoRead +GCUserData chronos/transports/common.html#GCUserData ServerFlags.GCUserData +FirstPipe chronos/transports/common.html#FirstPipe ServerFlags.FirstPipe +NoPipeFlash chronos/transports/common.html#NoPipeFlash ServerFlags.NoPipeFlash +Broadcast chronos/transports/common.html#Broadcast ServerFlags.Broadcast +V4Mapped chronos/transports/common.html#V4Mapped ServerFlags.V4Mapped +ServerFlags chronos/transports/common.html#ServerFlags common: ServerFlags +DualStackType chronos/transports/common.html#DualStackType common: DualStackType +AddressFamily chronos/transports/common.html#AddressFamily common: AddressFamily +TransportAddress chronos/transports/common.html#TransportAddress common: TransportAddress +Start chronos/transports/common.html#Start ServerCommand.Start +Pause chronos/transports/common.html#Pause ServerCommand.Pause +Stop chronos/transports/common.html#Stop ServerCommand.Stop +ServerCommand chronos/transports/common.html#ServerCommand common: ServerCommand +Starting chronos/transports/common.html#Starting ServerStatus.Starting +Stopped chronos/transports/common.html#Stopped ServerStatus.Stopped +Running chronos/transports/common.html#Running ServerStatus.Running +Closed chronos/transports/common.html#Closed ServerStatus.Closed +ServerStatus chronos/transports/common.html#ServerStatus common: ServerStatus +SocketServer chronos/transports/common.html#SocketServer common: SocketServer +TransportError chronos/transports/common.html#TransportError common: TransportError +TransportOsError chronos/transports/common.html#TransportOsError common: TransportOsError +TransportIncompleteError chronos/transports/common.html#TransportIncompleteError common: TransportIncompleteError +TransportLimitError chronos/transports/common.html#TransportLimitError common: TransportLimitError +TransportAddressError chronos/transports/common.html#TransportAddressError common: TransportAddressError +TransportNoSupport chronos/transports/common.html#TransportNoSupport common: TransportNoSupport +TransportUseClosedError chronos/transports/common.html#TransportUseClosedError common: TransportUseClosedError +TransportUseEofError chronos/transports/common.html#TransportUseEofError common: TransportUseEofError +TransportTooManyError chronos/transports/common.html#TransportTooManyError common: TransportTooManyError +TransportAbortedError chronos/transports/common.html#TransportAbortedError common: TransportAbortedError +ReadPending chronos/transports/common.html#ReadPending TransportState.ReadPending +ReadPaused chronos/transports/common.html#ReadPaused TransportState.ReadPaused +ReadClosed chronos/transports/common.html#ReadClosed TransportState.ReadClosed +ReadEof chronos/transports/common.html#ReadEof TransportState.ReadEof +ReadError chronos/transports/common.html#ReadError TransportState.ReadError +WritePending chronos/transports/common.html#WritePending TransportState.WritePending +WritePaused chronos/transports/common.html#WritePaused TransportState.WritePaused +WriteClosed chronos/transports/common.html#WriteClosed TransportState.WriteClosed +WriteEof chronos/transports/common.html#WriteEof TransportState.WriteEof +WriteError chronos/transports/common.html#WriteError TransportState.WriteError +TransportState chronos/transports/common.html#TransportState common: TransportState +AnyAddress chronos/transports/common.html#AnyAddress common: AnyAddress +AnyAddress6 chronos/transports/common.html#AnyAddress6 common: AnyAddress6 +`==` chronos/transports/common.html#==,TransportAddress,TransportAddress common: `==`(lhs, rhs: TransportAddress): bool +getDomain chronos/transports/common.html#getDomain,TransportAddress common: getDomain(address: TransportAddress): Domain +`$` chronos/transports/common.html#$,TransportAddress common: `$`(address: TransportAddress): string +toIpAddress chronos/transports/common.html#toIpAddress,TransportAddress common: toIpAddress(address: TransportAddress): IpAddress +toHex chronos/transports/common.html#toHex,TransportAddress common: toHex(address: TransportAddress): string +initTAddress chronos/transports/common.html#initTAddress,string common: initTAddress(address: string): TransportAddress +initTAddress chronos/transports/common.html#initTAddress,string,Port common: initTAddress(address: string; port: Port): TransportAddress +initTAddress chronos/transports/common.html#initTAddress,string,int common: initTAddress(address: string; port: int): TransportAddress +initTAddress chronos/transports/common.html#initTAddress,IpAddress,Port common: initTAddress(address: IpAddress; port: Port): TransportAddress +fromSAddr chronos/transports/common.html#fromSAddr,ptr.Sockaddr_storage,SockLen,TransportAddress common: fromSAddr(sa: ptr Sockaddr_storage; sl: SockLen; address: var TransportAddress) +toSAddr chronos/transports/common.html#toSAddr,TransportAddress,Sockaddr_storage,SockLen common: toSAddr(address: TransportAddress; sa: var Sockaddr_storage; sl: var SockLen) +address chronos/transports/common.html#address,TransportAddress common: address(ta: TransportAddress): IpAddress +host chronos/transports/common.html#host,TransportAddress common: host(ta: TransportAddress): string +resolveTAddress chronos/transports/common.html#resolveTAddress,string,Port,Domain common: resolveTAddress(address: string; port: Port; domain: Domain): seq[\n TransportAddress] +resolveTAddress chronos/transports/common.html#resolveTAddress,string,Domain common: resolveTAddress(address: string; domain: Domain): seq[TransportAddress] +resolveTAddress chronos/transports/common.html#resolveTAddress,string common: resolveTAddress(address: string): seq[TransportAddress] +resolveTAddress chronos/transports/common.html#resolveTAddress,string,Port common: resolveTAddress(address: string; port: Port): seq[TransportAddress] +resolveTAddress chronos/transports/common.html#resolveTAddress,string,AddressFamily common: resolveTAddress(address: string; family: AddressFamily): seq[TransportAddress] +resolveTAddress chronos/transports/common.html#resolveTAddress,string,Port,AddressFamily common: resolveTAddress(address: string; port: Port; family: AddressFamily): seq[\n TransportAddress] +resolveTAddress chronos/transports/common.html#resolveTAddress,string,IpAddressFamily common: resolveTAddress(address: string; family: IpAddressFamily): seq[TransportAddress] +resolveTAddress chronos/transports/common.html#resolveTAddress,string,Port,IpAddressFamily common: resolveTAddress(address: string; port: Port; family: IpAddressFamily): seq[\n TransportAddress] +windowsAnyAddressFix chronos/transports/common.html#windowsAnyAddressFix,TransportAddress common: windowsAnyAddressFix(a: TransportAddress): TransportAddress +checkClosed chronos/transports/common.html#checkClosed.t,untyped common: checkClosed(t: untyped) +checkClosed chronos/transports/common.html#checkClosed.t,untyped,untyped common: checkClosed(t: untyped; future: untyped) +checkWriteEof chronos/transports/common.html#checkWriteEof.t,untyped,untyped common: checkWriteEof(t: untyped; future: untyped) +getError chronos/transports/common.html#getError.t,untyped common: getError(t: untyped): ref TransportError +getServerUseClosedError chronos/transports/common.html#getServerUseClosedError.t common: getServerUseClosedError(): ref TransportUseClosedError +getTransportUseClosedError chronos/transports/common.html#getTransportUseClosedError.t common: getTransportUseClosedError(): ref TransportUseClosedError +getTransportOsError chronos/transports/common.html#getTransportOsError.t,OSErrorCode common: getTransportOsError(err: OSErrorCode): ref TransportOsError +getTransportOsError chronos/transports/common.html#getTransportOsError.t,cint common: getTransportOsError(err: cint): ref TransportOsError +raiseTransportOsError chronos/transports/common.html#raiseTransportOsError,OSErrorCode common: raiseTransportOsError(err: OSErrorCode) +getTransportTooManyError chronos/transports/common.html#getTransportTooManyError.t common: getTransportTooManyError(code = OSErrorCode(0)): ref TransportTooManyError +getConnectionAbortedError chronos/transports/common.html#getConnectionAbortedError.t,string common: getConnectionAbortedError(m: string = ""): ref TransportAbortedError +getConnectionAbortedError chronos/transports/common.html#getConnectionAbortedError.t,OSErrorCode common: getConnectionAbortedError(code: OSErrorCode): ref TransportAbortedError +getTransportError chronos/transports/common.html#getTransportError.t,OSErrorCode common: getTransportError(ecode: OSErrorCode): untyped +raiseTransportError chronos/transports/common.html#raiseTransportError,OSErrorCode common: raiseTransportError(ecode: OSErrorCode) +isAvailable chronos/transports/common.html#isAvailable,AddressFamily common: isAvailable(family: AddressFamily): bool +getDomain chronos/transports/common.html#getDomain,AsyncFD common: getDomain(socket: AsyncFD): Result[AddressFamily, OSErrorCode] +setDualstack chronos/transports/common.html#setDualstack,AsyncFD,AddressFamily,DualStackType common: setDualstack(socket: AsyncFD; family: AddressFamily; flag: DualStackType): Result[\n void, OSErrorCode] +setDualstack chronos/transports/common.html#setDualstack,AsyncFD,DualStackType common: setDualstack(socket: AsyncFD; flag: DualStackType): Result[void, OSErrorCode] +getAutoAddress chronos/transports/common.html#getAutoAddress,Port common: getAutoAddress(port: Port): TransportAddress +getAutoAddresses chronos/transports/common.html#getAutoAddresses,Port,Port common: getAutoAddresses(localPort: Port; remotePort: Port): tuple[\n local: TransportAddress, remote: TransportAddress] diff --git a/api/chronos/transports/datagram.html b/api/chronos/transports/datagram.html new file mode 100644 index 00000000..78e8e598 --- /dev/null +++ b/api/chronos/transports/datagram.html @@ -0,0 +1,1052 @@ + + + + + + + + + + + + + + + + + + +chronos/transports/datagram + + + + + + + + +
+
+

chronos/transports/datagram

+
+
+
+ +     Dark Mode +
+ +
+ Search: +
+
+ Group by: + +
+ + +
+   Source +  Edit + +
+
+ +

+ +
+

Types

+
+
+
DatagramCallback = proc (transp: DatagramTransport; remote: TransportAddress): Future[
+    void] {.async: (...raises: []).}
+
+ + +  Source +  Edit + +
+
+
+
DatagramTransport = ref object of RootRef
+  fd*: AsyncFD
+  state: set[TransportState]
+  flags: set[ServerFlags]
+  buffer: seq[byte]
+  buflen: int
+  error: ref TransportError
+  queue: Deque[GramVector]
+  local: TransportAddress
+  remote: TransportAddress
+  udata*: pointer
+  function: DatagramCallback
+  future: Future[void].Raising([])
+  raddr: Sockaddr_storage
+  ralen: SockLen
+  waddr: Sockaddr_storage
+  walen: SockLen
+  when defined(windows):
+      rovl: CustomOverlapped
+      wovl: CustomOverlapped
+      rflag: uint32
+      rwsabuf: WSABUF
+      wwsabuf: WSABUF
+
+  
+
+ + +  Source +  Edit + +
+
+
+
UnsafeDatagramCallback = proc (transp: DatagramTransport;
+                               remote: TransportAddress): Future[void] {.async.}
+
+ + +  Source +  Edit + +
+
+ +
+
+

Consts

+
+
+
DgramTransportTrackerName = "datagram.transport"
+
+ + +  Source +  Edit + +
+
+ +
+
+

Procs

+
+
+
proc close(transp: DatagramTransport) {....raises: [], tags: [].}
+
+ +Closes and frees resources of transport transp. +  Source +  Edit + +
+
+
+
proc closed(transp: DatagramTransport): bool {.inline, ...raises: [], tags: [].}
+
+ +Returns true if transport in closed state. +  Source +  Edit + +
+
+
+
proc closeWait(transp: DatagramTransport): InternalRaisesFuture[void, void] {.
+    stackTrace: false, ...raises: [], gcsafe, raises: [], raises: [],
+    tags: [RootEffect].}
+
+ +Close transport transp and release all resources. +  Source +  Edit + +
+
+
+
proc getMessage(transp: DatagramTransport): seq[byte] {.
+    ...raises: [TransportError], raises: [], tags: [].}
+
+ +Copy data from internal message buffer and return result. +  Source +  Edit + +
+
+
+
proc getUserData[T](transp: DatagramTransport): T {.inline, ...raises: [].}
+
+ +Obtain user data stored in transp object. +  Source +  Edit + +
+
+
+
proc join(transp: DatagramTransport): InternalRaisesFuture[void,
+    (CancelledError,)] {.stackTrace: false, ...raises: [], gcsafe, raises: [],
+                         raises: [], tags: [RootEffect].}
+
+ + +  Source +  Edit + +
+
+
+
proc localAddress(transp: DatagramTransport): TransportAddress {.
+    ...raises: [TransportOsError], raises: [], tags: [].}
+
+ +Returns transp remote socket address. +  Source +  Edit + +
+
+
+
proc localAddress2(transp: DatagramTransport): Result[TransportAddress,
+    OSErrorCode] {....raises: [], tags: [].}
+
+ +Returns transp local socket address. +  Source +  Edit + +
+
+
+
proc newDatagramTransport(cbproc: DatagramCallback;
+                          remote: TransportAddress = AnyAddress;
+                          local: TransportAddress = AnyAddress;
+                          sock: AsyncFD = asyncInvalidSocket;
+                          flags: set[ServerFlags] = {}; udata: pointer = nil;
+                          child: DatagramTransport = nil;
+                          bufSize: int = DefaultDatagramBufferSize;
+                          ttl: int = 0; dualstack = DualStackType.Auto): DatagramTransport {.
+    ...raises: [TransportOsError], raises: [], tags: [RootEffect].}
+
+ +

Create new UDP datagram transport (IPv4).

+

cbproc - callback which will be called, when new datagram received. remote - bind transport to remote address (optional). local - bind transport to local address (to serving incoming datagrams, optional) sock - application-driven socket to use. flags - flags that will be applied to socket. udata - custom argument which will be passed to cbproc. bufSize - size of internal buffer. ttl - TTL for UDP datagram packet (only usable when flags has Broadcast option).

+ +  Source +  Edit + +
+
+
+
proc newDatagramTransport(cbproc: DatagramCallback; localPort: Port;
+                          local: Opt[IpAddress] = Opt.none(IpAddress);
+                          flags: set[ServerFlags] = {}; udata: pointer = nil;
+                          child: DatagramTransport = nil;
+                          bufSize: int = DefaultDatagramBufferSize;
+                          ttl: int = 0; dualstack = DualStackType.Auto): DatagramTransport {.
+    ...raises: [TransportOsError], raises: [], tags: [RootEffect].}
+
+ + +  Source +  Edit + +
+
+
+
proc newDatagramTransport(cbproc: DatagramCallback; localPort: Port;
+                          remotePort: Port;
+                          local: Opt[IpAddress] = Opt.none(IpAddress);
+                          remote: Opt[IpAddress] = Opt.none(IpAddress);
+                          flags: set[ServerFlags] = {}; udata: pointer = nil;
+                          child: DatagramTransport = nil;
+                          bufSize: int = DefaultDatagramBufferSize;
+                          ttl: int = 0; dualstack = DualStackType.Auto): DatagramTransport {.
+    ...raises: [TransportOsError], raises: [], tags: [RootEffect].}
+
+ +

Create new UDP datagram transport (IPv6) and bind it to ANY_ADDRESS. Depending on OS settings procedure perform an attempt to create transport using IPv6 ANY_ADDRESS, if its not available it will try to bind transport to IPv4 ANY_ADDRESS.

+

cbproc - callback which will be called, when new datagram received. localPort - local peer's port number. remotePort - remote peer's port number. local - optional local peer's IPv4/IPv6 address. remote - optional remote peer's IPv4/IPv6 address. sock - application-driven socket to use. flags - flags that will be applied to socket. udata - custom argument which will be passed to cbproc. bufSize - size of internal buffer. ttl - TTL for UDP datagram packet (only usable when flags has Broadcast option).

+ +  Source +  Edit + +
+
+
+
proc newDatagramTransport(cbproc: UnsafeDatagramCallback;
+                          remote: TransportAddress = AnyAddress;
+                          local: TransportAddress = AnyAddress;
+                          sock: AsyncFD = asyncInvalidSocket;
+                          flags: set[ServerFlags] = {}; udata: pointer = nil;
+                          child: DatagramTransport = nil;
+                          bufSize: int = DefaultDatagramBufferSize;
+                          ttl: int = 0; dualstack = DualStackType.Auto): DatagramTransport {.
+    ...raises: [TransportOsError], deprecated: "Callback must not raise exceptions, annotate with {.async: (raises: []).}",
+    raises: [], tags: [RootEffect].}
+
+
+ Deprecated: Callback must not raise exceptions, annotate with {.async: (raises: []).} +
+ +

Create new UDP datagram transport (IPv4).

+

cbproc - callback which will be called, when new datagram received. remote - bind transport to remote address (optional). local - bind transport to local address (to serving incoming datagrams, optional) sock - application-driven socket to use. flags - flags that will be applied to socket. udata - custom argument which will be passed to cbproc. bufSize - size of internal buffer. ttl - TTL for UDP datagram packet (only usable when flags has Broadcast option).

+ +  Source +  Edit + +
+
+
+
proc newDatagramTransport6(cbproc: DatagramCallback;
+                           remote: TransportAddress = AnyAddress6;
+                           local: TransportAddress = AnyAddress6;
+                           sock: AsyncFD = asyncInvalidSocket;
+                           flags: set[ServerFlags] = {}; udata: pointer = nil;
+                           child: DatagramTransport = nil;
+                           bufSize: int = DefaultDatagramBufferSize;
+                           ttl: int = 0; dualstack = DualStackType.Auto): DatagramTransport {.
+    ...raises: [TransportOsError], raises: [], tags: [RootEffect].}
+
+ +

Create new UDP datagram transport (IPv6).

+

cbproc - callback which will be called, when new datagram received. remote - bind transport to remote address (optional). local - bind transport to local address (to serving incoming datagrams, optional) sock - application-driven socket to use. flags - flags that will be applied to socket. udata - custom argument which will be passed to cbproc. bufSize - size of internal buffer. ttl - TTL for UDP datagram packet (only usable when flags has Broadcast option).

+ +  Source +  Edit + +
+
+
+
proc newDatagramTransport6(cbproc: UnsafeDatagramCallback;
+                           remote: TransportAddress = AnyAddress6;
+                           local: TransportAddress = AnyAddress6;
+                           sock: AsyncFD = asyncInvalidSocket;
+                           flags: set[ServerFlags] = {}; udata: pointer = nil;
+                           child: DatagramTransport = nil;
+                           bufSize: int = DefaultDatagramBufferSize;
+                           ttl: int = 0; dualstack = DualStackType.Auto): DatagramTransport {.
+    ...raises: [TransportOsError], deprecated: "Callback must not raise exceptions, annotate with {.async: (raises: []).}",
+    raises: [], tags: [RootEffect].}
+
+
+ Deprecated: Callback must not raise exceptions, annotate with {.async: (raises: []).} +
+ +

Create new UDP datagram transport (IPv6).

+

cbproc - callback which will be called, when new datagram received. remote - bind transport to remote address (optional). local - bind transport to local address (to serving incoming datagrams, optional) sock - application-driven socket to use. flags - flags that will be applied to socket. udata - custom argument which will be passed to cbproc. bufSize - size of internal buffer. ttl - TTL for UDP datagram packet (only usable when flags has Broadcast option).

+ +  Source +  Edit + +
+
+
+
proc newDatagramTransport6[T](cbproc: DatagramCallback; udata: ref T;
+                              remote: TransportAddress = AnyAddress6;
+                              local: TransportAddress = AnyAddress6;
+                              sock: AsyncFD = asyncInvalidSocket;
+                              flags: set[ServerFlags] = {};
+                              child: DatagramTransport = nil;
+                              bufSize: int = DefaultDatagramBufferSize;
+                              ttl: int = 0; dualstack = DualStackType.Auto): DatagramTransport {.
+    ...raises: [TransportOsError], raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc newDatagramTransport6[T](cbproc: UnsafeDatagramCallback; udata: ref T;
+                              remote: TransportAddress = AnyAddress6;
+                              local: TransportAddress = AnyAddress6;
+                              sock: AsyncFD = asyncInvalidSocket;
+                              flags: set[ServerFlags] = {};
+                              child: DatagramTransport = nil;
+                              bufSize: int = DefaultDatagramBufferSize;
+                              ttl: int = 0; dualstack = DualStackType.Auto): DatagramTransport {.
+    ...raises: [TransportOsError], deprecated: "Callback must not raise exceptions, annotate with {.async: (raises: []).}",
+    raises: [].}
+
+
+ Deprecated: Callback must not raise exceptions, annotate with {.async: (raises: []).} +
+ + +  Source +  Edit + +
+
+
+
proc newDatagramTransport[T](cbproc: DatagramCallback; localPort: Port;
+                             local: Opt[IpAddress] = Opt.none(IpAddress);
+                             flags: set[ServerFlags] = {}; udata: ref T;
+                             child: DatagramTransport = nil;
+                             bufSize: int = DefaultDatagramBufferSize;
+                             ttl: int = 0; dualstack = DualStackType.Auto): DatagramTransport {.
+    ...raises: [TransportOsError], raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc newDatagramTransport[T](cbproc: DatagramCallback; localPort: Port;
+                             remotePort: Port;
+                             local: Opt[IpAddress] = Opt.none(IpAddress);
+                             remote: Opt[IpAddress] = Opt.none(IpAddress);
+                             flags: set[ServerFlags] = {}; udata: ref T;
+                             child: DatagramTransport = nil;
+                             bufSize: int = DefaultDatagramBufferSize;
+                             ttl: int = 0; dualstack = DualStackType.Auto): DatagramTransport {.
+    ...raises: [TransportOsError], raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc newDatagramTransport[T](cbproc: DatagramCallback; udata: ref T;
+                             remote: TransportAddress = AnyAddress;
+                             local: TransportAddress = AnyAddress;
+                             sock: AsyncFD = asyncInvalidSocket;
+                             flags: set[ServerFlags] = {};
+                             child: DatagramTransport = nil;
+                             bufSize: int = DefaultDatagramBufferSize;
+                             ttl: int = 0; dualstack = DualStackType.Auto): DatagramTransport {.
+    ...raises: [TransportOsError], raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc newDatagramTransport[T](cbproc: UnsafeDatagramCallback; udata: ref T;
+                             remote: TransportAddress = AnyAddress;
+                             local: TransportAddress = AnyAddress;
+                             sock: AsyncFD = asyncInvalidSocket;
+                             flags: set[ServerFlags] = {};
+                             child: DatagramTransport = nil;
+                             bufSize: int = DefaultDatagramBufferSize;
+                             ttl: int = 0; dualstack = DualStackType.Auto): DatagramTransport {.
+    ...raises: [TransportOsError], deprecated: "Callback must not raise exceptions, annotate with {.async: (raises: []).}",
+    raises: [].}
+
+
+ Deprecated: Callback must not raise exceptions, annotate with {.async: (raises: []).} +
+ + +  Source +  Edit + +
+
+
+
proc peekMessage(transp: DatagramTransport; msg: var seq[byte]; msglen: var int) {.
+    ...raises: [TransportError], raises: [], tags: [].}
+
+ +Get access to internal message buffer and length of incoming datagram. +  Source +  Edit + +
+
+
+
proc remoteAddress(transp: DatagramTransport): TransportAddress {.
+    ...raises: [TransportOsError], raises: [], tags: [].}
+
+ +Returns transp remote socket address. +  Source +  Edit + +
+
+
+
proc remoteAddress2(transp: DatagramTransport): Result[TransportAddress,
+    OSErrorCode] {....raises: [], tags: [].}
+
+ +Returns transp remote socket address. +  Source +  Edit + +
+
+
+
proc send(transp: DatagramTransport; msg: string; msglen = -1): InternalRaisesFuture[
+    void, (TransportError, CancelledError)] {.stackTrace: false, ...raises: [],
+    gcsafe, raises: [], raises: [], tags: [RootEffect].}
+
+ + +  Source +  Edit + +
+
+
+
proc send(transp: DatagramTransport; pbytes: pointer; nbytes: int): InternalRaisesFuture[
+    void, (TransportError, CancelledError)] {.stackTrace: false, ...raises: [],
+    gcsafe, raises: [], raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc send[T](transp: DatagramTransport; msg: seq[T]; msglen = -1): InternalRaisesFuture[
+    void, (TransportError, CancelledError)] {.stackTrace: false, ...raises: [],
+    gcsafe, raises: [], raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc sendTo(transp: DatagramTransport; remote: TransportAddress; msg: string;
+            msglen = -1): InternalRaisesFuture[void,
+    (TransportError, CancelledError)] {.stackTrace: false, ...raises: [], gcsafe,
+                                        raises: [], raises: [],
+                                        tags: [RootEffect].}
+
+ + +  Source +  Edit + +
+
+
+
proc sendTo(transp: DatagramTransport; remote: TransportAddress;
+            pbytes: pointer; nbytes: int): InternalRaisesFuture[void,
+    (TransportError, CancelledError)] {.stackTrace: false, ...raises: [], gcsafe,
+                                        raises: [], raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc sendTo[T](transp: DatagramTransport; remote: TransportAddress; msg: seq[T];
+               msglen = -1): InternalRaisesFuture[void,
+    (TransportError, CancelledError)] {.stackTrace: false, ...raises: [], gcsafe,
+                                        raises: [], raises: [].}
+
+ + +  Source +  Edit + +
+
+ +
+ +
+
+ +
+ +
+
+
+ + + diff --git a/api/chronos/transports/datagram.idx b/api/chronos/transports/datagram.idx new file mode 100644 index 00000000..8f71ae32 --- /dev/null +++ b/api/chronos/transports/datagram.idx @@ -0,0 +1,33 @@ +DatagramCallback chronos/transports/datagram.html#DatagramCallback datagram: DatagramCallback +UnsafeDatagramCallback chronos/transports/datagram.html#UnsafeDatagramCallback datagram: UnsafeDatagramCallback +DatagramTransport chronos/transports/datagram.html#DatagramTransport datagram: DatagramTransport +DgramTransportTrackerName chronos/transports/datagram.html#DgramTransportTrackerName datagram: DgramTransportTrackerName +remoteAddress2 chronos/transports/datagram.html#remoteAddress2,DatagramTransport datagram: remoteAddress2(transp: DatagramTransport): Result[TransportAddress, OSErrorCode] +localAddress2 chronos/transports/datagram.html#localAddress2,DatagramTransport datagram: localAddress2(transp: DatagramTransport): Result[TransportAddress, OSErrorCode] +remoteAddress chronos/transports/datagram.html#remoteAddress,DatagramTransport datagram: remoteAddress(transp: DatagramTransport): TransportAddress +localAddress chronos/transports/datagram.html#localAddress,DatagramTransport datagram: localAddress(transp: DatagramTransport): TransportAddress +close chronos/transports/datagram.html#close,DatagramTransport datagram: close(transp: DatagramTransport) +newDatagramTransport chronos/transports/datagram.html#newDatagramTransport,DatagramCallback,TransportAddress,TransportAddress,AsyncFD,set[ServerFlags],pointer,DatagramTransport,int,int datagram: newDatagramTransport(cbproc: DatagramCallback;\n remote: TransportAddress = AnyAddress;\n local: TransportAddress = AnyAddress;\n sock: AsyncFD = asyncInvalidSocket;\n flags: set[ServerFlags] = {}; udata: pointer = nil;\n child: DatagramTransport = nil;\n bufSize: int = DefaultDatagramBufferSize; ttl: int = 0;\n dualstack = DualStackType.Auto): DatagramTransport +newDatagramTransport chronos/transports/datagram.html#newDatagramTransport,DatagramCallback,ref.T,TransportAddress,TransportAddress,AsyncFD,set[ServerFlags],DatagramTransport,int,int datagram: newDatagramTransport[T](cbproc: DatagramCallback; udata: ref T;\n remote: TransportAddress = AnyAddress;\n local: TransportAddress = AnyAddress;\n sock: AsyncFD = asyncInvalidSocket;\n flags: set[ServerFlags] = {};\n child: DatagramTransport = nil;\n bufSize: int = DefaultDatagramBufferSize; ttl: int = 0;\n dualstack = DualStackType.Auto): DatagramTransport +newDatagramTransport6 chronos/transports/datagram.html#newDatagramTransport6,DatagramCallback,TransportAddress,TransportAddress,AsyncFD,set[ServerFlags],pointer,DatagramTransport,int,int datagram: newDatagramTransport6(cbproc: DatagramCallback;\n remote: TransportAddress = AnyAddress6;\n local: TransportAddress = AnyAddress6;\n sock: AsyncFD = asyncInvalidSocket;\n flags: set[ServerFlags] = {}; udata: pointer = nil;\n child: DatagramTransport = nil;\n bufSize: int = DefaultDatagramBufferSize; ttl: int = 0;\n dualstack = DualStackType.Auto): DatagramTransport +newDatagramTransport6 chronos/transports/datagram.html#newDatagramTransport6,DatagramCallback,ref.T,TransportAddress,TransportAddress,AsyncFD,set[ServerFlags],DatagramTransport,int,int datagram: newDatagramTransport6[T](cbproc: DatagramCallback; udata: ref T;\n remote: TransportAddress = AnyAddress6;\n local: TransportAddress = AnyAddress6;\n sock: AsyncFD = asyncInvalidSocket;\n flags: set[ServerFlags] = {};\n child: DatagramTransport = nil;\n bufSize: int = DefaultDatagramBufferSize; ttl: int = 0;\n dualstack = DualStackType.Auto): DatagramTransport +newDatagramTransport chronos/transports/datagram.html#newDatagramTransport,UnsafeDatagramCallback,TransportAddress,TransportAddress,AsyncFD,set[ServerFlags],pointer,DatagramTransport,int,int datagram: newDatagramTransport(cbproc: UnsafeDatagramCallback;\n remote: TransportAddress = AnyAddress;\n local: TransportAddress = AnyAddress;\n sock: AsyncFD = asyncInvalidSocket;\n flags: set[ServerFlags] = {}; udata: pointer = nil;\n child: DatagramTransport = nil;\n bufSize: int = DefaultDatagramBufferSize; ttl: int = 0;\n dualstack = DualStackType.Auto): DatagramTransport +newDatagramTransport chronos/transports/datagram.html#newDatagramTransport,UnsafeDatagramCallback,ref.T,TransportAddress,TransportAddress,AsyncFD,set[ServerFlags],DatagramTransport,int,int datagram: newDatagramTransport[T](cbproc: UnsafeDatagramCallback; udata: ref T;\n remote: TransportAddress = AnyAddress;\n local: TransportAddress = AnyAddress;\n sock: AsyncFD = asyncInvalidSocket;\n flags: set[ServerFlags] = {};\n child: DatagramTransport = nil;\n bufSize: int = DefaultDatagramBufferSize; ttl: int = 0;\n dualstack = DualStackType.Auto): DatagramTransport +newDatagramTransport6 chronos/transports/datagram.html#newDatagramTransport6,UnsafeDatagramCallback,TransportAddress,TransportAddress,AsyncFD,set[ServerFlags],pointer,DatagramTransport,int,int datagram: newDatagramTransport6(cbproc: UnsafeDatagramCallback;\n remote: TransportAddress = AnyAddress6;\n local: TransportAddress = AnyAddress6;\n sock: AsyncFD = asyncInvalidSocket;\n flags: set[ServerFlags] = {}; udata: pointer = nil;\n child: DatagramTransport = nil;\n bufSize: int = DefaultDatagramBufferSize; ttl: int = 0;\n dualstack = DualStackType.Auto): DatagramTransport +newDatagramTransport6 chronos/transports/datagram.html#newDatagramTransport6,UnsafeDatagramCallback,ref.T,TransportAddress,TransportAddress,AsyncFD,set[ServerFlags],DatagramTransport,int,int datagram: newDatagramTransport6[T](cbproc: UnsafeDatagramCallback; udata: ref T;\n remote: TransportAddress = AnyAddress6;\n local: TransportAddress = AnyAddress6;\n sock: AsyncFD = asyncInvalidSocket;\n flags: set[ServerFlags] = {};\n child: DatagramTransport = nil;\n bufSize: int = DefaultDatagramBufferSize; ttl: int = 0;\n dualstack = DualStackType.Auto): DatagramTransport +newDatagramTransport chronos/transports/datagram.html#newDatagramTransport,DatagramCallback,Port,Port,Opt[IpAddress],Opt[IpAddress],set[ServerFlags],pointer,DatagramTransport,int,int datagram: newDatagramTransport(cbproc: DatagramCallback; localPort: Port;\n remotePort: Port;\n local: Opt[IpAddress] = Opt.none(IpAddress);\n remote: Opt[IpAddress] = Opt.none(IpAddress);\n flags: set[ServerFlags] = {}; udata: pointer = nil;\n child: DatagramTransport = nil;\n bufSize: int = DefaultDatagramBufferSize; ttl: int = 0;\n dualstack = DualStackType.Auto): DatagramTransport +newDatagramTransport chronos/transports/datagram.html#newDatagramTransport,DatagramCallback,Port,Opt[IpAddress],set[ServerFlags],pointer,DatagramTransport,int,int datagram: newDatagramTransport(cbproc: DatagramCallback; localPort: Port;\n local: Opt[IpAddress] = Opt.none(IpAddress);\n flags: set[ServerFlags] = {}; udata: pointer = nil;\n child: DatagramTransport = nil;\n bufSize: int = DefaultDatagramBufferSize; ttl: int = 0;\n dualstack = DualStackType.Auto): DatagramTransport +newDatagramTransport chronos/transports/datagram.html#newDatagramTransport,DatagramCallback,Port,Port,Opt[IpAddress],Opt[IpAddress],set[ServerFlags],ref.T,DatagramTransport,int,int datagram: newDatagramTransport[T](cbproc: DatagramCallback; localPort: Port;\n remotePort: Port;\n local: Opt[IpAddress] = Opt.none(IpAddress);\n remote: Opt[IpAddress] = Opt.none(IpAddress);\n flags: set[ServerFlags] = {}; udata: ref T;\n child: DatagramTransport = nil;\n bufSize: int = DefaultDatagramBufferSize; ttl: int = 0;\n dualstack = DualStackType.Auto): DatagramTransport +newDatagramTransport chronos/transports/datagram.html#newDatagramTransport,DatagramCallback,Port,Opt[IpAddress],set[ServerFlags],ref.T,DatagramTransport,int,int datagram: newDatagramTransport[T](cbproc: DatagramCallback; localPort: Port;\n local: Opt[IpAddress] = Opt.none(IpAddress);\n flags: set[ServerFlags] = {}; udata: ref T;\n child: DatagramTransport = nil;\n bufSize: int = DefaultDatagramBufferSize; ttl: int = 0;\n dualstack = DualStackType.Auto): DatagramTransport +join chronos/transports/datagram.html#join,DatagramTransport datagram: join(transp: DatagramTransport): InternalRaisesFuture[void, (CancelledError,)] +closed chronos/transports/datagram.html#closed,DatagramTransport datagram: closed(transp: DatagramTransport): bool +closeWait chronos/transports/datagram.html#closeWait,DatagramTransport datagram: closeWait(transp: DatagramTransport): InternalRaisesFuture[void, void] +send chronos/transports/datagram.html#send,DatagramTransport,pointer,int datagram: send(transp: DatagramTransport; pbytes: pointer; nbytes: int): InternalRaisesFuture[\n void, (TransportError, CancelledError)] +send chronos/transports/datagram.html#send,DatagramTransport,string,int datagram: send(transp: DatagramTransport; msg: string; msglen = -1): InternalRaisesFuture[\n void, (TransportError, CancelledError)] +send chronos/transports/datagram.html#send,DatagramTransport,seq[T],int datagram: send[T](transp: DatagramTransport; msg: seq[T]; msglen = -1): InternalRaisesFuture[\n void, (TransportError, CancelledError)] +sendTo chronos/transports/datagram.html#sendTo,DatagramTransport,TransportAddress,pointer,int datagram: sendTo(transp: DatagramTransport; remote: TransportAddress; pbytes: pointer;\n nbytes: int): InternalRaisesFuture[void,\n (TransportError, CancelledError)] +sendTo chronos/transports/datagram.html#sendTo,DatagramTransport,TransportAddress,string,int datagram: sendTo(transp: DatagramTransport; remote: TransportAddress; msg: string;\n msglen = -1): InternalRaisesFuture[void,\n (TransportError, CancelledError)] +sendTo chronos/transports/datagram.html#sendTo,DatagramTransport,TransportAddress,seq[T],int datagram: sendTo[T](transp: DatagramTransport; remote: TransportAddress; msg: seq[T];\n msglen = -1): InternalRaisesFuture[void,\n (TransportError, CancelledError)] +peekMessage chronos/transports/datagram.html#peekMessage,DatagramTransport,seq[byte],int datagram: peekMessage(transp: DatagramTransport; msg: var seq[byte]; msglen: var int) +getMessage chronos/transports/datagram.html#getMessage,DatagramTransport datagram: getMessage(transp: DatagramTransport): seq[byte] +getUserData chronos/transports/datagram.html#getUserData,DatagramTransport datagram: getUserData[T](transp: DatagramTransport): T diff --git a/api/chronos/transports/ipnet.html b/api/chronos/transports/ipnet.html new file mode 100644 index 00000000..ab1dfc3d --- /dev/null +++ b/api/chronos/transports/ipnet.html @@ -0,0 +1,1166 @@ + + + + + + + + + + + + + + + + + + +chronos/transports/ipnet + + + + + + + + +
+
+

chronos/transports/ipnet

+
+
+
+ +     Dark Mode +
+ +
+ Search: +
+
+ Group by: + +
+ + +
+   Source +  Edit + +
+
+ +

This module implements various IP network utility procedures.

+ +
+

Types

+
+
+
IpMask = object
+  case family*: AddressFamily
+  of AddressFamily.None, AddressFamily.Unix:
+      nil
+
+  of AddressFamily.IPv4:
+      mask4*: uint32
+
+  of AddressFamily.IPv6:
+      mask6*: array[2, uint64]
+
+  
+
+ + +  Source +  Edit + +
+
+
+
IpNet = object
+  host*: TransportAddress
+  mask*: IpMask
+
+
+ + +  Source +  Edit + +
+
+ +
+
+

Procs

+
+
+
proc `$`(mask: IpMask; include0x = false): string {....raises: [], tags: [].}
+
+ +Returns hexadecimal string representation of IP mask mask. +  Source +  Edit + +
+
+
+
proc `$`(net: IpNet): string {....raises: [], tags: [].}
+
+ +Return string representation of IP network in format: <IPv4 or IPv6 address>/<prefix length>. +  Source +  Edit + +
+
+
+
proc `+`(address: TransportAddress; v: int | uint): TransportAddress {.
+    ...raises: [].}
+
+ +Add to IPv4/IPv6 transport address integer v. +  Source +  Edit + +
+
+
+
proc `-`(address: TransportAddress; v: int | uint): TransportAddress {.
+    ...raises: [].}
+
+ +Sub from IPv4/IPv6 transport address integer v. +  Source +  Edit + +
+
+
+
proc `==`(m1, m2: IpMask): bool {.inline, ...raises: [], tags: [].}
+
+ +Returns true if masks m1 and m2 are equal in IP family and by value. +  Source +  Edit + +
+
+
+
proc `==`(n1, n2: IpNet): bool {.inline, ...raises: [], tags: [].}
+
+ +Returns true if networks n1 and n2 are equal in IP family and by value. +  Source +  Edit + +
+
+
+
proc `and`(address1, address2: TransportAddress): TransportAddress {....raises: [],
+    tags: [].}
+
+ +

Bitwise and operation for address1 and address2.

+

Note only IPv4 and IPv6 addresses are supported. address1 and address2 must be in equal IP family

+ +  Source +  Edit + +
+
+
+
proc `not`(address: TransportAddress): TransportAddress {....raises: [], tags: [].}
+
+ +Bitwise not operation for address. +  Source +  Edit + +
+
+
+
proc `or`(address1, address2: TransportAddress): TransportAddress {....raises: [],
+    tags: [].}
+
+ +

Bitwise or operation for address1 or address2.

+

Note only IPv4 and IPv6 addresses are supported. address1 and address2 must be in equal IP family

+ +  Source +  Edit + +
+
+
+
proc broadcast(net: IpNet): TransportAddress {....raises: [], tags: [].}
+
+ +Returns broadcast address for IP Network net. +  Source +  Edit + +
+
+
+
proc contains(net: IpNet; address: TransportAddress): bool {....raises: [],
+    tags: [].}
+
+ +Returns true if address belongs to IP Network net +  Source +  Edit + +
+
+
+
proc dec(address: var TransportAddress; v: int = 1) {....raises: [], tags: [].}
+
+ +Decrement IPv4/IPv6 transport address by integer v. +  Source +  Edit + +
+
+
+
proc inc(address: var TransportAddress; v: int = 1) {....raises: [], tags: [].}
+
+ +Increment IPv4/IPv6 transport address by integer v. +  Source +  Edit + +
+
+
+
proc init(t: typedesc[IpMask]; family: AddressFamily; prefix: int): IpMask {.
+    ...raises: [].}
+
+ +Initialize mask of IP family family from prefix length prefix. +  Source +  Edit + +
+
+
+
proc init(t: typedesc[IpMask]; netmask: string): IpMask {....raises: [].}
+
+ +

Initialize network mask using hexadecimal string representation netmask.

+

If netmask mask is invalid, result IpMask.family will be set to AddressFamily.None.

+ +  Source +  Edit + +
+
+
+
proc init(t: typedesc[IpMask]; netmask: TransportAddress): IpMask {....raises: [].}
+
+ +Initialize network mask using address netmask. +  Source +  Edit + +
+
+
+
proc init(t: typedesc[IpNet]; host, mask: TransportAddress): IpNet {.inline,
+    ...raises: [].}
+
+ +

Initialize IP Network using host address host and network mask address mask.

+

Note that host and mask must be from the same IP family.

+ +  Source +  Edit + +
+
+
+
proc init(t: typedesc[IpNet]; host: TransportAddress; mask: IpMask): IpNet {.
+    inline, ...raises: [].}
+
+ +Initialize IP Network using host address host and network mask mask. +  Source +  Edit + +
+
+
+
proc init(t: typedesc[IpNet]; host: TransportAddress; prefix: int): IpNet {.
+    inline, ...raises: [].}
+
+ +Initialize IP Network using host address host and prefix length prefix. +  Source +  Edit + +
+
+
+
proc init(t: typedesc[IpNet]; network: string): IpNet {.
+    ...raises: [TransportAddressError], raises: [].}
+
+ +Initialize IP Network from string representation in format <address>/<prefix length> or <address>/<netmask address>. +  Source +  Edit + +
+
+
+
proc initIp(t: typedesc[IpMask]; netmask: string): IpMask {....raises: [].}
+
+ +

Initialize network mask using IPv4 or IPv6 address in text representation netmask.

+

If netmask address string is invalid, result IpMask.family will be set to AddressFamily.None.

+ +  Source +  Edit + +
+
+
+
proc ip(mask: IpMask): string {....raises: [ValueError], raises: [], tags: [].}
+
+ +Returns IP address text representation of IP mask mask. +  Source +  Edit + +
+
+
+
proc isAnyLocal(address: TransportAddress): bool {....raises: [], tags: [].}
+
+ +

Returns true if address is a wildcard address.

+

IPv4: 0.0.0.0

+

IPv6: ::

+ +  Source +  Edit + +
+
+
+
proc isBenchmarking(address: TransportAddress): bool {....raises: [], tags: [].}
+
+ +

Returns true if address is part of the 198.18.0.0/15 range, which is reserved for network devices benchmarking. This range is defined in [IETF RFC 2544] as 198.18.0.0 through 198.19.255.255 but [errata 423] corrects it to 198.18.0.0/15.

+

IPv4: 198.18.0.0/15

+

IPv6: 2001:2::/48

+ +  Source +  Edit + +
+
+
+
proc isBroadcast(address: TransportAddress): bool {....raises: [], tags: [].}
+
+ +

Returns true if address is a broadcast address.

+

IPv4: 255.255.255.255

+ +  Source +  Edit + +
+
+
+
proc isDocumentation(address: TransportAddress): bool {....raises: [], tags: [].}
+
+ +Returns true if address is in a range designated for documentation.
IPv4: 192.0.2.0/24 (TEST-NET-1)
+
198.51.100.0/24 (TEST-NET-2) 203.0.113.0/24 (TEST-NET-3)
+
+

IPv6: 2001:DB8::/32

+ +  Source +  Edit + +
+
+
+
proc isGlobal(address: TransportAddress): bool {....raises: [], tags: [].}
+
+ +Returns true if address appears to be globally reachable as specified by the [IANA IPv4 Special-Purpose Address Registry]. +  Source +  Edit + +
+
+
+
proc isGlobalMulticast(address: TransportAddress): bool {....raises: [], tags: [].}
+
+ +

Returns true if the multicast address has global scope.

+

IPv4: 224.0.1.0 - 238.255.255.255

+

IPv6: FF0E:: - FFFE:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF

+ +  Source +  Edit + +
+
+
+
proc isInterfaceLocalMulticast(address: TransportAddress): bool {....raises: [],
+    tags: [].}
+
+ +

Returns true if address is interface local multicast address.

+

IPv4: N/A (always returns false)

+ +  Source +  Edit + +
+
+
+
proc isLinkLocal(address: TransportAddress): bool {....raises: [], tags: [].}
+
+ +

Returns true if address is link local address.

+

IPv4: 169.254.0.0 - 169.254.255.255

+

IPv6: FE80:: - FEBF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF

+ +  Source +  Edit + +
+
+
+
proc isLinkLocalMulticast(address: TransportAddress): bool {....raises: [],
+    tags: [].}
+
+ +

Returns true if address is link local multicast address.

+

IPv4: 224.0.0.0 - 224.0.0.255

+ +  Source +  Edit + +
+
+
+
proc isLinkLocalUnicast(address: TransportAddress): bool {.inline, ...raises: [],
+    tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc isLoopback(address: TransportAddress): bool {....raises: [], tags: [].}
+
+ +

Returns true if address is loopback address.

+

IPv4: 127.0.0.0 - 127.255.255.255

+

IPv6: ::1

+ +  Source +  Edit + +
+
+
+
proc isMulticast(address: TransportAddress): bool {....raises: [], tags: [].}
+
+ +

Returns true if address is a multicast address.

+

IPv4: 224.0.0.0 - 239.255.255.255

+

IPv6: FF00:: - FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF

+ +  Source +  Edit + +
+
+
+
proc isNone(address: TransportAddress): bool {.inline, ...raises: [], tags: [].}
+
+ +Returns true if address is not initialized yet, e.g. its family field is not set or equal to AddressFamily.None. +  Source +  Edit + +
+
+
+
proc isPrivate(address: TransportAddress): bool {....raises: [], tags: [].}
+
+ +Alias for isSiteLocal(). +  Source +  Edit + +
+
+
+
proc isReserved(address: TransportAddress): bool {....raises: [], tags: [].}
+
+ +

Returns true if address is reserved by IANA for future use. [IETF RFC 1112] defines the block of reserved addresses as 240.0.0.0/4.

+

NOTE: As IANA assigns new addresses, this procedure will be updated. This may result in non-reserved addresses being treated as reserved in code that relies on an outdated version of this procedure.

+

IPv4: 240.0.0.0/4

+ +  Source +  Edit + +
+
+
+
proc isShared(address: TransportAddress): bool {....raises: [], tags: [].}
+
+ +

Returns true if address is part of the Shared Address Space defined in [IETF RFC 6598]

+

IPv4: 100.64.0.0/10

+ +  Source +  Edit + +
+
+
+
proc isSiteLocal(address: TransportAddress): bool {....raises: [], tags: [].}
+
+ +Returns true if address is site local address.
IPv4: 10.0.0.0 - 10.255.255.255, 172.16.0.0 - 172.31.255.255,
+
192.168.0.0 - 192.168.255.255
+
+

IPv6: FEC0:: - FEFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF

+ +  Source +  Edit + +
+
+
+
proc isUnicast(address: TransportAddress): bool {....raises: [], tags: [].}
+
+ +Returns true if address is unicast, as defined by [IETF RFC 4291]. Any address that is not a IPv6 multicast address FF00::/8 is unicast. +  Source +  Edit + +
+
+
+
proc isUnicastLinkLocal(address: TransportAddress): bool {....raises: [], tags: [].}
+
+ +

Returns true if address is a IPv6 unicast address with link-local scope.

+

NOTE: While [RFC 4291 section 2.5.3] mentions about the [loopback address] ::1 that "it is treated as having Link-Local scope", this does not mean that the loopback address actually has link-local scope and procedure will return false on it.

+

IPv6: FE80::/10

+ +  Source +  Edit + +
+
+
+
proc isUniqueLocal(address: TransportAddress): bool {....raises: [], tags: [].}
+
+ +

Returns true if address is a unique local IPv6 unicast address.

+

IPv6: FC00::/7

+ +  Source +  Edit + +
+
+
+
proc isUnspecified(address: TransportAddress): bool {.inline, ...raises: [],
+    tags: [].}
+
+ +Alias for isZero(). +  Source +  Edit + +
+
+
+
proc isV4Mapped(address: TransportAddress): bool {....raises: [], tags: [].}
+
+ +

Returns true if address is (IPv4 to IPv6) mapped address, e.g. 0000:0000:0000:0000:0000:FFFF:xxxx:xxxx

+

Procedure returns false if address family is IPv4.

+ +  Source +  Edit + +
+
+
+
proc isZero(address: TransportAddress): bool {.inline, ...raises: [], tags: [].}
+
+ +Returns true if address is full of zeros, but its family is not AddressFamily.None. +  Source +  Edit + +
+
+
+
proc mask(a: TransportAddress; m: IpMask): TransportAddress {....raises: [],
+    tags: [].}
+
+ +

Apply IP mask m to address a and return result address.

+

If a family is IPv4 and m family is IPv6, masking is still possible when m has FFFF:FFFF:FFFF:FFFF:FFFF:FFFF prefix. Returned value will be IPv4 address.

+

If a family is IPv6 and m family is IPv4, masking is still possible when a holds (IPv4 to IPv6) mapped address. Returned value will be IPv6 address.

+

If a family is IPv4 and m family is IPv4, returned value will be IPv4 address.

+

If a family is IPv6 and m family is IPv6, returned value will be IPv6 address.

+

In all other cases returned address will have AddressFamily.None.

+ +  Source +  Edit + +
+
+
+
proc network(net: IpNet): TransportAddress {.inline, ...raises: [], tags: [].}
+
+ +Returns network address (host address masked with network mask) for IP Network net. +  Source +  Edit + +
+
+
+
proc prefix(mask: IpMask): int {....raises: [], tags: [].}
+
+ +

Returns number of bits set 1 in IP mask mask.

+

Procedure returns -1 if mask is not canonical, e.g. has holes with 0 bits between 1 bits.

+ +  Source +  Edit + +
+
+
+
proc subnetMask(mask: IpMask): TransportAddress {....raises: [], tags: [].}
+
+ +Returns TransportAddress representation of IP mask mask. +  Source +  Edit + +
+
+
+
proc subnetMask(net: IpNet): TransportAddress {....raises: [], tags: [].}
+
+ +Returns netmask address for IP Network net. +  Source +  Edit + +
+
+
+
proc toIPv4(address: TransportAddress): TransportAddress {....raises: [], tags: [].}
+
+ +

Get IPv4 from (IPv4 to IPv6) mapped address.

+

If address is IPv4 address it will be returned without any changes.

+

If address is not IPv4 to IPv6 mapped address, then result family will be set to AddressFamily.None.

+ +  Source +  Edit + +
+
+
+
proc toIPv6(address: TransportAddress): TransportAddress {....raises: [], tags: [].}
+
+ +

Map IPv4 address to IPv6 address.

+

If address is IPv4 address then it will be mapped as: <80 bits of zeros> + <16 bits of ones> + <32-bit IPv4 address>.

+

If address is IPv6 address it will be returned without any changes.

+ +  Source +  Edit + +
+
+ +
+ + +
+
+ +
+ +
+
+
+ + + diff --git a/api/chronos/transports/ipnet.idx b/api/chronos/transports/ipnet.idx new file mode 100644 index 00000000..d8a1d29e --- /dev/null +++ b/api/chronos/transports/ipnet.idx @@ -0,0 +1,54 @@ +IpMask chronos/transports/ipnet.html#IpMask ipnet: IpMask +IpNet chronos/transports/ipnet.html#IpNet ipnet: IpNet +`==` chronos/transports/ipnet.html#==,IpMask,IpMask ipnet: `==`(m1, m2: IpMask): bool +init chronos/transports/ipnet.html#init,typedesc[IpMask],AddressFamily,int ipnet: init(t: typedesc[IpMask]; family: AddressFamily; prefix: int): IpMask +init chronos/transports/ipnet.html#init,typedesc[IpMask],TransportAddress ipnet: init(t: typedesc[IpMask]; netmask: TransportAddress): IpMask +initIp chronos/transports/ipnet.html#initIp,typedesc[IpMask],string ipnet: initIp(t: typedesc[IpMask]; netmask: string): IpMask +init chronos/transports/ipnet.html#init,typedesc[IpMask],string ipnet: init(t: typedesc[IpMask]; netmask: string): IpMask +toIPv6 chronos/transports/ipnet.html#toIPv6,TransportAddress ipnet: toIPv6(address: TransportAddress): TransportAddress +isV4Mapped chronos/transports/ipnet.html#isV4Mapped,TransportAddress ipnet: isV4Mapped(address: TransportAddress): bool +toIPv4 chronos/transports/ipnet.html#toIPv4,TransportAddress ipnet: toIPv4(address: TransportAddress): TransportAddress +mask chronos/transports/ipnet.html#mask,TransportAddress,IpMask ipnet: mask(a: TransportAddress; m: IpMask): TransportAddress +prefix chronos/transports/ipnet.html#prefix,IpMask ipnet: prefix(mask: IpMask): int +subnetMask chronos/transports/ipnet.html#subnetMask,IpMask ipnet: subnetMask(mask: IpMask): TransportAddress +`$` chronos/transports/ipnet.html#$,IpMask ipnet: `$`(mask: IpMask; include0x = false): string +ip chronos/transports/ipnet.html#ip,IpMask ipnet: ip(mask: IpMask): string +init chronos/transports/ipnet.html#init,typedesc[IpNet],TransportAddress,int ipnet: init(t: typedesc[IpNet]; host: TransportAddress; prefix: int): IpNet +init chronos/transports/ipnet.html#init,typedesc[IpNet],TransportAddress,TransportAddress ipnet: init(t: typedesc[IpNet]; host, mask: TransportAddress): IpNet +init chronos/transports/ipnet.html#init,typedesc[IpNet],TransportAddress,IpMask ipnet: init(t: typedesc[IpNet]; host: TransportAddress; mask: IpMask): IpNet +init chronos/transports/ipnet.html#init,typedesc[IpNet],string ipnet: init(t: typedesc[IpNet]; network: string): IpNet +`==` chronos/transports/ipnet.html#==,IpNet,IpNet ipnet: `==`(n1, n2: IpNet): bool +contains chronos/transports/ipnet.html#contains,IpNet,TransportAddress ipnet: contains(net: IpNet; address: TransportAddress): bool +broadcast chronos/transports/ipnet.html#broadcast,IpNet ipnet: broadcast(net: IpNet): TransportAddress +subnetMask chronos/transports/ipnet.html#subnetMask,IpNet ipnet: subnetMask(net: IpNet): TransportAddress +network chronos/transports/ipnet.html#network,IpNet ipnet: network(net: IpNet): TransportAddress +`and` chronos/transports/ipnet.html#and,TransportAddress,TransportAddress ipnet: `and`(address1, address2: TransportAddress): TransportAddress +`or` chronos/transports/ipnet.html#or,TransportAddress,TransportAddress ipnet: `or`(address1, address2: TransportAddress): TransportAddress +`not` chronos/transports/ipnet.html#not,TransportAddress ipnet: `not`(address: TransportAddress): TransportAddress +`+` chronos/transports/ipnet.html#+,TransportAddress, ipnet: `+`(address: TransportAddress; v: int | uint): TransportAddress +`-` chronos/transports/ipnet.html#-,TransportAddress, ipnet: `-`(address: TransportAddress; v: int | uint): TransportAddress +inc chronos/transports/ipnet.html#inc,TransportAddress,int ipnet: inc(address: var TransportAddress; v: int = 1) +dec chronos/transports/ipnet.html#dec,TransportAddress,int ipnet: dec(address: var TransportAddress; v: int = 1) +`$` chronos/transports/ipnet.html#$,IpNet ipnet: `$`(net: IpNet): string +isNone chronos/transports/ipnet.html#isNone,TransportAddress ipnet: isNone(address: TransportAddress): bool +isZero chronos/transports/ipnet.html#isZero,TransportAddress ipnet: isZero(address: TransportAddress): bool +isUnspecified chronos/transports/ipnet.html#isUnspecified,TransportAddress ipnet: isUnspecified(address: TransportAddress): bool +isMulticast chronos/transports/ipnet.html#isMulticast,TransportAddress ipnet: isMulticast(address: TransportAddress): bool +isUnicast chronos/transports/ipnet.html#isUnicast,TransportAddress ipnet: isUnicast(address: TransportAddress): bool +isInterfaceLocalMulticast chronos/transports/ipnet.html#isInterfaceLocalMulticast,TransportAddress ipnet: isInterfaceLocalMulticast(address: TransportAddress): bool +isLinkLocalMulticast chronos/transports/ipnet.html#isLinkLocalMulticast,TransportAddress ipnet: isLinkLocalMulticast(address: TransportAddress): bool +isUniqueLocal chronos/transports/ipnet.html#isUniqueLocal,TransportAddress ipnet: isUniqueLocal(address: TransportAddress): bool +isUnicastLinkLocal chronos/transports/ipnet.html#isUnicastLinkLocal,TransportAddress ipnet: isUnicastLinkLocal(address: TransportAddress): bool +isLoopback chronos/transports/ipnet.html#isLoopback,TransportAddress ipnet: isLoopback(address: TransportAddress): bool +isAnyLocal chronos/transports/ipnet.html#isAnyLocal,TransportAddress ipnet: isAnyLocal(address: TransportAddress): bool +isLinkLocal chronos/transports/ipnet.html#isLinkLocal,TransportAddress ipnet: isLinkLocal(address: TransportAddress): bool +isLinkLocalUnicast chronos/transports/ipnet.html#isLinkLocalUnicast,TransportAddress ipnet: isLinkLocalUnicast(address: TransportAddress): bool +isSiteLocal chronos/transports/ipnet.html#isSiteLocal,TransportAddress ipnet: isSiteLocal(address: TransportAddress): bool +isPrivate chronos/transports/ipnet.html#isPrivate,TransportAddress ipnet: isPrivate(address: TransportAddress): bool +isGlobalMulticast chronos/transports/ipnet.html#isGlobalMulticast,TransportAddress ipnet: isGlobalMulticast(address: TransportAddress): bool +isShared chronos/transports/ipnet.html#isShared,TransportAddress ipnet: isShared(address: TransportAddress): bool +isBroadcast chronos/transports/ipnet.html#isBroadcast,TransportAddress ipnet: isBroadcast(address: TransportAddress): bool +isBenchmarking chronos/transports/ipnet.html#isBenchmarking,TransportAddress ipnet: isBenchmarking(address: TransportAddress): bool +isDocumentation chronos/transports/ipnet.html#isDocumentation,TransportAddress ipnet: isDocumentation(address: TransportAddress): bool +isReserved chronos/transports/ipnet.html#isReserved,TransportAddress ipnet: isReserved(address: TransportAddress): bool +isGlobal chronos/transports/ipnet.html#isGlobal,TransportAddress ipnet: isGlobal(address: TransportAddress): bool diff --git a/api/chronos/transports/osnet.html b/api/chronos/transports/osnet.html new file mode 100644 index 00000000..562bc609 --- /dev/null +++ b/api/chronos/transports/osnet.html @@ -0,0 +1,628 @@ + + + + + + + + + + + + + + + + + + +chronos/transports/osnet + + + + + + + + +
+
+

chronos/transports/osnet

+
+ +   Source +  Edit + +
+
+ +

This module implements cross-platform network interfaces list. Currently supported OSes are Windows, Linux, MacOS, BSD(not tested).

+ +
+

Types

+
+
+
InterfaceAddress = object
+  host*: TransportAddress
+  net*: IpNet
+
+
+ + +  Source +  Edit + +
+
+
+
InterfaceState = enum
+  StatusError = 0, StatusUp, StatusDown, StatusTesting, StatusUnknown,
+  StatusDormant, StatusNotPresent, StatusLowerLayerDown
+
+ + +  Source +  Edit + +
+
+
+
InterfaceType = enum
+  IfError = 0, IfOther = 1, IfRegular1822 = 2, IfHdh1822 = 3, IfDdnX25 = 4,
+  IfRfc877X25 = 5, IfEthernetCsmacd = 6, IfIso88023Csmacd = 7,
+  IfIso88024TokenBus = 8, IfIso88025TokenRing = 9, IfIso88026MAN = 10,
+  IfStarlan = 11, IfProteon10Mbit = 12, IfProteon80Mbit = 13,
+  IfHyperChannel = 14, IfFddi = 15, IfLapB = 16, IfSdlc = 17, IfDs1 = 18,
+  IfE1 = 19, IfBasicIsdn = 20, IfPrimaryIsdn = 21, IfPropPoint2PointSerial = 22,
+  IfPpp = 23, IfSoftwareLoopback = 24, IfEon = 25, IfEthernet3Mbit = 26,
+  IfNsip = 27, IfSlip = 28, IfUltra = 29, IfDs3 = 30, IfSip = 31,
+  IfFrameRelay = 32, IfRs232 = 33, IfPara = 34, IfArcNet = 35,
+  IfArcNetPlus = 36, IfAtm = 37, IfMioX25 = 38, IfSonet = 39, IfX25Ple = 40,
+  IfIso88022Llc = 41, IfLocalTalk = 42, IfSmdsDxi = 43,
+  IfFrameRelayService = 44, IfV35 = 45, IfHssi = 46, IfHippi = 47, IfModem = 48,
+  IfAal5 = 49, IfSonetPath = 50, IfSonetVt = 51, IfSmdsIcip = 52,
+  IfPropVirtual = 53, IfPropMultiplexor = 54, IfIeee80212 = 55,
+  IfFibreChannel = 56, IfHippiInterface = 57, IfFrameRelayInterconnect = 58,
+  IfAflane8023 = 59, IfAflane8025 = 60, IfCctemul = 61, IfFastEther = 62,
+  IfIsdn = 63, IfV11 = 64, IfV36 = 65, IfG70364K = 66, IfG7032MB = 67,
+  IfQllc = 68, IfFastEtherFx = 69, IfChannel = 70, IfIeee80211 = 71,
+  IfIbm370Parchan = 72, IfEscon = 73, IfDlsw = 74, IfIsdnS = 75, IfIsdnU = 76,
+  IfLapD = 77, IfIpSwitch = 78, IfRsrb = 79, IfAtmLogical = 80, IfDs0 = 81,
+  IfDs0Bundle = 82, IfBsc = 83, IfAsync = 84, IfCnr = 85, IfIso88025rDtr = 86,
+  IfEplrs = 87, IfArap = 88, IfPropCnls = 89, IfHostPad = 90, IfTermPad = 91,
+  IfFrameRelayMpi = 92, IfX213 = 93, IfAdsl = 94, IfRadsl = 95, IfSdsl = 96,
+  IfVdsl = 97, IfIso88025Crfprint = 98, IfMyrInet = 99, IfVoiceEm = 100,
+  IfVoiceFxo = 101, IfVoiceFxs = 102, IfVoiceEncap = 103, IfVoiceOverip = 104,
+  IfAtmDxi = 105, IfAtmFuni = 106, IfAtmIma = 107, IfPppMultilinkBundle = 108,
+  IfIpoverCdlc = 109, IfIpoverClaw = 110, IfStackToStack = 111,
+  IfVirtualIpAddress = 112, IfMpc = 113, IfIpoverAtm = 114,
+  IfIso88025Fiber = 115, IfTdlc = 116, IfGigabitEthernet = 117, IfHdlc = 118,
+  IfLapF = 119, IfV37 = 120, IfX25Mlp = 121, IfX25HuntGroup = 122,
+  IfTransPhdlc = 123, IfInterleave = 124, IfFast = 125, IfIp = 126,
+  IfDocScableMaclayer = 127, IfDocScableDownstream = 128,
+  IfDocScableUpstream = 129, IfA12MppSwitch = 130, IfTunnel = 131,
+  IfCoffee = 132, IfCes = 133, IfAtmSubInterface = 134, IfL2Vlan = 135,
+  IfL3IpVlan = 136, IfL3IpxVlan = 137, IfDigitalPowerline = 138,
+  IfMediaMailOverIp = 139, IfDtm = 140, IfDcn = 141, IfIpForward = 142,
+  IfMsdsl = 143, IfIeee1394 = 144, IfIfGsn = 145, IfDvbrccMaclayer = 146,
+  IfDvbrccDownstream = 147, IfDvbrccUpstream = 148, IfAtmVirtual = 149,
+  IfMplsTunnel = 150, IfSrp = 151, IfVoiceOverAtm = 152,
+  IfVoiceOverFrameRelay = 153, IfIdsl = 154, IfCompositeLink = 155,
+  IfSs7SigLink = 156, IfPropWirelessP2p = 157, IfFrForward = 158,
+  IfRfc1483 = 159, IfUsb = 160, IfIeee8023AdLag = 161,
+  IfBgpPolicyAccounting = 162, IfFrf16MfrBundle = 163, IfH323Gatekeeper = 164,
+  IfH323Proxy = 165, IfMpls = 166, IfMfSigLink = 167, IfHdsl2 = 168,
+  IfShdsl = 169, IfDs1Fdl = 170, IfPos = 171, IfDvbAsiIn = 172,
+  IfDvbAsiOut = 173, IfPlc = 174, IfNfas = 175, IfTr008 = 176, IfGr303Rdt = 177,
+  IfGr303Idt = 178, IfIsup = 179, IfPropDocsWirelessMaclayer = 180,
+  IfPropDocsWirelessDownstream = 181, IfPropDocsWirelessUpstream = 182,
+  IfHiperLan2 = 183, IfPropBwaP2mp = 184, IfSonetOverheadChannel = 185,
+  IfDigitalWrapperOverheadChannel = 186, IfAal2 = 187, IfRadioMac = 188,
+  IfAtmRadio = 189, IfImt = 190, IfMvl = 191, IfReachDsl = 192,
+  IfFrDlciEndpt = 193, IfAtmVciEndpt = 194, IfOpticalChannel = 195,
+  IfOpticalTransport = 196, IfIeee80216Wman = 237, IfWwanPp = 243,
+  IfWwanPp2 = 244, IfIeee802154 = 259, IfXboxWireless = 281
+
+ + +  Source +  Edit + +
+
+
+
NetworkInterface = object
+  ifIndex*: int
+  ifType*: InterfaceType
+  name*: string
+  desc*: string
+  mtu*: int64
+  flags*: uint64
+  state*: InterfaceState
+  mac*: array[MaxAdapterAddressLength, byte]
+  maclen*: int
+  addresses*: seq[InterfaceAddress]
+
+
+ + +  Source +  Edit + +
+
+
+
Route = object
+  ifIndex*: int
+  dest*: TransportAddress
+  source*: TransportAddress
+  gateway*: TransportAddress
+  metric*: int
+
+
+ + +  Source +  Edit + +
+
+ +
+
+

Consts

+
+
+
MaxAdapterAddressLength = 8
+
+ + +  Source +  Edit + +
+
+ +
+
+

Procs

+
+
+
proc `$`(ifa: InterfaceAddress): string {....raises: [], tags: [].}
+
+ +Return string representation of ifa. +  Source +  Edit + +
+
+
+
proc `$`(iface: NetworkInterface): string {....raises: [], tags: [].}
+
+ +Return string representation of network interface iface. +  Source +  Edit + +
+
+
+
proc `$`(route: Route): string {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc broadcast(ifa: InterfaceAddress): TransportAddress {....raises: [], tags: [].}
+
+ +Return broadcast address for ifa. +  Source +  Edit + +
+
+
+
proc cmp(a, b: NetworkInterface): int {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc getBestRoute(address: TransportAddress): Route {....raises: [], raises: [],
+    tags: [].}
+
+ +Return best applicable OS route, which will be used for connecting to address address. +  Source +  Edit + +
+
+
+
proc getInterfaces(): seq[NetworkInterface] {....raises: [], raises: [], tags: [].}
+
+ +Return list of available interfaces. +  Source +  Edit + +
+
+
+
proc init(ift: typedesc[InterfaceAddress]; address: TransportAddress;
+          prefix: int): InterfaceAddress {....raises: [].}
+
+ +Initialize InterfaceAddress using address and prefix length prefix. +  Source +  Edit + +
+
+
+
proc netmask(ifa: InterfaceAddress): TransportAddress {....raises: [], tags: [].}
+
+ +Return network mask for ifa. +  Source +  Edit + +
+
+
+
proc network(ifa: InterfaceAddress): TransportAddress {....raises: [], tags: [].}
+
+ +Return network address for ifa. +  Source +  Edit + +
+
+ +
+
+

Templates

+
+
+
template RTA_ALIGN(length: uint): uint
+
+ + +  Source +  Edit + +
+
+
+
template RTA_PAYLOAD(length: uint): uint
+
+ + +  Source +  Edit + +
+
+ +
+
+

Exports

+
+DualStackType, ==, AddressFamily, toHex, ==, toIPv6, TransportTooManyError, init, address, getError, isLoopback, isLinkLocalMulticast, ip, resolveTAddress, -, getTransportTooManyError, checkClosed, getTransportError, TransportAddress, isLinkLocalUnicast, contains, getAutoAddresses, initTAddress, getAutoAddress, checkWriteEof, ServerStatus, host, isMulticast, init, isV4Mapped, isUniqueLocal, TransportAddressError, isInterfaceLocalMulticast, ==, AnyAddress, getTransportOsError, $, $, setDualstack, init, TransportLimitError, $, ==, TransportNoSupport, TransportUseClosedError, broadcast, TransportUseEofError, isUnspecified, resolveTAddress, isZero, isSiteLocal, initTAddress, isShared, +, isAnyLocal, $, setDualstack, inc, ==, isDocumentation, isPrivate, getConnectionAbortedError, checkClosed, toSAddr, isUnicastLinkLocal, isLinkLocal, subnetMask, TransportError, ==, getDomain, TransportAbortedError, isNone, getConnectionAbortedError, getServerUseClosedError, mask, isReserved, ServerFlags, toIpAddress, isGlobal, TransportIncompleteError, and, resolveTAddress, getTransportOsError, ServerCommand, resolveTAddress, toIPv4, initTAddress, $, isUnicast, fromSAddr, raiseTransportOsError, getTransportUseClosedError, resolveTAddress, ==, init, prefix, isBroadcast, resolveTAddress, not, init, ==, resolveTAddress, isAvailable, $, init, SocketServer, dec, DefaultDatagramBufferSize, init, windowsAnyAddressFix, IpMask, network, DefaultStreamBufferSize, initIp, raiseTransportError, getDomain, AnyAddress6, IpNet, resolveTAddress, TransportOsError, TransportState, isBenchmarking, isGlobalMulticast, or, subnetMask, initTAddress +
+ +
+
+ +
+ +
+
+
+ + + diff --git a/api/chronos/transports/osnet.idx b/api/chronos/transports/osnet.idx new file mode 100644 index 00000000..b56137de --- /dev/null +++ b/api/chronos/transports/osnet.idx @@ -0,0 +1,228 @@ +MaxAdapterAddressLength chronos/transports/osnet.html#MaxAdapterAddressLength osnet: MaxAdapterAddressLength +IfError chronos/transports/osnet.html#IfError InterfaceType.IfError +IfOther chronos/transports/osnet.html#IfOther InterfaceType.IfOther +IfRegular1822 chronos/transports/osnet.html#IfRegular1822 InterfaceType.IfRegular1822 +IfHdh1822 chronos/transports/osnet.html#IfHdh1822 InterfaceType.IfHdh1822 +IfDdnX25 chronos/transports/osnet.html#IfDdnX25 InterfaceType.IfDdnX25 +IfRfc877X25 chronos/transports/osnet.html#IfRfc877X25 InterfaceType.IfRfc877X25 +IfEthernetCsmacd chronos/transports/osnet.html#IfEthernetCsmacd InterfaceType.IfEthernetCsmacd +IfIso88023Csmacd chronos/transports/osnet.html#IfIso88023Csmacd InterfaceType.IfIso88023Csmacd +IfIso88024TokenBus chronos/transports/osnet.html#IfIso88024TokenBus InterfaceType.IfIso88024TokenBus +IfIso88025TokenRing chronos/transports/osnet.html#IfIso88025TokenRing InterfaceType.IfIso88025TokenRing +IfIso88026MAN chronos/transports/osnet.html#IfIso88026MAN InterfaceType.IfIso88026MAN +IfStarlan chronos/transports/osnet.html#IfStarlan InterfaceType.IfStarlan +IfProteon10Mbit chronos/transports/osnet.html#IfProteon10Mbit InterfaceType.IfProteon10Mbit +IfProteon80Mbit chronos/transports/osnet.html#IfProteon80Mbit InterfaceType.IfProteon80Mbit +IfHyperChannel chronos/transports/osnet.html#IfHyperChannel InterfaceType.IfHyperChannel +IfFddi chronos/transports/osnet.html#IfFddi InterfaceType.IfFddi +IfLapB chronos/transports/osnet.html#IfLapB InterfaceType.IfLapB +IfSdlc chronos/transports/osnet.html#IfSdlc InterfaceType.IfSdlc +IfDs1 chronos/transports/osnet.html#IfDs1 InterfaceType.IfDs1 +IfE1 chronos/transports/osnet.html#IfE1 InterfaceType.IfE1 +IfBasicIsdn chronos/transports/osnet.html#IfBasicIsdn InterfaceType.IfBasicIsdn +IfPrimaryIsdn chronos/transports/osnet.html#IfPrimaryIsdn InterfaceType.IfPrimaryIsdn +IfPropPoint2PointSerial chronos/transports/osnet.html#IfPropPoint2PointSerial InterfaceType.IfPropPoint2PointSerial +IfPpp chronos/transports/osnet.html#IfPpp InterfaceType.IfPpp +IfSoftwareLoopback chronos/transports/osnet.html#IfSoftwareLoopback InterfaceType.IfSoftwareLoopback +IfEon chronos/transports/osnet.html#IfEon InterfaceType.IfEon +IfEthernet3Mbit chronos/transports/osnet.html#IfEthernet3Mbit InterfaceType.IfEthernet3Mbit +IfNsip chronos/transports/osnet.html#IfNsip InterfaceType.IfNsip +IfSlip chronos/transports/osnet.html#IfSlip InterfaceType.IfSlip +IfUltra chronos/transports/osnet.html#IfUltra InterfaceType.IfUltra +IfDs3 chronos/transports/osnet.html#IfDs3 InterfaceType.IfDs3 +IfSip chronos/transports/osnet.html#IfSip InterfaceType.IfSip +IfFrameRelay chronos/transports/osnet.html#IfFrameRelay InterfaceType.IfFrameRelay +IfRs232 chronos/transports/osnet.html#IfRs232 InterfaceType.IfRs232 +IfPara chronos/transports/osnet.html#IfPara InterfaceType.IfPara +IfArcNet chronos/transports/osnet.html#IfArcNet InterfaceType.IfArcNet +IfArcNetPlus chronos/transports/osnet.html#IfArcNetPlus InterfaceType.IfArcNetPlus +IfAtm chronos/transports/osnet.html#IfAtm InterfaceType.IfAtm +IfMioX25 chronos/transports/osnet.html#IfMioX25 InterfaceType.IfMioX25 +IfSonet chronos/transports/osnet.html#IfSonet InterfaceType.IfSonet +IfX25Ple chronos/transports/osnet.html#IfX25Ple InterfaceType.IfX25Ple +IfIso88022Llc chronos/transports/osnet.html#IfIso88022Llc InterfaceType.IfIso88022Llc +IfLocalTalk chronos/transports/osnet.html#IfLocalTalk InterfaceType.IfLocalTalk +IfSmdsDxi chronos/transports/osnet.html#IfSmdsDxi InterfaceType.IfSmdsDxi +IfFrameRelayService chronos/transports/osnet.html#IfFrameRelayService InterfaceType.IfFrameRelayService +IfV35 chronos/transports/osnet.html#IfV35 InterfaceType.IfV35 +IfHssi chronos/transports/osnet.html#IfHssi InterfaceType.IfHssi +IfHippi chronos/transports/osnet.html#IfHippi InterfaceType.IfHippi +IfModem chronos/transports/osnet.html#IfModem InterfaceType.IfModem +IfAal5 chronos/transports/osnet.html#IfAal5 InterfaceType.IfAal5 +IfSonetPath chronos/transports/osnet.html#IfSonetPath InterfaceType.IfSonetPath +IfSonetVt chronos/transports/osnet.html#IfSonetVt InterfaceType.IfSonetVt +IfSmdsIcip chronos/transports/osnet.html#IfSmdsIcip InterfaceType.IfSmdsIcip +IfPropVirtual chronos/transports/osnet.html#IfPropVirtual InterfaceType.IfPropVirtual +IfPropMultiplexor chronos/transports/osnet.html#IfPropMultiplexor InterfaceType.IfPropMultiplexor +IfIeee80212 chronos/transports/osnet.html#IfIeee80212 InterfaceType.IfIeee80212 +IfFibreChannel chronos/transports/osnet.html#IfFibreChannel InterfaceType.IfFibreChannel +IfHippiInterface chronos/transports/osnet.html#IfHippiInterface InterfaceType.IfHippiInterface +IfFrameRelayInterconnect chronos/transports/osnet.html#IfFrameRelayInterconnect InterfaceType.IfFrameRelayInterconnect +IfAflane8023 chronos/transports/osnet.html#IfAflane8023 InterfaceType.IfAflane8023 +IfAflane8025 chronos/transports/osnet.html#IfAflane8025 InterfaceType.IfAflane8025 +IfCctemul chronos/transports/osnet.html#IfCctemul InterfaceType.IfCctemul +IfFastEther chronos/transports/osnet.html#IfFastEther InterfaceType.IfFastEther +IfIsdn chronos/transports/osnet.html#IfIsdn InterfaceType.IfIsdn +IfV11 chronos/transports/osnet.html#IfV11 InterfaceType.IfV11 +IfV36 chronos/transports/osnet.html#IfV36 InterfaceType.IfV36 +IfG70364K chronos/transports/osnet.html#IfG70364K InterfaceType.IfG70364K +IfG7032MB chronos/transports/osnet.html#IfG7032MB InterfaceType.IfG7032MB +IfQllc chronos/transports/osnet.html#IfQllc InterfaceType.IfQllc +IfFastEtherFx chronos/transports/osnet.html#IfFastEtherFx InterfaceType.IfFastEtherFx +IfChannel chronos/transports/osnet.html#IfChannel InterfaceType.IfChannel +IfIeee80211 chronos/transports/osnet.html#IfIeee80211 InterfaceType.IfIeee80211 +IfIbm370Parchan chronos/transports/osnet.html#IfIbm370Parchan InterfaceType.IfIbm370Parchan +IfEscon chronos/transports/osnet.html#IfEscon InterfaceType.IfEscon +IfDlsw chronos/transports/osnet.html#IfDlsw InterfaceType.IfDlsw +IfIsdnS chronos/transports/osnet.html#IfIsdnS InterfaceType.IfIsdnS +IfIsdnU chronos/transports/osnet.html#IfIsdnU InterfaceType.IfIsdnU +IfLapD chronos/transports/osnet.html#IfLapD InterfaceType.IfLapD +IfIpSwitch chronos/transports/osnet.html#IfIpSwitch InterfaceType.IfIpSwitch +IfRsrb chronos/transports/osnet.html#IfRsrb InterfaceType.IfRsrb +IfAtmLogical chronos/transports/osnet.html#IfAtmLogical InterfaceType.IfAtmLogical +IfDs0 chronos/transports/osnet.html#IfDs0 InterfaceType.IfDs0 +IfDs0Bundle chronos/transports/osnet.html#IfDs0Bundle InterfaceType.IfDs0Bundle +IfBsc chronos/transports/osnet.html#IfBsc InterfaceType.IfBsc +IfAsync chronos/transports/osnet.html#IfAsync InterfaceType.IfAsync +IfCnr chronos/transports/osnet.html#IfCnr InterfaceType.IfCnr +IfIso88025rDtr chronos/transports/osnet.html#IfIso88025rDtr InterfaceType.IfIso88025rDtr +IfEplrs chronos/transports/osnet.html#IfEplrs InterfaceType.IfEplrs +IfArap chronos/transports/osnet.html#IfArap InterfaceType.IfArap +IfPropCnls chronos/transports/osnet.html#IfPropCnls InterfaceType.IfPropCnls +IfHostPad chronos/transports/osnet.html#IfHostPad InterfaceType.IfHostPad +IfTermPad chronos/transports/osnet.html#IfTermPad InterfaceType.IfTermPad +IfFrameRelayMpi chronos/transports/osnet.html#IfFrameRelayMpi InterfaceType.IfFrameRelayMpi +IfX213 chronos/transports/osnet.html#IfX213 InterfaceType.IfX213 +IfAdsl chronos/transports/osnet.html#IfAdsl InterfaceType.IfAdsl +IfRadsl chronos/transports/osnet.html#IfRadsl InterfaceType.IfRadsl +IfSdsl chronos/transports/osnet.html#IfSdsl InterfaceType.IfSdsl +IfVdsl chronos/transports/osnet.html#IfVdsl InterfaceType.IfVdsl +IfIso88025Crfprint chronos/transports/osnet.html#IfIso88025Crfprint InterfaceType.IfIso88025Crfprint +IfMyrInet chronos/transports/osnet.html#IfMyrInet InterfaceType.IfMyrInet +IfVoiceEm chronos/transports/osnet.html#IfVoiceEm InterfaceType.IfVoiceEm +IfVoiceFxo chronos/transports/osnet.html#IfVoiceFxo InterfaceType.IfVoiceFxo +IfVoiceFxs chronos/transports/osnet.html#IfVoiceFxs InterfaceType.IfVoiceFxs +IfVoiceEncap chronos/transports/osnet.html#IfVoiceEncap InterfaceType.IfVoiceEncap +IfVoiceOverip chronos/transports/osnet.html#IfVoiceOverip InterfaceType.IfVoiceOverip +IfAtmDxi chronos/transports/osnet.html#IfAtmDxi InterfaceType.IfAtmDxi +IfAtmFuni chronos/transports/osnet.html#IfAtmFuni InterfaceType.IfAtmFuni +IfAtmIma chronos/transports/osnet.html#IfAtmIma InterfaceType.IfAtmIma +IfPppMultilinkBundle chronos/transports/osnet.html#IfPppMultilinkBundle InterfaceType.IfPppMultilinkBundle +IfIpoverCdlc chronos/transports/osnet.html#IfIpoverCdlc InterfaceType.IfIpoverCdlc +IfIpoverClaw chronos/transports/osnet.html#IfIpoverClaw InterfaceType.IfIpoverClaw +IfStackToStack chronos/transports/osnet.html#IfStackToStack InterfaceType.IfStackToStack +IfVirtualIpAddress chronos/transports/osnet.html#IfVirtualIpAddress InterfaceType.IfVirtualIpAddress +IfMpc chronos/transports/osnet.html#IfMpc InterfaceType.IfMpc +IfIpoverAtm chronos/transports/osnet.html#IfIpoverAtm InterfaceType.IfIpoverAtm +IfIso88025Fiber chronos/transports/osnet.html#IfIso88025Fiber InterfaceType.IfIso88025Fiber +IfTdlc chronos/transports/osnet.html#IfTdlc InterfaceType.IfTdlc +IfGigabitEthernet chronos/transports/osnet.html#IfGigabitEthernet InterfaceType.IfGigabitEthernet +IfHdlc chronos/transports/osnet.html#IfHdlc InterfaceType.IfHdlc +IfLapF chronos/transports/osnet.html#IfLapF InterfaceType.IfLapF +IfV37 chronos/transports/osnet.html#IfV37 InterfaceType.IfV37 +IfX25Mlp chronos/transports/osnet.html#IfX25Mlp InterfaceType.IfX25Mlp +IfX25HuntGroup chronos/transports/osnet.html#IfX25HuntGroup InterfaceType.IfX25HuntGroup +IfTransPhdlc chronos/transports/osnet.html#IfTransPhdlc InterfaceType.IfTransPhdlc +IfInterleave chronos/transports/osnet.html#IfInterleave InterfaceType.IfInterleave +IfFast chronos/transports/osnet.html#IfFast InterfaceType.IfFast +IfIp chronos/transports/osnet.html#IfIp InterfaceType.IfIp +IfDocScableMaclayer chronos/transports/osnet.html#IfDocScableMaclayer InterfaceType.IfDocScableMaclayer +IfDocScableDownstream chronos/transports/osnet.html#IfDocScableDownstream InterfaceType.IfDocScableDownstream +IfDocScableUpstream chronos/transports/osnet.html#IfDocScableUpstream InterfaceType.IfDocScableUpstream +IfA12MppSwitch chronos/transports/osnet.html#IfA12MppSwitch InterfaceType.IfA12MppSwitch +IfTunnel chronos/transports/osnet.html#IfTunnel InterfaceType.IfTunnel +IfCoffee chronos/transports/osnet.html#IfCoffee InterfaceType.IfCoffee +IfCes chronos/transports/osnet.html#IfCes InterfaceType.IfCes +IfAtmSubInterface chronos/transports/osnet.html#IfAtmSubInterface InterfaceType.IfAtmSubInterface +IfL2Vlan chronos/transports/osnet.html#IfL2Vlan InterfaceType.IfL2Vlan +IfL3IpVlan chronos/transports/osnet.html#IfL3IpVlan InterfaceType.IfL3IpVlan +IfL3IpxVlan chronos/transports/osnet.html#IfL3IpxVlan InterfaceType.IfL3IpxVlan +IfDigitalPowerline chronos/transports/osnet.html#IfDigitalPowerline InterfaceType.IfDigitalPowerline +IfMediaMailOverIp chronos/transports/osnet.html#IfMediaMailOverIp InterfaceType.IfMediaMailOverIp +IfDtm chronos/transports/osnet.html#IfDtm InterfaceType.IfDtm +IfDcn chronos/transports/osnet.html#IfDcn InterfaceType.IfDcn +IfIpForward chronos/transports/osnet.html#IfIpForward InterfaceType.IfIpForward +IfMsdsl chronos/transports/osnet.html#IfMsdsl InterfaceType.IfMsdsl +IfIeee1394 chronos/transports/osnet.html#IfIeee1394 InterfaceType.IfIeee1394 +IfIfGsn chronos/transports/osnet.html#IfIfGsn InterfaceType.IfIfGsn +IfDvbrccMaclayer chronos/transports/osnet.html#IfDvbrccMaclayer InterfaceType.IfDvbrccMaclayer +IfDvbrccDownstream chronos/transports/osnet.html#IfDvbrccDownstream InterfaceType.IfDvbrccDownstream +IfDvbrccUpstream chronos/transports/osnet.html#IfDvbrccUpstream InterfaceType.IfDvbrccUpstream +IfAtmVirtual chronos/transports/osnet.html#IfAtmVirtual InterfaceType.IfAtmVirtual +IfMplsTunnel chronos/transports/osnet.html#IfMplsTunnel InterfaceType.IfMplsTunnel +IfSrp chronos/transports/osnet.html#IfSrp InterfaceType.IfSrp +IfVoiceOverAtm chronos/transports/osnet.html#IfVoiceOverAtm InterfaceType.IfVoiceOverAtm +IfVoiceOverFrameRelay chronos/transports/osnet.html#IfVoiceOverFrameRelay InterfaceType.IfVoiceOverFrameRelay +IfIdsl chronos/transports/osnet.html#IfIdsl InterfaceType.IfIdsl +IfCompositeLink chronos/transports/osnet.html#IfCompositeLink InterfaceType.IfCompositeLink +IfSs7SigLink chronos/transports/osnet.html#IfSs7SigLink InterfaceType.IfSs7SigLink +IfPropWirelessP2p chronos/transports/osnet.html#IfPropWirelessP2p InterfaceType.IfPropWirelessP2p +IfFrForward chronos/transports/osnet.html#IfFrForward InterfaceType.IfFrForward +IfRfc1483 chronos/transports/osnet.html#IfRfc1483 InterfaceType.IfRfc1483 +IfUsb chronos/transports/osnet.html#IfUsb InterfaceType.IfUsb +IfIeee8023AdLag chronos/transports/osnet.html#IfIeee8023AdLag InterfaceType.IfIeee8023AdLag +IfBgpPolicyAccounting chronos/transports/osnet.html#IfBgpPolicyAccounting InterfaceType.IfBgpPolicyAccounting +IfFrf16MfrBundle chronos/transports/osnet.html#IfFrf16MfrBundle InterfaceType.IfFrf16MfrBundle +IfH323Gatekeeper chronos/transports/osnet.html#IfH323Gatekeeper InterfaceType.IfH323Gatekeeper +IfH323Proxy chronos/transports/osnet.html#IfH323Proxy InterfaceType.IfH323Proxy +IfMpls chronos/transports/osnet.html#IfMpls InterfaceType.IfMpls +IfMfSigLink chronos/transports/osnet.html#IfMfSigLink InterfaceType.IfMfSigLink +IfHdsl2 chronos/transports/osnet.html#IfHdsl2 InterfaceType.IfHdsl2 +IfShdsl chronos/transports/osnet.html#IfShdsl InterfaceType.IfShdsl +IfDs1Fdl chronos/transports/osnet.html#IfDs1Fdl InterfaceType.IfDs1Fdl +IfPos chronos/transports/osnet.html#IfPos InterfaceType.IfPos +IfDvbAsiIn chronos/transports/osnet.html#IfDvbAsiIn InterfaceType.IfDvbAsiIn +IfDvbAsiOut chronos/transports/osnet.html#IfDvbAsiOut InterfaceType.IfDvbAsiOut +IfPlc chronos/transports/osnet.html#IfPlc InterfaceType.IfPlc +IfNfas chronos/transports/osnet.html#IfNfas InterfaceType.IfNfas +IfTr008 chronos/transports/osnet.html#IfTr008 InterfaceType.IfTr008 +IfGr303Rdt chronos/transports/osnet.html#IfGr303Rdt InterfaceType.IfGr303Rdt +IfGr303Idt chronos/transports/osnet.html#IfGr303Idt InterfaceType.IfGr303Idt +IfIsup chronos/transports/osnet.html#IfIsup InterfaceType.IfIsup +IfPropDocsWirelessMaclayer chronos/transports/osnet.html#IfPropDocsWirelessMaclayer InterfaceType.IfPropDocsWirelessMaclayer +IfPropDocsWirelessDownstream chronos/transports/osnet.html#IfPropDocsWirelessDownstream InterfaceType.IfPropDocsWirelessDownstream +IfPropDocsWirelessUpstream chronos/transports/osnet.html#IfPropDocsWirelessUpstream InterfaceType.IfPropDocsWirelessUpstream +IfHiperLan2 chronos/transports/osnet.html#IfHiperLan2 InterfaceType.IfHiperLan2 +IfPropBwaP2mp chronos/transports/osnet.html#IfPropBwaP2mp InterfaceType.IfPropBwaP2mp +IfSonetOverheadChannel chronos/transports/osnet.html#IfSonetOverheadChannel InterfaceType.IfSonetOverheadChannel +IfDigitalWrapperOverheadChannel chronos/transports/osnet.html#IfDigitalWrapperOverheadChannel InterfaceType.IfDigitalWrapperOverheadChannel +IfAal2 chronos/transports/osnet.html#IfAal2 InterfaceType.IfAal2 +IfRadioMac chronos/transports/osnet.html#IfRadioMac InterfaceType.IfRadioMac +IfAtmRadio chronos/transports/osnet.html#IfAtmRadio InterfaceType.IfAtmRadio +IfImt chronos/transports/osnet.html#IfImt InterfaceType.IfImt +IfMvl chronos/transports/osnet.html#IfMvl InterfaceType.IfMvl +IfReachDsl chronos/transports/osnet.html#IfReachDsl InterfaceType.IfReachDsl +IfFrDlciEndpt chronos/transports/osnet.html#IfFrDlciEndpt InterfaceType.IfFrDlciEndpt +IfAtmVciEndpt chronos/transports/osnet.html#IfAtmVciEndpt InterfaceType.IfAtmVciEndpt +IfOpticalChannel chronos/transports/osnet.html#IfOpticalChannel InterfaceType.IfOpticalChannel +IfOpticalTransport chronos/transports/osnet.html#IfOpticalTransport InterfaceType.IfOpticalTransport +IfIeee80216Wman chronos/transports/osnet.html#IfIeee80216Wman InterfaceType.IfIeee80216Wman +IfWwanPp chronos/transports/osnet.html#IfWwanPp InterfaceType.IfWwanPp +IfWwanPp2 chronos/transports/osnet.html#IfWwanPp2 InterfaceType.IfWwanPp2 +IfIeee802154 chronos/transports/osnet.html#IfIeee802154 InterfaceType.IfIeee802154 +IfXboxWireless chronos/transports/osnet.html#IfXboxWireless InterfaceType.IfXboxWireless +InterfaceType chronos/transports/osnet.html#InterfaceType osnet: InterfaceType +StatusError chronos/transports/osnet.html#StatusError InterfaceState.StatusError +StatusUp chronos/transports/osnet.html#StatusUp InterfaceState.StatusUp +StatusDown chronos/transports/osnet.html#StatusDown InterfaceState.StatusDown +StatusTesting chronos/transports/osnet.html#StatusTesting InterfaceState.StatusTesting +StatusUnknown chronos/transports/osnet.html#StatusUnknown InterfaceState.StatusUnknown +StatusDormant chronos/transports/osnet.html#StatusDormant InterfaceState.StatusDormant +StatusNotPresent chronos/transports/osnet.html#StatusNotPresent InterfaceState.StatusNotPresent +StatusLowerLayerDown chronos/transports/osnet.html#StatusLowerLayerDown InterfaceState.StatusLowerLayerDown +InterfaceState chronos/transports/osnet.html#InterfaceState osnet: InterfaceState +InterfaceAddress chronos/transports/osnet.html#InterfaceAddress osnet: InterfaceAddress +NetworkInterface chronos/transports/osnet.html#NetworkInterface osnet: NetworkInterface +Route chronos/transports/osnet.html#Route osnet: Route +broadcast chronos/transports/osnet.html#broadcast,InterfaceAddress osnet: broadcast(ifa: InterfaceAddress): TransportAddress +network chronos/transports/osnet.html#network,InterfaceAddress osnet: network(ifa: InterfaceAddress): TransportAddress +netmask chronos/transports/osnet.html#netmask,InterfaceAddress osnet: netmask(ifa: InterfaceAddress): TransportAddress +init chronos/transports/osnet.html#init,typedesc[InterfaceAddress],TransportAddress,int osnet: init(ift: typedesc[InterfaceAddress]; address: TransportAddress; prefix: int): InterfaceAddress +`$` chronos/transports/osnet.html#$,InterfaceAddress osnet: `$`(ifa: InterfaceAddress): string +`$` chronos/transports/osnet.html#$,NetworkInterface osnet: `$`(iface: NetworkInterface): string +`$` chronos/transports/osnet.html#$,Route osnet: `$`(route: Route): string +cmp chronos/transports/osnet.html#cmp,NetworkInterface,NetworkInterface osnet: cmp(a, b: NetworkInterface): int +RTA_ALIGN chronos/transports/osnet.html#RTA_ALIGN.t,uint osnet: RTA_ALIGN(length: uint): uint +RTA_PAYLOAD chronos/transports/osnet.html#RTA_PAYLOAD.t,uint osnet: RTA_PAYLOAD(length: uint): uint +getInterfaces chronos/transports/osnet.html#getInterfaces osnet: getInterfaces(): seq[NetworkInterface] +getBestRoute chronos/transports/osnet.html#getBestRoute,TransportAddress osnet: getBestRoute(address: TransportAddress): Route diff --git a/api/chronos/transports/stream.html b/api/chronos/transports/stream.html new file mode 100644 index 00000000..e8eef860 --- /dev/null +++ b/api/chronos/transports/stream.html @@ -0,0 +1,1635 @@ + + + + + + + + + + + + + + + + + + +chronos/transports/stream + + + + + + + + +
+
+

chronos/transports/stream

+
+
+
+ +     Dark Mode +
+ +
+ Search: +
+
+ Group by: + +
+ + +
+   Source +  Edit + +
+
+ +

+ +
+

Types

+
+
+
ReadMessagePredicate = proc (data: openArray[byte]): tuple[consumed: int,
+    done: bool] {....gcsafe, raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
SocketFlags {.pure.} = enum
+  TcpNoDelay, ReuseAddr, ReusePort
+
+ + +  Source +  Edit + +
+
+
+
StreamCallback = proc (server: StreamServer; client: StreamTransport) {.async.}
+
+ +Connection callback that doesn't check for exceptions at compile time server - StreamServer object. client - accepted client transport. +  Source +  Edit + +
+
+
+
StreamCallback2 = proc (server: StreamServer; client: StreamTransport) {.
+    async: (...raises: []).}
+
+ +New remote client connection callback server - StreamServer object. client - accepted client transport. +  Source +  Edit + +
+
+
+
StreamServer = ref object of SocketServer
+  function*: StreamCallback2
+  init*: TransportInitCallback
+
+
+ +StreamServer object +  Source +  Edit + +
+
+
+
StreamTransport = ref object of RootRef
+  fd*: AsyncFD
+  state: set[TransportState]
+  reader: ReaderFuture
+  buffer: BipBuffer
+  error: ref TransportError
+  queue: Deque[StreamVector]
+  future: Future[void].Raising([])
+  flags: set[TransportFlags]
+  case kind*: TransportKind
+  of TransportKind.Socket:
+      domain: Domain
+      local: TransportAddress
+      remote: TransportAddress
+
+  of TransportKind.Pipe:
+      nil
+
+  of TransportKind.File:
+      nil
+
+  
+
+ + +  Source +  Edit + +
+
+
+
TransportFlags = enum
+  None, WinServerPipe, WinNoPipeFlash, TcpNoDelay, V4Mapped
+
+ + +  Source +  Edit + +
+
+
+
TransportInitCallback = proc (server: StreamServer; fd: AsyncFD): StreamTransport {.
+    ...gcsafe, raises: [].}
+
+ +Custom transport initialization procedure, which can allocate inherited StreamTransport object. +  Source +  Edit + +
+
+
+
TransportKind {.pure.} = enum
+  Socket, Pipe, File
+
+ + +  Source +  Edit + +
+
+ +
+
+

Consts

+
+
+
DefaultBacklogSize = 2147483647'i32
+
+ + +  Source +  Edit + +
+
+
+
StreamServerTrackerName = "stream.server"
+
+ + +  Source +  Edit + +
+
+
+
StreamTransportTrackerName = "stream.transport"
+
+ + +  Source +  Edit + +
+
+ +
+
+

Procs

+
+
+
proc accept(server: StreamServer): InternalRaisesFuture[StreamTransport, (
+    TransportUseClosedError, TransportTooManyError, TransportAbortedError,
+    TransportOsError, CancelledError)] {.stackTrace: false, ...raises: [], gcsafe,
+    raises: [], raises: [], tags: [RootEffect].}
+
+ + +  Source +  Edit + +
+
+
+
proc atEof(transp: StreamTransport): bool {.inline, ...raises: [], tags: [].}
+
+ +Returns true if transp is at EOF. +  Source +  Edit + +
+
+
+
proc close(server: StreamServer) {....raises: [], tags: [].}
+
+ +

Release server resources.

+

Please note that release of resources is not completed immediately, to be sure all resources got released please use await server.join().

+ +  Source +  Edit + +
+
+
+
proc close(transp: StreamTransport) {....raises: [], tags: [].}
+
+ +

Closes and frees resources of transport transp.

+

Please note that release of resources is not completed immediately, to be sure all resources got released please use await transp.join().

+ +  Source +  Edit + +
+
+
+
proc closed(server: StreamServer): bool {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc closed(transp: StreamTransport): bool {.inline, ...raises: [], tags: [].}
+
+ +Returns true if transport in closed state. +  Source +  Edit + +
+
+
+
proc closeWait(server: StreamServer): InternalRaisesFuture[void, void] {.
+    stackTrace: false, ...raises: [], gcsafe, raises: [], raises: [],
+    tags: [RootEffect].}
+
+ +Close server server and release all resources. +  Source +  Edit + +
+
+
+
proc closeWait(transp: StreamTransport): InternalRaisesFuture[void, void] {.
+    stackTrace: false, ...raises: [], gcsafe, raises: [], raises: [],
+    tags: [RootEffect].}
+
+ +Close and frees resources of transport transp. +  Source +  Edit + +
+
+
+
proc connect(address: TransportAddress; bufferSize = DefaultStreamBufferSize;
+             child: StreamTransport = nil; flags: set[TransportFlags];
+             localAddress = TransportAddress(); dualstack = DualStackType.Auto): InternalRaisesFuture[
+    StreamTransport, (TransportError, CancelledError)] {.stackTrace: false,
+    ...raises: [], gcsafe, raises: [], raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc connect(address: TransportAddress; bufferSize = DefaultStreamBufferSize;
+             child: StreamTransport = nil; localAddress = TransportAddress();
+             flags: set[SocketFlags] = {}; dualstack = DualStackType.Auto): InternalRaisesFuture[
+    StreamTransport, (TransportError, CancelledError)] {.stackTrace: false,
+    ...raises: [], gcsafe, raises: [], raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc consume(transp: StreamTransport): InternalRaisesFuture[int,
+    (TransportError, CancelledError)] {.stackTrace: false, ...raises: [], gcsafe,
+                                        raises: [], raises: [],
+                                        tags: [RootEffect].}
+
+ +

Consume all bytes from transport transp and discard it.

+

Return number of bytes actually consumed and discarded.

+ +  Source +  Edit + +
+
+
+
proc consume(transp: StreamTransport; n: int): InternalRaisesFuture[int,
+    (TransportError, CancelledError)] {.stackTrace: false, ...raises: [], gcsafe,
+                                        raises: [], raises: [],
+                                        tags: [RootEffect].}
+
+ +

Consume all bytes (n <= 0) or n bytes from transport transp and discard it.

+

Return number of bytes actually consumed and discarded.

+ +  Source +  Edit + +
+
+
+
proc createStreamServer(cbproc: StreamCallback2; port: Port;
+                        host: Opt[IpAddress] = Opt.none(IpAddress);
+                        flags: set[ServerFlags] = {};
+                        sock: AsyncFD = asyncInvalidSocket;
+                        backlog: int = DefaultBacklogSize;
+                        bufferSize: int = DefaultStreamBufferSize;
+                        child: StreamServer = nil;
+                        init: TransportInitCallback = nil; udata: pointer = nil;
+                        dualstack = DualStackType.Auto): StreamServer {.
+    ...raises: [TransportOsError], raises: [], tags: [RootEffect].}
+
+ +Create stream server which will be bound to:
  1. IPv6 address ::, if IPv6 is available
  2. +
  3. IPv4 address 0.0.0.0, if IPv6 is not available.
  4. +
+ +  Source +  Edit + +
+
+
+
proc createStreamServer(host: TransportAddress; cbproc: StreamCallback2;
+                        flags: set[ServerFlags] = {};
+                        sock: AsyncFD = asyncInvalidSocket;
+                        backlog: int = DefaultBacklogSize;
+                        bufferSize: int = DefaultStreamBufferSize;
+                        child: StreamServer = nil;
+                        init: TransportInitCallback = nil; udata: pointer = nil;
+                        dualstack = DualStackType.Auto): StreamServer {.
+    ...raises: [TransportOsError], raises: [], tags: [].}
+
+ +

Create new TCP stream server.

+

host - address to which server will be bound. flags - flags to apply to server socket. cbproc - callback function which will be called, when new client connection will be established. sock - user-driven socket to use. backlog - number of outstanding connections in the socket's listen queue. bufferSize - size of internal buffer for transport. child - existing object StreamServerobject to initialize, can be used to initalize StreamServer inherited objects. udata - user-defined pointer.

+ +  Source +  Edit + +
+
+
+
proc createStreamServer(host: TransportAddress; cbproc: StreamCallback;
+                        flags: set[ServerFlags] = {};
+                        sock: AsyncFD = asyncInvalidSocket;
+                        backlog: int = DefaultBacklogSize;
+                        bufferSize: int = DefaultStreamBufferSize;
+                        child: StreamServer = nil;
+                        init: TransportInitCallback = nil; udata: pointer = nil;
+                        dualstack = DualStackType.Auto): StreamServer {.
+    ...raises: [TransportOsError], deprecated: "Callback must not raise exceptions, annotate with {.async: (raises: []).}",
+    raises: [], tags: [RootEffect].}
+
+
+ Deprecated: Callback must not raise exceptions, annotate with {.async: (raises: []).} +
+ + +  Source +  Edit + +
+
+
+
proc createStreamServer(host: TransportAddress; flags: set[ServerFlags] = {};
+                        sock: AsyncFD = asyncInvalidSocket;
+                        backlog: int = DefaultBacklogSize;
+                        bufferSize: int = DefaultStreamBufferSize;
+                        child: StreamServer = nil;
+                        init: TransportInitCallback = nil; udata: pointer = nil;
+                        dualstack = DualStackType.Auto): StreamServer {.
+    ...raises: [TransportOsError], raises: [], tags: [RootEffect].}
+
+ + +  Source +  Edit + +
+
+
+
proc createStreamServer(port: Port; host: Opt[IpAddress] = Opt.none(IpAddress);
+                        flags: set[ServerFlags] = {};
+                        sock: AsyncFD = asyncInvalidSocket;
+                        backlog: int = DefaultBacklogSize;
+                        bufferSize: int = DefaultStreamBufferSize;
+                        child: StreamServer = nil;
+                        init: TransportInitCallback = nil; udata: pointer = nil;
+                        dualstack = DualStackType.Auto): StreamServer {.
+    ...raises: [TransportOsError], raises: [], tags: [RootEffect].}
+
+ +Create stream server which will be bound to:
  1. IPv6 address ::, if IPv6 is available
  2. +
  3. IPv4 address 0.0.0.0, if IPv6 is not available.
  4. +
+ +  Source +  Edit + +
+
+
+
proc createStreamServer[T](cbproc: StreamCallback2; port: Port;
+                           host: Opt[IpAddress] = Opt.none(IpAddress);
+                           flags: set[ServerFlags] = {}; udata: ref T;
+                           sock: AsyncFD = asyncInvalidSocket;
+                           backlog: int = DefaultBacklogSize;
+                           bufferSize: int = DefaultStreamBufferSize;
+                           child: StreamServer = nil;
+                           init: TransportInitCallback = nil;
+                           dualstack = DualStackType.Auto): StreamServer {.
+    ...raises: [TransportOsError], raises: [].}
+
+ +Create stream server which will be bound to:
  1. IPv6 address ::, if IPv6 is available
  2. +
  3. IPv4 address 0.0.0.0, if IPv6 is not available.
  4. +
+ +  Source +  Edit + +
+
+
+
proc createStreamServer[T](host: TransportAddress; cbproc: StreamCallback2;
+                           flags: set[ServerFlags] = {}; udata: ref T;
+                           sock: AsyncFD = asyncInvalidSocket;
+                           backlog: int = DefaultBacklogSize;
+                           bufferSize: int = DefaultStreamBufferSize;
+                           child: StreamServer = nil;
+                           init: TransportInitCallback = nil;
+                           dualstack = DualStackType.Auto): StreamServer {.
+    ...raises: [TransportOsError], raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc createStreamServer[T](host: TransportAddress; cbproc: StreamCallback;
+                           flags: set[ServerFlags] = {}; udata: ref T;
+                           sock: AsyncFD = asyncInvalidSocket;
+                           backlog: int = DefaultBacklogSize;
+                           bufferSize: int = DefaultStreamBufferSize;
+                           child: StreamServer = nil;
+                           init: TransportInitCallback = nil;
+                           dualstack = DualStackType.Auto): StreamServer {.
+    ...raises: [TransportOsError], deprecated: "Callback must not raise exceptions, annotate with {.async: (raises: []).}",
+    raises: [].}
+
+
+ Deprecated: Callback must not raise exceptions, annotate with {.async: (raises: []).} +
+ + +  Source +  Edit + +
+
+
+
proc createStreamServer[T](host: TransportAddress; flags: set[ServerFlags] = {};
+                           udata: ref T; sock: AsyncFD = asyncInvalidSocket;
+                           backlog: int = DefaultBacklogSize;
+                           bufferSize: int = DefaultStreamBufferSize;
+                           child: StreamServer = nil;
+                           init: TransportInitCallback = nil;
+                           dualstack = DualStackType.Auto): StreamServer {.
+    ...raises: [TransportOsError], raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc createStreamServer[T](port: Port;
+                           host: Opt[IpAddress] = Opt.none(IpAddress);
+                           flags: set[ServerFlags] = {}; udata: ref T;
+                           sock: AsyncFD = asyncInvalidSocket;
+                           backlog: int = DefaultBacklogSize;
+                           bufferSize: int = DefaultStreamBufferSize;
+                           child: StreamServer = nil;
+                           init: TransportInitCallback = nil;
+                           dualstack = DualStackType.Auto): StreamServer {.
+    ...raises: [TransportOsError], raises: [].}
+
+ +Create stream server which will be bound to:
  1. IPv6 address ::, if IPv6 is available
  2. +
  3. IPv4 address 0.0.0.0, if IPv6 is not available.
  4. +
+ +  Source +  Edit + +
+
+
+
proc failed(transp: StreamTransport): bool {.inline, ...raises: [], tags: [].}
+
+ +Returns true if transport in error state. +  Source +  Edit + +
+
+
+
proc finished(transp: StreamTransport): bool {.inline, ...raises: [], tags: [].}
+
+ +Returns true if transport in finished (EOF) state. +  Source +  Edit + +
+
+
+
proc fromPipe(fd: AsyncFD; child: StreamTransport = nil;
+              bufferSize = DefaultStreamBufferSize): StreamTransport {.
+    ...raises: [TransportOsError], raises: [], tags: [].}
+
+ +

Create new transport object using pipe's file descriptor.

+

bufferSize is size of internal buffer for transport.

+ +  Source +  Edit + +
+
+
+
proc fromPipe2(fd: AsyncFD; child: StreamTransport = nil;
+               bufferSize = DefaultStreamBufferSize): Result[StreamTransport,
+    OSErrorCode] {....raises: [], tags: [].}
+
+ +

Create new transport object using pipe's file descriptor.

+

bufferSize is size of internal buffer for transport.

+ +  Source +  Edit + +
+
+
+
proc getUserData[T](server: StreamServer): T {.inline, ...raises: [].}
+
+ +Obtain user data stored in server object. +  Source +  Edit + +
+
+
+
proc join(server: StreamServer): InternalRaisesFuture[void, (CancelledError,)] {.
+    stackTrace: false, ...raises: [], gcsafe, raises: [], raises: [],
+    tags: [RootEffect].}
+
+ + +  Source +  Edit + +
+
+
+
proc join(transp: StreamTransport): InternalRaisesFuture[void, (CancelledError,)] {.
+    stackTrace: false, ...raises: [], gcsafe, raises: [], raises: [],
+    tags: [RootEffect].}
+
+ + +  Source +  Edit + +
+
+
+
proc localAddress(server: StreamServer): TransportAddress {....raises: [], tags: [].}
+
+ +Returns server bound local socket address. +  Source +  Edit + +
+
+
+
proc localAddress(transp: StreamTransport): TransportAddress {.
+    ...raises: [TransportOsError], raises: [], tags: [].}
+
+ +Returns transp remote socket address. +  Source +  Edit + +
+
+
+
proc localAddress2(transp: StreamTransport): Result[TransportAddress,
+    OSErrorCode] {....raises: [], tags: [].}
+
+ +Returns transp local socket address. +  Source +  Edit + +
+
+
+
proc read(transp: StreamTransport): InternalRaisesFuture[seq[byte],
+    (TransportError, CancelledError)] {.stackTrace: false, ...raises: [], gcsafe,
+                                        raises: [], raises: [],
+                                        tags: [RootEffect].}
+
+ +

Read all bytes from transport transp.

+

This procedure allocates buffer seq[byte] and return it as result.

+ +  Source +  Edit + +
+
+
+
proc read(transp: StreamTransport; n: int): InternalRaisesFuture[seq[byte],
+    (TransportError, CancelledError)] {.stackTrace: false, ...raises: [], gcsafe,
+                                        raises: [], raises: [],
+                                        tags: [RootEffect].}
+
+ +

Read all bytes (n <= 0) or exactly n bytes from transport transp.

+

This procedure allocates buffer seq[byte] and return it as result.

+ +  Source +  Edit + +
+
+
+
proc readExactly(transp: StreamTransport; pbytes: pointer; nbytes: int): InternalRaisesFuture[
+    void, (TransportError, CancelledError)] {.stackTrace: false, ...raises: [],
+    gcsafe, raises: [], raises: [], tags: [RootEffect].}
+
+ +

Read exactly nbytes bytes from transport transp and store it to pbytes. pbytes must not be nil pointer and nbytes should be Natural.

+

If nbytes == 0 this operation will return immediately.

+

If EOF is received and nbytes is not yet read, the procedure will raise TransportIncompleteError, potentially with some bytes already written.

+ +  Source +  Edit + +
+
+
+
proc readLine(transp: StreamTransport; limit = 0; sep = "\r\n"): InternalRaisesFuture[
+    string, (TransportError, CancelledError)] {.stackTrace: false, ...raises: [],
+    gcsafe, raises: [], raises: [], tags: [RootEffect].}
+
+ +

Read one line from transport transp, where "line" is a sequence of bytes ending with sep (default is "rn").

+

If EOF is received, and sep was not found, the method will return the partial read bytes.

+

If the EOF was received and the internal buffer is empty, return an empty string.

+

If limit more then 0, then read is limited to limit bytes.

+ +  Source +  Edit + +
+
+
+
proc readMessage(transp: StreamTransport; predicate: ReadMessagePredicate): InternalRaisesFuture[
+    void, (TransportError, CancelledError)] {.stackTrace: false, ...raises: [],
+    gcsafe, raises: [], raises: [], tags: [RootEffect].}
+
+ +

Read all bytes from transport transp until predicate callback will not be satisfied.

+

predicate callback should return tuple (consumed, result), where consumed is the number of bytes processed and result is a completion flag (true if readMessage() should stop reading data, or false if readMessage() should continue to read data from transport).

+

predicate callback must copy all the data from data array and return number of bytes it is going to consume. predicate callback will receive (zero-length) openArray, if transport is at EOF.

+ +  Source +  Edit + +
+
+
+
proc readOnce(transp: StreamTransport; pbytes: pointer; nbytes: int): InternalRaisesFuture[
+    int, (TransportError, CancelledError)] {.stackTrace: false, ...raises: [],
+    gcsafe, raises: [], raises: [], tags: [RootEffect].}
+
+ +

Perform one read operation on transport transp.

+

If internal buffer is not empty, nbytes bytes will be transferred from internal buffer, otherwise it will wait until some bytes will be received.

+ +  Source +  Edit + +
+
+
+
proc readUntil(transp: StreamTransport; pbytes: pointer; nbytes: int;
+               sep: seq[byte]): InternalRaisesFuture[int,
+    (TransportError, CancelledError)] {.stackTrace: false, ...raises: [], gcsafe,
+                                        raises: [], raises: [],
+                                        tags: [RootEffect].}
+
+ +

Read data from the transport transp until separator sep is found.

+

On success, the data and separator will be removed from the internal buffer (consumed). Returned data will include the separator at the end.

+

If EOF is received, and sep was not found, procedure will raise TransportIncompleteError.

+

If nbytes bytes has been received and sep was not found, procedure will raise TransportLimitError.

+

Procedure returns actual number of bytes read.

+ +  Source +  Edit + +
+
+
+
proc remoteAddress(transp: StreamTransport): TransportAddress {.
+    ...raises: [TransportOsError], raises: [], tags: [].}
+
+ +Returns transp remote socket address. +  Source +  Edit + +
+
+
+
proc remoteAddress2(transp: StreamTransport): Result[TransportAddress,
+    OSErrorCode] {....raises: [], tags: [].}
+
+ +Returns transp remote socket address. +  Source +  Edit + +
+
+
+
proc running(transp: StreamTransport): bool {.inline, ...raises: [], tags: [].}
+
+ +Returns true if transport is still pending. +  Source +  Edit + +
+
+
+
proc shutdownWait(transp: StreamTransport): InternalRaisesFuture[void,
+    (TransportError, CancelledError)] {.stackTrace: false, ...raises: [], gcsafe,
+                                        raises: [], raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc start(server: StreamServer) {....raises: [TransportOsError], raises: [],
+                                   tags: [RootEffect].}
+
+ +Starts server. +  Source +  Edit + +
+
+
+
proc start2(server: StreamServer): Result[void, OSErrorCode] {....raises: [],
+    tags: [RootEffect].}
+
+ +Starts server. +  Source +  Edit + +
+
+
+
proc stop(server: StreamServer) {....raises: [TransportOsError], raises: [],
+                                  tags: [].}
+
+ +Stops server. +  Source +  Edit + +
+
+
+
proc stop2(server: StreamServer): Result[void, OSErrorCode] {....raises: [],
+    tags: [].}
+
+ +Stops server. +  Source +  Edit + +
+
+
+
func toException(v: OSErrorCode): ref TransportOsError {....raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc write(transp: StreamTransport; msg: string; msglen = -1): InternalRaisesFuture[
+    int, (TransportError, CancelledError)] {.stackTrace: false, ...raises: [],
+    gcsafe, raises: [], raises: [], tags: [RootEffect].}
+
+ + +  Source +  Edit + +
+
+
+
proc write(transp: StreamTransport; pbytes: pointer; nbytes: int): InternalRaisesFuture[
+    int, (TransportError, CancelledError)] {.stackTrace: false, ...raises: [],
+    gcsafe, raises: [], raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc write[T](transp: StreamTransport; msg: seq[T]; msglen = -1): InternalRaisesFuture[
+    int, (TransportError, CancelledError)] {.stackTrace: false, ...raises: [],
+    gcsafe, raises: [], raises: [].}
+
+ + +  Source +  Edit + +
+
+
+
proc writeFile(transp: StreamTransport; handle: int; offset: uint = 0;
+               size: int = 0): InternalRaisesFuture[int,
+    (TransportError, CancelledError)] {.stackTrace: false, ...raises: [], gcsafe,
+                                        raises: [], raises: [], tags: [].}
+
+ + +  Source +  Edit + +
+
+ +
+
+

Templates

+
+
+
template toUnchecked(a: untyped): untyped
+
+ + +  Source +  Edit + +
+
+ +
+ +
+
+ +
+ +
+
+
+ + + diff --git a/api/chronos/transports/stream.idx b/api/chronos/transports/stream.idx new file mode 100644 index 00000000..c3e5a5f4 --- /dev/null +++ b/api/chronos/transports/stream.idx @@ -0,0 +1,70 @@ +TransportKind chronos/transports/stream.html#TransportKind stream: TransportKind +None chronos/transports/stream.html#None TransportFlags.None +WinServerPipe chronos/transports/stream.html#WinServerPipe TransportFlags.WinServerPipe +WinNoPipeFlash chronos/transports/stream.html#WinNoPipeFlash TransportFlags.WinNoPipeFlash +TcpNoDelay chronos/transports/stream.html#TcpNoDelay TransportFlags.TcpNoDelay +V4Mapped chronos/transports/stream.html#V4Mapped TransportFlags.V4Mapped +TransportFlags chronos/transports/stream.html#TransportFlags stream: TransportFlags +SocketFlags chronos/transports/stream.html#SocketFlags stream: SocketFlags +ReadMessagePredicate chronos/transports/stream.html#ReadMessagePredicate stream: ReadMessagePredicate +StreamTransportTrackerName chronos/transports/stream.html#StreamTransportTrackerName stream: StreamTransportTrackerName +StreamServerTrackerName chronos/transports/stream.html#StreamServerTrackerName stream: StreamServerTrackerName +DefaultBacklogSize chronos/transports/stream.html#DefaultBacklogSize stream: DefaultBacklogSize +StreamTransport chronos/transports/stream.html#StreamTransport stream: StreamTransport +StreamCallback2 chronos/transports/stream.html#StreamCallback2 stream: StreamCallback2 +StreamCallback chronos/transports/stream.html#StreamCallback stream: StreamCallback +TransportInitCallback chronos/transports/stream.html#TransportInitCallback stream: TransportInitCallback +StreamServer chronos/transports/stream.html#StreamServer stream: StreamServer +remoteAddress2 chronos/transports/stream.html#remoteAddress2,StreamTransport stream: remoteAddress2(transp: StreamTransport): Result[TransportAddress, OSErrorCode] +localAddress2 chronos/transports/stream.html#localAddress2,StreamTransport stream: localAddress2(transp: StreamTransport): Result[TransportAddress, OSErrorCode] +toException chronos/transports/stream.html#toException,OSErrorCode stream: toException(v: OSErrorCode): ref TransportOsError +remoteAddress chronos/transports/stream.html#remoteAddress,StreamTransport stream: remoteAddress(transp: StreamTransport): TransportAddress +localAddress chronos/transports/stream.html#localAddress,StreamTransport stream: localAddress(transp: StreamTransport): TransportAddress +localAddress chronos/transports/stream.html#localAddress,StreamServer stream: localAddress(server: StreamServer): TransportAddress +toUnchecked chronos/transports/stream.html#toUnchecked.t,untyped stream: toUnchecked(a: untyped): untyped +connect chronos/transports/stream.html#connect,TransportAddress,StreamTransport,set[SocketFlags] stream: connect(address: TransportAddress; bufferSize = DefaultStreamBufferSize;\n child: StreamTransport = nil; localAddress = TransportAddress();\n flags: set[SocketFlags] = {}; dualstack = DualStackType.Auto): InternalRaisesFuture[\n StreamTransport, (TransportError, CancelledError)] +accept chronos/transports/stream.html#accept,StreamServer stream: accept(server: StreamServer): InternalRaisesFuture[StreamTransport, (\n TransportUseClosedError, TransportTooManyError, TransportAbortedError,\n TransportOsError, CancelledError)] +start2 chronos/transports/stream.html#start2,StreamServer stream: start2(server: StreamServer): Result[void, OSErrorCode] +stop2 chronos/transports/stream.html#stop2,StreamServer stream: stop2(server: StreamServer): Result[void, OSErrorCode] +start chronos/transports/stream.html#start,StreamServer stream: start(server: StreamServer) +stop chronos/transports/stream.html#stop,StreamServer stream: stop(server: StreamServer) +join chronos/transports/stream.html#join,StreamServer stream: join(server: StreamServer): InternalRaisesFuture[void, (CancelledError,)] +connect chronos/transports/stream.html#connect,TransportAddress,StreamTransport,set[TransportFlags] stream: connect(address: TransportAddress; bufferSize = DefaultStreamBufferSize;\n child: StreamTransport = nil; flags: set[TransportFlags];\n localAddress = TransportAddress(); dualstack = DualStackType.Auto): InternalRaisesFuture[\n StreamTransport, (TransportError, CancelledError)] +closed chronos/transports/stream.html#closed,StreamServer stream: closed(server: StreamServer): bool +close chronos/transports/stream.html#close,StreamServer stream: close(server: StreamServer) +closeWait chronos/transports/stream.html#closeWait,StreamServer stream: closeWait(server: StreamServer): InternalRaisesFuture[void, void] +createStreamServer chronos/transports/stream.html#createStreamServer,TransportAddress,StreamCallback2,set[ServerFlags],AsyncFD,int,int,StreamServer,TransportInitCallback,pointer stream: createStreamServer(host: TransportAddress; cbproc: StreamCallback2;\n flags: set[ServerFlags] = {};\n sock: AsyncFD = asyncInvalidSocket;\n backlog: int = DefaultBacklogSize;\n bufferSize: int = DefaultStreamBufferSize;\n child: StreamServer = nil; init: TransportInitCallback = nil;\n udata: pointer = nil; dualstack = DualStackType.Auto): StreamServer +createStreamServer chronos/transports/stream.html#createStreamServer,TransportAddress,StreamCallback,set[ServerFlags],AsyncFD,int,int,StreamServer,TransportInitCallback,pointer stream: createStreamServer(host: TransportAddress; cbproc: StreamCallback;\n flags: set[ServerFlags] = {};\n sock: AsyncFD = asyncInvalidSocket;\n backlog: int = DefaultBacklogSize;\n bufferSize: int = DefaultStreamBufferSize;\n child: StreamServer = nil; init: TransportInitCallback = nil;\n udata: pointer = nil; dualstack = DualStackType.Auto): StreamServer +createStreamServer chronos/transports/stream.html#createStreamServer,TransportAddress,set[ServerFlags],AsyncFD,int,int,StreamServer,TransportInitCallback,pointer stream: createStreamServer(host: TransportAddress; flags: set[ServerFlags] = {};\n sock: AsyncFD = asyncInvalidSocket;\n backlog: int = DefaultBacklogSize;\n bufferSize: int = DefaultStreamBufferSize;\n child: StreamServer = nil; init: TransportInitCallback = nil;\n udata: pointer = nil; dualstack = DualStackType.Auto): StreamServer +createStreamServer chronos/transports/stream.html#createStreamServer,Port,Opt[IpAddress],set[ServerFlags],AsyncFD,int,int,StreamServer,TransportInitCallback,pointer stream: createStreamServer(port: Port; host: Opt[IpAddress] = Opt.none(IpAddress);\n flags: set[ServerFlags] = {};\n sock: AsyncFD = asyncInvalidSocket;\n backlog: int = DefaultBacklogSize;\n bufferSize: int = DefaultStreamBufferSize;\n child: StreamServer = nil; init: TransportInitCallback = nil;\n udata: pointer = nil; dualstack = DualStackType.Auto): StreamServer +createStreamServer chronos/transports/stream.html#createStreamServer,StreamCallback2,Port,Opt[IpAddress],set[ServerFlags],AsyncFD,int,int,StreamServer,TransportInitCallback,pointer stream: createStreamServer(cbproc: StreamCallback2; port: Port;\n host: Opt[IpAddress] = Opt.none(IpAddress);\n flags: set[ServerFlags] = {};\n sock: AsyncFD = asyncInvalidSocket;\n backlog: int = DefaultBacklogSize;\n bufferSize: int = DefaultStreamBufferSize;\n child: StreamServer = nil; init: TransportInitCallback = nil;\n udata: pointer = nil; dualstack = DualStackType.Auto): StreamServer +createStreamServer chronos/transports/stream.html#createStreamServer,TransportAddress,StreamCallback2,set[ServerFlags],ref.T,AsyncFD,int,int,StreamServer,TransportInitCallback stream: createStreamServer[T](host: TransportAddress; cbproc: StreamCallback2;\n flags: set[ServerFlags] = {}; udata: ref T;\n sock: AsyncFD = asyncInvalidSocket;\n backlog: int = DefaultBacklogSize;\n bufferSize: int = DefaultStreamBufferSize;\n child: StreamServer = nil;\n init: TransportInitCallback = nil;\n dualstack = DualStackType.Auto): StreamServer +createStreamServer chronos/transports/stream.html#createStreamServer,TransportAddress,StreamCallback,set[ServerFlags],ref.T,AsyncFD,int,int,StreamServer,TransportInitCallback stream: createStreamServer[T](host: TransportAddress; cbproc: StreamCallback;\n flags: set[ServerFlags] = {}; udata: ref T;\n sock: AsyncFD = asyncInvalidSocket;\n backlog: int = DefaultBacklogSize;\n bufferSize: int = DefaultStreamBufferSize;\n child: StreamServer = nil;\n init: TransportInitCallback = nil;\n dualstack = DualStackType.Auto): StreamServer +createStreamServer chronos/transports/stream.html#createStreamServer,TransportAddress,set[ServerFlags],ref.T,AsyncFD,int,int,StreamServer,TransportInitCallback stream: createStreamServer[T](host: TransportAddress; flags: set[ServerFlags] = {};\n udata: ref T; sock: AsyncFD = asyncInvalidSocket;\n backlog: int = DefaultBacklogSize;\n bufferSize: int = DefaultStreamBufferSize;\n child: StreamServer = nil;\n init: TransportInitCallback = nil;\n dualstack = DualStackType.Auto): StreamServer +createStreamServer chronos/transports/stream.html#createStreamServer,StreamCallback2,Port,Opt[IpAddress],set[ServerFlags],ref.T,AsyncFD,int,int,StreamServer,TransportInitCallback stream: createStreamServer[T](cbproc: StreamCallback2; port: Port;\n host: Opt[IpAddress] = Opt.none(IpAddress);\n flags: set[ServerFlags] = {}; udata: ref T;\n sock: AsyncFD = asyncInvalidSocket;\n backlog: int = DefaultBacklogSize;\n bufferSize: int = DefaultStreamBufferSize;\n child: StreamServer = nil;\n init: TransportInitCallback = nil;\n dualstack = DualStackType.Auto): StreamServer +createStreamServer chronos/transports/stream.html#createStreamServer,Port,Opt[IpAddress],set[ServerFlags],ref.T,AsyncFD,int,int,StreamServer,TransportInitCallback stream: createStreamServer[T](port: Port; host: Opt[IpAddress] = Opt.none(IpAddress);\n flags: set[ServerFlags] = {}; udata: ref T;\n sock: AsyncFD = asyncInvalidSocket;\n backlog: int = DefaultBacklogSize;\n bufferSize: int = DefaultStreamBufferSize;\n child: StreamServer = nil;\n init: TransportInitCallback = nil;\n dualstack = DualStackType.Auto): StreamServer +getUserData chronos/transports/stream.html#getUserData,StreamServer stream: getUserData[T](server: StreamServer): T +write chronos/transports/stream.html#write,StreamTransport,pointer,int stream: write(transp: StreamTransport; pbytes: pointer; nbytes: int): InternalRaisesFuture[\n int, (TransportError, CancelledError)] +write chronos/transports/stream.html#write,StreamTransport,string,int stream: write(transp: StreamTransport; msg: string; msglen = -1): InternalRaisesFuture[\n int, (TransportError, CancelledError)] +write chronos/transports/stream.html#write,StreamTransport,seq[T],int stream: write[T](transp: StreamTransport; msg: seq[T]; msglen = -1): InternalRaisesFuture[\n int, (TransportError, CancelledError)] +writeFile chronos/transports/stream.html#writeFile,StreamTransport,int,uint,int stream: writeFile(transp: StreamTransport; handle: int; offset: uint = 0; size: int = 0): InternalRaisesFuture[\n int, (TransportError, CancelledError)] +atEof chronos/transports/stream.html#atEof,StreamTransport stream: atEof(transp: StreamTransport): bool +readExactly chronos/transports/stream.html#readExactly,StreamTransport,pointer,int stream: readExactly(transp: StreamTransport; pbytes: pointer; nbytes: int): InternalRaisesFuture[\n void, (TransportError, CancelledError)] +readOnce chronos/transports/stream.html#readOnce,StreamTransport,pointer,int stream: readOnce(transp: StreamTransport; pbytes: pointer; nbytes: int): InternalRaisesFuture[\n int, (TransportError, CancelledError)] +readUntil chronos/transports/stream.html#readUntil,StreamTransport,pointer,int,seq[byte] stream: readUntil(transp: StreamTransport; pbytes: pointer; nbytes: int; sep: seq[byte]): InternalRaisesFuture[\n int, (TransportError, CancelledError)] +readLine chronos/transports/stream.html#readLine,StreamTransport,int,string stream: readLine(transp: StreamTransport; limit = 0; sep = "\r\n"): InternalRaisesFuture[\n string, (TransportError, CancelledError)] +read chronos/transports/stream.html#read,StreamTransport stream: read(transp: StreamTransport): InternalRaisesFuture[seq[byte],\n (TransportError, CancelledError)] +read chronos/transports/stream.html#read,StreamTransport,int stream: read(transp: StreamTransport; n: int): InternalRaisesFuture[seq[byte],\n (TransportError, CancelledError)] +consume chronos/transports/stream.html#consume,StreamTransport stream: consume(transp: StreamTransport): InternalRaisesFuture[int,\n (TransportError, CancelledError)] +consume chronos/transports/stream.html#consume,StreamTransport,int stream: consume(transp: StreamTransport; n: int): InternalRaisesFuture[int,\n (TransportError, CancelledError)] +readMessage chronos/transports/stream.html#readMessage,StreamTransport,ReadMessagePredicate stream: readMessage(transp: StreamTransport; predicate: ReadMessagePredicate): InternalRaisesFuture[\n void, (TransportError, CancelledError)] +join chronos/transports/stream.html#join,StreamTransport stream: join(transp: StreamTransport): InternalRaisesFuture[void, (CancelledError,)] +closed chronos/transports/stream.html#closed,StreamTransport stream: closed(transp: StreamTransport): bool +finished chronos/transports/stream.html#finished,StreamTransport stream: finished(transp: StreamTransport): bool +failed chronos/transports/stream.html#failed,StreamTransport stream: failed(transp: StreamTransport): bool +running chronos/transports/stream.html#running,StreamTransport stream: running(transp: StreamTransport): bool +close chronos/transports/stream.html#close,StreamTransport stream: close(transp: StreamTransport) +closeWait chronos/transports/stream.html#closeWait,StreamTransport stream: closeWait(transp: StreamTransport): InternalRaisesFuture[void, void] +shutdownWait chronos/transports/stream.html#shutdownWait,StreamTransport stream: shutdownWait(transp: StreamTransport): InternalRaisesFuture[void,\n (TransportError, CancelledError)] +fromPipe2 chronos/transports/stream.html#fromPipe2,AsyncFD,StreamTransport stream: fromPipe2(fd: AsyncFD; child: StreamTransport = nil;\n bufferSize = DefaultStreamBufferSize): Result[StreamTransport,\n OSErrorCode] +fromPipe chronos/transports/stream.html#fromPipe,AsyncFD,StreamTransport stream: fromPipe(fd: AsyncFD; child: StreamTransport = nil;\n bufferSize = DefaultStreamBufferSize): StreamTransport diff --git a/api/dochack.js b/api/dochack.js new file mode 100644 index 00000000..30c3b8d5 --- /dev/null +++ b/api/dochack.js @@ -0,0 +1,2036 @@ +/* Generated by the Nim Compiler v1.6.20 */ +var framePtr = null; +var excHandler = 0; +var lastJSError = null; +var NTI654311438 = {size: 0, kind: 18, base: null, node: null, finalizer: null}; +var NTI503317021 = {size: 0, kind: 24, base: null, node: null, finalizer: null}; +var NTI637534300 = {size: 0,kind: 25,base: null,node: null,finalizer: null}; +var NTI637534299 = {size: 0,kind: 25,base: null,node: null,finalizer: null}; +var NTI637534298 = {size: 0,kind: 25,base: null,node: null,finalizer: null}; +var NTI637534297 = {size: 0,kind: 25,base: null,node: null,finalizer: null}; +var NTI637534296 = {size: 0,kind: 25,base: null,node: null,finalizer: null}; +var NTI637534295 = {size: 0,kind: 25,base: null,node: null,finalizer: null}; +var NTI637534294 = {size: 0,kind: 25,base: null,node: null,finalizer: null}; +var NTI637534293 = {size: 0,kind: 25,base: null,node: null,finalizer: null}; +var NTI637534292 = {size: 0,kind: 25,base: null,node: null,finalizer: null}; +var NTI637534291 = {size: 0,kind: 25,base: null,node: null,finalizer: null}; +var NTI637534290 = {size: 0,kind: 25,base: null,node: null,finalizer: null}; +var NTI637534289 = {size: 0,kind: 25,base: null,node: null,finalizer: null}; +var NTI637534288 = {size: 0,kind: 25,base: null,node: null,finalizer: null}; +var NTI637534287 = {size: 0,kind: 25,base: null,node: null,finalizer: null}; +var NTI637534286 = {size: 0,kind: 25,base: null,node: null,finalizer: null}; +var NTI637534285 = {size: 0,kind: 25,base: null,node: null,finalizer: null}; +var NTI637534284 = {size: 0,kind: 25,base: null,node: null,finalizer: null}; +var NTI637534283 = {size: 0,kind: 25,base: null,node: null,finalizer: null}; +var NTI637534282 = {size: 0,kind: 25,base: null,node: null,finalizer: null}; +var NTI637534281 = {size: 0,kind: 25,base: null,node: null,finalizer: null}; +var NTI637534280 = {size: 0,kind: 25,base: null,node: null,finalizer: null}; +var NTI637534279 = {size: 0,kind: 25,base: null,node: null,finalizer: null}; +var NTI637534278 = {size: 0,kind: 25,base: null,node: null,finalizer: null}; +var NTI637534277 = {size: 0,kind: 25,base: null,node: null,finalizer: null}; +var NTI637534276 = {size: 0, kind: 17, base: null, node: null, finalizer: null}; +var NTI637534349 = {size: 0, kind: 17, base: null, node: null, finalizer: null}; +var NTI637534238 = {size: 0, kind: 22, base: null, node: null, finalizer: null}; +var NTI637534396 = {size: 0,kind: 25,base: null,node: null,finalizer: null}; +var NTI637534393 = {size: 0,kind: 25,base: null,node: null,finalizer: null}; +var NTI637534392 = {size: 0, kind: 18, base: null, node: null, finalizer: null}; +var NTI637534273 = {size: 0, kind: 22, base: null, node: null, finalizer: null}; +var NTI637534395 = {size: 0, kind: 18, base: null, node: null, finalizer: null}; +var NTI637534274 = {size: 0, kind: 22, base: null, node: null, finalizer: null}; +var NTI637534342 = {size: 0, kind: 17, base: null, node: null, finalizer: null}; +var NTI637534232 = {size: 0, kind: 22, base: null, node: null, finalizer: null}; +var NTI637534331 = {size: 0, kind: 24, base: null, node: null, finalizer: null}; +var NTI637534343 = {size: 0, kind: 17, base: null, node: null, finalizer: null}; +var NTI637534233 = {size: 0, kind: 22, base: null, node: null, finalizer: null}; +var NTI637534330 = {size: 0, kind: 24, base: null, node: null, finalizer: null}; +var NTI637534329 = {size: 0, kind: 24, base: null, node: null, finalizer: null}; +var NTI637534348 = {size: 0, kind: 17, base: null, node: null, finalizer: null}; +var NTI637534237 = {size: 0, kind: 22, base: null, node: null, finalizer: null}; +var NTI637534328 = {size: 0, kind: 24, base: null, node: null, finalizer: null}; +var NTI637534327 = {size: 0, kind: 24, base: null, node: null, finalizer: null}; +var NTI637534344 = {size: 0, kind: 17, base: null, node: null, finalizer: null}; +var NTI637534234 = {size: 0, kind: 22, base: null, node: null, finalizer: null}; +var NTI637534326 = {size: 0, kind: 24, base: null, node: null, finalizer: null}; +var NTI637534334 = {size: 0, kind: 24, base: null, node: null, finalizer: null}; +var NTI637534345 = {size: 0, kind: 17, base: null, node: null, finalizer: null}; +var NTI637534235 = {size: 0, kind: 22, base: null, node: null, finalizer: null}; +var NTI637534333 = {size: 0, kind: 24, base: null, node: null, finalizer: null}; +var NTI33554456 = {size: 0,kind: 31,base: null,node: null,finalizer: null}; +var NTI637534347 = {size: 0, kind: 24, base: null, node: null, finalizer: null}; +var NTI637534346 = {size: 0, kind: 17, base: null, node: null, finalizer: null}; +var NTI637534236 = {size: 0, kind: 22, base: null, node: null, finalizer: null}; +var NTI33554466 = {size: 0,kind: 1,base: null,node: null,finalizer: null}; +var NTI637534318 = {size: 0, kind: 17, base: null, node: null, finalizer: null}; +var NTI637534222 = {size: 0, kind: 22, base: null, node: null, finalizer: null}; +var NTI637534332 = {size: 0, kind: 17, base: null, node: null, finalizer: null}; +var NTI637534226 = {size: 0, kind: 22, base: null, node: null, finalizer: null}; +var NTI637534325 = {size: 0, kind: 17, base: null, node: null, finalizer: null}; +var NTI637534225 = {size: 0, kind: 22, base: null, node: null, finalizer: null}; +var NTI637534223 = {size: 0, kind: 14, base: null, node: null, finalizer: null}; +var NTI637534324 = {size: 0, kind: 24, base: null, node: null, finalizer: null}; +var NTI637534323 = {size: 0, kind: 24, base: null, node: null, finalizer: null}; +var NTI637534322 = {size: 0, kind: 24, base: null, node: null, finalizer: null}; +var NTI637534321 = {size: 0, kind: 17, base: null, node: null, finalizer: null}; +var NTI637534224 = {size: 0, kind: 22, base: null, node: null, finalizer: null}; +var NTI637534652 = {size: 0, kind: 24, base: null, node: null, finalizer: null}; +var NTI33555127 = {size: 0, kind: 17, base: null, node: null, finalizer: null}; +var NTI33555131 = {size: 0, kind: 17, base: null, node: null, finalizer: null}; +var NTI33555133 = {size: 0, kind: 17, base: null, node: null, finalizer: null}; +var NTI33555086 = {size: 0, kind: 17, base: null, node: null, finalizer: null}; +var NTI33555168 = {size: 0, kind: 22, base: null, node: null, finalizer: null}; +var NTI33554439 = {size: 0,kind: 28,base: null,node: null,finalizer: null}; +var NTI33554440 = {size: 0,kind: 29,base: null,node: null,finalizer: null}; +var NTI33555167 = {size: 0, kind: 22, base: null, node: null, finalizer: null}; +var NTI33555115 = {size: 0, kind: 17, base: null, node: null, finalizer: null}; +var NTI33555116 = {size: 0, kind: 17, base: null, node: null, finalizer: null}; +var NTI33555123 = {size: 0, kind: 17, base: null, node: null, finalizer: null}; +var NTI33555125 = {size: 0, kind: 17, base: null, node: null, finalizer: null}; +var NNI33555125 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []}; +NTI33555125.node = NNI33555125; +var NNI33555123 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []}; +NTI33555123.node = NNI33555123; +var NNI33555116 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []}; +NTI33555116.node = NNI33555116; +NTI33555167.base = NTI33555115; +NTI33555168.base = NTI33555115; +var NNI33555115 = {kind: 2, len: 5, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "parent", len: 0, typ: NTI33555167, name: "parent", sons: null}, +{kind: 1, offset: "name", len: 0, typ: NTI33554440, name: "name", sons: null}, +{kind: 1, offset: "message", len: 0, typ: NTI33554439, name: "msg", sons: null}, +{kind: 1, offset: "trace", len: 0, typ: NTI33554439, name: "trace", sons: null}, +{kind: 1, offset: "up", len: 0, typ: NTI33555168, name: "up", sons: null}]}; +NTI33555115.node = NNI33555115; +var NNI33555086 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []}; +NTI33555086.node = NNI33555086; +NTI33555115.base = NTI33555086; +NTI33555116.base = NTI33555115; +NTI33555123.base = NTI33555116; +NTI33555125.base = NTI33555123; +var NNI33555133 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []}; +NTI33555133.node = NNI33555133; +NTI33555133.base = NTI33555116; +var NNI33555131 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []}; +NTI33555131.node = NNI33555131; +NTI33555131.base = NTI33555116; +var NNI33555127 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []}; +NTI33555127.node = NNI33555127; +NTI33555127.base = NTI33555116; +NTI637534322.base = NTI637534224; +NTI637534323.base = NTI637534224; +NTI637534324.base = NTI637534224; +var NNI637534223 = {kind: 2, offset: 0, typ: null, name: null, len: 12, sons: {"1": {kind: 1, offset: 1, typ: NTI637534223, name: "ElementNode", len: 0, sons: null}, +"2": {kind: 1, offset: 2, typ: NTI637534223, name: "AttributeNode", len: 0, sons: null}, +"3": {kind: 1, offset: 3, typ: NTI637534223, name: "TextNode", len: 0, sons: null}, +"4": {kind: 1, offset: 4, typ: NTI637534223, name: "CDATANode", len: 0, sons: null}, +"5": {kind: 1, offset: 5, typ: NTI637534223, name: "EntityRefNode", len: 0, sons: null}, +"6": {kind: 1, offset: 6, typ: NTI637534223, name: "EntityNode", len: 0, sons: null}, +"7": {kind: 1, offset: 7, typ: NTI637534223, name: "ProcessingInstructionNode", len: 0, sons: null}, +"8": {kind: 1, offset: 8, typ: NTI637534223, name: "CommentNode", len: 0, sons: null}, +"9": {kind: 1, offset: 9, typ: NTI637534223, name: "DocumentNode", len: 0, sons: null}, +"10": {kind: 1, offset: 10, typ: NTI637534223, name: "DocumentTypeNode", len: 0, sons: null}, +"11": {kind: 1, offset: 11, typ: NTI637534223, name: "DocumentFragmentNode", len: 0, sons: null}, +"12": {kind: 1, offset: 12, typ: NTI637534223, name: "NotationNode", len: 0, sons: null}}}; +NTI637534223.node = NNI637534223; +var NNI637534318 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []}; +NTI637534318.node = NNI637534318; +NTI637534318.base = NTI33555086; +NTI637534222.base = NTI637534318; +NTI637534347.base = NTI637534226; +var NNI637534346 = {kind: 2, len: 10, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "acceptCharset", len: 0, typ: NTI33554440, name: "acceptCharset", sons: null}, +{kind: 1, offset: "action", len: 0, typ: NTI33554440, name: "action", sons: null}, +{kind: 1, offset: "autocomplete", len: 0, typ: NTI33554440, name: "autocomplete", sons: null}, +{kind: 1, offset: "elements", len: 0, typ: NTI637534347, name: "elements", sons: null}, +{kind: 1, offset: "encoding", len: 0, typ: NTI33554440, name: "encoding", sons: null}, +{kind: 1, offset: "enctype", len: 0, typ: NTI33554440, name: "enctype", sons: null}, +{kind: 1, offset: "length", len: 0, typ: NTI33554456, name: "length", sons: null}, +{kind: 1, offset: "method", len: 0, typ: NTI33554440, name: "method", sons: null}, +{kind: 1, offset: "noValidate", len: 0, typ: NTI33554466, name: "noValidate", sons: null}, +{kind: 1, offset: "target", len: 0, typ: NTI33554440, name: "target", sons: null}]}; +NTI637534346.node = NNI637534346; +NTI637534346.base = NTI637534332; +NTI637534236.base = NTI637534346; +var NNI637534345 = {kind: 2, len: 5, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "defaultSelected", len: 0, typ: NTI33554466, name: "defaultSelected", sons: null}, +{kind: 1, offset: "selected", len: 0, typ: NTI33554466, name: "selected", sons: null}, +{kind: 1, offset: "selectedIndex", len: 0, typ: NTI33554456, name: "selectedIndex", sons: null}, +{kind: 1, offset: "text", len: 0, typ: NTI33554440, name: "text", sons: null}, +{kind: 1, offset: "value", len: 0, typ: NTI33554440, name: "value", sons: null}]}; +NTI637534345.node = NNI637534345; +NTI637534345.base = NTI637534332; +NTI637534235.base = NTI637534345; +NTI637534333.base = NTI637534235; +NTI637534334.base = NTI637534235; +var NNI637534332 = {kind: 2, len: 20, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "className", len: 0, typ: NTI33554440, name: "className", sons: null}, +{kind: 1, offset: "classList", len: 0, typ: NTI637534222, name: "classList", sons: null}, +{kind: 1, offset: "checked", len: 0, typ: NTI33554466, name: "checked", sons: null}, +{kind: 1, offset: "defaultChecked", len: 0, typ: NTI33554466, name: "defaultChecked", sons: null}, +{kind: 1, offset: "defaultValue", len: 0, typ: NTI33554440, name: "defaultValue", sons: null}, +{kind: 1, offset: "disabled", len: 0, typ: NTI33554466, name: "disabled", sons: null}, +{kind: 1, offset: "form", len: 0, typ: NTI637534236, name: "form", sons: null}, +{kind: 1, offset: "name", len: 0, typ: NTI33554440, name: "name", sons: null}, +{kind: 1, offset: "readOnly", len: 0, typ: NTI33554466, name: "readOnly", sons: null}, +{kind: 1, offset: "options", len: 0, typ: NTI637534333, name: "options", sons: null}, +{kind: 1, offset: "selectedOptions", len: 0, typ: NTI637534334, name: "selectedOptions", sons: null}, +{kind: 1, offset: "clientWidth", len: 0, typ: NTI33554456, name: "clientWidth", sons: null}, +{kind: 1, offset: "clientHeight", len: 0, typ: NTI33554456, name: "clientHeight", sons: null}, +{kind: 1, offset: "contentEditable", len: 0, typ: NTI33554440, name: "contentEditable", sons: null}, +{kind: 1, offset: "isContentEditable", len: 0, typ: NTI33554466, name: "isContentEditable", sons: null}, +{kind: 1, offset: "dir", len: 0, typ: NTI33554440, name: "dir", sons: null}, +{kind: 1, offset: "offsetHeight", len: 0, typ: NTI33554456, name: "offsetHeight", sons: null}, +{kind: 1, offset: "offsetWidth", len: 0, typ: NTI33554456, name: "offsetWidth", sons: null}, +{kind: 1, offset: "offsetLeft", len: 0, typ: NTI33554456, name: "offsetLeft", sons: null}, +{kind: 1, offset: "offsetTop", len: 0, typ: NTI33554456, name: "offsetTop", sons: null}]}; +NTI637534332.node = NNI637534332; +NTI637534332.base = NTI637534321; +NTI637534226.base = NTI637534332; +var NNI637534344 = {kind: 2, len: 3, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "text", len: 0, typ: NTI33554440, name: "text", sons: null}, +{kind: 1, offset: "x", len: 0, typ: NTI33554456, name: "x", sons: null}, +{kind: 1, offset: "y", len: 0, typ: NTI33554456, name: "y", sons: null}]}; +NTI637534344.node = NNI637534344; +NTI637534344.base = NTI637534332; +NTI637534234.base = NTI637534344; +NTI637534326.base = NTI637534234; +NTI637534327.base = NTI637534236; +var NNI637534348 = {kind: 2, len: 8, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "border", len: 0, typ: NTI33554456, name: "border", sons: null}, +{kind: 1, offset: "complete", len: 0, typ: NTI33554466, name: "complete", sons: null}, +{kind: 1, offset: "height", len: 0, typ: NTI33554456, name: "height", sons: null}, +{kind: 1, offset: "hspace", len: 0, typ: NTI33554456, name: "hspace", sons: null}, +{kind: 1, offset: "lowsrc", len: 0, typ: NTI33554440, name: "lowsrc", sons: null}, +{kind: 1, offset: "src", len: 0, typ: NTI33554440, name: "src", sons: null}, +{kind: 1, offset: "vspace", len: 0, typ: NTI33554456, name: "vspace", sons: null}, +{kind: 1, offset: "width", len: 0, typ: NTI33554456, name: "width", sons: null}]}; +NTI637534348.node = NNI637534348; +NTI637534348.base = NTI637534332; +NTI637534237.base = NTI637534348; +NTI637534328.base = NTI637534237; +NTI637534329.base = NTI637534226; +var NNI637534343 = {kind: 2, len: 6, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "height", len: 0, typ: NTI33554456, name: "height", sons: null}, +{kind: 1, offset: "hspace", len: 0, typ: NTI33554456, name: "hspace", sons: null}, +{kind: 1, offset: "src", len: 0, typ: NTI33554440, name: "src", sons: null}, +{kind: 1, offset: "width", len: 0, typ: NTI33554456, name: "width", sons: null}, +{kind: 1, offset: "type", len: 0, typ: NTI33554440, name: "type", sons: null}, +{kind: 1, offset: "vspace", len: 0, typ: NTI33554456, name: "vspace", sons: null}]}; +NTI637534343.node = NNI637534343; +NTI637534343.base = NTI637534332; +NTI637534233.base = NTI637534343; +NTI637534330.base = NTI637534233; +var NNI637534342 = {kind: 2, len: 4, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "target", len: 0, typ: NTI33554440, name: "target", sons: null}, +{kind: 1, offset: "text", len: 0, typ: NTI33554440, name: "text", sons: null}, +{kind: 1, offset: "x", len: 0, typ: NTI33554456, name: "x", sons: null}, +{kind: 1, offset: "y", len: 0, typ: NTI33554456, name: "y", sons: null}]}; +NTI637534342.node = NNI637534342; +NTI637534342.base = NTI637534332; +NTI637534232.base = NTI637534342; +NTI637534331.base = NTI637534232; +var NNI637534392 = {kind: 1, offset: "then", len: 0, typ: NTI637534393, name: "then", sons: null}; +NTI637534392.node = NNI637534392; +NTI637534273.base = NTI637534392; +var NNI637534395 = {kind: 2, len: 2, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "ready", len: 0, typ: NTI637534273, name: "ready", sons: null}, +{kind: 1, offset: "onloadingdone", len: 0, typ: NTI637534396, name: "onloadingdone", sons: null}]}; +NTI637534395.node = NNI637534395; +NTI637534274.base = NTI637534395; +var NNI637534325 = {kind: 2, len: 23, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "activeElement", len: 0, typ: NTI637534226, name: "activeElement", sons: null}, +{kind: 1, offset: "documentElement", len: 0, typ: NTI637534226, name: "documentElement", sons: null}, +{kind: 1, offset: "alinkColor", len: 0, typ: NTI33554440, name: "alinkColor", sons: null}, +{kind: 1, offset: "bgColor", len: 0, typ: NTI33554440, name: "bgColor", sons: null}, +{kind: 1, offset: "body", len: 0, typ: NTI637534226, name: "body", sons: null}, +{kind: 1, offset: "charset", len: 0, typ: NTI33554440, name: "charset", sons: null}, +{kind: 1, offset: "cookie", len: 0, typ: NTI33554440, name: "cookie", sons: null}, +{kind: 1, offset: "defaultCharset", len: 0, typ: NTI33554440, name: "defaultCharset", sons: null}, +{kind: 1, offset: "fgColor", len: 0, typ: NTI33554440, name: "fgColor", sons: null}, +{kind: 1, offset: "head", len: 0, typ: NTI637534226, name: "head", sons: null}, +{kind: 1, offset: "lastModified", len: 0, typ: NTI33554440, name: "lastModified", sons: null}, +{kind: 1, offset: "linkColor", len: 0, typ: NTI33554440, name: "linkColor", sons: null}, +{kind: 1, offset: "referrer", len: 0, typ: NTI33554440, name: "referrer", sons: null}, +{kind: 1, offset: "title", len: 0, typ: NTI33554440, name: "title", sons: null}, +{kind: 1, offset: "URL", len: 0, typ: NTI33554440, name: "URL", sons: null}, +{kind: 1, offset: "vlinkColor", len: 0, typ: NTI33554440, name: "vlinkColor", sons: null}, +{kind: 1, offset: "anchors", len: 0, typ: NTI637534326, name: "anchors", sons: null}, +{kind: 1, offset: "forms", len: 0, typ: NTI637534327, name: "forms", sons: null}, +{kind: 1, offset: "images", len: 0, typ: NTI637534328, name: "images", sons: null}, +{kind: 1, offset: "applets", len: 0, typ: NTI637534329, name: "applets", sons: null}, +{kind: 1, offset: "embeds", len: 0, typ: NTI637534330, name: "embeds", sons: null}, +{kind: 1, offset: "links", len: 0, typ: NTI637534331, name: "links", sons: null}, +{kind: 1, offset: "fonts", len: 0, typ: NTI637534274, name: "fonts", sons: null}]}; +NTI637534325.node = NNI637534325; +NTI637534325.base = NTI637534321; +NTI637534225.base = NTI637534325; +var NNI637534349 = {kind: 2, len: 368, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "alignContent", len: 0, typ: NTI33554440, name: "alignContent", sons: null}, +{kind: 1, offset: "alignItems", len: 0, typ: NTI33554440, name: "alignItems", sons: null}, +{kind: 1, offset: "alignSelf", len: 0, typ: NTI33554440, name: "alignSelf", sons: null}, +{kind: 1, offset: "all", len: 0, typ: NTI33554440, name: "all", sons: null}, +{kind: 1, offset: "animation", len: 0, typ: NTI33554440, name: "animation", sons: null}, +{kind: 1, offset: "animationDelay", len: 0, typ: NTI33554440, name: "animationDelay", sons: null}, +{kind: 1, offset: "animationDirection", len: 0, typ: NTI33554440, name: "animationDirection", sons: null}, +{kind: 1, offset: "animationDuration", len: 0, typ: NTI33554440, name: "animationDuration", sons: null}, +{kind: 1, offset: "animationFillMode", len: 0, typ: NTI33554440, name: "animationFillMode", sons: null}, +{kind: 1, offset: "animationIterationCount", len: 0, typ: NTI33554440, name: "animationIterationCount", sons: null}, +{kind: 1, offset: "animationName", len: 0, typ: NTI33554440, name: "animationName", sons: null}, +{kind: 1, offset: "animationPlayState", len: 0, typ: NTI33554440, name: "animationPlayState", sons: null}, +{kind: 1, offset: "animationTimingFunction", len: 0, typ: NTI33554440, name: "animationTimingFunction", sons: null}, +{kind: 1, offset: "backdropFilter", len: 0, typ: NTI33554440, name: "backdropFilter", sons: null}, +{kind: 1, offset: "backfaceVisibility", len: 0, typ: NTI33554440, name: "backfaceVisibility", sons: null}, +{kind: 1, offset: "background", len: 0, typ: NTI33554440, name: "background", sons: null}, +{kind: 1, offset: "backgroundAttachment", len: 0, typ: NTI33554440, name: "backgroundAttachment", sons: null}, +{kind: 1, offset: "backgroundBlendMode", len: 0, typ: NTI33554440, name: "backgroundBlendMode", sons: null}, +{kind: 1, offset: "backgroundClip", len: 0, typ: NTI33554440, name: "backgroundClip", sons: null}, +{kind: 1, offset: "backgroundColor", len: 0, typ: NTI33554440, name: "backgroundColor", sons: null}, +{kind: 1, offset: "backgroundImage", len: 0, typ: NTI33554440, name: "backgroundImage", sons: null}, +{kind: 1, offset: "backgroundOrigin", len: 0, typ: NTI33554440, name: "backgroundOrigin", sons: null}, +{kind: 1, offset: "backgroundPosition", len: 0, typ: NTI33554440, name: "backgroundPosition", sons: null}, +{kind: 1, offset: "backgroundRepeat", len: 0, typ: NTI33554440, name: "backgroundRepeat", sons: null}, +{kind: 1, offset: "backgroundSize", len: 0, typ: NTI33554440, name: "backgroundSize", sons: null}, +{kind: 1, offset: "blockSize", len: 0, typ: NTI33554440, name: "blockSize", sons: null}, +{kind: 1, offset: "border", len: 0, typ: NTI33554440, name: "border", sons: null}, +{kind: 1, offset: "borderBlock", len: 0, typ: NTI33554440, name: "borderBlock", sons: null}, +{kind: 1, offset: "borderBlockColor", len: 0, typ: NTI33554440, name: "borderBlockColor", sons: null}, +{kind: 1, offset: "borderBlockEnd", len: 0, typ: NTI33554440, name: "borderBlockEnd", sons: null}, +{kind: 1, offset: "borderBlockEndColor", len: 0, typ: NTI33554440, name: "borderBlockEndColor", sons: null}, +{kind: 1, offset: "borderBlockEndStyle", len: 0, typ: NTI33554440, name: "borderBlockEndStyle", sons: null}, +{kind: 1, offset: "borderBlockEndWidth", len: 0, typ: NTI33554440, name: "borderBlockEndWidth", sons: null}, +{kind: 1, offset: "borderBlockStart", len: 0, typ: NTI33554440, name: "borderBlockStart", sons: null}, +{kind: 1, offset: "borderBlockStartColor", len: 0, typ: NTI33554440, name: "borderBlockStartColor", sons: null}, +{kind: 1, offset: "borderBlockStartStyle", len: 0, typ: NTI33554440, name: "borderBlockStartStyle", sons: null}, +{kind: 1, offset: "borderBlockStartWidth", len: 0, typ: NTI33554440, name: "borderBlockStartWidth", sons: null}, +{kind: 1, offset: "borderBlockStyle", len: 0, typ: NTI33554440, name: "borderBlockStyle", sons: null}, +{kind: 1, offset: "borderBlockWidth", len: 0, typ: NTI33554440, name: "borderBlockWidth", sons: null}, +{kind: 1, offset: "borderBottom", len: 0, typ: NTI33554440, name: "borderBottom", sons: null}, +{kind: 1, offset: "borderBottomColor", len: 0, typ: NTI33554440, name: "borderBottomColor", sons: null}, +{kind: 1, offset: "borderBottomLeftRadius", len: 0, typ: NTI33554440, name: "borderBottomLeftRadius", sons: null}, +{kind: 1, offset: "borderBottomRightRadius", len: 0, typ: NTI33554440, name: "borderBottomRightRadius", sons: null}, +{kind: 1, offset: "borderBottomStyle", len: 0, typ: NTI33554440, name: "borderBottomStyle", sons: null}, +{kind: 1, offset: "borderBottomWidth", len: 0, typ: NTI33554440, name: "borderBottomWidth", sons: null}, +{kind: 1, offset: "borderCollapse", len: 0, typ: NTI33554440, name: "borderCollapse", sons: null}, +{kind: 1, offset: "borderColor", len: 0, typ: NTI33554440, name: "borderColor", sons: null}, +{kind: 1, offset: "borderEndEndRadius", len: 0, typ: NTI33554440, name: "borderEndEndRadius", sons: null}, +{kind: 1, offset: "borderEndStartRadius", len: 0, typ: NTI33554440, name: "borderEndStartRadius", sons: null}, +{kind: 1, offset: "borderImage", len: 0, typ: NTI33554440, name: "borderImage", sons: null}, +{kind: 1, offset: "borderImageOutset", len: 0, typ: NTI33554440, name: "borderImageOutset", sons: null}, +{kind: 1, offset: "borderImageRepeat", len: 0, typ: NTI33554440, name: "borderImageRepeat", sons: null}, +{kind: 1, offset: "borderImageSlice", len: 0, typ: NTI33554440, name: "borderImageSlice", sons: null}, +{kind: 1, offset: "borderImageSource", len: 0, typ: NTI33554440, name: "borderImageSource", sons: null}, +{kind: 1, offset: "borderImageWidth", len: 0, typ: NTI33554440, name: "borderImageWidth", sons: null}, +{kind: 1, offset: "borderInline", len: 0, typ: NTI33554440, name: "borderInline", sons: null}, +{kind: 1, offset: "borderInlineColor", len: 0, typ: NTI33554440, name: "borderInlineColor", sons: null}, +{kind: 1, offset: "borderInlineEnd", len: 0, typ: NTI33554440, name: "borderInlineEnd", sons: null}, +{kind: 1, offset: "borderInlineEndColor", len: 0, typ: NTI33554440, name: "borderInlineEndColor", sons: null}, +{kind: 1, offset: "borderInlineEndStyle", len: 0, typ: NTI33554440, name: "borderInlineEndStyle", sons: null}, +{kind: 1, offset: "borderInlineEndWidth", len: 0, typ: NTI33554440, name: "borderInlineEndWidth", sons: null}, +{kind: 1, offset: "borderInlineStart", len: 0, typ: NTI33554440, name: "borderInlineStart", sons: null}, +{kind: 1, offset: "borderInlineStartColor", len: 0, typ: NTI33554440, name: "borderInlineStartColor", sons: null}, +{kind: 1, offset: "borderInlineStartStyle", len: 0, typ: NTI33554440, name: "borderInlineStartStyle", sons: null}, +{kind: 1, offset: "borderInlineStartWidth", len: 0, typ: NTI33554440, name: "borderInlineStartWidth", sons: null}, +{kind: 1, offset: "borderInlineStyle", len: 0, typ: NTI33554440, name: "borderInlineStyle", sons: null}, +{kind: 1, offset: "borderInlineWidth", len: 0, typ: NTI33554440, name: "borderInlineWidth", sons: null}, +{kind: 1, offset: "borderLeft", len: 0, typ: NTI33554440, name: "borderLeft", sons: null}, +{kind: 1, offset: "borderLeftColor", len: 0, typ: NTI33554440, name: "borderLeftColor", sons: null}, +{kind: 1, offset: "borderLeftStyle", len: 0, typ: NTI33554440, name: "borderLeftStyle", sons: null}, +{kind: 1, offset: "borderLeftWidth", len: 0, typ: NTI33554440, name: "borderLeftWidth", sons: null}, +{kind: 1, offset: "borderRadius", len: 0, typ: NTI33554440, name: "borderRadius", sons: null}, +{kind: 1, offset: "borderRight", len: 0, typ: NTI33554440, name: "borderRight", sons: null}, +{kind: 1, offset: "borderRightColor", len: 0, typ: NTI33554440, name: "borderRightColor", sons: null}, +{kind: 1, offset: "borderRightStyle", len: 0, typ: NTI33554440, name: "borderRightStyle", sons: null}, +{kind: 1, offset: "borderRightWidth", len: 0, typ: NTI33554440, name: "borderRightWidth", sons: null}, +{kind: 1, offset: "borderSpacing", len: 0, typ: NTI33554440, name: "borderSpacing", sons: null}, +{kind: 1, offset: "borderStartEndRadius", len: 0, typ: NTI33554440, name: "borderStartEndRadius", sons: null}, +{kind: 1, offset: "borderStartStartRadius", len: 0, typ: NTI33554440, name: "borderStartStartRadius", sons: null}, +{kind: 1, offset: "borderStyle", len: 0, typ: NTI33554440, name: "borderStyle", sons: null}, +{kind: 1, offset: "borderTop", len: 0, typ: NTI33554440, name: "borderTop", sons: null}, +{kind: 1, offset: "borderTopColor", len: 0, typ: NTI33554440, name: "borderTopColor", sons: null}, +{kind: 1, offset: "borderTopLeftRadius", len: 0, typ: NTI33554440, name: "borderTopLeftRadius", sons: null}, +{kind: 1, offset: "borderTopRightRadius", len: 0, typ: NTI33554440, name: "borderTopRightRadius", sons: null}, +{kind: 1, offset: "borderTopStyle", len: 0, typ: NTI33554440, name: "borderTopStyle", sons: null}, +{kind: 1, offset: "borderTopWidth", len: 0, typ: NTI33554440, name: "borderTopWidth", sons: null}, +{kind: 1, offset: "borderWidth", len: 0, typ: NTI33554440, name: "borderWidth", sons: null}, +{kind: 1, offset: "bottom", len: 0, typ: NTI33554440, name: "bottom", sons: null}, +{kind: 1, offset: "boxDecorationBreak", len: 0, typ: NTI33554440, name: "boxDecorationBreak", sons: null}, +{kind: 1, offset: "boxShadow", len: 0, typ: NTI33554440, name: "boxShadow", sons: null}, +{kind: 1, offset: "boxSizing", len: 0, typ: NTI33554440, name: "boxSizing", sons: null}, +{kind: 1, offset: "breakAfter", len: 0, typ: NTI33554440, name: "breakAfter", sons: null}, +{kind: 1, offset: "breakBefore", len: 0, typ: NTI33554440, name: "breakBefore", sons: null}, +{kind: 1, offset: "breakInside", len: 0, typ: NTI33554440, name: "breakInside", sons: null}, +{kind: 1, offset: "captionSide", len: 0, typ: NTI33554440, name: "captionSide", sons: null}, +{kind: 1, offset: "caretColor", len: 0, typ: NTI33554440, name: "caretColor", sons: null}, +{kind: 1, offset: "clear", len: 0, typ: NTI33554440, name: "clear", sons: null}, +{kind: 1, offset: "clip", len: 0, typ: NTI33554440, name: "clip", sons: null}, +{kind: 1, offset: "clipPath", len: 0, typ: NTI33554440, name: "clipPath", sons: null}, +{kind: 1, offset: "color", len: 0, typ: NTI33554440, name: "color", sons: null}, +{kind: 1, offset: "colorAdjust", len: 0, typ: NTI33554440, name: "colorAdjust", sons: null}, +{kind: 1, offset: "columnCount", len: 0, typ: NTI33554440, name: "columnCount", sons: null}, +{kind: 1, offset: "columnFill", len: 0, typ: NTI33554440, name: "columnFill", sons: null}, +{kind: 1, offset: "columnGap", len: 0, typ: NTI33554440, name: "columnGap", sons: null}, +{kind: 1, offset: "columnRule", len: 0, typ: NTI33554440, name: "columnRule", sons: null}, +{kind: 1, offset: "columnRuleColor", len: 0, typ: NTI33554440, name: "columnRuleColor", sons: null}, +{kind: 1, offset: "columnRuleStyle", len: 0, typ: NTI33554440, name: "columnRuleStyle", sons: null}, +{kind: 1, offset: "columnRuleWidth", len: 0, typ: NTI33554440, name: "columnRuleWidth", sons: null}, +{kind: 1, offset: "columnSpan", len: 0, typ: NTI33554440, name: "columnSpan", sons: null}, +{kind: 1, offset: "columnWidth", len: 0, typ: NTI33554440, name: "columnWidth", sons: null}, +{kind: 1, offset: "columns", len: 0, typ: NTI33554440, name: "columns", sons: null}, +{kind: 1, offset: "contain", len: 0, typ: NTI33554440, name: "contain", sons: null}, +{kind: 1, offset: "content", len: 0, typ: NTI33554440, name: "content", sons: null}, +{kind: 1, offset: "counterIncrement", len: 0, typ: NTI33554440, name: "counterIncrement", sons: null}, +{kind: 1, offset: "counterReset", len: 0, typ: NTI33554440, name: "counterReset", sons: null}, +{kind: 1, offset: "counterSet", len: 0, typ: NTI33554440, name: "counterSet", sons: null}, +{kind: 1, offset: "cursor", len: 0, typ: NTI33554440, name: "cursor", sons: null}, +{kind: 1, offset: "direction", len: 0, typ: NTI33554440, name: "direction", sons: null}, +{kind: 1, offset: "display", len: 0, typ: NTI33554440, name: "display", sons: null}, +{kind: 1, offset: "emptyCells", len: 0, typ: NTI33554440, name: "emptyCells", sons: null}, +{kind: 1, offset: "filter", len: 0, typ: NTI33554440, name: "filter", sons: null}, +{kind: 1, offset: "flex", len: 0, typ: NTI33554440, name: "flex", sons: null}, +{kind: 1, offset: "flexBasis", len: 0, typ: NTI33554440, name: "flexBasis", sons: null}, +{kind: 1, offset: "flexDirection", len: 0, typ: NTI33554440, name: "flexDirection", sons: null}, +{kind: 1, offset: "flexFlow", len: 0, typ: NTI33554440, name: "flexFlow", sons: null}, +{kind: 1, offset: "flexGrow", len: 0, typ: NTI33554440, name: "flexGrow", sons: null}, +{kind: 1, offset: "flexShrink", len: 0, typ: NTI33554440, name: "flexShrink", sons: null}, +{kind: 1, offset: "flexWrap", len: 0, typ: NTI33554440, name: "flexWrap", sons: null}, +{kind: 1, offset: "cssFloat", len: 0, typ: NTI33554440, name: "cssFloat", sons: null}, +{kind: 1, offset: "font", len: 0, typ: NTI33554440, name: "font", sons: null}, +{kind: 1, offset: "fontFamily", len: 0, typ: NTI33554440, name: "fontFamily", sons: null}, +{kind: 1, offset: "fontFeatureSettings", len: 0, typ: NTI33554440, name: "fontFeatureSettings", sons: null}, +{kind: 1, offset: "fontKerning", len: 0, typ: NTI33554440, name: "fontKerning", sons: null}, +{kind: 1, offset: "fontLanguageOverride", len: 0, typ: NTI33554440, name: "fontLanguageOverride", sons: null}, +{kind: 1, offset: "fontOpticalSizing", len: 0, typ: NTI33554440, name: "fontOpticalSizing", sons: null}, +{kind: 1, offset: "fontSize", len: 0, typ: NTI33554440, name: "fontSize", sons: null}, +{kind: 1, offset: "fontSizeAdjust", len: 0, typ: NTI33554440, name: "fontSizeAdjust", sons: null}, +{kind: 1, offset: "fontStretch", len: 0, typ: NTI33554440, name: "fontStretch", sons: null}, +{kind: 1, offset: "fontStyle", len: 0, typ: NTI33554440, name: "fontStyle", sons: null}, +{kind: 1, offset: "fontSynthesis", len: 0, typ: NTI33554440, name: "fontSynthesis", sons: null}, +{kind: 1, offset: "fontVariant", len: 0, typ: NTI33554440, name: "fontVariant", sons: null}, +{kind: 1, offset: "fontVariantAlternates", len: 0, typ: NTI33554440, name: "fontVariantAlternates", sons: null}, +{kind: 1, offset: "fontVariantCaps", len: 0, typ: NTI33554440, name: "fontVariantCaps", sons: null}, +{kind: 1, offset: "fontVariantEastAsian", len: 0, typ: NTI33554440, name: "fontVariantEastAsian", sons: null}, +{kind: 1, offset: "fontVariantLigatures", len: 0, typ: NTI33554440, name: "fontVariantLigatures", sons: null}, +{kind: 1, offset: "fontVariantNumeric", len: 0, typ: NTI33554440, name: "fontVariantNumeric", sons: null}, +{kind: 1, offset: "fontVariantPosition", len: 0, typ: NTI33554440, name: "fontVariantPosition", sons: null}, +{kind: 1, offset: "fontVariationSettings", len: 0, typ: NTI33554440, name: "fontVariationSettings", sons: null}, +{kind: 1, offset: "fontWeight", len: 0, typ: NTI33554440, name: "fontWeight", sons: null}, +{kind: 1, offset: "gap", len: 0, typ: NTI33554440, name: "gap", sons: null}, +{kind: 1, offset: "grid", len: 0, typ: NTI33554440, name: "grid", sons: null}, +{kind: 1, offset: "gridArea", len: 0, typ: NTI33554440, name: "gridArea", sons: null}, +{kind: 1, offset: "gridAutoColumns", len: 0, typ: NTI33554440, name: "gridAutoColumns", sons: null}, +{kind: 1, offset: "gridAutoFlow", len: 0, typ: NTI33554440, name: "gridAutoFlow", sons: null}, +{kind: 1, offset: "gridAutoRows", len: 0, typ: NTI33554440, name: "gridAutoRows", sons: null}, +{kind: 1, offset: "gridColumn", len: 0, typ: NTI33554440, name: "gridColumn", sons: null}, +{kind: 1, offset: "gridColumnEnd", len: 0, typ: NTI33554440, name: "gridColumnEnd", sons: null}, +{kind: 1, offset: "gridColumnStart", len: 0, typ: NTI33554440, name: "gridColumnStart", sons: null}, +{kind: 1, offset: "gridRow", len: 0, typ: NTI33554440, name: "gridRow", sons: null}, +{kind: 1, offset: "gridRowEnd", len: 0, typ: NTI33554440, name: "gridRowEnd", sons: null}, +{kind: 1, offset: "gridRowStart", len: 0, typ: NTI33554440, name: "gridRowStart", sons: null}, +{kind: 1, offset: "gridTemplate", len: 0, typ: NTI33554440, name: "gridTemplate", sons: null}, +{kind: 1, offset: "gridTemplateAreas", len: 0, typ: NTI33554440, name: "gridTemplateAreas", sons: null}, +{kind: 1, offset: "gridTemplateColumns", len: 0, typ: NTI33554440, name: "gridTemplateColumns", sons: null}, +{kind: 1, offset: "gridTemplateRows", len: 0, typ: NTI33554440, name: "gridTemplateRows", sons: null}, +{kind: 1, offset: "hangingPunctuation", len: 0, typ: NTI33554440, name: "hangingPunctuation", sons: null}, +{kind: 1, offset: "height", len: 0, typ: NTI33554440, name: "height", sons: null}, +{kind: 1, offset: "hyphens", len: 0, typ: NTI33554440, name: "hyphens", sons: null}, +{kind: 1, offset: "imageOrientation", len: 0, typ: NTI33554440, name: "imageOrientation", sons: null}, +{kind: 1, offset: "imageRendering", len: 0, typ: NTI33554440, name: "imageRendering", sons: null}, +{kind: 1, offset: "inlineSize", len: 0, typ: NTI33554440, name: "inlineSize", sons: null}, +{kind: 1, offset: "inset", len: 0, typ: NTI33554440, name: "inset", sons: null}, +{kind: 1, offset: "insetBlock", len: 0, typ: NTI33554440, name: "insetBlock", sons: null}, +{kind: 1, offset: "insetBlockEnd", len: 0, typ: NTI33554440, name: "insetBlockEnd", sons: null}, +{kind: 1, offset: "insetBlockStart", len: 0, typ: NTI33554440, name: "insetBlockStart", sons: null}, +{kind: 1, offset: "insetInline", len: 0, typ: NTI33554440, name: "insetInline", sons: null}, +{kind: 1, offset: "insetInlineEnd", len: 0, typ: NTI33554440, name: "insetInlineEnd", sons: null}, +{kind: 1, offset: "insetInlineStart", len: 0, typ: NTI33554440, name: "insetInlineStart", sons: null}, +{kind: 1, offset: "isolation", len: 0, typ: NTI33554440, name: "isolation", sons: null}, +{kind: 1, offset: "justifyContent", len: 0, typ: NTI33554440, name: "justifyContent", sons: null}, +{kind: 1, offset: "justifyItems", len: 0, typ: NTI33554440, name: "justifyItems", sons: null}, +{kind: 1, offset: "justifySelf", len: 0, typ: NTI33554440, name: "justifySelf", sons: null}, +{kind: 1, offset: "left", len: 0, typ: NTI33554440, name: "left", sons: null}, +{kind: 1, offset: "letterSpacing", len: 0, typ: NTI33554440, name: "letterSpacing", sons: null}, +{kind: 1, offset: "lineBreak", len: 0, typ: NTI33554440, name: "lineBreak", sons: null}, +{kind: 1, offset: "lineHeight", len: 0, typ: NTI33554440, name: "lineHeight", sons: null}, +{kind: 1, offset: "listStyle", len: 0, typ: NTI33554440, name: "listStyle", sons: null}, +{kind: 1, offset: "listStyleImage", len: 0, typ: NTI33554440, name: "listStyleImage", sons: null}, +{kind: 1, offset: "listStylePosition", len: 0, typ: NTI33554440, name: "listStylePosition", sons: null}, +{kind: 1, offset: "listStyleType", len: 0, typ: NTI33554440, name: "listStyleType", sons: null}, +{kind: 1, offset: "margin", len: 0, typ: NTI33554440, name: "margin", sons: null}, +{kind: 1, offset: "marginBlock", len: 0, typ: NTI33554440, name: "marginBlock", sons: null}, +{kind: 1, offset: "marginBlockEnd", len: 0, typ: NTI33554440, name: "marginBlockEnd", sons: null}, +{kind: 1, offset: "marginBlockStart", len: 0, typ: NTI33554440, name: "marginBlockStart", sons: null}, +{kind: 1, offset: "marginBottom", len: 0, typ: NTI33554440, name: "marginBottom", sons: null}, +{kind: 1, offset: "marginInline", len: 0, typ: NTI33554440, name: "marginInline", sons: null}, +{kind: 1, offset: "marginInlineEnd", len: 0, typ: NTI33554440, name: "marginInlineEnd", sons: null}, +{kind: 1, offset: "marginInlineStart", len: 0, typ: NTI33554440, name: "marginInlineStart", sons: null}, +{kind: 1, offset: "marginLeft", len: 0, typ: NTI33554440, name: "marginLeft", sons: null}, +{kind: 1, offset: "marginRight", len: 0, typ: NTI33554440, name: "marginRight", sons: null}, +{kind: 1, offset: "marginTop", len: 0, typ: NTI33554440, name: "marginTop", sons: null}, +{kind: 1, offset: "mask", len: 0, typ: NTI33554440, name: "mask", sons: null}, +{kind: 1, offset: "maskBorder", len: 0, typ: NTI33554440, name: "maskBorder", sons: null}, +{kind: 1, offset: "maskBorderMode", len: 0, typ: NTI33554440, name: "maskBorderMode", sons: null}, +{kind: 1, offset: "maskBorderOutset", len: 0, typ: NTI33554440, name: "maskBorderOutset", sons: null}, +{kind: 1, offset: "maskBorderRepeat", len: 0, typ: NTI33554440, name: "maskBorderRepeat", sons: null}, +{kind: 1, offset: "maskBorderSlice", len: 0, typ: NTI33554440, name: "maskBorderSlice", sons: null}, +{kind: 1, offset: "maskBorderSource", len: 0, typ: NTI33554440, name: "maskBorderSource", sons: null}, +{kind: 1, offset: "maskBorderWidth", len: 0, typ: NTI33554440, name: "maskBorderWidth", sons: null}, +{kind: 1, offset: "maskClip", len: 0, typ: NTI33554440, name: "maskClip", sons: null}, +{kind: 1, offset: "maskComposite", len: 0, typ: NTI33554440, name: "maskComposite", sons: null}, +{kind: 1, offset: "maskImage", len: 0, typ: NTI33554440, name: "maskImage", sons: null}, +{kind: 1, offset: "maskMode", len: 0, typ: NTI33554440, name: "maskMode", sons: null}, +{kind: 1, offset: "maskOrigin", len: 0, typ: NTI33554440, name: "maskOrigin", sons: null}, +{kind: 1, offset: "maskPosition", len: 0, typ: NTI33554440, name: "maskPosition", sons: null}, +{kind: 1, offset: "maskRepeat", len: 0, typ: NTI33554440, name: "maskRepeat", sons: null}, +{kind: 1, offset: "maskSize", len: 0, typ: NTI33554440, name: "maskSize", sons: null}, +{kind: 1, offset: "maskType", len: 0, typ: NTI33554440, name: "maskType", sons: null}, +{kind: 1, offset: "maxBlockSize", len: 0, typ: NTI33554440, name: "maxBlockSize", sons: null}, +{kind: 1, offset: "maxHeight", len: 0, typ: NTI33554440, name: "maxHeight", sons: null}, +{kind: 1, offset: "maxInlineSize", len: 0, typ: NTI33554440, name: "maxInlineSize", sons: null}, +{kind: 1, offset: "maxWidth", len: 0, typ: NTI33554440, name: "maxWidth", sons: null}, +{kind: 1, offset: "minBlockSize", len: 0, typ: NTI33554440, name: "minBlockSize", sons: null}, +{kind: 1, offset: "minHeight", len: 0, typ: NTI33554440, name: "minHeight", sons: null}, +{kind: 1, offset: "minInlineSize", len: 0, typ: NTI33554440, name: "minInlineSize", sons: null}, +{kind: 1, offset: "minWidth", len: 0, typ: NTI33554440, name: "minWidth", sons: null}, +{kind: 1, offset: "mixBlendMode", len: 0, typ: NTI33554440, name: "mixBlendMode", sons: null}, +{kind: 1, offset: "objectFit", len: 0, typ: NTI33554440, name: "objectFit", sons: null}, +{kind: 1, offset: "objectPosition", len: 0, typ: NTI33554440, name: "objectPosition", sons: null}, +{kind: 1, offset: "offset", len: 0, typ: NTI33554440, name: "offset", sons: null}, +{kind: 1, offset: "offsetAnchor", len: 0, typ: NTI33554440, name: "offsetAnchor", sons: null}, +{kind: 1, offset: "offsetDistance", len: 0, typ: NTI33554440, name: "offsetDistance", sons: null}, +{kind: 1, offset: "offsetPath", len: 0, typ: NTI33554440, name: "offsetPath", sons: null}, +{kind: 1, offset: "offsetRotate", len: 0, typ: NTI33554440, name: "offsetRotate", sons: null}, +{kind: 1, offset: "opacity", len: 0, typ: NTI33554440, name: "opacity", sons: null}, +{kind: 1, offset: "order", len: 0, typ: NTI33554440, name: "order", sons: null}, +{kind: 1, offset: "orphans", len: 0, typ: NTI33554440, name: "orphans", sons: null}, +{kind: 1, offset: "outline", len: 0, typ: NTI33554440, name: "outline", sons: null}, +{kind: 1, offset: "outlineColor", len: 0, typ: NTI33554440, name: "outlineColor", sons: null}, +{kind: 1, offset: "outlineOffset", len: 0, typ: NTI33554440, name: "outlineOffset", sons: null}, +{kind: 1, offset: "outlineStyle", len: 0, typ: NTI33554440, name: "outlineStyle", sons: null}, +{kind: 1, offset: "outlineWidth", len: 0, typ: NTI33554440, name: "outlineWidth", sons: null}, +{kind: 1, offset: "overflow", len: 0, typ: NTI33554440, name: "overflow", sons: null}, +{kind: 1, offset: "overflowAnchor", len: 0, typ: NTI33554440, name: "overflowAnchor", sons: null}, +{kind: 1, offset: "overflowBlock", len: 0, typ: NTI33554440, name: "overflowBlock", sons: null}, +{kind: 1, offset: "overflowInline", len: 0, typ: NTI33554440, name: "overflowInline", sons: null}, +{kind: 1, offset: "overflowWrap", len: 0, typ: NTI33554440, name: "overflowWrap", sons: null}, +{kind: 1, offset: "overflowX", len: 0, typ: NTI33554440, name: "overflowX", sons: null}, +{kind: 1, offset: "overflowY", len: 0, typ: NTI33554440, name: "overflowY", sons: null}, +{kind: 1, offset: "overscrollBehavior", len: 0, typ: NTI33554440, name: "overscrollBehavior", sons: null}, +{kind: 1, offset: "overscrollBehaviorBlock", len: 0, typ: NTI33554440, name: "overscrollBehaviorBlock", sons: null}, +{kind: 1, offset: "overscrollBehaviorInline", len: 0, typ: NTI33554440, name: "overscrollBehaviorInline", sons: null}, +{kind: 1, offset: "overscrollBehaviorX", len: 0, typ: NTI33554440, name: "overscrollBehaviorX", sons: null}, +{kind: 1, offset: "overscrollBehaviorY", len: 0, typ: NTI33554440, name: "overscrollBehaviorY", sons: null}, +{kind: 1, offset: "padding", len: 0, typ: NTI33554440, name: "padding", sons: null}, +{kind: 1, offset: "paddingBlock", len: 0, typ: NTI33554440, name: "paddingBlock", sons: null}, +{kind: 1, offset: "paddingBlockEnd", len: 0, typ: NTI33554440, name: "paddingBlockEnd", sons: null}, +{kind: 1, offset: "paddingBlockStart", len: 0, typ: NTI33554440, name: "paddingBlockStart", sons: null}, +{kind: 1, offset: "paddingBottom", len: 0, typ: NTI33554440, name: "paddingBottom", sons: null}, +{kind: 1, offset: "paddingInline", len: 0, typ: NTI33554440, name: "paddingInline", sons: null}, +{kind: 1, offset: "paddingInlineEnd", len: 0, typ: NTI33554440, name: "paddingInlineEnd", sons: null}, +{kind: 1, offset: "paddingInlineStart", len: 0, typ: NTI33554440, name: "paddingInlineStart", sons: null}, +{kind: 1, offset: "paddingLeft", len: 0, typ: NTI33554440, name: "paddingLeft", sons: null}, +{kind: 1, offset: "paddingRight", len: 0, typ: NTI33554440, name: "paddingRight", sons: null}, +{kind: 1, offset: "paddingTop", len: 0, typ: NTI33554440, name: "paddingTop", sons: null}, +{kind: 1, offset: "pageBreakAfter", len: 0, typ: NTI33554440, name: "pageBreakAfter", sons: null}, +{kind: 1, offset: "pageBreakBefore", len: 0, typ: NTI33554440, name: "pageBreakBefore", sons: null}, +{kind: 1, offset: "pageBreakInside", len: 0, typ: NTI33554440, name: "pageBreakInside", sons: null}, +{kind: 1, offset: "paintOrder", len: 0, typ: NTI33554440, name: "paintOrder", sons: null}, +{kind: 1, offset: "perspective", len: 0, typ: NTI33554440, name: "perspective", sons: null}, +{kind: 1, offset: "perspectiveOrigin", len: 0, typ: NTI33554440, name: "perspectiveOrigin", sons: null}, +{kind: 1, offset: "placeContent", len: 0, typ: NTI33554440, name: "placeContent", sons: null}, +{kind: 1, offset: "placeItems", len: 0, typ: NTI33554440, name: "placeItems", sons: null}, +{kind: 1, offset: "placeSelf", len: 0, typ: NTI33554440, name: "placeSelf", sons: null}, +{kind: 1, offset: "pointerEvents", len: 0, typ: NTI33554440, name: "pointerEvents", sons: null}, +{kind: 1, offset: "position", len: 0, typ: NTI33554440, name: "position", sons: null}, +{kind: 1, offset: "quotes", len: 0, typ: NTI33554440, name: "quotes", sons: null}, +{kind: 1, offset: "resize", len: 0, typ: NTI33554440, name: "resize", sons: null}, +{kind: 1, offset: "right", len: 0, typ: NTI33554440, name: "right", sons: null}, +{kind: 1, offset: "rotate", len: 0, typ: NTI33554440, name: "rotate", sons: null}, +{kind: 1, offset: "rowGap", len: 0, typ: NTI33554440, name: "rowGap", sons: null}, +{kind: 1, offset: "scale", len: 0, typ: NTI33554440, name: "scale", sons: null}, +{kind: 1, offset: "scrollBehavior", len: 0, typ: NTI33554440, name: "scrollBehavior", sons: null}, +{kind: 1, offset: "scrollMargin", len: 0, typ: NTI33554440, name: "scrollMargin", sons: null}, +{kind: 1, offset: "scrollMarginBlock", len: 0, typ: NTI33554440, name: "scrollMarginBlock", sons: null}, +{kind: 1, offset: "scrollMarginBlockEnd", len: 0, typ: NTI33554440, name: "scrollMarginBlockEnd", sons: null}, +{kind: 1, offset: "scrollMarginBlockStart", len: 0, typ: NTI33554440, name: "scrollMarginBlockStart", sons: null}, +{kind: 1, offset: "scrollMarginBottom", len: 0, typ: NTI33554440, name: "scrollMarginBottom", sons: null}, +{kind: 1, offset: "scrollMarginInline", len: 0, typ: NTI33554440, name: "scrollMarginInline", sons: null}, +{kind: 1, offset: "scrollMarginInlineEnd", len: 0, typ: NTI33554440, name: "scrollMarginInlineEnd", sons: null}, +{kind: 1, offset: "scrollMarginInlineStart", len: 0, typ: NTI33554440, name: "scrollMarginInlineStart", sons: null}, +{kind: 1, offset: "scrollMarginLeft", len: 0, typ: NTI33554440, name: "scrollMarginLeft", sons: null}, +{kind: 1, offset: "scrollMarginRight", len: 0, typ: NTI33554440, name: "scrollMarginRight", sons: null}, +{kind: 1, offset: "scrollMarginTop", len: 0, typ: NTI33554440, name: "scrollMarginTop", sons: null}, +{kind: 1, offset: "scrollPadding", len: 0, typ: NTI33554440, name: "scrollPadding", sons: null}, +{kind: 1, offset: "scrollPaddingBlock", len: 0, typ: NTI33554440, name: "scrollPaddingBlock", sons: null}, +{kind: 1, offset: "scrollPaddingBlockEnd", len: 0, typ: NTI33554440, name: "scrollPaddingBlockEnd", sons: null}, +{kind: 1, offset: "scrollPaddingBlockStart", len: 0, typ: NTI33554440, name: "scrollPaddingBlockStart", sons: null}, +{kind: 1, offset: "scrollPaddingBottom", len: 0, typ: NTI33554440, name: "scrollPaddingBottom", sons: null}, +{kind: 1, offset: "scrollPaddingInline", len: 0, typ: NTI33554440, name: "scrollPaddingInline", sons: null}, +{kind: 1, offset: "scrollPaddingInlineEnd", len: 0, typ: NTI33554440, name: "scrollPaddingInlineEnd", sons: null}, +{kind: 1, offset: "scrollPaddingInlineStart", len: 0, typ: NTI33554440, name: "scrollPaddingInlineStart", sons: null}, +{kind: 1, offset: "scrollPaddingLeft", len: 0, typ: NTI33554440, name: "scrollPaddingLeft", sons: null}, +{kind: 1, offset: "scrollPaddingRight", len: 0, typ: NTI33554440, name: "scrollPaddingRight", sons: null}, +{kind: 1, offset: "scrollPaddingTop", len: 0, typ: NTI33554440, name: "scrollPaddingTop", sons: null}, +{kind: 1, offset: "scrollSnapAlign", len: 0, typ: NTI33554440, name: "scrollSnapAlign", sons: null}, +{kind: 1, offset: "scrollSnapStop", len: 0, typ: NTI33554440, name: "scrollSnapStop", sons: null}, +{kind: 1, offset: "scrollSnapType", len: 0, typ: NTI33554440, name: "scrollSnapType", sons: null}, +{kind: 1, offset: "scrollbar3dLightColor", len: 0, typ: NTI33554440, name: "scrollbar3dLightColor", sons: null}, +{kind: 1, offset: "scrollbarArrowColor", len: 0, typ: NTI33554440, name: "scrollbarArrowColor", sons: null}, +{kind: 1, offset: "scrollbarBaseColor", len: 0, typ: NTI33554440, name: "scrollbarBaseColor", sons: null}, +{kind: 1, offset: "scrollbarColor", len: 0, typ: NTI33554440, name: "scrollbarColor", sons: null}, +{kind: 1, offset: "scrollbarDarkshadowColor", len: 0, typ: NTI33554440, name: "scrollbarDarkshadowColor", sons: null}, +{kind: 1, offset: "scrollbarFaceColor", len: 0, typ: NTI33554440, name: "scrollbarFaceColor", sons: null}, +{kind: 1, offset: "scrollbarHighlightColor", len: 0, typ: NTI33554440, name: "scrollbarHighlightColor", sons: null}, +{kind: 1, offset: "scrollbarShadowColor", len: 0, typ: NTI33554440, name: "scrollbarShadowColor", sons: null}, +{kind: 1, offset: "scrollbarTrackColor", len: 0, typ: NTI33554440, name: "scrollbarTrackColor", sons: null}, +{kind: 1, offset: "scrollbarWidth", len: 0, typ: NTI33554440, name: "scrollbarWidth", sons: null}, +{kind: 1, offset: "shapeImageThreshold", len: 0, typ: NTI33554440, name: "shapeImageThreshold", sons: null}, +{kind: 1, offset: "shapeMargin", len: 0, typ: NTI33554440, name: "shapeMargin", sons: null}, +{kind: 1, offset: "shapeOutside", len: 0, typ: NTI33554440, name: "shapeOutside", sons: null}, +{kind: 1, offset: "tabSize", len: 0, typ: NTI33554440, name: "tabSize", sons: null}, +{kind: 1, offset: "tableLayout", len: 0, typ: NTI33554440, name: "tableLayout", sons: null}, +{kind: 1, offset: "textAlign", len: 0, typ: NTI33554440, name: "textAlign", sons: null}, +{kind: 1, offset: "textAlignLast", len: 0, typ: NTI33554440, name: "textAlignLast", sons: null}, +{kind: 1, offset: "textCombineUpright", len: 0, typ: NTI33554440, name: "textCombineUpright", sons: null}, +{kind: 1, offset: "textDecoration", len: 0, typ: NTI33554440, name: "textDecoration", sons: null}, +{kind: 1, offset: "textDecorationColor", len: 0, typ: NTI33554440, name: "textDecorationColor", sons: null}, +{kind: 1, offset: "textDecorationLine", len: 0, typ: NTI33554440, name: "textDecorationLine", sons: null}, +{kind: 1, offset: "textDecorationSkipInk", len: 0, typ: NTI33554440, name: "textDecorationSkipInk", sons: null}, +{kind: 1, offset: "textDecorationStyle", len: 0, typ: NTI33554440, name: "textDecorationStyle", sons: null}, +{kind: 1, offset: "textDecorationThickness", len: 0, typ: NTI33554440, name: "textDecorationThickness", sons: null}, +{kind: 1, offset: "textEmphasis", len: 0, typ: NTI33554440, name: "textEmphasis", sons: null}, +{kind: 1, offset: "textEmphasisColor", len: 0, typ: NTI33554440, name: "textEmphasisColor", sons: null}, +{kind: 1, offset: "textEmphasisPosition", len: 0, typ: NTI33554440, name: "textEmphasisPosition", sons: null}, +{kind: 1, offset: "textEmphasisStyle", len: 0, typ: NTI33554440, name: "textEmphasisStyle", sons: null}, +{kind: 1, offset: "textIndent", len: 0, typ: NTI33554440, name: "textIndent", sons: null}, +{kind: 1, offset: "textJustify", len: 0, typ: NTI33554440, name: "textJustify", sons: null}, +{kind: 1, offset: "textOrientation", len: 0, typ: NTI33554440, name: "textOrientation", sons: null}, +{kind: 1, offset: "textOverflow", len: 0, typ: NTI33554440, name: "textOverflow", sons: null}, +{kind: 1, offset: "textRendering", len: 0, typ: NTI33554440, name: "textRendering", sons: null}, +{kind: 1, offset: "textShadow", len: 0, typ: NTI33554440, name: "textShadow", sons: null}, +{kind: 1, offset: "textTransform", len: 0, typ: NTI33554440, name: "textTransform", sons: null}, +{kind: 1, offset: "textUnderlineOffset", len: 0, typ: NTI33554440, name: "textUnderlineOffset", sons: null}, +{kind: 1, offset: "textUnderlinePosition", len: 0, typ: NTI33554440, name: "textUnderlinePosition", sons: null}, +{kind: 1, offset: "top", len: 0, typ: NTI33554440, name: "top", sons: null}, +{kind: 1, offset: "touchAction", len: 0, typ: NTI33554440, name: "touchAction", sons: null}, +{kind: 1, offset: "transform", len: 0, typ: NTI33554440, name: "transform", sons: null}, +{kind: 1, offset: "transformBox", len: 0, typ: NTI33554440, name: "transformBox", sons: null}, +{kind: 1, offset: "transformOrigin", len: 0, typ: NTI33554440, name: "transformOrigin", sons: null}, +{kind: 1, offset: "transformStyle", len: 0, typ: NTI33554440, name: "transformStyle", sons: null}, +{kind: 1, offset: "transition", len: 0, typ: NTI33554440, name: "transition", sons: null}, +{kind: 1, offset: "transitionDelay", len: 0, typ: NTI33554440, name: "transitionDelay", sons: null}, +{kind: 1, offset: "transitionDuration", len: 0, typ: NTI33554440, name: "transitionDuration", sons: null}, +{kind: 1, offset: "transitionProperty", len: 0, typ: NTI33554440, name: "transitionProperty", sons: null}, +{kind: 1, offset: "transitionTimingFunction", len: 0, typ: NTI33554440, name: "transitionTimingFunction", sons: null}, +{kind: 1, offset: "translate", len: 0, typ: NTI33554440, name: "translate", sons: null}, +{kind: 1, offset: "unicodeBidi", len: 0, typ: NTI33554440, name: "unicodeBidi", sons: null}, +{kind: 1, offset: "verticalAlign", len: 0, typ: NTI33554440, name: "verticalAlign", sons: null}, +{kind: 1, offset: "visibility", len: 0, typ: NTI33554440, name: "visibility", sons: null}, +{kind: 1, offset: "whiteSpace", len: 0, typ: NTI33554440, name: "whiteSpace", sons: null}, +{kind: 1, offset: "widows", len: 0, typ: NTI33554440, name: "widows", sons: null}, +{kind: 1, offset: "width", len: 0, typ: NTI33554440, name: "width", sons: null}, +{kind: 1, offset: "willChange", len: 0, typ: NTI33554440, name: "willChange", sons: null}, +{kind: 1, offset: "wordBreak", len: 0, typ: NTI33554440, name: "wordBreak", sons: null}, +{kind: 1, offset: "wordSpacing", len: 0, typ: NTI33554440, name: "wordSpacing", sons: null}, +{kind: 1, offset: "writingMode", len: 0, typ: NTI33554440, name: "writingMode", sons: null}, +{kind: 1, offset: "zIndex", len: 0, typ: NTI33554440, name: "zIndex", sons: null}]}; +NTI637534349.node = NNI637534349; +NTI637534349.base = NTI33555086; +NTI637534238.base = NTI637534349; +var NNI637534321 = {kind: 2, len: 22, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "attributes", len: 0, typ: NTI637534322, name: "attributes", sons: null}, +{kind: 1, offset: "childNodes", len: 0, typ: NTI637534323, name: "childNodes", sons: null}, +{kind: 1, offset: "children", len: 0, typ: NTI637534324, name: "children", sons: null}, +{kind: 1, offset: "data", len: 0, typ: NTI33554440, name: "data", sons: null}, +{kind: 1, offset: "firstChild", len: 0, typ: NTI637534224, name: "firstChild", sons: null}, +{kind: 1, offset: "lastChild", len: 0, typ: NTI637534224, name: "lastChild", sons: null}, +{kind: 1, offset: "nextSibling", len: 0, typ: NTI637534224, name: "nextSibling", sons: null}, +{kind: 1, offset: "nodeName", len: 0, typ: NTI33554440, name: "nodeName", sons: null}, +{kind: 1, offset: "nodeType", len: 0, typ: NTI637534223, name: "nodeType", sons: null}, +{kind: 1, offset: "nodeValue", len: 0, typ: NTI33554440, name: "nodeValue", sons: null}, +{kind: 1, offset: "parentNode", len: 0, typ: NTI637534224, name: "parentNode", sons: null}, +{kind: 1, offset: "content", len: 0, typ: NTI637534224, name: "content", sons: null}, +{kind: 1, offset: "previousSibling", len: 0, typ: NTI637534224, name: "previousSibling", sons: null}, +{kind: 1, offset: "ownerDocument", len: 0, typ: NTI637534225, name: "ownerDocument", sons: null}, +{kind: 1, offset: "innerHTML", len: 0, typ: NTI33554440, name: "innerHTML", sons: null}, +{kind: 1, offset: "outerHTML", len: 0, typ: NTI33554440, name: "outerHTML", sons: null}, +{kind: 1, offset: "innerText", len: 0, typ: NTI33554440, name: "innerText", sons: null}, +{kind: 1, offset: "textContent", len: 0, typ: NTI33554440, name: "textContent", sons: null}, +{kind: 1, offset: "style", len: 0, typ: NTI637534238, name: "style", sons: null}, +{kind: 1, offset: "baseURI", len: 0, typ: NTI33554440, name: "baseURI", sons: null}, +{kind: 1, offset: "parentElement", len: 0, typ: NTI637534226, name: "parentElement", sons: null}, +{kind: 1, offset: "isConnected", len: 0, typ: NTI33554466, name: "isConnected", sons: null}]}; +NTI637534321.node = NNI637534321; +var NNI637534276 = {kind: 2, len: 24, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "onabort", len: 0, typ: NTI637534277, name: "onabort", sons: null}, +{kind: 1, offset: "onblur", len: 0, typ: NTI637534278, name: "onblur", sons: null}, +{kind: 1, offset: "onchange", len: 0, typ: NTI637534279, name: "onchange", sons: null}, +{kind: 1, offset: "onclick", len: 0, typ: NTI637534280, name: "onclick", sons: null}, +{kind: 1, offset: "ondblclick", len: 0, typ: NTI637534281, name: "ondblclick", sons: null}, +{kind: 1, offset: "onerror", len: 0, typ: NTI637534282, name: "onerror", sons: null}, +{kind: 1, offset: "onfocus", len: 0, typ: NTI637534283, name: "onfocus", sons: null}, +{kind: 1, offset: "onkeydown", len: 0, typ: NTI637534284, name: "onkeydown", sons: null}, +{kind: 1, offset: "onkeypress", len: 0, typ: NTI637534285, name: "onkeypress", sons: null}, +{kind: 1, offset: "onkeyup", len: 0, typ: NTI637534286, name: "onkeyup", sons: null}, +{kind: 1, offset: "onload", len: 0, typ: NTI637534287, name: "onload", sons: null}, +{kind: 1, offset: "onmousedown", len: 0, typ: NTI637534288, name: "onmousedown", sons: null}, +{kind: 1, offset: "onmousemove", len: 0, typ: NTI637534289, name: "onmousemove", sons: null}, +{kind: 1, offset: "onmouseout", len: 0, typ: NTI637534290, name: "onmouseout", sons: null}, +{kind: 1, offset: "onmouseover", len: 0, typ: NTI637534291, name: "onmouseover", sons: null}, +{kind: 1, offset: "onmouseup", len: 0, typ: NTI637534292, name: "onmouseup", sons: null}, +{kind: 1, offset: "onreset", len: 0, typ: NTI637534293, name: "onreset", sons: null}, +{kind: 1, offset: "onselect", len: 0, typ: NTI637534294, name: "onselect", sons: null}, +{kind: 1, offset: "onstorage", len: 0, typ: NTI637534295, name: "onstorage", sons: null}, +{kind: 1, offset: "onsubmit", len: 0, typ: NTI637534296, name: "onsubmit", sons: null}, +{kind: 1, offset: "onunload", len: 0, typ: NTI637534297, name: "onunload", sons: null}, +{kind: 1, offset: "onloadstart", len: 0, typ: NTI637534298, name: "onloadstart", sons: null}, +{kind: 1, offset: "onprogress", len: 0, typ: NTI637534299, name: "onprogress", sons: null}, +{kind: 1, offset: "onloadend", len: 0, typ: NTI637534300, name: "onloadend", sons: null}]}; +NTI637534276.node = NNI637534276; +NTI637534276.base = NTI33555086; +NTI637534321.base = NTI637534276; +NTI637534224.base = NTI637534321; +NTI637534652.base = NTI637534224; +NTI503317021.base = NTI33554440; +var NNI654311438 = {kind: 2, len: 2, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "Field0", len: 0, typ: NTI33554456, name: "Field0", sons: null}, +{kind: 1, offset: "Field1", len: 0, typ: NTI33554466, name: "Field1", sons: null}]}; +NTI654311438.node = NNI654311438; + +function makeNimstrLit(c_33556801) { + var result = []; + for (var i = 0; i < c_33556801.length; ++i) { + result[i] = c_33556801.charCodeAt(i); + } + return result; + + + +} + +function toJSStr(s_33556807) { + var Temporary5; + + var result_33556808 = null; + + var res_33556842 = newSeq_33556825((s_33556807).length); + var i_33556843 = 0; + var j_33556844 = 0; + Label1: do { + Label2: while (true) { + if (!(i_33556843 < (s_33556807).length)) break Label2; + var c_33556845 = s_33556807[i_33556843]; + if ((c_33556845 < 128)) { + res_33556842[j_33556844] = String.fromCharCode(c_33556845); + i_33556843 += 1; + } + else { + var helper_33556857 = newSeq_33556825(0); + Label3: do { + Label4: while (true) { + if (!true) break Label4; + var code_33556858 = c_33556845.toString(16); + if ((((code_33556858) == null ? 0 : (code_33556858).length) == 1)) { + helper_33556857.push("%0");; + } + else { + helper_33556857.push("%");; + } + + helper_33556857.push(code_33556858);; + i_33556843 += 1; + if (((s_33556807).length <= i_33556843)) Temporary5 = true; else { Temporary5 = (s_33556807[i_33556843] < 128); } if (Temporary5) { + break Label3; + } + + c_33556845 = s_33556807[i_33556843]; + } + } while (false); +++excHandler; + try { + res_33556842[j_33556844] = decodeURIComponent(helper_33556857.join("")); +--excHandler; +} catch (EXCEPTION) { + var prevJSError = lastJSError; + lastJSError = EXCEPTION; + --excHandler; + res_33556842[j_33556844] = helper_33556857.join(""); + lastJSError = prevJSError; + } finally { + } + } + + j_33556844 += 1; + } + } while (false); + if (res_33556842.length < j_33556844) { for (var i = res_33556842.length ; i < j_33556844 ; ++i) res_33556842.push(null); } + else { res_33556842.length = j_33556844; }; + result_33556808 = res_33556842.join(""); + + return result_33556808; + +} + +function raiseException(e_33556667, ename_33556668) { + e_33556667.name = ename_33556668; + if ((excHandler == 0)) { + unhandledException(e_33556667); + } + + throw e_33556667; + + +} + +function addInt(a_33556940, b_33556941) { + var result = a_33556940 + b_33556941; + checkOverflowInt(result); + return result; + + + +} + +function mnewString(len_33556893) { + return new Array(len_33556893); + + + +} + +function chckRange(i_33557189, a_33557190, b_33557191) { + var Temporary1; + + var result_33557192 = 0; + + BeforeRet: do { + if (!(a_33557190 <= i_33557189)) Temporary1 = false; else { Temporary1 = (i_33557189 <= b_33557191); } if (Temporary1) { + result_33557192 = i_33557189; + break BeforeRet; + } + else { + raiseRangeError(); + } + + } while (false); + + return result_33557192; + +} + +function setConstr() { + var result = {}; + for (var i = 0; i < arguments.length; ++i) { + var x = arguments[i]; + if (typeof(x) == "object") { + for (var j = x[0]; j <= x[1]; ++j) { + result[j] = true; + } + } else { + result[x] = true; + } + } + return result; + + + +} +var ConstSet1 = setConstr(17, 16, 4, 18, 27, 19, 23, 22, 21); + +function nimCopy(dest_33557140, src_33557141, ti_33557142) { + var result_33557151 = null; + + switch (ti_33557142.kind) { + case 21: + case 22: + case 23: + case 5: + if (!(isFatPointer_33557131(ti_33557142))) { + result_33557151 = src_33557141; + } + else { + result_33557151 = [src_33557141[0], src_33557141[1]]; + } + + break; + case 19: + if (dest_33557140 === null || dest_33557140 === undefined) { + dest_33557140 = {}; + } + else { + for (var key in dest_33557140) { delete dest_33557140[key]; } + } + for (var key in src_33557141) { dest_33557140[key] = src_33557141[key]; } + result_33557151 = dest_33557140; + + break; + case 18: + case 17: + if (!((ti_33557142.base == null))) { + result_33557151 = nimCopy(dest_33557140, src_33557141, ti_33557142.base); + } + else { + if ((ti_33557142.kind == 17)) { + result_33557151 = (dest_33557140 === null || dest_33557140 === undefined) ? {m_type: ti_33557142} : dest_33557140; + } + else { + result_33557151 = (dest_33557140 === null || dest_33557140 === undefined) ? {} : dest_33557140; + } + } + nimCopyAux(result_33557151, src_33557141, ti_33557142.node); + break; + case 24: + case 4: + case 27: + case 16: + if (src_33557141 === null) { + result_33557151 = null; + } + else { + if (dest_33557140 === null || dest_33557140 === undefined || dest_33557140.length != src_33557141.length) { + dest_33557140 = new Array(src_33557141.length); + } + result_33557151 = dest_33557140; + for (var i = 0; i < src_33557141.length; ++i) { + result_33557151[i] = nimCopy(result_33557151[i], src_33557141[i], ti_33557142.base); + } + } + + break; + case 28: + if (src_33557141 !== null) { + result_33557151 = src_33557141.slice(0); + } + + break; + default: + result_33557151 = src_33557141; + break; + } + + return result_33557151; + +} + +function chckIndx(i_33557184, a_33557185, b_33557186) { + var Temporary1; + + var result_33557187 = 0; + + BeforeRet: do { + if (!(a_33557185 <= i_33557184)) Temporary1 = false; else { Temporary1 = (i_33557184 <= b_33557186); } if (Temporary1) { + result_33557187 = i_33557184; + break BeforeRet; + } + else { + raiseIndexError(i_33557184, a_33557185, b_33557186); + } + + } while (false); + + return result_33557187; + +} + +function subInt(a_33556944, b_33556945) { + var result = a_33556944 - b_33556945; + checkOverflowInt(result); + return result; + + + +} +var ConstSet2 = setConstr([65, 90]); +var ConstSet3 = setConstr(95, 32, 46); +var ConstSet4 = setConstr(95, 32, 46); + +function mulInt(a_33556948, b_33556949) { + var result = a_33556948 * b_33556949; + checkOverflowInt(result); + return result; + + + +} +var ConstSet5 = setConstr([97, 122]); +var ConstSet6 = setConstr([65, 90], [97, 122]); +var ConstSet7 = setConstr([97, 122]); +var ConstSet8 = setConstr([65, 90]); +var ConstSet9 = setConstr([65, 90], [97, 122]); + +function nimMax(a_33556998, b_33556999) { + var Temporary1; + + var result_33557000 = 0; + + BeforeRet: do { + if ((b_33556999 <= a_33556998)) { + Temporary1 = a_33556998; + } + else { + Temporary1 = b_33556999; + } + + result_33557000 = Temporary1; + break BeforeRet; + } while (false); + + return result_33557000; + +} + +function nimMin(a_33556994, b_33556995) { + var Temporary1; + + var result_33556996 = 0; + + BeforeRet: do { + if ((a_33556994 <= b_33556995)) { + Temporary1 = a_33556994; + } + else { + Temporary1 = b_33556995; + } + + result_33556996 = Temporary1; + break BeforeRet; + } while (false); + + return result_33556996; + +} + +function addChar(x_33557255, c_33557256) { + x_33557255.push(c_33557256); + + +} +if (!Math.trunc) { + Math.trunc = function(v) { + v = +v; + if (!isFinite(v)) return v; + return (v - v % 1) || (v < 0 ? -0 : v === 0 ? v : 0); + }; +} + +var alternative_503317074 = [null]; + +function add_33556419(x_33556420, x_33556420_Idx, y_33556421) { + if (x_33556420[x_33556420_Idx] === null) { x_33556420[x_33556420_Idx] = []; } + var off = x_33556420[x_33556420_Idx].length; + x_33556420[x_33556420_Idx].length += y_33556421.length; + for (var i = 0; i < y_33556421.length; ++i) { + x_33556420[x_33556420_Idx][off+i] = y_33556421.charCodeAt(i); + } + + + +} + +function newSeq_33556825(len_33556827) { + var result_33556828 = []; + + result_33556828 = new Array(len_33556827); for (var i = 0 ; i < len_33556827 ; ++i) { result_33556828[i] = null; } + return result_33556828; + +} + +function unhandledException(e_33556663) { + var buf_33556664 = [[]]; + if (!(((e_33556663.message).length == 0))) { + buf_33556664[0].push.apply(buf_33556664[0], makeNimstrLit("Error: unhandled exception: "));; + buf_33556664[0].push.apply(buf_33556664[0], e_33556663.message);; + } + else { + buf_33556664[0].push.apply(buf_33556664[0], makeNimstrLit("Error: unhandled exception"));; + } + + buf_33556664[0].push.apply(buf_33556664[0], makeNimstrLit(" ["));; + add_33556419(buf_33556664, 0, e_33556663.name); + buf_33556664[0].push.apply(buf_33556664[0], makeNimstrLit("]\x0A"));; + var cbuf_33556665 = toJSStr(buf_33556664[0]); + if (typeof(Error) !== "undefined") { + throw new Error(cbuf_33556665); + } + else { + throw cbuf_33556665; + } + + + +} + +function raiseOverflow() { + raiseException({message: makeNimstrLit("over- or underflow"), parent: null, m_type: NTI33555125, name: null, trace: [], up: null}, "OverflowDefect"); + + +} + +function checkOverflowInt(a_33556938) { + if (a_33556938 > 2147483647 || a_33556938 < -2147483648) raiseOverflow(); + + + +} + +function isWhitespace_503316788(text_503316789) { + return !/[^\s]/.test(text_503316789); + + + +} + +function isWhitespace_503316791(x_503316792) { + var Temporary1; + var Temporary2; + + var result_503316793 = false; + + if (!(x_503316792.nodeName == "#text")) Temporary2 = false; else { Temporary2 = isWhitespace_503316788(x_503316792.textContent); } if (Temporary2) Temporary1 = true; else { Temporary1 = (x_503316792.nodeName == "#comment"); } result_503316793 = Temporary1; + + return result_503316793; + +} + +function raiseRangeError() { + raiseException({message: makeNimstrLit("value out of range"), parent: null, m_type: NTI33555133, name: null, trace: [], up: null}, "RangeDefect"); + + +} + +function addChars_251658415(result_251658417, result_251658417_Idx, x_251658418, start_251658419, n_251658420) { + var old_251658421 = (result_251658417[result_251658417_Idx]).length; + (result_251658417[result_251658417_Idx].length = chckRange(addInt(old_251658421, n_251658420), 0, 2147483647)); + Label1: do { + var iHEX60gensym4_251658435 = 0; + var i_503317133 = 0; + Label2: do { + Label3: while (true) { + if (!(i_503317133 < n_251658420)) break Label3; + iHEX60gensym4_251658435 = i_503317133; + result_251658417[result_251658417_Idx][chckIndx(addInt(old_251658421, iHEX60gensym4_251658435), 0, (result_251658417[result_251658417_Idx]).length - 1)] = x_251658418.charCodeAt(chckIndx(addInt(start_251658419, iHEX60gensym4_251658435), 0, (x_251658418).length - 1)); + i_503317133 = addInt(i_503317133, 1); + } + } while (false); + } while (false); + + +} + +function addChars_251658411(result_251658413, result_251658413_Idx, x_251658414) { + addChars_251658415(result_251658413, result_251658413_Idx, x_251658414, 0, ((x_251658414) == null ? 0 : (x_251658414).length)); + + +} + +function addInt_251658436(result_251658437, result_251658437_Idx, x_251658438) { + addChars_251658411(result_251658437, result_251658437_Idx, ((x_251658438) + "")); + + +} + +function addInt_251658457(result_251658458, result_251658458_Idx, x_251658459) { + addInt_251658436(result_251658458, result_251658458_Idx, x_251658459); + + +} + +function HEX24_352321539(x_352321540) { + var result_352321541 = [[]]; + + addInt_251658457(result_352321541, 0, x_352321540); + + return result_352321541[0]; + +} + +function isFatPointer_33557131(ti_33557132) { + var result_33557133 = false; + + BeforeRet: do { + result_33557133 = !((ConstSet1[ti_33557132.base.kind] != undefined)); + break BeforeRet; + } while (false); + + return result_33557133; + +} + +function nimCopyAux(dest_33557144, src_33557145, n_33557146) { + switch (n_33557146.kind) { + case 0: + break; + case 1: + dest_33557144[n_33557146.offset] = nimCopy(dest_33557144[n_33557146.offset], src_33557145[n_33557146.offset], n_33557146.typ); + + break; + case 2: + for (var i = 0; i < n_33557146.sons.length; i++) { + nimCopyAux(dest_33557144, src_33557145, n_33557146.sons[i]); + } + + break; + case 3: + dest_33557144[n_33557146.offset] = nimCopy(dest_33557144[n_33557146.offset], src_33557145[n_33557146.offset], n_33557146.typ); + for (var i = 0; i < n_33557146.sons.length; ++i) { + nimCopyAux(dest_33557144, src_33557145, n_33557146.sons[i][1]); + } + + break; + } + + +} + +function raiseIndexError(i_33556754, a_33556755, b_33556756) { + var Temporary1; + + if ((b_33556756 < a_33556755)) { + Temporary1 = makeNimstrLit("index out of bounds, the container is empty"); + } + else { + Temporary1 = (makeNimstrLit("index ") || []).concat(HEX24_352321539(i_33556754) || [],makeNimstrLit(" not in ") || [],HEX24_352321539(a_33556755) || [],makeNimstrLit(" .. ") || [],HEX24_352321539(b_33556756) || []); + } + + raiseException({message: nimCopy(null, Temporary1, NTI33554439), parent: null, m_type: NTI33555131, name: null, trace: [], up: null}, "IndexDefect"); + + +} + +function toToc_503316794(x_503316795, father_503316796) { + var Temporary5; + var Temporary6; + var Temporary7; + var Temporary8; + var Temporary15; + + if ((x_503316795.nodeName == "UL")) { + var f_503316804 = {heading: null, kids: [], sortId: (father_503316796.kids).length, doSort: false}; + var i_503316805 = 0; + Label1: do { + Label2: while (true) { + if (!(i_503316805 < x_503316795.childNodes.length)) break Label2; + var nxt_503316806 = addInt(i_503316805, 1); + Label3: do { + Label4: while (true) { + if (!(nxt_503316806 < x_503316795.childNodes.length)) Temporary5 = false; else { Temporary5 = isWhitespace_503316791(x_503316795.childNodes[nxt_503316806]); } if (!Temporary5) break Label4; + nxt_503316806 = addInt(nxt_503316806, 1); + } + } while (false); + if (!(nxt_503316806 < x_503316795.childNodes.length)) Temporary8 = false; else { Temporary8 = (x_503316795.childNodes[i_503316805].nodeName == "LI"); } if (!Temporary8) Temporary7 = false; else { Temporary7 = (x_503316795.childNodes[i_503316805].childNodes.length == 1); } if (!Temporary7) Temporary6 = false; else { Temporary6 = (x_503316795.childNodes[nxt_503316806].nodeName == "UL"); } if (Temporary6) { + var e_503316818 = {heading: x_503316795.childNodes[i_503316805].childNodes[0], kids: [], sortId: (f_503316804.kids).length, doSort: false}; + var it_503316819 = x_503316795.childNodes[nxt_503316806]; + Label9: do { + var j_503316824 = 0; + var colontmp__503317112 = 0; + colontmp__503317112 = it_503316819.childNodes.length; + var i_503317113 = 0; + Label10: do { + Label11: while (true) { + if (!(i_503317113 < colontmp__503317112)) break Label11; + j_503316824 = i_503317113; + toToc_503316794(it_503316819.childNodes[j_503316824], e_503316818); + i_503317113 = addInt(i_503317113, 1); + } + } while (false); + } while (false); + f_503316804.kids.push(e_503316818);; + i_503316805 = addInt(nxt_503316806, 1); + } + else { + toToc_503316794(x_503316795.childNodes[i_503316805], f_503316804); + i_503316805 = addInt(i_503316805, 1); + } + + } + } while (false); + father_503316796.kids.push(f_503316804);; + } + else { + if (isWhitespace_503316791(x_503316795)) { + } + else { + if ((x_503316795.nodeName == "LI")) { + var idx_503316841 = []; + Label12: do { + var i_503316846 = 0; + var colontmp__503317116 = 0; + colontmp__503317116 = x_503316795.childNodes.length; + var i_503317117 = 0; + Label13: do { + Label14: while (true) { + if (!(i_503317117 < colontmp__503317116)) break Label14; + i_503316846 = i_503317117; + if (!(isWhitespace_503316791(x_503316795.childNodes[i_503316846]))) { + idx_503316841.push(i_503316846);; + } + + i_503317117 = addInt(i_503317117, 1); + } + } while (false); + } while (false); + if (!((idx_503316841).length == 2)) Temporary15 = false; else { Temporary15 = (x_503316795.childNodes[idx_503316841[chckIndx(1, 0, (idx_503316841).length - 1)]].nodeName == "UL"); } if (Temporary15) { + var e_503316862 = {heading: x_503316795.childNodes[idx_503316841[chckIndx(0, 0, (idx_503316841).length - 1)]], kids: [], sortId: (father_503316796.kids).length, doSort: false}; + var it_503316863 = x_503316795.childNodes[idx_503316841[chckIndx(1, 0, (idx_503316841).length - 1)]]; + Label16: do { + var j_503316868 = 0; + var colontmp__503317120 = 0; + colontmp__503317120 = it_503316863.childNodes.length; + var i_503317121 = 0; + Label17: do { + Label18: while (true) { + if (!(i_503317121 < colontmp__503317120)) break Label18; + j_503316868 = i_503317121; + toToc_503316794(it_503316863.childNodes[j_503316868], e_503316862); + i_503317121 = addInt(i_503317121, 1); + } + } while (false); + } while (false); + father_503316796.kids.push(e_503316862);; + } + else { + Label19: do { + var i_503316877 = 0; + var colontmp__503317124 = 0; + colontmp__503317124 = x_503316795.childNodes.length; + var i_503317125 = 0; + Label20: do { + Label21: while (true) { + if (!(i_503317125 < colontmp__503317124)) break Label21; + i_503316877 = i_503317125; + toToc_503316794(x_503316795.childNodes[i_503316877], father_503316796); + i_503317125 = addInt(i_503317125, 1); + } + } while (false); + } while (false); + } + + } + else { + father_503316796.kids.push({heading: x_503316795, kids: [], sortId: (father_503316796.kids).length, doSort: false});; + } + }} + + +} + +function extractItems_503316614(x_503316615, heading_503316616, items_503316617, items_503316617_Idx) { + var Temporary1; + + BeforeRet: do { + if ((x_503316615 == null)) { + break BeforeRet; + } + + if (!!((x_503316615.heading == null))) Temporary1 = false; else { Temporary1 = (x_503316615.heading.textContent == heading_503316616); } if (Temporary1) { + Label2: do { + var i_503316634 = 0; + var colontmp__503317136 = 0; + colontmp__503317136 = (x_503316615.kids).length; + var i_503317137 = 0; + Label3: do { + Label4: while (true) { + if (!(i_503317137 < colontmp__503317136)) break Label4; + i_503316634 = i_503317137; + items_503316617[items_503316617_Idx].push(x_503316615.kids[chckIndx(i_503316634, 0, (x_503316615.kids).length - 1)].heading);; + i_503317137 = addInt(i_503317137, 1); + } + } while (false); + } while (false); + } + else { + Label5: do { + var i_503316646 = 0; + var colontmp__503317140 = 0; + colontmp__503317140 = (x_503316615.kids).length; + var i_503317141 = 0; + Label6: do { + Label7: while (true) { + if (!(i_503317141 < colontmp__503317140)) break Label7; + i_503316646 = i_503317141; + var it_503316647 = x_503316615.kids[chckIndx(i_503316646, 0, (x_503316615.kids).length - 1)]; + extractItems_503316614(it_503316647, heading_503316616, items_503316617, items_503316617_Idx); + i_503317141 = addInt(i_503317141, 1); + } + } while (false); + } while (false); + } + + } while (false); + + +} + +function tree_503316487(tag_503316488, kids_503316489) { + var result_503316490 = null; + + result_503316490 = document.createElement(toJSStr(tag_503316488)); + Label1: do { + var k_503316503 = null; + var i_503317154 = 0; + Label2: do { + Label3: while (true) { + if (!(i_503317154 < (kids_503316489).length)) break Label3; + k_503316503 = kids_503316489[chckIndx(i_503317154, 0, (kids_503316489).length - 1)]; + result_503316490.appendChild(k_503316503); + i_503317154 = addInt(i_503317154, 1); + } + } while (false); + } while (false); + + return result_503316490; + +} + +function text_503316541(s_503316542) { + var result_503316543 = null; + + result_503316543 = document.createTextNode(s_503316542); + + return result_503316543; + +} + +function sysFatal_218103842(message_218103845) { + raiseException({message: nimCopy(null, message_218103845, NTI33554439), m_type: NTI33555127, parent: null, name: null, trace: [], up: null}, "AssertionDefect"); + + +} + +function raiseAssert_218103840(msg_218103841) { + sysFatal_218103842(msg_218103841); + + +} + +function failedAssertImpl_218103864(msg_218103865) { + raiseAssert_218103840(msg_218103865); + + +} + +function uncovered_503316943(x_503316944) { + var Temporary1; + var Temporary2; + + var result_503316945 = null; + + BeforeRet: do { + if (!((x_503316944.kids).length == 0)) Temporary1 = false; else { Temporary1 = !((x_503316944.heading == null)); } if (Temporary1) { + if (!(x_503316944.heading.hasOwnProperty('__karaxMarker__'))) { + Temporary2 = x_503316944; + } + else { + Temporary2 = null; + } + + result_503316945 = Temporary2; + break BeforeRet; + } + + result_503316945 = {heading: x_503316944.heading, kids: [], sortId: x_503316944.sortId, doSort: x_503316944.doSort}; + Label3: do { + var i_503316964 = 0; + var colontmp__503317161 = 0; + colontmp__503317161 = (x_503316944.kids).length; + var i_503317162 = 0; + Label4: do { + Label5: while (true) { + if (!(i_503317162 < colontmp__503317161)) break Label5; + i_503316964 = i_503317162; + var y_503316965 = uncovered_503316943(x_503316944.kids[chckIndx(i_503316964, 0, (x_503316944.kids).length - 1)]); + if (!((y_503316965 == null))) { + result_503316945.kids.push(y_503316965);; + } + + i_503317162 = addInt(i_503317162, 1); + } + } while (false); + } while (false); + if (((result_503316945.kids).length == 0)) { + result_503316945 = null; + } + + } while (false); + + return result_503316945; + +} + +function mergeTocs_503316977(orig_503316978, news_503316979) { + var result_503316980 = null; + + result_503316980 = uncovered_503316943(orig_503316978); + if ((result_503316980 == null)) { + result_503316980 = news_503316979; + } + else { + Label1: do { + var i_503316992 = 0; + var colontmp__503317157 = 0; + colontmp__503317157 = (news_503316979.kids).length; + var i_503317158 = 0; + Label2: do { + Label3: while (true) { + if (!(i_503317158 < colontmp__503317157)) break Label3; + i_503316992 = i_503317158; + result_503316980.kids.push(news_503316979.kids[chckIndx(i_503316992, 0, (news_503316979.kids).length - 1)]);; + i_503317158 = addInt(i_503317158, 1); + } + } while (false); + } while (false); + } + + + return result_503316980; + +} + +function buildToc_503316997(orig_503316998, types_503316999, procs_503317000) { + var Temporary7; + + var result_503317001 = null; + + var newStuff_503317006 = {heading: null, kids: [], doSort: true, sortId: 0}; + Label1: do { + var t_503317028 = null; + var i_503317149 = 0; + var L_503317150 = (types_503316999).length; + Label2: do { + Label3: while (true) { + if (!(i_503317149 < L_503317150)) break Label3; + t_503317028 = types_503316999[chckIndx(i_503317149, 0, (types_503316999).length - 1)]; + var c_503317033 = {heading: t_503317028.cloneNode(true), kids: [], doSort: true, sortId: 0}; + t_503317028.__karaxMarker__ = true; + Label4: do { + var p_503317037 = null; + var i_503317146 = 0; + var L_503317147 = (procs_503317000).length; + Label5: do { + Label6: while (true) { + if (!(i_503317146 < L_503317147)) break Label6; + p_503317037 = procs_503317000[chckIndx(i_503317146, 0, (procs_503317000).length - 1)]; + if (!(p_503317037.hasOwnProperty('__karaxMarker__'))) { + var xx_503317038 = p_503317037.parentNode.getElementsByClassName("attachedType"); + if (!((xx_503317038).length == 1)) Temporary7 = false; else { Temporary7 = (xx_503317038[chckIndx(0, 0, (xx_503317038).length - 1)].textContent == t_503317028.textContent); } if (Temporary7) { + var q_503317043 = tree_503316487(makeNimstrLit("A"), [text_503316541(p_503317037.title)]); + q_503317043.setAttribute("href", p_503317037.getAttribute("href")); + c_503317033.kids.push({heading: q_503317043, kids: [], sortId: 0, doSort: false});; + p_503317037.__karaxMarker__ = true; + } + + } + + i_503317146 = addInt(i_503317146, 1); + if (!(((procs_503317000).length == L_503317147))) { + failedAssertImpl_218103864(makeNimstrLit("iterators.nim(240, 11) `len(a) == L` the length of the seq changed while iterating over it")); + } + + } + } while (false); + } while (false); + newStuff_503317006.kids.push(c_503317033);; + i_503317149 = addInt(i_503317149, 1); + if (!(((types_503316999).length == L_503317150))) { + failedAssertImpl_218103864(makeNimstrLit("iterators.nim(240, 11) `len(a) == L` the length of the seq changed while iterating over it")); + } + + } + } while (false); + } while (false); + result_503317001 = mergeTocs_503316977(orig_503316998, newStuff_503317006); + + return result_503317001; + +} + +function add_503316531(parent_503316532, kid_503316533) { + var Temporary1; + var Temporary2; + + if (!(parent_503316532.nodeName == "TR")) Temporary1 = false; else { if ((kid_503316533.nodeName == "TD")) Temporary2 = true; else { Temporary2 = (kid_503316533.nodeName == "TH"); } Temporary1 = Temporary2; } if (Temporary1) { + var k_503316534 = document.createElement("TD"); + k_503316534.appendChild(kid_503316533); + parent_503316532.appendChild(k_503316534); + } + else { + parent_503316532.appendChild(kid_503316533); + } + + + +} + +function setClass_503316535(e_503316536, value_503316537) { + e_503316536.setAttribute("class", toJSStr(value_503316537)); + + +} + +function toHtml_503316657(x_503316658, isRoot_503316659) { + var Temporary1; + +function HEX3Aanonymous_503316677(a_503316678, b_503316679) { + var Temporary1; + + var result_503316680 = 0; + + BeforeRet: do { + if (!!((a_503316678.heading == null))) Temporary1 = false; else { Temporary1 = !((b_503316679.heading == null)); } if (Temporary1) { + var x_503316689 = a_503316678.heading.textContent; + var y_503316690 = b_503316679.heading.textContent; + if ((x_503316689 < y_503316690)) { + result_503316680 = -1; + break BeforeRet; + } + + if ((y_503316690 < x_503316689)) { + result_503316680 = 1; + break BeforeRet; + } + + result_503316680 = 0; + break BeforeRet; + } + else { + result_503316680 = subInt(a_503316678.sortId, b_503316679.sortId); + break BeforeRet; + } + + } while (false); + + return result_503316680; + + } + + var result_503316660 = null; + + BeforeRet: do { + if ((x_503316658 == null)) { + result_503316660 = null; + break BeforeRet; + } + + if (((x_503316658.kids).length == 0)) { + if ((x_503316658.heading == null)) { + result_503316660 = null; + break BeforeRet; + } + + result_503316660 = x_503316658.heading.cloneNode(true); + break BeforeRet; + } + + result_503316660 = tree_503316487(makeNimstrLit("DIV"), []); + if (!!((x_503316658.heading == null))) Temporary1 = false; else { Temporary1 = !(x_503316658.heading.hasOwnProperty('__karaxMarker__')); } if (Temporary1) { + add_503316531(result_503316660, x_503316658.heading.cloneNode(true)); + } + + var ul_503316676 = tree_503316487(makeNimstrLit("UL"), []); + if (isRoot_503316659) { + setClass_503316535(ul_503316676, makeNimstrLit("simple simple-toc")); + } + else { + setClass_503316535(ul_503316676, makeNimstrLit("simple")); + } + + if (x_503316658.doSort) { + x_503316658.kids.sort(HEX3Aanonymous_503316677); + } + + Label2: do { + var k_503316719 = null; + var i_503317166 = 0; + var L_503317167 = (x_503316658.kids).length; + Label3: do { + Label4: while (true) { + if (!(i_503317166 < L_503317167)) break Label4; + k_503316719 = x_503316658.kids[chckIndx(i_503317166, 0, (x_503316658.kids).length - 1)]; + var y_503316720 = toHtml_503316657(k_503316719, false); + if (!((y_503316720 == null))) { + add_503316531(ul_503316676, tree_503316487(makeNimstrLit("LI"), [y_503316720])); + } + + i_503317166 = addInt(i_503317166, 1); + if (!(((x_503316658.kids).length == L_503317167))) { + failedAssertImpl_218103864(makeNimstrLit("iterators.nim(240, 11) `len(a) == L` the length of the seq changed while iterating over it")); + } + + } + } while (false); + } while (false); + if (!((ul_503316676.childNodes.length == 0))) { + add_503316531(result_503316660, ul_503316676); + } + + if ((result_503316660.childNodes.length == 0)) { + result_503316660 = null; + } + + } while (false); + + return result_503316660; + +} + +function replaceById_503316546(id_503316547, newTree_503316548) { + var x_503316549 = document.getElementById(id_503316547); + x_503316549.parentNode.replaceChild(newTree_503316548, x_503316549); + newTree_503316548.id = id_503316547; + + +} + +function togglevis_503317075(d_503317076) { + if (d_503317076.style.display == 'none') + d_503317076.style.display = 'inline'; + else + d_503317076.style.display = 'none'; + + + +} + +function groupBy(value_503317078) { + var toc_503317079 = document.getElementById("toc-list"); + if ((alternative_503317074[0] == null)) { + var tt_503317087 = {heading: null, kids: [], sortId: 0, doSort: false}; + toToc_503316794(toc_503317079, tt_503317087); + tt_503317087 = tt_503317087.kids[chckIndx(0, 0, (tt_503317087.kids).length - 1)]; + var types_503317092 = [[]]; + var procs_503317097 = [[]]; + extractItems_503316614(tt_503317087, "Types", types_503317092, 0); + extractItems_503316614(tt_503317087, "Procs", procs_503317097, 0); + extractItems_503316614(tt_503317087, "Converters", procs_503317097, 0); + extractItems_503316614(tt_503317087, "Methods", procs_503317097, 0); + extractItems_503316614(tt_503317087, "Templates", procs_503317097, 0); + extractItems_503316614(tt_503317087, "Macros", procs_503317097, 0); + extractItems_503316614(tt_503317087, "Iterators", procs_503317097, 0); + var ntoc_503317098 = buildToc_503316997(tt_503317087, types_503317092[0], procs_503317097[0]); + var x_503317099 = toHtml_503316657(ntoc_503317098, true); + alternative_503317074[0] = tree_503316487(makeNimstrLit("DIV"), [x_503317099]); + } + + if ((value_503317078 == "type")) { + replaceById_503316546("tocRoot", alternative_503317074[0]); + } + else { + replaceById_503316546("tocRoot", tree_503316487(makeNimstrLit("DIV"), [])); + } + + togglevis_503317075(document.getElementById("toc-list")); + + +} +var db_503317169 = [[]]; +var contents_503317170 = [[]]; +var oldtoc_503317335 = [null]; +var timer_503317336 = [null]; + +function nsuToLowerAsciiChar(c_671088708) { + var result_671088709 = 0; + + if ((ConstSet2[c_671088708] != undefined)) { + result_671088709 = (c_671088708 ^ 32); + } + else { + result_671088709 = c_671088708; + } + + + return result_671088709; + +} + +function fuzzyMatch_654311440(pattern_654311441, str_654311442) { + var Temporary4; + var Temporary5; + var Temporary6; + var Temporary7; + var Temporary8; + + var result_654311445 = {Field0: 0, Field1: false}; + + var scoreState_654311446 = -100; + var headerMatched_654311447 = false; + var unmatchedLeadingCharCount_654311448 = 0; + var consecutiveMatchCount_654311449 = 0; + var strIndex_654311450 = 0; + var patIndex_654311451 = 0; + var score_654311452 = 0; + Label1: do { + Label2: while (true) { + if (!((strIndex_654311450 < ((str_654311442) == null ? 0 : (str_654311442).length)) && (patIndex_654311451 < ((pattern_654311441) == null ? 0 : (pattern_654311441).length)))) break Label2; + Label3: do { + var patternChar_654311455 = nsuToLowerAsciiChar(pattern_654311441.charCodeAt(chckIndx(patIndex_654311451, 0, (pattern_654311441).length - 1))); + var strChar_654311456 = nsuToLowerAsciiChar(str_654311442.charCodeAt(chckIndx(strIndex_654311450, 0, (str_654311442).length - 1))); + if ((ConstSet3[patternChar_654311455] != undefined)) { + patIndex_654311451 = addInt(patIndex_654311451, 1); + break Label3; + } + + if ((ConstSet4[strChar_654311456] != undefined)) { + strIndex_654311450 = addInt(strIndex_654311450, 1); + break Label3; + } + + if ((!(headerMatched_654311447) && (strChar_654311456 == 58))) { + headerMatched_654311447 = true; + scoreState_654311446 = -100; + score_654311452 = ((Math.floor((0.5 * score_654311452))) | 0); + patIndex_654311451 = 0; + strIndex_654311450 = addInt(strIndex_654311450, 1); + break Label3; + } + + if ((strChar_654311456 == patternChar_654311455)) { + switch (scoreState_654311446) { + case -100: + case 20: + scoreState_654311446 = 10; + break; + case 0: + scoreState_654311446 = 5; + score_654311452 = addInt(score_654311452, scoreState_654311446); + break; + case 10: + case 5: + consecutiveMatchCount_654311449 = addInt(consecutiveMatchCount_654311449, 1); + scoreState_654311446 = 5; + score_654311452 = addInt(score_654311452, mulInt(5, consecutiveMatchCount_654311449)); + if ((scoreState_654311446 == 10)) { + score_654311452 = addInt(score_654311452, 10); + } + + var onBoundary_654311508 = (patIndex_654311451 == ((pattern_654311441) == null ? -1 : (pattern_654311441).length - 1)); + if ((!(onBoundary_654311508) && (strIndex_654311450 < ((str_654311442) == null ? -1 : (str_654311442).length - 1)))) { + var nextPatternChar_654311509 = nsuToLowerAsciiChar(pattern_654311441.charCodeAt(chckIndx(addInt(patIndex_654311451, 1), 0, (pattern_654311441).length - 1))); + var nextStrChar_654311510 = nsuToLowerAsciiChar(str_654311442.charCodeAt(chckIndx(addInt(strIndex_654311450, 1), 0, (str_654311442).length - 1))); + if (!!((ConstSet5[nextStrChar_654311510] != undefined))) Temporary4 = false; else { Temporary4 = !((nextStrChar_654311510 == nextPatternChar_654311509)); } onBoundary_654311508 = Temporary4; + } + + if (onBoundary_654311508) { + scoreState_654311446 = 20; + score_654311452 = addInt(score_654311452, scoreState_654311446); + } + + break; + case -1: + case -3: + if (!((ConstSet6[str_654311442.charCodeAt(chckIndx(subInt(strIndex_654311450, 1), 0, (str_654311442).length - 1))] != undefined))) Temporary5 = true; else { if (!(ConstSet7[str_654311442.charCodeAt(chckIndx(subInt(strIndex_654311450, 1), 0, (str_654311442).length - 1))] != undefined)) Temporary6 = false; else { Temporary6 = (ConstSet8[str_654311442.charCodeAt(chckIndx(strIndex_654311450, 0, (str_654311442).length - 1))] != undefined); } Temporary5 = Temporary6; } var isLeadingChar_654311534 = Temporary5; + if (isLeadingChar_654311534) { + scoreState_654311446 = 10; + } + else { + scoreState_654311446 = 0; + score_654311452 = addInt(score_654311452, scoreState_654311446); + } + + break; + } + patIndex_654311451 = addInt(patIndex_654311451, 1); + } + else { + switch (scoreState_654311446) { + case -100: + scoreState_654311446 = -3; + score_654311452 = addInt(score_654311452, scoreState_654311446); + break; + case 5: + scoreState_654311446 = -1; + score_654311452 = addInt(score_654311452, scoreState_654311446); + consecutiveMatchCount_654311449 = 0; + break; + case -3: + if ((unmatchedLeadingCharCount_654311448 < 3)) { + scoreState_654311446 = -3; + score_654311452 = addInt(score_654311452, scoreState_654311446); + } + + unmatchedLeadingCharCount_654311448 = addInt(unmatchedLeadingCharCount_654311448, 1); + break; + default: + scoreState_654311446 = -1; + score_654311452 = addInt(score_654311452, scoreState_654311446); + break; + } + } + + strIndex_654311450 = addInt(strIndex_654311450, 1); + } while (false); + } + } while (false); + if (!(patIndex_654311451 == ((pattern_654311441) == null ? 0 : (pattern_654311441).length))) Temporary7 = false; else { if ((strIndex_654311450 == ((str_654311442) == null ? 0 : (str_654311442).length))) Temporary8 = true; else { Temporary8 = !((ConstSet9[str_654311442.charCodeAt(chckIndx(strIndex_654311450, 0, (str_654311442).length - 1))] != undefined)); } Temporary7 = Temporary8; } if (Temporary7) { + score_654311452 = addInt(score_654311452, 10); + } + + var colontmp__503317396 = nimMax(0, score_654311452); + var colontmp__503317397 = (0 < score_654311452); + result_654311445 = nimCopy(result_654311445, {Field0: colontmp__503317396, Field1: colontmp__503317397}, NTI654311438); + + return result_654311445; + +} + +function escapeCString_503317173(x_503317174, x_503317174_Idx) { + var s_503317175 = []; + Label1: do { + var c_503317176 = 0; + var iHEX60gensym6_503317400 = 0; + var nHEX60gensym6_503317401 = ((x_503317174[x_503317174_Idx]) == null ? 0 : (x_503317174[x_503317174_Idx]).length); + Label2: do { + Label3: while (true) { + if (!(iHEX60gensym6_503317400 < nHEX60gensym6_503317401)) break Label3; + c_503317176 = x_503317174[x_503317174_Idx].charCodeAt(chckIndx(iHEX60gensym6_503317400, 0, (x_503317174[x_503317174_Idx]).length - 1)); + switch (c_503317176) { + case 60: + s_503317175.push.apply(s_503317175, makeNimstrLit("<"));; + break; + case 62: + s_503317175.push.apply(s_503317175, makeNimstrLit(">"));; + break; + default: + addChar(s_503317175, c_503317176);; + break; + } + iHEX60gensym6_503317400 = addInt(iHEX60gensym6_503317400, 1); + } + } while (false); + } while (false); + x_503317174[x_503317174_Idx] = toJSStr(s_503317175); + + +} + +function text_503316538(s_503316539) { + var result_503316540 = null; + + result_503316540 = document.createTextNode(toJSStr(s_503316539)); + + return result_503316540; + +} + +function dosearch_503317177(value_503317178) { + +function HEX3Aanonymous_503317234(a_503317239, b_503317240) { + var result_503317245 = 0; + + result_503317245 = subInt(b_503317240["Field1"], a_503317239["Field1"]); + + return result_503317245; + + } + + var result_503317179 = null; + + if (((db_503317169[0]).length == 0)) { + var stuff_503317183 = null; + var request = new XMLHttpRequest(); + request.open("GET", "theindex.html", false); + request.send(null); + + var doc = document.implementation.createHTMLDocument("theindex"); + doc.documentElement.innerHTML = request.responseText; + + //parser=new DOMParser(); + //doc=parser.parseFromString("", "text/html"); + + stuff_503317183 = doc.documentElement; + + db_503317169[0] = nimCopy(null, stuff_503317183.getElementsByClassName("reference"), NTI637534652); + contents_503317170[0] = nimCopy(null, [], NTI503317021); + Label1: do { + var ahref_503317208 = null; + var i_503317381 = 0; + var L_503317382 = (db_503317169[0]).length; + Label2: do { + Label3: while (true) { + if (!(i_503317381 < L_503317382)) break Label3; + ahref_503317208 = db_503317169[0][chckIndx(i_503317381, 0, (db_503317169[0]).length - 1)]; + contents_503317170[0].push(ahref_503317208.getAttribute("data-doc-search-tag"));; + i_503317381 = addInt(i_503317381, 1); + if (!(((db_503317169[0]).length == L_503317382))) { + failedAssertImpl_218103864(makeNimstrLit("iterators.nim(240, 11) `len(a) == L` the length of the seq changed while iterating over it")); + } + + } + } while (false); + } while (false); + } + + var ul_503317213 = tree_503316487(makeNimstrLit("UL"), []); + result_503317179 = tree_503316487(makeNimstrLit("DIV"), []); + setClass_503316535(result_503317179, makeNimstrLit("search_results")); + var matches_503317218 = []; + Label4: do { + var i_503317226 = 0; + var colontmp__503317386 = 0; + colontmp__503317386 = (db_503317169[0]).length; + var i_503317387 = 0; + Label5: do { + Label6: while (true) { + if (!(i_503317387 < colontmp__503317386)) break Label6; + i_503317226 = i_503317387; + Label7: do { + var c_503317227 = contents_503317170[0][chckIndx(i_503317226, 0, (contents_503317170[0]).length - 1)]; + if (((c_503317227 == "Examples") || (c_503317227 == "PEG construction"))) { + break Label7; + } + + var colontmp__503317393 = fuzzyMatch_654311440(value_503317178, c_503317227); + var score_503317228 = colontmp__503317393["Field0"]; + var matched_503317229 = colontmp__503317393["Field1"]; + if (matched_503317229) { + matches_503317218.push({Field0: db_503317169[0][chckIndx(i_503317226, 0, (db_503317169[0]).length - 1)], Field1: score_503317228});; + } + + } while (false); + i_503317387 = addInt(i_503317387, 1); + } + } while (false); + } while (false); + matches_503317218.sort(HEX3Aanonymous_503317234); + Label8: do { + var i_503317262 = 0; + var colontmp__503317390 = 0; + colontmp__503317390 = nimMin((matches_503317218).length, 29); + var i_503317391 = 0; + Label9: do { + Label10: while (true) { + if (!(i_503317391 < colontmp__503317390)) break Label10; + i_503317262 = i_503317391; + matches_503317218[chckIndx(i_503317262, 0, (matches_503317218).length - 1)]["Field0"].innerHTML = matches_503317218[chckIndx(i_503317262, 0, (matches_503317218).length - 1)]["Field0"].getAttribute("data-doc-search-tag"); + escapeCString_503317173(matches_503317218[chckIndx(i_503317262, 0, (matches_503317218).length - 1)]["Field0"], "innerHTML"); + add_503316531(ul_503317213, tree_503316487(makeNimstrLit("LI"), [matches_503317218[chckIndx(i_503317262, 0, (matches_503317218).length - 1)]["Field0"]])); + i_503317391 = addInt(i_503317391, 1); + } + } while (false); + } while (false); + if ((ul_503317213.childNodes.length == 0)) { + add_503316531(result_503317179, tree_503316487(makeNimstrLit("B"), [text_503316538(makeNimstrLit("no search results"))])); + } + else { + add_503316531(result_503317179, tree_503316487(makeNimstrLit("B"), [text_503316538(makeNimstrLit("search results"))])); + add_503316531(result_503317179, ul_503317213); + } + + + return result_503317179; + +} + +function search() { + +function wrapper_503317347() { + var elem_503317348 = document.getElementById("searchInput"); + var value_503317349 = elem_503317348.value; + if (!((((value_503317349) == null ? 0 : (value_503317349).length) == 0))) { + if ((oldtoc_503317335[0] == null)) { + oldtoc_503317335[0] = document.getElementById("tocRoot"); + } + + var results_503317353 = dosearch_503317177(value_503317349); + replaceById_503316546("tocRoot", results_503317353); + } + else { + if (!((oldtoc_503317335[0] == null))) { + replaceById_503316546("tocRoot", oldtoc_503317335[0]); + } + } + + + } + + if (!((timer_503317336[0] == null))) { + clearTimeout(timer_503317336[0]); + } + + timer_503317336[0] = setTimeout(wrapper_503317347, 400); + + +} diff --git a/api/nimdoc.out.css b/api/nimdoc.out.css new file mode 100644 index 00000000..4abea9ce --- /dev/null +++ b/api/nimdoc.out.css @@ -0,0 +1,1016 @@ +/* +Stylesheet for use with Docutils/rst2html. + +See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to +customize this style sheet. + +Modified from Chad Skeeters' rst2html-style +https://bitbucket.org/cskeeters/rst2html-style/ + +Modified by Boyd Greenfield and narimiran +*/ + +:root { + --primary-background: #fff; + --secondary-background: ghostwhite; + --third-background: #e8e8e8; + --info-background: #50c050; + --warning-background: #c0a000; + --error-background: #e04040; + --border: #dde; + --text: #222; + --anchor: #07b; + --anchor-focus: #607c9f; + --input-focus: #1fa0eb; + --strong: #3c3c3c; + --hint: #9A9A9A; + --nim-sprite-base64: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAN4AAAA9CAYAAADCt9ebAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFFmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDggNzkuMTY0MDM2LCAyMDE5LzA4LzEzLTAxOjA2OjU3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTEyLTAzVDAxOjAzOjQ4KzAxOjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0xMi0wM1QwMjoyODo0MSswMTowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0xMi0wM1QwMjoyODo0MSswMTowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozMzM0ZjAxYS0yMDExLWE1NGQtOTVjNy1iOTgxMDFlMDFhMmEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzMzNGYwMWEtMjAxMS1hNTRkLTk1YzctYjk4MTAxZTAxYTJhIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6MzMzNGYwMWEtMjAxMS1hNTRkLTk1YzctYjk4MTAxZTAxYTJhIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDozMzM0ZjAxYS0yMDExLWE1NGQtOTVjNy1iOTgxMDFlMDFhMmEiIHN0RXZ0OndoZW49IjIwMTktMTItMDNUMDE6MDM6NDgrMDE6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMS4wIChXaW5kb3dzKSIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4PsixkAAAJ5klEQVR4nO2dfbBUZR3HP3vvxVD0zo0ACXxBuQMoQjJ1DfMl0NIhNcuSZqQhfGt6UWtK06xJexkrmywVRTQlHCIdtclC0zBJvYIvvEUgZpc3XyC7RVbKlQu1/fHdbc+uu2fPOfs85+y55/nMnBl2z+5zfnc5v/M8z+8119XVRYroAG4HfgvMT1YUR4MMAa4HLkhakCRoSVqAELwLeBY4C7gF+D6QS1QiR1ROAJ4Dzk9akKQwoXhtwL4GxvHjU8AKoNPz3leAu4HBFq+bAyZZHD9rDAK+BywDDklYlkQxoXhfAtYAEw2MVckQYBHwU6or99nA08BBFq49GngUeBIYaWH8rNEJdAOXA60Jy5I4jSreSOBKYDzwBPCJhiUqcSjwe2BWnc9NLnxuvMFrnwqsAqYBBwBfNzh2FpmNfs9jkhakWcg1aFxZiH5UL3cDnwf+Xue7BwFjgFHAOwuv24tyob3cO0LIshP4EbCn8Pq/wKvA9sLxMvCvOmPsA1yDZnHv/nEv2mM+F0IeR4m8z7lM7tMbUbzj0CxX7YfbAXwaWFJ4PRrNIu9FS9KJyEIZN68CG4DnkRJtLBw7gHHAYuDdNb77EDAjBhkHIk7xKoiqeK3IwjilzuceQJvoZjdQ/AMZaeoZiWYgBXSEwyleBW0Rv3cR9ZUO4LSI48fN2wN+bi5wJNBvUZaBSCaVy48oxpVhwDdMC5ISxpJRh6/DLGEUrxXt29YBQ+2IkwquR76ofZIWxJFegireNLSnm48skFmmDfmiVgJHJyuKI620ADOpbWEcDPwYOZKD7OmyxCTkXL+wzueOiEEWR8poQb60V4A7kLm/yFjgKeALuM1xLfYDbkX+zEGe98cAX0Oui6viF8vR7OS6urragW2UZr21wK+Aiwlu7XPoN3sYOAd4H6WH1SnA0qSEcjQnRT/e1bgnsw16kGPez4/lyCBF48oNwL+TFGSAsgCndI4qFBVvJ0owdZhjL3CnxfHzBo8+YBMyol0CHBijrKbHS/LoA7Yio9sPgJNr/QHekLGR6MffL+KP4SjnHmQxtoXNmbQP+CHyV75hYDzTIWNpWkU8iR5mq71vVsZqXgtcFqNQ/wG2IOtfD8oi6AX+Ujj+isKz8sBrnu+1okyGdmD/wnEgcDClTIdRyJRvI1cvCMciq7At4rj5eoCPAusbHCfLigda/VyKgi+AtyreMGAzykGzQQ/wO+BxSlkCuy1dq8hw5OieUjimYT+x9bHCdWwS1823Ez1EXmhgjKwrXpHzkduuanbCtzGX+NkPPAj8GincNkPjNkIO5dadUjiOB95m+BonopQpm8R58/0JJbHWy2eshVM8sRvdbyurKV4Hmoka2WA/iwwLP6d+QmzSdKC92GzK/W9R+Q3woQbHCELcN991wJcjftcpXolngKm18vFmoVonYcgDv0Qz5pqGREuOTuA8lPYUZbndh0LJNpkUqgZx33xvomim7RG+6xSvnOm1gqQXoyiMoKxFs8VZpFfpQHvQK4HDUPnAsBa9bxGP0tUjF+IYCkxFew+/G3owdq20pgjzt3uPRscs/o43IaOhH2f4ZaAPRyZQP6vgbuCbyGext87F0sgIZFI/N8BnlwBnolovcWAjq/uzwM0+55cBJ0UYN84ZL+rfbnLMM4FfUDv7Z1XlCe8FetETbleNL7+CZrnvMjCVDuTOOA84Hf+96ga0PC8qXY50FQsuMg+41+d8p885R4n7gdt8zo+qvDkmUF4fZQXwEbS+99KDMhlWkw0eALqQglXyDDCdcovf+4lv5jPNXJ9zWc/FDMMdPudGVCreRlTWwVtWbynwYVQQCFSp61Q042WJLUjB1nneuw8tvXo97x1Lugvg+j1Mo9boySLVHtJFWqsthx5GlbSGeN5bigrHdqPl52Zj4qWLXvTQWY4KOX2ccgPMBLRcuy9+0YzhguXN4GuYq2Zc2R/NZg+hfYt3/9ZCepdQthmB4vIWIYOTbWyWzGt2Y0izG1fqjlltxnsdpbPMRMmd3lqTTumqMw7FZY5G5mSHw5dalreiRWYGWjbZ7gYUlFa0xOtIWA4vk1E6zWEoI+FvyYrjSAO1FG8DCmQGKd+DJFsGogWVVFiP/GWbga9Svg9NgtPQvnd04fUNCcriSBF+vqZ5nn9PQ+Xs4q401oI6EP0R+BkyXoAeAtcgBfwidnvkVaMVFTO6n1JoWTfqiONw1MVP8e6l3GVwOPJZXW5VItGGiuduAu5CZdOrMQJ1CHqpIFccS+LxaD/3Hcr7vF0Xw7UdAwQ/xduLGkJ6aUMhVAuwU006B3wM+ZLmozJ5QRhWkGs9yjKw1fhwDsq8eE/F+y+i1CeHIxD1wppupXrA5xyUOjQHMzU3cyjTeS2aaaN2Fzoc1bhch3xspuqBTkDulQVUz1q4mYEbNuewQD3FexGFS1VjOLoRHwOOinj9HAooXY2CSidHHKeSI5GFcRWNdSxqR7VH1iHHeTV24R+X53C8hSCBvPPqnD8B+AOygn6OYAm0ORSGthLl8B0d4DtRmIKsoMsJF1U/Hi1dt6DusIN8PrsIlUdwOAITpDFlC6q3MTbgmHm011qGepOvQSXPipyOCujW6rxqk0dRWYsVFe8PRSn5JxWOoEvdfOGzfnF5tnCRK+bGi33MoB1hL0U5d1H5J5oVD6A5mp8sQS6KSWh5e0jEcR4BPmhKqJA4xTM3XuxjBlW8DuRacDU3y0myNbNTPHPjxT5m0GTN15A/zVFiI+HKYzgc/ydMlrRfgmQWuYn0F91xJEQYxVuDnMcOrQAWJi2EI72ErQviwqLEQpQ+5XBEIqzi3YWLwF+BMiMcjshEqYR1Gdk1KmxBsaR9SQviSDdRFK8fxVU+YliWZmcbcq7vSFoQR/qJWvuxD0WgLDYoSzPzAqowtjVhORwDhEaKru4GPoliGgcyy4Hj0DLT4TBCo9WO88jQ8Bns97lLghvRTOfqqDiMYqrM+HyUYdBtaLykeRmlK12C9rQOh1FM1vd/HqUIzaT5e+LVoh/VxByHShs6HFaw0VjjHhTxP5d0LT+fRnu5q3HuAodlbHW02Q5cDByM+sw1642cRylCx6PeZiuTFScUFxK+f19QovaRS+t4tsasxhvABbZbSfUCV6CM7qtQl6Fm4E1U22UqcAYqvZ42fgJMxH6vdYc5nkBlSW6Pq4fbS6hb6jg0u9yGug7FyS5U1+UcVBbwbFSuMM1sQ1bXK4A9CcviqM0e9H80HdUxCpwIa4McygA/GfgAcCJqmGKKXUixupEv7nHsLc2agWNQ0d9OzC+PHNHIo1XeLCoe8kkqXiUtwKFoWXoEKqk3BpWLaC8cXsV8HT1J+tFTZKvn+DMqFZi1knvtyKg1O2lBHADcCVxEedNSAP4HJcsr0NNWHVUAAAAASUVORK5CYII="); + + --keyword: #5e8f60; + --identifier: #222; + --comment: #484a86; + --operator: #155da4; + --punctuation: black; + --other: black; + --escapeSequence: #c4891b; + --number: #252dbe; + --literal: #a4255b; + --program: #6060c0; + --option: #508000; + --raw-data: #a4255b; +} + +[data-theme="dark"] { + --primary-background: #171921; + --secondary-background: #1e202a; + --third-background: #2b2e3b; + --info-background: #008000; + --warning-background: #807000; + --error-background: #c03000; + --border: #0e1014; + --text: #fff; + --anchor: #8be9fd; + --anchor-focus: #8be9fd; + --input-focus: #8be9fd; + --strong: #bd93f9; + --hint: #7A7C85; + --nim-sprite-base64: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARMAAABMCAYAAABOBlMuAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFFmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDggNzkuMTY0MDM2LCAyMDE5LzA4LzEzLTAxOjA2OjU3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTEyLTAzVDAxOjE4OjIyKzAxOjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0xMi0wM1QwMToyMDoxMCswMTowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0xMi0wM1QwMToyMDoxMCswMTowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDplZGViMzU3MC1iNmZjLWQyNDQtYTExZi0yMjc5YmY4NDNhYTAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ZWRlYjM1NzAtYjZmYy1kMjQ0LWExMWYtMjI3OWJmODQzYWEwIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6ZWRlYjM1NzAtYjZmYy1kMjQ0LWExMWYtMjI3OWJmODQzYWEwIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDplZGViMzU3MC1iNmZjLWQyNDQtYTExZi0yMjc5YmY4NDNhYTAiIHN0RXZ0OndoZW49IjIwMTktMTItMDNUMDE6MTg6MjIrMDE6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMS4wIChXaW5kb3dzKSIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4JZNR8AAAfG0lEQVR4nO2deViTZ7r/7yxkJaxJ2MK+GCBAMCwS1kgUFQSKK4XWWqsz1jpjp3b0tDP1V+eqU391fqfT/mpPPd20drTFDS0KFEVWJSGAEgLIZpAICBJACIRs549Rj1WILAkBfD/XlevySp68z/0S3+/7vPdzLyidTgcLkU2bd+z39/f/q1gshsrKSoJELFCa2iaEuU9K6kb+8uXxv54/fzE8L/eswNT2zCfQpjbAGKS8lPFKSEjIXiaTCSEhIeDj4xNnapsQ5j6rktZGp6UlfxIdzQVzCplmanvmG1hTG2BIAtlc26CgoDfT0tL2e3l5AQCAjY0NkMnk/a9s2k6rrKw8UV8n1JjYTIQ5RlAw14KzmL3xze1vfJyUuMJaq9UCFovFm9qu+YbBxcSPFUYkk8l2Q0NDsvo6ocrQx5+I8Ih4bz6f/0l8fHyKlZXV4/dRKBQwmcwwMpn8A4FAoPgHhH9bV1sxa488wZxoaycnJ/a9e/duCa5fkc3WvAiTI4Ib77p+XdqHG9anbfLy8gAAgLGxMdBpF+bjvzExqJj4scKI0dHRnwQHB++orq7+AgDeMuTxJ2Jl4rqU9PT0EwEBAUQCgTDuGAaDAampqYepVKpHUHDk325Ulw0a266YuFW+Gzdu/MDPz29jfn7+XgA4aOw5ESZP6kvpCXv3vnM8NiaSamVl+fj9BepGNDoGFRN7e/slcXFxO1xcXMDJyWnH7j//H/fi4uJdgutXmgw5z5O8smn7X9euXbvf29sbMBjMhONQKBRYWVlBbGzsbjMzM3JoOG+/sKKwy1h2rd/4elpGRsYuLy+vaDweD2w2Oy1h5ZrCvEunEaeeiVnMiabyl/F2/+X9P+8JDPQHHA5napMWBAYTk6DgSNuEhIS9DAYDAP7tq1i6dOkqOp3OWbNu0wens44emeoxA9lcWwKBYEMkEm2JRKIdHo+3QKFQWJ1Op8ZgMER3d/dVq1evTnFycpr0MSkUCsTExGzH4/Gk1LTME/39/TI0Go1FoVCg1WrVY2NjipGRkcGRkRH5dPwrEZHLXMPCwjJSUlIy3dzcfB+97+rqGhYSEpIOAIiYmBguN3zL77dt3uPh4W5qUxYUBhMTb2/vjeHh4cvR6P/dILK0tITIyEg7BweHr363/Z3Ampqaf1Zcu/zMKiVsyVJvMplsRyKR7IhEor2FhYUbhUJhJCYm2pFIJB6JRAIymQx4PB7QaDRoNBowMzMDJycnwOOn7icjEokQGxu7icFgbLp///7jFY1WqwWlUgkjIyOgUCgO7Ni5Rz48PCwfHh7uGRkZeaBQKOSjo6ODCoVCXlNVKn/6uCsT13FXrVr1emho6BYKhfLMnP7+/omrU9LPX8g+UThloxEMxqJFXjxESAyPQcSEExrLWLNmzW57e/txP/fw8ABHR8cdDAaDt3xF2ru9vb03sVgs0cbGxs/FxWVZUlISj0aj+dna2oKtrS1M5PcwJCgUCry8vODRrs84vPfoH6OjoyCXy6Gvr+/R6+CWrX9s7evrk/b19bWr1Wqli4sLZ8OGDe95eXmxUSjUuAd0cHDwjoqK2sYKXFIhvnldYYTTQpgU4/8+jyASCYDGoCd+ZkYYF8OICYezl8PhuOkbQyAQIDo62s/NzS2np6cHbGxsgEajAYFAAAwGA1gsFia6CE0NgUAABwcHsLe3B61WC2q1eo9WqwWNRgNKpRLUajUQiUSgUCh6zwGHwwGTydzo5+eXBQBnZu8MEJ5keHhYPqyYWMtHR0ZBpVIhYj9FUDONgOUvT12+du3avMDAQJjssdRqNWCxCyrEZdLodDoQi8Ulx44de628NL/V1Pa8iERE8l2dHB2CJvpcq9Nqbt1qKURWj1Njxld0ZGTkAW9v70kLCQC8sEIC8O/HKx8fn2gmk8kHgCk7pRFmzrWyAikASE1tx0Jj2uH0EZHL/N7YtuvT4OBgzmz4OBYSeDweIiMjt2S++vtMP1YYEmmJsCCY8mNOIJtr6+zsHBcZGXmIw+G4mZubG8m0hU9HRwcUFxe/KxQKTyDRsQjznSmJCS9+dVRERMTfQ0NDo2xtbfUGiSFMjtHRUaitrc3Jzc09kHvxVLmp7UFAmC6oZQkvrZLL5RJhReHtiQb5scKIXC7371FRUX90dnYGIpE4JR8Jgn40Gg20t7fXFxYWfnr9+vWjz8sdYi+Osh4vzgUBwZSgtu94V+fs7Hx7YGCgra6u7khLS0u2RCwYeTQgKmYFh8fj/f/g4OAldnZ2prR1wdPd3Q1CofBQSUnJkdLi3N8E93FCY6k+Pj48FxcXjlar1ZSWlh65VvYr4kREmDNg79+/D3FxcW5OTk5uXl5evNbW1tL0jK3ZXV1d1ykUintycvInoaGhdkj+gvGxs7MDPp+/m0AgWMQvS/lyeHhYTqPRPJycnIJSU1NZ3t7eW2g0Gly/fv2oWq1Gij0hzClQ/gHhpLS0tEM8Hm/7I8Ho7++HlpYWsLa2Bg8PDxOb+OKhUCigqakJ7t+/D25ubuDu7g4oFAp0Oh08ePAAvv7666TTWUdzTG0nAsKTYMU3ryuSU18+4+bmFrZo0SIOAICVlRUsXrx4zkakLnRIJBI8CgJ8MtdJp9NBZ2enqL29XWRC8xAQxgUNAHD+3L8KGhoaCp78ABES04JCoX4jJAAAAwMDUFtbe96YpRMQEKbL41DU5ubmko6Ojj2PSgggzD36+/vrb9y4cX425zzw93/8EBjon2is44+NjSkePBjqGRwc7G5v7xBV19w8U5B/3qgrr9+/uWtXUuKKD/TZ9MXh/066/OuFmunO8dGBQ98HBbGSp/t9U6LRaDXK0dHBoeFhuVzeL22/0yFqamopufjLqRJ933ssJi0tLSXV1dWHGAzGbuObOzs8ubqa71vZKpUKOjo6blwpOF8zm/Mu5cVkLlkSaswprAHAaVihgK7O7oSGxltvfXLon3nXK4RHT2cdN4pfKDCAlZyUuMJan02nTmczAaBmunPw4qI3cbnh0/36XICq0+lgcPABp7OrK629vUP5z8++LLh2XXD05L++yxrvC4/F5EZ12WBS8saLS5Ys2U2lUufUY45SqQSlUgkqlQrUavXj19jYGGg0GtBoNKDT6UCn05VotVq1TqfToFAojFar1eh0Og0Wi8XhcDgeGo1+/PhgZmYGOBwOsFgsmJmZ/eY1F+nt7YXa2trs2Z73wdCQBgCMHp1IJpHA09MdPD3dLRIS+OtKisvWvbP7vf2lZdePVFwzbHTwyMiI3hidkZFRUKvUYzOZ48HQkBIA5nWqBAqFAktLC7C0tADmIh88Pz4uMSyUk7hn776DV4tKPn/6d/lNxp1MJqsRCASf8vn8XdMpOjRTVCoVjI2NgUqlAq1WCyMjI9DX1wf379+Hvr6+/Q8ePOgdGRmRKxSKx0WLFAqFXKlUKnQ6nUar1arHq47mxwrD4/F4Eg6HI2GxWDwej7cgkUjWFAqFam5uTjU3N6eRyeQPLSwswNraGqysrIBAIDwWFywW+zja11Qi29LSclIikeSZZPJZBovBAI8XA8HBQR9kZZ3lR8cmvFZSlGe00p8IkwONRkNERBj4+i7a4+XpHv307/IbMakWlciXJbx0nMPh7Jqo0JGh0el0MDo6Cl1dXSCVSkEmk7177969W319fe1DQ0M9KpVKoVarlWq1WjndNhUPG3ApAWDcOxLTLwSDwWAOotFoDBaLxRMIBAsrKysne3t7Xzqd7k2n0/c4OzsDlUoFHA4364IyMDAATU1NxdWikhcq6tXKyhJezljPJZKI2eERS5cZeoWCMD2srCwhPX0tVzk2djiCG//GtfLLUoBxShB0dHTU3Lx580sLC4vtJBLJKMZoNBqQSqUglUqPdnR01PT09DT19/fLHjx40DM0NNQ72933GiSVGgB4JFQK+LfoSAGgnL04yppEIh2xtLS0t7GxcaFSqR7Ozs4fMRgMcHR0nJX8pJs3b54Ui8UXjT7RHIRMIkFK8irfwcEHPwQELUmqvYHUGJkLmJubw8YNa/i9vfffY/px3myQiDTPiEl9nVDDX576jaenZ7SnpyfLUJNrNBqQyWRw+/bt4x0dHTdkMlltV1dXw/XygjkdEv4wB0YOAK0AUM70C8HQ6fSzdDrdm0qlejg6OrLc3Ny2MBiMadWjfR4PHjyAmzdvZs/1v5MxoVAokJK8iicWS95k+nH+s0EiQhqpzQGoVFtYk5a87ba0XQAA34xbpagg/5zoT7s/OGNnZ8eaaYkBuVwOnZ2d5VKpVNTS0lLS2NhYWFVZ3Dujg5qQh6uY+ocvCAiKIPn4+Jz19PSMdnV15VCpVL6Dg4NBViw6nQ5EItHRpqamqzM+2DzHzo4O69amftLQeKsAZrDLgmBY/PyYsCIhfs+SiKUFE5Y8EwqFx11cXDihoaFTjjFAoVAwPDwMHR0dourq6jNCofDHhZqUVnvjmgIAcgAgJyg40mLRokX8kJCQjT4+PussLS1n1JPl7t27UFxcfHguB6mNjY2B7G4naNRTWyygUCjAYDGAx+PB0sICSCSi3vFYLBbCwjjA8vddBQtATKb7d3saBwc7IJPJBpsHjUGDGRYLJBIJLK0sAfucmyIGg4FFi3y8AwNZtycUk5KiS02vvf7WWQaDkejg4DApQwAeh3xDaWnpPoFAcPxFqnP6sEvgGf+A8Bx3d/cvIyIiNi1evHjT8wpNj8fAwACUlZW9P9dD5+/ckcFbf9gd2dcnn9LNAovF4inmZHtXNxdOdBR3+/JlS33pdP29wolEInA4weuiYxOy5vvuTkeHDHb+8c8xvb33Z3R9/N+Df+uIjYk02DwkEsna2trS1d/fNyGeF7uTyw1/7g3R3t4O2OxA/TVghULhcQqFQk1JSfmYSNR/5wD4d6EfgUBwvLS09IhUKhW9qAV5H9YjKQwJi6uvrKw8ERoamhkSEpKp7w7yJEqlEiQSyZmysrJv53qjdaVSCZdyTk+3qFMrAJRHRPLPN95qeifj5fU7mYt8JhyMRqMhMJDFdnF25gDAvBYTpXIMWlpay2fq/8m5mDcIABYGnEcGAGI/VlhBZWX1yZdSkz55OX0dV5+7w9bGGvz8mPrFpK62QskJjf2GTqd7x8bGbpnID4BCoUAmk0lLSkqOiESik2UleS/MakQflYKrXQDQxY1a3tTe3i6KiIjY5OXlxX7e9+rr6wsuXbr0t4ffn9OgMWjghMZQRcLp+8GulRVI/QPC37Wxtnal0ajJtjY2E451ZjiBra31vE9lR2PQQKFQaAAwo98Yi8Xq9fpPd56HO6rlvKWJv/PwcK+JilyCmajWMw6HAzs7+rMFpQOCIn6zHywSFvXm5eUdFAqFZ9Rq9bgHa2trq79w4cK+zz49cAARkmcpL81v/a/Dhz49d+7c3qqqqjyVSjXuOJ1OBxKJpDw3N/fA5V+zax6978cKw/sHhM/raMrnUVdboSy4fPWQSFSjd5yFBQWIRNKEd2IEw1J4JUd88WL+R51d3XrHWVDMnxUTa2tr1zXrNiUGsrmPf7DS4tymCxcu7Kuurs55+kKQSqVN586d23vs+8NHDXUCC5Wzp3/Iy8rKeruysvLM2Nhvo7VVKhXU1tYWnj17du/T7UOdnZ2D7OzsfGGB09raVi4S1RzXl0eFw+EAj8chYjKLVFffyOrq1C8mJBLpWTFRKBRyDofzC4vFWvXk+1ev/CLOzs7eKxAIslQqFeh0Oujp6enKzs7em/XTd7OayTqfKb56sT4rK+sPAoHg5KO/o0KhAKFQmHXy5MkdF3/5+TeZmctXpIXZ29v7zqVcKWNRX1epuXu3U/y8pEw0GmndOZt0dnXVDw0P6/W5oNHoZ30mQ0NDPb29vfvj4+Pf3rR5B/7od188XnEUXr4gDgmL+0NfX5/U19d3d3l5+YGfTnyDtLmcIhXXLsu4UcvfR6PRGGtra9eysrIjYrE45+kt4Fheou/69es/unnz5vm7d+/Wmsre2WRkZGTQ1DYg/JYGiUiTm1ugBAC9IfHPiEmDpFITE7fqJI/H27lmzZpDq5LWtz55t6wUXO3ihMYerK+vz2tpaUFaM0yT8tL81ujYle+TSCTrvEunBU9/voTLd92wYcPHVCqV39XVdXCu7+oYCp1O90Kc50Jk3I5+xVcv1jc3N5d4enpSMzIyvkpK3sh78nORsKg3++yPBS/q1q+hKCm61DSekERGJ3ikp6d/ERsbm1xVVXWwtbX1hRFtFAqFPMLMUyZsDyoQCI7LZDKIiIjwzczM/GpV0vro2TTsRSUqZoX3+vXrP1u9enXi0NAQiESirIdRtggIc5oJ40zq6uryGhoa8ry8vBJCQ0O9USjU94mrN7yWc+EnvaXb5gJMvxCMp6cnl0Kh2Le1tZVXXLs8L1LXefGrWRkZGZ/x+XyeUqkEkUh0vqenZ14HZyG8OEwoJjdrygd37NxTEBkZmWBtbQ3BwcEeKBTq+/UbX3/355Pfzlmn66qk9dGbN29+k8PhbCSRSNDZ2Snb9ae/HCkpKTksEhbN2QTD5NSX+Vu3bj0cHBzsjcFg4O7du1BWVvbNwxB9BIQ5j94I2Fu3bhXW19cDl8sFLBYLHA7Hg0wmf/e77e84ffXlPz6fLSMnQ2paZkJ4eHjmtm3b+B4eHvZkMhlQKBTY29s72dvbfxgUFJT8x7ffP1NRUfHjXErnZ/qFYKKjo7dt3rz5g8DAQPtH/XHa2tpqGhsbC55/BASEuYFeMblz505NTU3NgfDw8PcwGAygUCjw9fW1IJPJn/1130Hv0tLSI4WXL4hny9inYS+Osvbz80tgMpn8jIwMPovFch2vpoiDgwM4ODhwfH19OYsWLeJv3/Hu+cbGxquzXZz5aZYlvMRJT0/fFhkZue3JZmfd3d0gEolOIr4ShPmEXjFpkFRqXlrzSnFnZ+d7Tk5OjzNfXVxcICMjY6ezszNnVdL6vU8HWhmbgKAIkrOzMyc1NTXz0YU4maAuOp0OK1as4EVFRfGEQqHg1dfePHzr1q2rs71S8WOF4f38/BLS09M/iIyM5DxdxLq5uVlcVVU1bgVwBIS5il4xAQCQyWRigUBwJikpKe3JVGQcDgdLly7l2tranti0ecf7IpEoy9hbxX6sMDydTvdevXr1ltjY2F3u7u6AxT73FJ7B3Nwc4uLiwthsdphQKCzZkL7l0/r6+oKbNeVG90+EhMXZL1++fFtycvKHrq6uz4igUqmE5ubmEiTHCWG+8dwrUXD9imz9xtd/jIuLS7N5KpsTjUZDUFCQE4PB+F4oFGYmJW888Mv5k4UTHGpGxC9LYaenp78VEhKyxdHRESgUyoyOh0KhwNraGuLi4qIDAgKi6+rqyjekb/mHMSN6N6RvSdu+ffseNpsdZm09ftuW+vp6EIvFSB9hhHnHpG7rUqm0orW1tdXS0tLj6TIEaDQaaDQaxMfH811dXTl/3Xfw+JUrVz411J01cfWG6IiIiC07d+5McHNzs7ewMGyOFw6HAwcHB6BSqVx3d/fwz7/4rkAgEBwXCoUnHpZonDGrU9J5MTEx27du3Zrm4uKC0beaqq6u/ry+vj7XEPMiIMwmkxKTimuXZe/u+fCkp6fnexPdUfF4PPj7+1szGIydLi4unF1/+kvenTt3RG1tbRXTqfma8lIG39/fP/HVV19NZrFYHpMpzjQTzMzMwNPTE+Pp6Zng6emZ4Ofnl5CesfV8bW1tznQe3/wDwvFeXl7Rvr6+Ca+88kpaUFCQh74GXzqdDrq7u6GpqankRQmdR1hYTNrhUFVVlcXj8d6ysrKy0OfstLS0hPj4eC6Xy+U2NzeDRCI5/sa2XeX37t1rGhwc7BoYGJBN1P+FFbiE5OzszGaxWImvvvrqpoCAAKfp+ERmCpPJBCaTmcnhcDJLS0u/TE59+YxUKhXoi/lg+oVgrKysGJaWlna2trYeaWlpXDabvTMgIGDSfp2KiorzbW1tL0zoPMLCYtJX6uVfs2u++PKowMPDgz+ZIslEIhECAgKAxWJlajSazJ6eHmhra4PW1tZvtmz9o6Czs7O+r6+vfWxsbFir1WosLCzsV6xYkcnj8d7z9vaelmPV0Hh5eYGnp+f2mJiY7UVFRZ/HL0v5tru7+5ZGo1FisVg8Docj4fF4CxsbG1c+nx/m7e39sYeHB7i4uIC5ufmU6r4ODQ1BZWXlifkSrYuA8DRTumIrKytPent78728vCb9HRQKBVgsFhwcHIBOpwObzd4yNja2RaVSwdDQEHR1dcHo6CjQaDRwdXWdsWPV0KBQKPDw8AA7O7udERERO2tra2FgYACoVCo4OTkBjUYDMpkMeDz+8WuqaLVaaGxsbL19+/YzSX8ICPOFqYrJidDQ0AwvLy/e80c/CwaDARKJBI86BdJoNHB3dwe1Wj0nViL6IJPJwGQywdnZGZRKJRAIBDBUx8OBgQEoLS39BtkORpjPTJg1PB61N64pmpqarvb39xvUiLkuJE9CJpPBxsbGYEICANDZ2SlHgtQQ5jtTEhMAgLq6ulyJRFJvDGNeREZGRkAikRSUFuci2cEI85opi0l+7hmBWCzOeV6dToTJcfv27cHr168jxbgR5j1TFhMAgObm5hKZDNl0MAQtLS3Xzpw6hkS8Isx7piUmUqlUIBAIJuyjgzA5Ojs7QSKRINGuCAuCaYmJsKKw68qVK59KJJIu5HFneiiVSigqKjouEolOmtoWBARDMC0xAQC4+MvPJadOnXq3ra1N8yL0dDEkOp0OSktLy/Pz8w8+3d4CAWG+Mm0xAQA4fuy/jl+8ePGju3fvGsqeBY9Wq4XKysrWU6dOvX31yi8mKyyFgGBoZiQmAAD/79D+fadPn96PCMrz0el0UFVV1frtt9+mj9fiAgFhPjNjMQEAyMvLO3Ds2LE/tLS0INmuerh27Vr9999//xoiJAgLEYOEntbVVigB4PNNm3cMpqSkfMRms50McdyFgkqlgqKiovJTp069nZ97BhEShAWJQePYj373xdF1GzbLFQrFx6Ghob766ne8KNy7dw+KiopO5ubmfmTK4tsICMbG4EkxWT99d35l4rre/v7+D0NCQvh0Ot3QU8wL1Go1SKVSTX5+/sH8/PyDSP8bhIWOUTLsLuVklQcFR65pbGzcvnLlyvfc3NwsCASCMaaac+h0OhgaGoLq6uqaCxcu/OV01tGcTw7uM7VZCAhGx2jpug/vxAd58atzoqKitq1cuXKnvb29saabE+h0Oqiurpbm5eUdrK6uPlspuDrvY0hmO4YIhUIBGq1/X2CmNqFQKL3/79HomZ/z82xEowyy9zFr80zGDqPn/hdeviBmL47ad+fOnRsRERGbQkNDo62srIw97azT2dkJxcXFx0tKSo7Mdh8hY4LD4TDPH2U4MFjMc6tLmZmZzaj+Aw6H0/t9PB4PGCxmRudNJBL0ngeZTAI0Gj3jv+1szfM88Hic8cUEAKCmqlQOAN/ELU2qkEgkySwWK3HRokVcBoMxG9MbDZ1OB83NzdDU1FRQW1t7XiAQHJ+ovu18pbr6Rg6L5ZtoM0EhcUPT0tJW8tWRb0vQqIkvgKqqmhnVfrl2TfANXo+gjKlUio4OWc1M5sjOzjnQUH8rbqLPu3t6moaGhmfc+3q25tGHUqmECoEIUKbIrVkcEkONiIh4jcvlvu7s7OxLo9GmVe7QVCgUCujq6oKGhoaCioqKo9XV1WeM3YDMVPDik1gpyas+XrVyeaKXl8czjyANjbcgI/MNmkg49Q4ECPOH3NyC4RUr+M8IcHt7B1y9WlKRl3/5kElKnD1sfXEoJCzueEBAQGJYWFgGk8nk2djYAIFAgLm4pTw6Ogqjo6Mgl8vhxo0b50tLS4/U19fnLvS2FIWXfxEDQNLmLW9ueW1TxtchHDaQyWRTm4VgYkZHR6G+vhF+/NfP+y5e+vVjiVgwZpKVydOwF0dZW1lZOTGZTD6bzU4LCAiIptPp8HTDL1MwOjoKLS0tUFdXd1IsFudIpdKKgYGB7tloJTrX4MUnsVJTEj9etzY10dHRAQAAGm81wcsZW5CVyQInL69gNCGBjwcAGBx8ANnncypOnTr3H9nn/reD55wovvrQpyIHAHFUzIocGo3mQaPRfBwdHVlubm7bXF1dgcFgABqNNvruglwuh7t374JMJoOOjo7P79y5I+ru7m7q7e1tXQi7MzOh8PIv4pCw2DdaWtte37Au7aPIyCWAxWABjUbPif9HCMbjURtKiaQBfvr5zH9evlJ0uLQ4r/nJMXNiZTIRrMAlJAcHB18HBweWo6Mjy8rKajeJRAJLS0uwtLQECwsLoFAogMfjAYvFgpmZ2XNXMyqVCoaHh2FoaAiGh4cfvwYGBqCvrw+6u7vfvnfvXlNvb29rT09Pq0QsUM7S6c4rNqS/lrZ5U+YPRBKR9M7u9xwqBUUvtNAudH766XSLE8PR49ixE78/8tVnX403Zk7fUR46NUUAIPIPCMdTKJTdNjY2QKPRgE6nA51OB1tbWyCRSIDD4YBAIAAejwcCgfDYUajVakGlUoFarQadTvfY79HX1wf9/f0gl8tBLpfDvXv3HvXw+dxQPYYXMj+d+P7Mmzv+5OHr6/OJWq1GBHeB09TcUiKuq/coKS3/eqIx/wPkiIXC3w6YjAAAAABJRU5ErkJggg=="); + + --keyword: #ff79c6; + --identifier: #f8f8f2; + --comment: #6272a4; + --operator: #ff79c6; + --punctuation: #f8f8f2; + --other: #f8f8f2; + --escapeSequence: #bd93f9; + --number: #bd93f9; + --literal: #f1fa8c; + --program: #9090c0; + --option: #90b010; + --raw-data: #8be9fd; +} + +.theme-switch-wrapper { + display: flex; + align-items: center; +} + +.theme-switch-wrapper em { + margin-left: 10px; + font-size: 1rem; +} + +.theme-switch { + display: inline-block; + height: 22px; + position: relative; + width: 50px; +} + +.theme-switch input { + display: none; +} + +.slider { + background-color: #ccc; + bottom: 0; + cursor: pointer; + left: 0; + position: absolute; + right: 0; + top: 0; + transition: .4s; +} + +.slider:before { + background-color: #fff; + bottom: 4px; + content: ""; + height: 13px; + left: 4px; + position: absolute; + transition: .4s; + width: 13px; +} + +input:checked + .slider { + background-color: #66bb6a; +} + +input:checked + .slider:before { + transform: translateX(26px); +} + +.slider.round { + border-radius: 17px; +} + +.slider.round:before { + border-radius: 50%; +} + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; } + +body { + font-family: "Lato", "Helvetica Neue", "HelveticaNeue", Helvetica, Arial, sans-serif; + font-weight: 400; + font-size: 1.125em; + line-height: 1.5; + color: var(--text); + background-color: var(--primary-background); } + +/* Skeleton grid */ +.container { + position: relative; + width: 100%; + max-width: 1050px; + margin: 0 auto; + padding: 0; + box-sizing: border-box; } + +.column, +.columns { + width: 100%; + float: left; + box-sizing: border-box; + margin-left: 1%; +} + +.column:first-child, +.columns:first-child { + margin-left: 0; } + +.three.columns { + width: 22%; +} + +.nine.columns { + width: 77.0%; } + +.twelve.columns { + width: 100%; + margin-left: 0; } + +@media screen and (max-width: 860px) { + .three.columns { + display: none; + } + .nine.columns { + width: 98.0%; + } + body { + font-size: 1em; + line-height: 1.35; + } +} + +cite { + font-style: italic !important; } + + +/* Nim search input */ +div#searchInputDiv { + margin-bottom: 1em; +} +input#searchInput { + width: 80%; +} + +/* + * Some custom formatting for input forms. + * This also fixes input form colors on Firefox with a dark system theme on Linux. + */ +input { + -moz-appearance: none; + background-color: var(--secondary-background); + color: var(--text); + border: 1px solid var(--border); + font-family: "Lato", "Helvetica Neue", "HelveticaNeue", Helvetica, Arial, sans-serif; + font-size: 0.9em; + padding: 6px; +} + +input:focus { + border: 1px solid var(--input-focus); + box-shadow: 0 0 3px var(--input-focus); +} + +select { + -moz-appearance: none; + background-color: var(--secondary-background); + color: var(--text); + border: 1px solid var(--border); + font-family: "Lato", "Helvetica Neue", "HelveticaNeue", Helvetica, Arial, sans-serif; + font-size: 0.9em; + padding: 6px; +} + +select:focus { + border: 1px solid var(--input-focus); + box-shadow: 0 0 3px var(--input-focus); +} + +/* Docgen styles */ + +:target { + border: 2px solid #B5651D; + border-style: dotted; +} + +/* Links */ +a { + color: var(--anchor); + text-decoration: none; +} + +a span.Identifier { + text-decoration: underline; + text-decoration-color: #aab; +} + +a.reference-toplevel { + font-weight: bold; +} + +a.toc-backref { + text-decoration: none; + color: var(--text); } + +a.link-seesrc { + color: #607c9f; + font-size: 0.9em; + font-style: italic; } + +a:hover, +a:focus { + color: var(--anchor-focus); + text-decoration: underline; } + +a:hover span.Identifier { + color: var(--anchor); +} + + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; } + +sup { + top: -0.5em; } + +sub { + bottom: -0.25em; } + +img { + width: auto; + height: auto; + max-width: 100%; + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; } + +@media print { + * { + color: black !important; + text-shadow: none !important; + background: transparent !important; + box-shadow: none !important; } + + a, + a:visited { + text-decoration: underline; } + + a[href]:after { + content: " (" attr(href) ")"; } + + abbr[title]:after { + content: " (" attr(title) ")"; } + + .ir a:after, + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: ""; } + + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; } + + thead { + display: table-header-group; } + + tr, + img { + page-break-inside: avoid; } + + img { + max-width: 100% !important; } + + @page { + margin: 0.5cm; } + + h1 { + page-break-before: always; } + + h1.title { + page-break-before: avoid; } + + p, + h2, + h3 { + orphans: 3; + widows: 3; } + + h2, + h3 { + page-break-after: avoid; } +} + + +p { + margin-top: 0.5em; + margin-bottom: 0.5em; +} + +small { + font-size: 85%; } + +strong { + font-weight: 600; + font-size: 0.95em; + color: var(--strong); +} + +em { + font-style: italic; } + +h1 { + font-size: 1.8em; + font-weight: 400; + padding-bottom: .25em; + border-bottom: 6px solid var(--third-background); + margin-top: 2.5em; + margin-bottom: 1em; + line-height: 1.2em; } + +h1.title { + padding-bottom: 1em; + border-bottom: 0px; + font-size: 2.5em; + text-align: center; + font-weight: 900; + margin-top: 0.75em; + margin-bottom: 0em; +} + +h2 { + font-size: 1.3em; + margin-top: 2em; } + +h2.subtitle { + margin-top: 0em; + text-align: center; } + +h3 { + font-size: 1.125em; + font-style: italic; + margin-top: 1.5em; } + +h4 { + font-size: 1.125em; + margin-top: 1em; } + +h5 { + font-size: 1.125em; + margin-top: 0.75em; } + +h6 { + font-size: 1.1em; } + + +ul, +ol { + padding: 0; + margin-top: 0.5em; + margin-left: 0.75em; } + +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; + margin-left: 1.25em; } + +ul.simple > li { + list-style-type: circle; +} + +ul.simple-boot li { + list-style-type: none; + margin-left: 0em; + margin-bottom: 0.5em; +} + +ol.simple > li, ul.simple > li { + margin-bottom: 0.2em; + margin-left: 0.4em } + +ul.simple.simple-toc > li { + margin-top: 1em; +} + +ul.simple-toc { + list-style: none; + font-size: 0.9em; + margin-left: -0.3em; + margin-top: 1em; } + +ul.simple-toc > li { + list-style-type: none; +} + +ul.simple-toc-section { + list-style-type: circle; + margin-left: 0.8em; + color: #6c9aae; } + +ul.nested-toc-section { + list-style-type: circle; + margin-left: -0.75em; + color: var(--text); +} + +ul.nested-toc-section > li { + margin-left: 1.25em; +} + + +ol.arabic { + list-style: decimal; } + +ol.loweralpha { + list-style: lower-alpha; } + +ol.upperalpha { + list-style: upper-alpha; } + +ol.lowerroman { + list-style: lower-roman; } + +ol.upperroman { + list-style: upper-roman; } + +ul.auto-toc { + list-style-type: none; } + + +dl { + margin-bottom: 1.5em; } + +dt { + margin-bottom: -0.5em; + margin-left: 0.0em; } + +dd { + margin-left: 2.0em; + margin-bottom: 3.0em; + margin-top: 0.5em; } + + +hr { + margin: 2em 0; + border: 0; + border-top: 1px solid #aaa; } + +hr.footnote { + width: 25%; + border-top: 0.15em solid #999; + margin-bottom: 0.15em; + margin-top: 0.15em; +} +div.footnote-group { + margin-left: 1em; } +div.footnote-label { + display: inline-block; + min-width: 1.7em; +} + +div.option-list { + border: 0.1em solid var(--border); +} +div.option-list-item { + padding-left: 12em; + padding-right: 0; + padding-bottom: 0.3em; + padding-top: 0.3em; +} +div.odd { + background-color: var(--secondary-background); +} +div.option-list-label { + margin-left: -11.5em; + margin-right: 0em; + min-width: 11.5em; + display: inline-block; + vertical-align: top; +} +div.option-list-description { + width: calc(100% - 1em); + padding-left: 1em; + padding-right: 0; + display: inline-block; +} + +blockquote { + font-size: 0.9em; + font-style: italic; + padding-left: 0.5em; + margin-left: 0; + border-left: 5px solid #bbc; +} + +.pre, span.tok { + font-family: "Source Code Pro", Monaco, Menlo, Consolas, "Courier New", monospace; + font-weight: 500; + font-size: 0.85em; + color: var(--text); + background-color: var(--third-background); + padding-left: 3px; + padding-right: 3px; + border-radius: 4px; +} + +span.tok { + border: 1px solid #808080; + padding-bottom: 0.1em; + margin-right: 0.2em; +} + +pre { + font-family: "Source Code Pro", Monaco, Menlo, Consolas, "Courier New", monospace; + color: var(--text); + font-weight: 500; + display: inline-block; + box-sizing: border-box; + min-width: 100%; + padding: 0.5em; + margin-top: 0.5em; + margin-bottom: 0.5em; + font-size: 0.85em; + white-space: pre !important; + overflow-y: hidden; + overflow-x: visible; + background-color: var(--secondary-background); + border: 1px solid var(--border); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; } + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; } + + +/* Nim line-numbered tables */ +.line-nums-table { + width: 100%; + table-layout: fixed; } + +table.line-nums-table { + border-radius: 4px; + border: 1px solid #cccccc; + background-color: ghostwhite; + border-collapse: separate; + margin-top: 15px; + margin-bottom: 25px; } + +.line-nums-table tbody { + border: none; } + +.line-nums-table td pre { + border: none; + background-color: transparent; } + +.line-nums-table td.blob-line-nums { + width: 28px; } + +.line-nums-table td.blob-line-nums pre { + color: #b0b0b0; + -webkit-filter: opacity(75%); + filter: opacity(75%); + text-align: right; + border-color: transparent; + background-color: transparent; + padding-left: 0px; + margin-left: 0px; + padding-right: 0px; + margin-right: 0px; } + + +table { + max-width: 100%; + background-color: transparent; + margin-top: 0.5em; + margin-bottom: 1.5em; + border-collapse: collapse; + border-color: var(--third-background); + border-spacing: 0; + font-size: 0.9em; +} + +table th, table td { + padding: 0px 0.5em 0px; + border-color: var(--third-background); +} + +table th { + background-color: var(--third-background); + border-color: var(--third-background); + font-weight: bold; } + +table th.docinfo-name { + background-color: transparent; + text-align: right; +} + +table tr:hover { + background-color: var(--third-background); } + + +/* rst2html default used to remove borders from tables and images */ +.borderless, table.borderless td, table.borderless th { + border: 0; } + +table.borderless td, table.borderless th { + /* Override padding for "table.docutils td" with "! important". + The right padding separates the table cells. */ + padding: 0 0.5em 0 0 !important; } + +.admonition { + padding: 0.3em; + background-color: var(--secondary-background); + border-left: 0.4em solid #7f7f84; + margin-bottom: 0.5em; + -webkit-box-shadow: 0 5px 8px -6px rgba(0,0,0,.2); + -moz-box-shadow: 0 5px 8px -6px rgba(0,0,0,.2); + box-shadow: 0 5px 8px -6px rgba(0,0,0,.2); +} +.admonition-info { + border-color: var(--info-background); +} +.admonition-info-text { + color: var(--info-background); +} +.admonition-warning { + border-color: var(--warning-background); +} +.admonition-warning-text { + color: var(--warning-background); +} +.admonition-error { + border-color: var(--error-background); +} +.admonition-error-text { + color: var(--error-background); +} + +.first { + /* Override more specific margin styles with "! important". */ + margin-top: 0 !important; } + +.last, .with-subtitle { + margin-bottom: 0 !important; } + +.hidden { + display: none; } + +blockquote.epigraph { + margin: 2em 5em; } + +dl.docutils dd { + margin-bottom: 0.5em; } + +object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] { + overflow: hidden; } + + +div.figure { + margin-left: 2em; + margin-right: 2em; } + +div.footer, div.header { + clear: both; + text-align: center; + color: #666; + font-size: smaller; } + +div.footer { + padding-top: 5em; +} + +div.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; } + +div.line-block div.line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; } + +div.topic { + margin: 2em; } + +div.search_results { + background-color: var(--third-background); + margin: 3em; + padding: 1em; + border: 1px solid #4d4d4d; +} + +div#global-links ul { + margin-left: 0; + list-style-type: none; +} + +div#global-links > simple-boot { + margin-left: 3em; +} + +hr.docutils { + width: 75%; } + +img.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; } + +img.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; } + +img.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; } + +.align-left { + text-align: left; } + +.align-center { + clear: both; + text-align: center; } + +.align-right { + text-align: right; } + +/* reset inner alignment in figures */ +div.align-right { + text-align: inherit; } + +p.attribution { + text-align: right; + margin-left: 50%; } + +p.caption { + font-style: italic; } + +p.credits { + font-style: italic; + font-size: smaller; } + +p.label { + white-space: nowrap; } + +p.rubric { + font-weight: bold; + font-size: larger; + color: maroon; + text-align: center; } + +p.topic-title { + font-weight: bold; } + +pre.address { + margin-bottom: 0; + margin-top: 0; + font: inherit; } + +pre.literal-block, pre.doctest-block, pre.math, pre.code { + margin-left: 2em; + margin-right: 2em; } + +pre.code .ln { + color: grey; } + +/* line numbers */ +pre.code, code { + background-color: #eeeeee; } + +pre.code .comment, code .comment { + color: #5c6576; } + +pre.code .keyword, code .keyword { + color: #3B0D06; + font-weight: bold; } + +pre.code .literal.string, code .literal.string { + color: #0c5404; } + +pre.code .name.builtin, code .name.builtin { + color: #352b84; } + +pre.code .deleted, code .deleted { + background-color: #DEB0A1; } + +pre.code .inserted, code .inserted { + background-color: #A3D289; } + +span.classifier { + font-style: oblique; } + +span.classifier-delimiter { + font-weight: bold; } + +span.problematic { + color: #b30000; } + +span.section-subtitle { + /* font-size relative to parent (h1..h6 element) */ + font-size: 80%; } + +span.DecNumber { + color: var(--number); } + +span.BinNumber { + color: var(--number); } + +span.HexNumber { + color: var(--number); } + +span.OctNumber { + color: var(--number); } + +span.FloatNumber { + color: var(--number); } + +span.Identifier { + color: var(--identifier); } + +span.Keyword { + font-weight: 600; + color: var(--keyword); } + +span.StringLit { + color: var(--literal); } + +span.LongStringLit { + color: var(--literal); } + +span.CharLit { + color: var(--literal); } + +span.EscapeSequence { + color: var(--escapeSequence); } + +span.Operator { + color: var(--operator); } + +span.Punctuation { + color: var(--punctuation); } + +span.Comment, span.LongComment { + font-style: italic; + font-weight: 400; + color: var(--comment); } + +span.RegularExpression { + color: darkviolet; } + +span.TagStart { + color: darkviolet; } + +span.TagEnd { + color: darkviolet; } + +span.Key { + color: #252dbe; } + +span.Value { + color: #252dbe; } + +span.RawData { + color: var(--raw-data); } + +span.Assembler { + color: #252dbe; } + +span.Preprocessor { + color: #252dbe; } + +span.Directive { + color: #252dbe; } + +span.option { + font-weight: bold; + font-family: "Source Code Pro", Monaco, Menlo, Consolas, "Courier New", monospace; + color: var(--option); +} + +span.Prompt { + font-weight: bold; + color: red; } + +span.ProgramOutput { + font-weight: bold; + color: #808080; } + +span.program { + font-weight: bold; + color: var(--program); + text-decoration: underline; + text-decoration-color: var(--hint); + text-decoration-thickness: 0.05em; + text-underline-offset: 0.15em; +} + +span.Command, span.Rule, span.Hyperlink, span.Label, span.Reference, +span.Other { + color: var(--other); } + +/* Pop type, const, proc, and iterator defs in nim def blocks */ +dt pre > span.Identifier, dt pre > span.Operator { + color: var(--identifier); + font-weight: 700; } + +dt pre > span.Keyword ~ span.Identifier, dt pre > span.Identifier ~ span.Identifier, +dt pre > span.Operator ~ span.Identifier, dt pre > span.Other ~ span.Identifier { + color: var(--identifier); + font-weight: inherit; } + +/* Nim sprite for the footer (taken from main page favicon) */ +.nim-sprite { + display: inline-block; + width: 51px; + height: 14px; + background-position: 0 0; + background-size: 51px 14px; + -webkit-filter: opacity(50%); + filter: opacity(50%); + background-repeat: no-repeat; + background-image: var(--nim-sprite-base64); + margin-bottom: 5px; } + +span.pragmadots { + /* Position: relative frees us up to make the dots + look really nice without fucking up the layout and + causing bulging in the parent container */ + position: relative; + /* 1px down looks slightly nicer */ + top: 1px; + padding: 2px; + background-color: var(--third-background); + border-radius: 4px; + margin: 0 2px; + cursor: pointer; + font-size: 0.8em; +} + +span.pragmadots:hover { + background-color: var(--hint); +} +span.pragmawrap { + display: none; +} + +span.attachedType { + display: none; + visibility: hidden; +} diff --git a/api/theindex.html b/api/theindex.html new file mode 100644 index 00000000..4d2170be --- /dev/null +++ b/api/theindex.html @@ -0,0 +1,5238 @@ + + + + + + + + + + + + + + + + + + +Index + + + + + + + + +
+
+

Index

+ Modules: chronos/asyncsync, chronos/bipbuffer, chronos/config, chronos/debugutils, chronos/futures, chronos/handles, chronos/internal/asyncengine, chronos/internal/asyncfutures, chronos/internal/asyncmacro, chronos/internal/errors, chronos/internal/raisesfutures, chronos/osdefs, chronos/oserrno, chronos/osutils, chronos/selectors2, chronos/sendfile, chronos/srcloc, chronos/streams/asyncstream, chronos/streams/chunkstream, chronos/timer, chronos/transports/common, chronos/transports/datagram, chronos/transports/ipnet, chronos/transports/osnet, chronos/transports/stream.

API symbols

+
`$`:
+
`>=`:
+
`>`:
+
`<=`:
+
`<`:
+
`*`:
+
`+=`:
+
`+`:
+
`-=`:
+
`-`:
+
`==`:
+
`[]=`:
+
`[]`:
+
`and`:
+
`div`:
+
`not`:
+
`or`:
+
accept:
+
accept4:
+
acceptConn:
+
acquire:
+
addCallback:
+
addFirst:
+
addFirstNoWait:
+
addLast:
+
addLastNoWait:
+
addReader2:
+
address:
+
AddressFamily:
+
addTimer:
+
addTracker:
+
addWriter2:
+
AF_NETLINK:
+
AF_PACKET:
+
all:
+
allFinished:
+
allFutures:
+
AllFutureStates:
+
AnyAddress:
+
AnyAddress6:
+
ARPHRD_ARCNET:
+
ARPHRD_ATM:
+
ARPHRD_CISCO:
+
ARPHRD_CSLIP:
+
ARPHRD_CSLIP6:
+
ARPHRD_EETHER:
+
ARPHRD_ETHER:
+
ARPHRD_FRAD:
+
ARPHRD_HDLC:
+
ARPHRD_HIPPI:
+
ARPHRD_IEEE1394:
+
ARPHRD_IEEE80211:
+
ARPHRD_IEEE80211_PRISM:
+
ARPHRD_IEEE80211_RADIOTAP:
+
ARPHRD_LAPB:
+
ARPHRD_LOOPBACK:
+
ARPHRD_PPP:
+
ARPHRD_SLIP:
+
ARPHRD_SLIP6:
+
async:
+
AsyncBuffer:
+
AsyncBufferRef:
+
AsyncCallback:
+
asyncCheck:
+
AsyncDescriptorDefault:
+
asyncDiscard:
+
AsyncError:
+
AsyncEvent:
+
AsyncEventQueue:
+
AsyncEventQueueFullError:
+
AsyncExceptionError:
+
AsyncFD:
+
asyncInvalidPipe:
+
asyncInvalidSocket:
+
AsyncLock:
+
AsyncLockError:
+
AsyncQueue:
+
AsyncQueueEmptyError:
+
AsyncQueueFullError:
+
asyncSpawn:
+
AsyncStream:
+
AsyncStreamDefaultBufferSize:
+
AsyncStreamDefaultQueueSize:
+
AsyncStreamError:
+
AsyncStreamIncompleteError:
+
AsyncStreamIncorrectDefect:
+
AsyncStreamLimitError:
+
AsyncStreamReader:
+
AsyncStreamReadError:
+
AsyncStreamReaderTrackerName:
+
AsyncStreamRW:
+
AsyncStreamState:
+
AsyncStreamUseClosedError:
+
AsyncStreamWriteEOFError:
+
AsyncStreamWriteError:
+
AsyncStreamWriter:
+
AsyncStreamWriterTrackerName:
+
AsyncTimeoutError:
+
asyncTimer:
+
atEof:
+
availSpace:
+
await:
+
awaitne:
+
BipBuffer:
+
Broadcast:
+
broadcast:
+
callback=:
+
CallbackFunc:
+
callIdle:
+
callSoon:
+
cancel:
+
cancelAndSchedule:
+
cancelAndWait:
+
cancelCallback=:
+
cancelled:
+
CancelledError:
+
cancelSoon:
+
checkClosed:
+
checkRaises:
+
checkStreamClosed:
+
checkStreamFinished:
+
checkWriteEof:
+
chronosDumpAsync:
+
chronosEventEngine:
+
chronosEventsCount:
+
chronosFutureId:
+
chronosFutureTracking:
+
chronosHandleException:
+
chronosHasRaises:
+
chronosInitialSize:
+
chronosMoveSink:
+
chronosProcShell:
+
chronosStackTrace:
+
chronosStreamDefaultBufferSize:
+
chronosStrictFutureAccess:
+
chronosTLSSessionCacheBufferSize:
+
chronosTransportDefaultBufferSize:
+
ChunkedStreamError:
+
ChunkedStreamIncompleteError:
+
ChunkedStreamProtocolError:
+
ChunkedStreamReader:
+
ChunkedStreamWriter:
+
clear:
+
clearTimer:
+
close:
+
Closed:
+
closed:
+
Closed:
+
closed:
+
closeFd:
+
closeHandle:
+
closeSocket:
+
closeWait:
+
Closing:
+
cmp:
+
commit:
+
complete:
+
completed:
+
connect:
+
consume:
+
contains:
+
copyOut:
+
createAsyncPipe:
+
createAsyncSocket:
+
createAsyncSocket2:
+
createOsPipe:
+
createStreamServer:
+
DatagramCallback:
+
DatagramTransport:
+
Day:
+
days:
+
dec:
+
DefaultBacklogSize:
+
DefaultDatagramBufferSize:
+
DefaultStreamBufferSize:
+
DescriptorFlag:
+
DgramTransportTrackerName:
+
done:
+
DualStackType:
+
dumpPendingFutures:
+
Duration:
+
E2BIG:
+
EACCES:
+
EADDRINUSE:
+
EADDRNOTAVAIL:
+
EADV:
+
EAFNOSUPPORT:
+
EAGAIN:
+
EALREADY:
+
EBADE:
+
EBADF:
+
EBADFD:
+
EBADMSG:
+
EBADR:
+
EBADRQC:
+
EBADSLT:
+
EBFONT:
+
EBUSY:
+
ECANCELED:
+
ECHILD:
+
ECHRNG:
+
ECOMM:
+
ECONNABORTED:
+
ECONNREFUSED:
+
ECONNRESET:
+
EDEADLK:
+
EDEADLOCK:
+
EDESTADDRREQ:
+
EDOM:
+
EDOTDOT:
+
EDQUOT:
+
EEXIST:
+
EFAULT:
+
EFBIG:
+
EFD_CLOEXEC:
+
EFD_NONBLOCK:
+
EHOSTDOWN:
+
EHOSTUNREACH:
+
EHWPOISON:
+
EIDRM:
+
EILSEQ:
+
EINPROGRESS:
+
EINTR:
+
EINVAL:
+
EIO:
+
EISCONN:
+
EISDIR:
+
EISNAM:
+
EKEYEXPIRED:
+
EKEYREJECTED:
+
EKEYREVOKED:
+
EL2HLT:
+
EL2NSYNC:
+
EL3HLT:
+
EL3RST:
+
ELIBACC:
+
ELIBBAD:
+
ELIBEXEC:
+
ELIBMAX:
+
ELIBSCN:
+
ELNRNG:
+
ELOOP:
+
EMEDIUMTYPE:
+
EMFILE:
+
emit:
+
EMLINK:
+
empty:
+
EMSGSIZE:
+
EMULTIHOP:
+
ENAMETOOLONG:
+
ENAVAIL:
+
ENETDOWN:
+
ENETRESET:
+
ENETUNREACH:
+
ENFILE:
+
ENOANO:
+
ENOBUFS:
+
ENOCSI:
+
ENODATA:
+
ENODEV:
+
ENOENT:
+
ENOEXEC:
+
ENOKEY:
+
ENOLCK:
+
ENOLINK:
+
ENOMEDIUM:
+
ENOMEM:
+
ENOMSG:
+
ENONET:
+
ENOPKG:
+
ENOPROTOOPT:
+
ENOSPC:
+
ENOSR:
+
ENOSTR:
+
ENOSYS:
+
ENOTBLK:
+
ENOTCONN:
+
ENOTDIR:
+
ENOTEMPTY:
+
ENOTNAM:
+
ENOTRECOVERABLE:
+
ENOTSOCK:
+
ENOTTY:
+
ENOTUNIQ:
+
ENXIO:
+
EOPNOTSUPP:
+
EOVERFLOW:
+
EOWNERDEAD:
+
EPERM:
+
EPFNOSUPPORT:
+
EPIPE:
+
epochNanoSeconds:
+
epochSeconds:
+
epoll_create:
+
epoll_create1:
+
epoll_ctl:
+
EPOLL_CTL_ADD:
+
EPOLL_CTL_DEL:
+
EPOLL_CTL_MOD:
+
EpollData:
+
EPOLLERR:
+
EPOLLET:
+
EpollEvent:
+
EPOLLEXCLUSIVE:
+
EPOLLHUP:
+
EPOLLIN:
+
EPOLLMSG:
+
EPOLLONESHOT:
+
EPOLLOUT:
+
EPOLLPRI:
+
EPOLLRDBAND:
+
EPOLLRDHUP:
+
EPOLLRDNORM:
+
epoll_wait:
+
EPOLLWAKEUP:
+
EPOLLWRBAND:
+
EPOLLWRNORM:
+
EPROTO:
+
EPROTONOSUPPORT:
+
EPROTOTYPE:
+
ERANGE:
+
EREMCHG:
+
EREMOTE:
+
EREMOTEIO:
+
ERESTART:
+
ERFKILL:
+
EROFS:
+
error:
+
Error:
+
ESHUTDOWN:
+
ESOCKTNOSUPPORT:
+
ESPIPE:
+
ESRCH:
+
ESRMNT:
+
ESTALE:
+
ESTRPIPE:
+
ETIME:
+
ETIMEDOUT:
+
ETOOMANYREFS:
+
ETXTBSY:
+
EUCLEAN:
+
EUNATCH:
+
EUSERS:
+
Event:
+
eventfd:
+
EventQueueKey:
+
EventQueueReader:
+
EWOULDBLOCK:
+
EXDEV:
+
EXFULL:
+
fail:
+
failed:
+
fastEpochTime:
+
finish:
+
finished:
+
Finished:
+
finished:
+
fire:
+
FirstPipe:
+
flags:
+
forget:
+
fromNow:
+
fromPipe:
+
fromPipe2:
+
fromSAddr:
+
full:
+
Future:
+
FutureBase:
+
FutureCompletedError:
+
futureContinue:
+
FutureDefect:
+
FutureError:
+
FutureFlag:
+
FutureFlags:
+
FuturePendingError:
+
FutureSeq:
+
FutureState:
+
FutureStr:
+
GCUserData:
+
get:
+
getAsyncTimestamp:
+
getAutoAddress:
+
getAutoAddresses:
+
getBestRoute:
+
getConnectionAbortedError:
+
getData:
+
getDescriptorInheritance:
+
getDomain:
+
getDualstack:
+
getError:
+
getFd:
+
getGlobalDispatcher:
+
getInheritable:
+
getInterfaces:
+
getMaxOpenFiles:
+
getMaxOpenFiles2:
+
getMessage:
+
getNoWait:
+
getRaisesTypes:
+
getServerUseClosedError:
+
getSocketError:
+
getSocketError2:
+
getSockOpt:
+
getSockOpt2:
+
getSrcLocation:
+
getThreadDispatcher:
+
getTracker:
+
getTrackerCounter:
+
getTransportError:
+
getTransportOsError:
+
getTransportTooManyError:
+
getTransportUseClosedError:
+
getUserData:
+
handleEintr:
+
hexValue:
+
high:
+
host:
+
Hour:
+
hours:
+
id:
+
idleAsync:
+
IfA12MppSwitch:
+
IFA_ADDRESS:
+
IfAal2:
+
IfAal5:
+
IfAddrMessage:
+
IfAdsl:
+
IfAflane8023:
+
IfAflane8025:
+
IFA_LOCAL:
+
IfArap:
+
IfArcNet:
+
IfArcNetPlus:
+
IfAsync:
+
IfAtm:
+
IfAtmDxi:
+
IfAtmFuni:
+
IfAtmIma:
+
IfAtmLogical:
+
IfAtmRadio:
+
IfAtmSubInterface:
+
IfAtmVciEndpt:
+
IfAtmVirtual:
+
IfBasicIsdn:
+
IfBgpPolicyAccounting:
+
IfBsc:
+
IfCctemul:
+
IfCes:
+
IfChannel:
+
IfCnr:
+
IfCoffee:
+
IfCompositeLink:
+
IfDcn:
+
IfDdnX25:
+
IfDigitalPowerline:
+
IfDigitalWrapperOverheadChannel:
+
IfDlsw:
+
IfDocScableDownstream:
+
IfDocScableMaclayer:
+
IfDocScableUpstream:
+
IfDs0:
+
IfDs0Bundle:
+
IfDs1:
+
IfDs1Fdl:
+
IfDs3:
+
IfDtm:
+
IfDvbAsiIn:
+
IfDvbAsiOut:
+
IfDvbrccDownstream:
+
IfDvbrccMaclayer:
+
IfDvbrccUpstream:
+
IfE1:
+
IfEon:
+
IfEplrs:
+
IfError:
+
IfEscon:
+
IfEthernet3Mbit:
+
IfEthernetCsmacd:
+
IfFast:
+
IfFastEther:
+
IfFastEtherFx:
+
IfFddi:
+
IfFibreChannel:
+
IfFrameRelay:
+
IfFrameRelayInterconnect:
+
IfFrameRelayMpi:
+
IfFrameRelayService:
+
IfFrDlciEndpt:
+
IfFrf16MfrBundle:
+
IfFrForward:
+
IfG7032MB:
+
IfG70364K:
+
IfGigabitEthernet:
+
IfGr303Idt:
+
IfGr303Rdt:
+
IfH323Gatekeeper:
+
IfH323Proxy:
+
IfHdh1822:
+
IfHdlc:
+
IfHdsl2:
+
IfHiperLan2:
+
IfHippi:
+
IfHippiInterface:
+
IfHostPad:
+
IfHssi:
+
IfHyperChannel:
+
IfIbm370Parchan:
+
IfIdsl:
+
IfIeee1394:
+
IfIeee80211:
+
IfIeee80212:
+
IfIeee802154:
+
IfIeee80216Wman:
+
IfIeee8023AdLag:
+
IfIfGsn:
+
IfImt:
+
IfInfoMessage:
+
IfInterleave:
+
IfIp:
+
IfIpForward:
+
IfIpoverAtm:
+
IfIpoverCdlc:
+
IfIpoverClaw:
+
IfIpSwitch:
+
IfIsdn:
+
IfIsdnS:
+
IfIsdnU:
+
IfIso88022Llc:
+
IfIso88023Csmacd:
+
IfIso88024TokenBus:
+
IfIso88025Crfprint:
+
IfIso88025Fiber:
+
IfIso88025rDtr:
+
IfIso88025TokenRing:
+
IfIso88026MAN:
+
IfIsup:
+
IfL2Vlan:
+
IfL3IpVlan:
+
IfL3IpxVlan:
+
IFLA_ADDRESS:
+
IFLA_IFNAME:
+
IFLA_MTU:
+
IFLA_OPERSTATE:
+
IfLapB:
+
IfLapD:
+
IfLapF:
+
IFLIST_REPLY_BUFFER:
+
IfLocalTalk:
+
IfMediaMailOverIp:
+
IfMfSigLink:
+
IfMioX25:
+
IfModem:
+
IfMpc:
+
IfMpls:
+
IfMplsTunnel:
+
IfMsdsl:
+
IfMvl:
+
IfMyrInet:
+
IfNfas:
+
IfNsip:
+
IfOpticalChannel:
+
IfOpticalTransport:
+
IfOther:
+
IfPara:
+
IfPlc:
+
IfPos:
+
IfPpp:
+
IfPppMultilinkBundle:
+
IfPrimaryIsdn:
+
IfPropBwaP2mp:
+
IfPropCnls:
+
IfPropDocsWirelessDownstream:
+
IfPropDocsWirelessMaclayer:
+
IfPropDocsWirelessUpstream:
+
IfPropMultiplexor:
+
IfPropPoint2PointSerial:
+
IfPropVirtual:
+
IfPropWirelessP2p:
+
IfProteon10Mbit:
+
IfProteon80Mbit:
+
IfQllc:
+
IfRadioMac:
+
IfRadsl:
+
IfReachDsl:
+
IfRegular1822:
+
IfRfc1483:
+
IfRfc877X25:
+
IfRs232:
+
IfRsrb:
+
IfSdlc:
+
IfSdsl:
+
IfShdsl:
+
IfSip:
+
IfSlip:
+
IfSmdsDxi:
+
IfSmdsIcip:
+
IfSoftwareLoopback:
+
IfSonet:
+
IfSonetOverheadChannel:
+
IfSonetPath:
+
IfSonetVt:
+
IfSrp:
+
IfSs7SigLink:
+
IfStackToStack:
+
IfStarlan:
+
IfTdlc:
+
IfTermPad:
+
IfTr008:
+
IfTransPhdlc:
+
IfTunnel:
+
IfUltra:
+
IfUsb:
+
IfV11:
+
IfV35:
+
IfV36:
+
IfV37:
+
IfVdsl:
+
IfVirtualIpAddress:
+
IfVoiceEm:
+
IfVoiceEncap:
+
IfVoiceFxo:
+
IfVoiceFxs:
+
IfVoiceOverAtm:
+
IfVoiceOverFrameRelay:
+
IfVoiceOverip:
+
IfWwanPp:
+
IfWwanPp2:
+
IfX213:
+
IfX25HuntGroup:
+
IfX25Mlp:
+
IfX25Ple:
+
IfXboxWireless:
+
inc:
+
InfiniteDuration:
+
init:
+
initIp:
+
initTAddress:
+
InterfaceAddress:
+
InterfaceState:
+
InterfaceType:
+
InternalAsyncCallback:
+
internalCallTick:
+
InternalFutureBase:
+
internalInitFutureBase:
+
internalRaiseIfError:
+
InternalRaisesFuture:
+
INVALID_HANDLE_VALUE:
+
INVALID_SOCKET:
+
InvalidSocketHandle:
+
IOSelectorsException:
+
ip:
+
IpMask:
+
IP_MULTICAST_TTL:
+
IpNet:
+
IPPROTO_TCP:
+
IPV6_V6ONLY:
+
isAnyLocal:
+
isAvailable:
+
isBenchmarking:
+
isBroadcast:
+
isCounterLeaked:
+
isDocumentation:
+
isEmpty:
+
isGlobal:
+
isGlobalMulticast:
+
isInfinite:
+
isInterfaceLocalMulticast:
+
isLinkLocal:
+
isLinkLocalMulticast:
+
isLinkLocalUnicast:
+
isLoopback:
+
isMulticast:
+
isNone:
+
isNoRaises:
+
isPrivate:
+
isReserved:
+
isSet:
+
isShared:
+
isSiteLocal:
+
isUnicast:
+
isUnicastLinkLocal:
+
isUniqueLocal:
+
isUnspecified:
+
isV4Mapped:
+
isZero:
+
items:
+
join:
+
len:
+
localAddress:
+
localAddress2:
+
location:
+
LocationKind:
+
LocCompleteIndex:
+
LocCreateIndex:
+
LocFinishIndex:
+
locked:
+
low:
+
makeNoRaises:
+
mask:
+
MaxAdapterAddressLength:
+
MaxEventsCount:
+
MaxSignalEventLength:
+
MaxSignalSuffixLength:
+
micros:
+
Microsecond:
+
microseconds:
+
millis:
+
Millisecond:
+
milliseconds:
+
Minute:
+
minutes:
+
mitems:
+
Moment:
+
nanos:
+
Nanosecond:
+
nanoseconds:
+
NETLINK_ROUTE:
+
netmask:
+
network:
+
NetworkInterface:
+
new:
+
newAsyncEvent:
+
newAsyncEventQueue:
+
newAsyncLock:
+
newAsyncQueue:
+
newAsyncStreamIncompleteError:
+
newAsyncStreamLimitError:
+
newAsyncStreamReader:
+
newAsyncStreamUseClosedError:
+
newAsyncStreamWriter:
+
newChunkedStreamReader:
+
newChunkedStreamWriter:
+
newDatagramTransport:
+
newDatagramTransport6:
+
newDispatcher:
+
newFuture:
+
newFutureSeq:
+
newFutureStr:
+
newInternalRaisesFuture:
+
newSelectEvent:
+
newSelector:
+
NLM_F_DUMP:
+
NLM_F_MATCH:
+
NLM_F_REQUEST:
+
NLM_F_ROOT:
+
NLMSG_ALIGNTO:
+
NLMSG_DONE:
+
NLMSG_ERROR:
+
NlMsgHeader:
+
NLReq:
+
NLRouteReq:
+
NoAutoRead:
+
noCancel:
+
None:
+
NoPipeFlash:
+
now:
+
O_CLOEXEC:
+
one:
+
oneIndex:
+
oneValue:
+
OnlyCompleted:
+
OnlyPending:
+
orImpl:
+
pairs:
+
Pause:
+
PDispatcher:
+
peekMessage:
+
pendingFuturesCount:
+
pipe2:
+
PipeHeaderName:
+
Pointer:
+
poll:
+
popFirst:
+
popFirstNoWait:
+
popLast:
+
popLastNoWait:
+
posixSpawn:
+
PosixSpawnAttr:
+
posixSpawnAttrDestroy:
+
posixSpawnAttrGetFlags:
+
posixSpawnAttrGetPgroup:
+
posixSpawnAttrGetSchedParam:
+
posixSpawnAttrGetSchedPolicy:
+
posixSpawnAttrGetSigDefault:
+
posixSpawnAttrGetSigMask:
+
posixSpawnAttrInit:
+
posixSpawnAttrSetFlags:
+
posixSpawnAttrSetPgroup:
+
posixSpawnAttrSetSchedParam:
+
posixSpawnAttrSetSchedPolicy:
+
posixSpawnAttrSetSigDefault:
+
posixSpawnAttrSetSigMask:
+
PosixSpawnFileActions:
+
posixSpawnFileActionsAddClose:
+
posixSpawnFileActionsAddDup2:
+
posixSpawnFileActionsAddOpen:
+
posixSpawnFileActionsDestroy:
+
posixSpawnFileActionsInit:
+
posixSpawnp:
+
POSIX_SPAWN_RESETIDS:
+
POSIX_SPAWN_SETPGROUP:
+
POSIX_SPAWN_SETSCHEDPARAM:
+
POSIX_SPAWN_SETSCHEDULER:
+
POSIX_SPAWN_SETSIGDEF:
+
POSIX_SPAWN_SETSIGMASK:
+
POSIX_SPAWN_USEVFORK:
+
P_PID:
+
prefix:
+
prepend:
+
put:
+
putNoWait:
+
race:
+
raiseAsDefect:
+
raiseAsyncStreamIncompleteError:
+
raiseAsyncStreamLimitError:
+
raiseAsyncStreamUseClosedError:
+
raiseAsyncStreamWriteEOFError:
+
raiseEmptyMessageDefect:
+
raiseOsDefect:
+
raiseTransportError:
+
raiseTransportOsError:
+
Raising:
+
read:
+
ReadClosed:
+
ReadEof:
+
readerOverflow:
+
readError:
+
ReadError:
+
readExactly:
+
readLine:
+
readMessage:
+
ReadMessagePredicate:
+
readOnce:
+
ReadPaused:
+
ReadPending:
+
readUntil:
+
ReadyKey:
+
regions:
+
register:
+
register2:
+
registerEvent:
+
registerHandle:
+
registerProcess:
+
registerSignal:
+
registerTimer:
+
registerVnode:
+
release:
+
remoteAddress:
+
remoteAddress2:
+
remove:
+
removeCallback:
+
removeReader2:
+
removeTimer:
+
removeWriter2:
+
reserve:
+
resolveTAddress:
+
ReuseAddr:
+
ReusePort:
+
Route:
+
RTA_ALIGN:
+
RTA_ALIGNTO:
+
RTA_DST:
+
RTA_GATEWAY:
+
RTA_OIF:
+
RTA_PAYLOAD:
+
RTA_PREFSRC:
+
RtAttr:
+
RtGenMsg:
+
RtMessage:
+
RTM_F_LOOKUP_TABLE:
+
RTM_GETADDR:
+
RTM_GETLINK:
+
RTM_GETROUTE:
+
RTM_NEWLINK:
+
RTM_NEWROUTE:
+
runForever:
+
Running:
+
running:
+
Running:
+
running:
+
SchedParam:
+
Second:
+
seconds:
+
secs:
+
select:
+
SelectEvent:
+
selectInto:
+
Selector:
+
send:
+
sendfile:
+
sendTo:
+
Sequence:
+
ServerCommand:
+
ServerFlags:
+
ServerStatus:
+
setData:
+
setDescriptorBlocking:
+
setDescriptorFlags:
+
setDescriptorInheritance:
+
setDualstack:
+
setGlobalDispatcher:
+
setMaxOpenFiles:
+
setMaxOpenFiles2:
+
setSocketBlocking:
+
setSockOpt:
+
setSockOpt2:
+
setThreadDispatcher:
+
setTimer:
+
SFD_CLOEXEC:
+
SFD_NONBLOCK:
+
shutdownWait:
+
signalfd:
+
SignalFdInfo:
+
SignalPrefixName:
+
size:
+
sleepAsync:
+
Sockaddr_nl:
+
SOCK_CLOEXEC:
+
SocketFlags:
+
SocketServer:
+
SOCK_NONBLOCK:
+
SomeIntegerI64:
+
SrcLoc:
+
Start:
+
start:
+
start2:
+
Starting:
+
state:
+
StatusDormant:
+
StatusDown:
+
StatusError:
+
StatusLowerLayerDown:
+
StatusNotPresent:
+
StatusTesting:
+
StatusUnknown:
+
StatusUp:
+
stepsAsync:
+
Stop:
+
stop:
+
stop2:
+
Stopped:
+
stopped:
+
Stopped:
+
StreamCallback:
+
StreamCallback2:
+
StreamReaderLoop:
+
StreamServer:
+
StreamServerTrackerName:
+
StreamTransport:
+
StreamTransportTrackerName:
+
StreamWriterLoop:
+
String:
+
subnetMask:
+
TCP_NODELAY:
+
TcpNoDelay:
+
TFD_CLOEXEC:
+
TFD_NONBLOCK:
+
TimerCallback:
+
timerfd_create:
+
timerfd_settime:
+
toException:
+
toHex:
+
toIpAddress:
+
toIPv4:
+
toIPv6:
+
toSAddr:
+
toString:
+
toUnchecked:
+
trackCounter:
+
TrackerBase:
+
TrackerCounter:
+
trackerCounterKeys:
+
trackerCounters:
+
transfer:
+
TransportAbortedError:
+
TransportAddress:
+
TransportAddressError:
+
TransportError:
+
TransportFlags:
+
TransportIncompleteError:
+
TransportInitCallback:
+
TransportKind:
+
TransportLimitError:
+
TransportNoSupport:
+
TransportOsError:
+
TransportState:
+
TransportTooManyError:
+
TransportUseClosedError:
+
TransportUseEofError:
+
trigger:
+
tryCancel:
+
union:
+
unregister:
+
unregister2:
+
unregisterAndCloseFd:
+
UnsafeDatagramCallback:
+
untrackCounter:
+
updateHandle:
+
upload:
+
V4Mapped:
+
value:
+
wait:
+
waitEvents:
+
WAITEXITSTATUS:
+
waitFor:
+
WAITIFCONTINUED:
+
WAITIFEXITED:
+
WAITIFSIGNALED:
+
WAITIFSTOPPED:
+
WAITSTOPSIG:
+
WAITTERMSIG:
+
Week:
+
weeks:
+
WEXITED:
+
windowsAnyAddressFix:
+
WinNoPipeFlash:
+
WinServerPipe:
+
withData:
+
WithoutCompleted:
+
withTimeout:
+
WNOHANG:
+
WNOWAIT:
+
wrapAsyncSocket:
+
wrapAsyncSocket2:
+
write:
+
WriteClosed:
+
WriteEof:
+
WriteError:
+
writeFile:
+
WriteItem:
+
WritePaused:
+
WritePending:
+
WriteType:
+
WSTOPPED:
+
ZeroDuration:
+
+
+ +
+
+
+ + + diff --git a/async_procs.html b/async_procs.html new file mode 100644 index 00000000..04d57bb8 --- /dev/null +++ b/async_procs.html @@ -0,0 +1,326 @@ + + + + + + async functions - Chronos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Async procedures

+

Async procedures are those that interact with chronos to cooperatively +suspend and resume their execution depending on the completion of other +async procedures, timers, tasks on other threads or asynchronous I/O scheduled +with the operating system.

+

Async procedures are marked with the {.async.} pragma and return a Future +indicating the state of the operation.

+ +

The async pragma

+

The {.async.} pragma will transform a procedure (or a method) returning a +Future into a closure iterator. If there is no return type specified, +Future[void] is returned.

+
proc p() {.async.} =
+  await sleepAsync(100.milliseconds)
+
+echo p().type # prints "Future[system.void]"
+
+

await keyword

+

The await keyword operates on Future instances typically returned from an +async procedure.

+

Whenever await is encountered inside an async procedure, control is given +back to the dispatcher for as many steps as it's necessary for the awaited +future to complete, fail or be cancelled. await calls the +equivalent of Future.read() on the completed future to return the +encapsulated value when the operation finishes.

+
proc p1() {.async.} =
+  await sleepAsync(1.seconds)
+
+proc p2() {.async.} =
+  await sleepAsync(1.seconds)
+
+proc p3() {.async.} =
+  let
+    fut1 = p1()
+    fut2 = p2()
+  # Just by executing the async procs, both resulting futures entered the
+  # dispatcher queue and their "clocks" started ticking.
+  await fut1
+  await fut2
+  # Only one second passed while awaiting them both, not two.
+
+waitFor p3()
+
+
Because `async` procedures are executed concurrently, they are subject to many
+of the same risks that typically accompany multithreaded programming.
+
+In particular, if two `async` procedures have access to the same mutable state,
+the value before and after `await` might not be the same as the order of execution is not guaranteed!
+
+

Raw async procedures

+

Raw async procedures are those that interact with chronos via the Future +type but whose body does not go through the async transformation.

+

Such functions are created by adding raw: true to the async parameters:

+
proc rawAsync(): Future[void] {.async: (raw: true).} =
+  let fut = newFuture[void]("rawAsync")
+  fut.complete()
+  fut
+
+

Raw functions must not raise exceptions directly - they are implicitly declared +as raises: [] - instead they should store exceptions in the returned Future:

+
proc rawFailure(): Future[void] {.async: (raw: true).} =
+  let fut = newFuture[void]("rawAsync")
+  fut.fail((ref ValueError)(msg: "Oh no!"))
+  fut
+
+

Raw procedures can also use checked exceptions:

+
proc rawAsyncRaises(): Future[void] {.async: (raw: true, raises: [IOError]).} =
+  let fut = newFuture[void]()
+  assert not (compiles do: fut.fail((ref ValueError)(msg: "uh-uh")))
+  fut.fail((ref IOError)(msg: "IO"))
+  fut
+
+

Callbacks and closures

+

Callback/closure types are declared using the async annotation as usual:

+
type MyCallback = proc(): Future[void] {.async.}
+
+proc runCallback(cb: MyCallback) {.async: (raises: []).} =
+  try:
+    await cb()
+  except CatchableError:
+    discard # handle errors as usual
+
+

When calling a callback, it is important to remember that it may raise exceptions that need to be handled.

+

Checked exceptions can be used to limit the exceptions that a callback can +raise:

+
type MyEasyCallback = proc(): Future[void] {.async: (raises: []).}
+
+proc runCallback(cb: MyEasyCallback) {.async: (raises: [])} =
+  await cb()
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/ayu-highlight.css b/ayu-highlight.css new file mode 100644 index 00000000..32c94322 --- /dev/null +++ b/ayu-highlight.css @@ -0,0 +1,78 @@ +/* +Based off of the Ayu theme +Original by Dempfi (https://github.com/dempfi/ayu) +*/ + +.hljs { + display: block; + overflow-x: auto; + background: #191f26; + color: #e6e1cf; +} + +.hljs-comment, +.hljs-quote { + color: #5c6773; + font-style: italic; +} + +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-attr, +.hljs-regexp, +.hljs-link, +.hljs-selector-id, +.hljs-selector-class { + color: #ff7733; +} + +.hljs-number, +.hljs-meta, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #ffee99; +} + +.hljs-string, +.hljs-bullet { + color: #b8cc52; +} + +.hljs-title, +.hljs-built_in, +.hljs-section { + color: #ffb454; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-symbol { + color: #ff7733; +} + +.hljs-name { + color: #36a3d9; +} + +.hljs-tag { + color: #00568d; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-addition { + color: #91b362; +} + +.hljs-deletion { + color: #d96c75; +} diff --git a/book.html b/book.html new file mode 100644 index 00000000..b2af8a0a --- /dev/null +++ b/book.html @@ -0,0 +1,226 @@ + + + + + + Updating this book - Chronos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Updating this book

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/book.js b/book.js new file mode 100644 index 00000000..aa12e7ec --- /dev/null +++ b/book.js @@ -0,0 +1,697 @@ +"use strict"; + +// Fix back button cache problem +window.onunload = function () { }; + +// Global variable, shared between modules +function playground_text(playground, hidden = true) { + let code_block = playground.querySelector("code"); + + if (window.ace && code_block.classList.contains("editable")) { + let editor = window.ace.edit(code_block); + return editor.getValue(); + } else if (hidden) { + return code_block.textContent; + } else { + return code_block.innerText; + } +} + +(function codeSnippets() { + function fetch_with_timeout(url, options, timeout = 6000) { + return Promise.race([ + fetch(url, options), + new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), timeout)) + ]); + } + + var playgrounds = Array.from(document.querySelectorAll(".playground")); + if (playgrounds.length > 0) { + fetch_with_timeout("https://play.rust-lang.org/meta/crates", { + headers: { + 'Content-Type': "application/json", + }, + method: 'POST', + mode: 'cors', + }) + .then(response => response.json()) + .then(response => { + // get list of crates available in the rust playground + let playground_crates = response.crates.map(item => item["id"]); + playgrounds.forEach(block => handle_crate_list_update(block, playground_crates)); + }); + } + + function handle_crate_list_update(playground_block, playground_crates) { + // update the play buttons after receiving the response + update_play_button(playground_block, playground_crates); + + // and install on change listener to dynamically update ACE editors + if (window.ace) { + let code_block = playground_block.querySelector("code"); + if (code_block.classList.contains("editable")) { + let editor = window.ace.edit(code_block); + editor.addEventListener("change", function (e) { + update_play_button(playground_block, playground_crates); + }); + // add Ctrl-Enter command to execute rust code + editor.commands.addCommand({ + name: "run", + bindKey: { + win: "Ctrl-Enter", + mac: "Ctrl-Enter" + }, + exec: _editor => run_rust_code(playground_block) + }); + } + } + } + + // updates the visibility of play button based on `no_run` class and + // used crates vs ones available on https://play.rust-lang.org + function update_play_button(pre_block, playground_crates) { + var play_button = pre_block.querySelector(".play-button"); + + // skip if code is `no_run` + if (pre_block.querySelector('code').classList.contains("no_run")) { + play_button.classList.add("hidden"); + return; + } + + // get list of `extern crate`'s from snippet + var txt = playground_text(pre_block); + var re = /extern\s+crate\s+([a-zA-Z_0-9]+)\s*;/g; + var snippet_crates = []; + var item; + while (item = re.exec(txt)) { + snippet_crates.push(item[1]); + } + + // check if all used crates are available on play.rust-lang.org + var all_available = snippet_crates.every(function (elem) { + return playground_crates.indexOf(elem) > -1; + }); + + if (all_available) { + play_button.classList.remove("hidden"); + } else { + play_button.classList.add("hidden"); + } + } + + function run_rust_code(code_block) { + var result_block = code_block.querySelector(".result"); + if (!result_block) { + result_block = document.createElement('code'); + result_block.className = 'result hljs language-bash'; + + code_block.append(result_block); + } + + let text = playground_text(code_block); + let classes = code_block.querySelector('code').classList; + let edition = "2015"; + if(classes.contains("edition2018")) { + edition = "2018"; + } else if(classes.contains("edition2021")) { + edition = "2021"; + } + var params = { + version: "stable", + optimize: "0", + code: text, + edition: edition + }; + + if (text.indexOf("#![feature") !== -1) { + params.version = "nightly"; + } + + result_block.innerText = "Running..."; + + fetch_with_timeout("https://play.rust-lang.org/evaluate.json", { + headers: { + 'Content-Type': "application/json", + }, + method: 'POST', + mode: 'cors', + body: JSON.stringify(params) + }) + .then(response => response.json()) + .then(response => { + if (response.result.trim() === '') { + result_block.innerText = "No output"; + result_block.classList.add("result-no-output"); + } else { + result_block.innerText = response.result; + result_block.classList.remove("result-no-output"); + } + }) + .catch(error => result_block.innerText = "Playground Communication: " + error.message); + } + + // Syntax highlighting Configuration + hljs.configure({ + tabReplace: ' ', // 4 spaces + languages: [], // Languages used for auto-detection + }); + + let code_nodes = Array + .from(document.querySelectorAll('code')) + // Don't highlight `inline code` blocks in headers. + .filter(function (node) {return !node.parentElement.classList.contains("header"); }); + + if (window.ace) { + // language-rust class needs to be removed for editable + // blocks or highlightjs will capture events + code_nodes + .filter(function (node) {return node.classList.contains("editable"); }) + .forEach(function (block) { block.classList.remove('language-rust'); }); + + code_nodes + .filter(function (node) {return !node.classList.contains("editable"); }) + .forEach(function (block) { hljs.highlightBlock(block); }); + } else { + code_nodes.forEach(function (block) { hljs.highlightBlock(block); }); + } + + // Adding the hljs class gives code blocks the color css + // even if highlighting doesn't apply + code_nodes.forEach(function (block) { block.classList.add('hljs'); }); + + Array.from(document.querySelectorAll("code.hljs")).forEach(function (block) { + + var lines = Array.from(block.querySelectorAll('.boring')); + // If no lines were hidden, return + if (!lines.length) { return; } + block.classList.add("hide-boring"); + + var buttons = document.createElement('div'); + buttons.className = 'buttons'; + buttons.innerHTML = ""; + + // add expand button + var pre_block = block.parentNode; + pre_block.insertBefore(buttons, pre_block.firstChild); + + pre_block.querySelector('.buttons').addEventListener('click', function (e) { + if (e.target.classList.contains('fa-eye')) { + e.target.classList.remove('fa-eye'); + e.target.classList.add('fa-eye-slash'); + e.target.title = 'Hide lines'; + e.target.setAttribute('aria-label', e.target.title); + + block.classList.remove('hide-boring'); + } else if (e.target.classList.contains('fa-eye-slash')) { + e.target.classList.remove('fa-eye-slash'); + e.target.classList.add('fa-eye'); + e.target.title = 'Show hidden lines'; + e.target.setAttribute('aria-label', e.target.title); + + block.classList.add('hide-boring'); + } + }); + }); + + if (window.playground_copyable) { + Array.from(document.querySelectorAll('pre code')).forEach(function (block) { + var pre_block = block.parentNode; + if (!pre_block.classList.contains('playground')) { + var buttons = pre_block.querySelector(".buttons"); + if (!buttons) { + buttons = document.createElement('div'); + buttons.className = 'buttons'; + pre_block.insertBefore(buttons, pre_block.firstChild); + } + + var clipButton = document.createElement('button'); + clipButton.className = 'fa fa-copy clip-button'; + clipButton.title = 'Copy to clipboard'; + clipButton.setAttribute('aria-label', clipButton.title); + clipButton.innerHTML = ''; + + buttons.insertBefore(clipButton, buttons.firstChild); + } + }); + } + + // Process playground code blocks + Array.from(document.querySelectorAll(".playground")).forEach(function (pre_block) { + // Add play button + var buttons = pre_block.querySelector(".buttons"); + if (!buttons) { + buttons = document.createElement('div'); + buttons.className = 'buttons'; + pre_block.insertBefore(buttons, pre_block.firstChild); + } + + var runCodeButton = document.createElement('button'); + runCodeButton.className = 'fa fa-play play-button'; + runCodeButton.hidden = true; + runCodeButton.title = 'Run this code'; + runCodeButton.setAttribute('aria-label', runCodeButton.title); + + buttons.insertBefore(runCodeButton, buttons.firstChild); + runCodeButton.addEventListener('click', function (e) { + run_rust_code(pre_block); + }); + + if (window.playground_copyable) { + var copyCodeClipboardButton = document.createElement('button'); + copyCodeClipboardButton.className = 'fa fa-copy clip-button'; + copyCodeClipboardButton.innerHTML = ''; + copyCodeClipboardButton.title = 'Copy to clipboard'; + copyCodeClipboardButton.setAttribute('aria-label', copyCodeClipboardButton.title); + + buttons.insertBefore(copyCodeClipboardButton, buttons.firstChild); + } + + let code_block = pre_block.querySelector("code"); + if (window.ace && code_block.classList.contains("editable")) { + var undoChangesButton = document.createElement('button'); + undoChangesButton.className = 'fa fa-history reset-button'; + undoChangesButton.title = 'Undo changes'; + undoChangesButton.setAttribute('aria-label', undoChangesButton.title); + + buttons.insertBefore(undoChangesButton, buttons.firstChild); + + undoChangesButton.addEventListener('click', function () { + let editor = window.ace.edit(code_block); + editor.setValue(editor.originalCode); + editor.clearSelection(); + }); + } + }); +})(); + +(function themes() { + var html = document.querySelector('html'); + var themeToggleButton = document.getElementById('theme-toggle'); + var themePopup = document.getElementById('theme-list'); + var themeColorMetaTag = document.querySelector('meta[name="theme-color"]'); + var stylesheets = { + ayuHighlight: document.querySelector("[href$='ayu-highlight.css']"), + tomorrowNight: document.querySelector("[href$='tomorrow-night.css']"), + highlight: document.querySelector("[href$='highlight.css']"), + }; + + function showThemes() { + themePopup.style.display = 'block'; + themeToggleButton.setAttribute('aria-expanded', true); + themePopup.querySelector("button#" + get_theme()).focus(); + } + + function updateThemeSelected() { + themePopup.querySelectorAll('.theme-selected').forEach(function (el) { + el.classList.remove('theme-selected'); + }); + themePopup.querySelector("button#" + get_theme()).classList.add('theme-selected'); + } + + function hideThemes() { + themePopup.style.display = 'none'; + themeToggleButton.setAttribute('aria-expanded', false); + themeToggleButton.focus(); + } + + function get_theme() { + var theme; + try { theme = localStorage.getItem('mdbook-theme'); } catch (e) { } + if (theme === null || theme === undefined) { + return default_theme; + } else { + return theme; + } + } + + function set_theme(theme, store = true) { + let ace_theme; + + if (theme == 'coal' || theme == 'navy') { + stylesheets.ayuHighlight.disabled = true; + stylesheets.tomorrowNight.disabled = false; + stylesheets.highlight.disabled = true; + + ace_theme = "ace/theme/tomorrow_night"; + } else if (theme == 'ayu') { + stylesheets.ayuHighlight.disabled = false; + stylesheets.tomorrowNight.disabled = true; + stylesheets.highlight.disabled = true; + ace_theme = "ace/theme/tomorrow_night"; + } else { + stylesheets.ayuHighlight.disabled = true; + stylesheets.tomorrowNight.disabled = true; + stylesheets.highlight.disabled = false; + ace_theme = "ace/theme/dawn"; + } + + setTimeout(function () { + themeColorMetaTag.content = getComputedStyle(document.documentElement).backgroundColor; + }, 1); + + if (window.ace && window.editors) { + window.editors.forEach(function (editor) { + editor.setTheme(ace_theme); + }); + } + + var previousTheme = get_theme(); + + if (store) { + try { localStorage.setItem('mdbook-theme', theme); } catch (e) { } + } + + html.classList.remove(previousTheme); + html.classList.add(theme); + updateThemeSelected(); + } + + // Set theme + var theme = get_theme(); + + set_theme(theme, false); + + themeToggleButton.addEventListener('click', function () { + if (themePopup.style.display === 'block') { + hideThemes(); + } else { + showThemes(); + } + }); + + themePopup.addEventListener('click', function (e) { + var theme; + if (e.target.className === "theme") { + theme = e.target.id; + } else if (e.target.parentElement.className === "theme") { + theme = e.target.parentElement.id; + } else { + return; + } + set_theme(theme); + }); + + themePopup.addEventListener('focusout', function(e) { + // e.relatedTarget is null in Safari and Firefox on macOS (see workaround below) + if (!!e.relatedTarget && !themeToggleButton.contains(e.relatedTarget) && !themePopup.contains(e.relatedTarget)) { + hideThemes(); + } + }); + + // Should not be needed, but it works around an issue on macOS & iOS: https://github.com/rust-lang/mdBook/issues/628 + document.addEventListener('click', function(e) { + if (themePopup.style.display === 'block' && !themeToggleButton.contains(e.target) && !themePopup.contains(e.target)) { + hideThemes(); + } + }); + + document.addEventListener('keydown', function (e) { + if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; } + if (!themePopup.contains(e.target)) { return; } + + switch (e.key) { + case 'Escape': + e.preventDefault(); + hideThemes(); + break; + case 'ArrowUp': + e.preventDefault(); + var li = document.activeElement.parentElement; + if (li && li.previousElementSibling) { + li.previousElementSibling.querySelector('button').focus(); + } + break; + case 'ArrowDown': + e.preventDefault(); + var li = document.activeElement.parentElement; + if (li && li.nextElementSibling) { + li.nextElementSibling.querySelector('button').focus(); + } + break; + case 'Home': + e.preventDefault(); + themePopup.querySelector('li:first-child button').focus(); + break; + case 'End': + e.preventDefault(); + themePopup.querySelector('li:last-child button').focus(); + break; + } + }); +})(); + +(function sidebar() { + var body = document.querySelector("body"); + var sidebar = document.getElementById("sidebar"); + var sidebarLinks = document.querySelectorAll('#sidebar a'); + var sidebarToggleButton = document.getElementById("sidebar-toggle"); + var sidebarResizeHandle = document.getElementById("sidebar-resize-handle"); + var firstContact = null; + + function showSidebar() { + body.classList.remove('sidebar-hidden') + body.classList.add('sidebar-visible'); + Array.from(sidebarLinks).forEach(function (link) { + link.setAttribute('tabIndex', 0); + }); + sidebarToggleButton.setAttribute('aria-expanded', true); + sidebar.setAttribute('aria-hidden', false); + try { localStorage.setItem('mdbook-sidebar', 'visible'); } catch (e) { } + } + + + var sidebarAnchorToggles = document.querySelectorAll('#sidebar a.toggle'); + + function toggleSection(ev) { + ev.currentTarget.parentElement.classList.toggle('expanded'); + } + + Array.from(sidebarAnchorToggles).forEach(function (el) { + el.addEventListener('click', toggleSection); + }); + + function hideSidebar() { + body.classList.remove('sidebar-visible') + body.classList.add('sidebar-hidden'); + Array.from(sidebarLinks).forEach(function (link) { + link.setAttribute('tabIndex', -1); + }); + sidebarToggleButton.setAttribute('aria-expanded', false); + sidebar.setAttribute('aria-hidden', true); + try { localStorage.setItem('mdbook-sidebar', 'hidden'); } catch (e) { } + } + + // Toggle sidebar + sidebarToggleButton.addEventListener('click', function sidebarToggle() { + if (body.classList.contains("sidebar-hidden")) { + var current_width = parseInt( + document.documentElement.style.getPropertyValue('--sidebar-width'), 10); + if (current_width < 150) { + document.documentElement.style.setProperty('--sidebar-width', '150px'); + } + showSidebar(); + } else if (body.classList.contains("sidebar-visible")) { + hideSidebar(); + } else { + if (getComputedStyle(sidebar)['transform'] === 'none') { + hideSidebar(); + } else { + showSidebar(); + } + } + }); + + sidebarResizeHandle.addEventListener('mousedown', initResize, false); + + function initResize(e) { + window.addEventListener('mousemove', resize, false); + window.addEventListener('mouseup', stopResize, false); + body.classList.add('sidebar-resizing'); + } + function resize(e) { + var pos = (e.clientX - sidebar.offsetLeft); + if (pos < 20) { + hideSidebar(); + } else { + if (body.classList.contains("sidebar-hidden")) { + showSidebar(); + } + pos = Math.min(pos, window.innerWidth - 100); + document.documentElement.style.setProperty('--sidebar-width', pos + 'px'); + } + } + //on mouseup remove windows functions mousemove & mouseup + function stopResize(e) { + body.classList.remove('sidebar-resizing'); + window.removeEventListener('mousemove', resize, false); + window.removeEventListener('mouseup', stopResize, false); + } + + document.addEventListener('touchstart', function (e) { + firstContact = { + x: e.touches[0].clientX, + time: Date.now() + }; + }, { passive: true }); + + document.addEventListener('touchmove', function (e) { + if (!firstContact) + return; + + var curX = e.touches[0].clientX; + var xDiff = curX - firstContact.x, + tDiff = Date.now() - firstContact.time; + + if (tDiff < 250 && Math.abs(xDiff) >= 150) { + if (xDiff >= 0 && firstContact.x < Math.min(document.body.clientWidth * 0.25, 300)) + showSidebar(); + else if (xDiff < 0 && curX < 300) + hideSidebar(); + + firstContact = null; + } + }, { passive: true }); +})(); + +(function chapterNavigation() { + document.addEventListener('keydown', function (e) { + if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; } + if (window.search && window.search.hasFocus()) { return; } + var html = document.querySelector('html'); + + function next() { + var nextButton = document.querySelector('.nav-chapters.next'); + if (nextButton) { + window.location.href = nextButton.href; + } + } + function prev() { + var previousButton = document.querySelector('.nav-chapters.previous'); + if (previousButton) { + window.location.href = previousButton.href; + } + } + switch (e.key) { + case 'ArrowRight': + e.preventDefault(); + if (html.dir == 'rtl') { + prev(); + } else { + next(); + } + break; + case 'ArrowLeft': + e.preventDefault(); + if (html.dir == 'rtl') { + next(); + } else { + prev(); + } + break; + } + }); +})(); + +(function clipboard() { + var clipButtons = document.querySelectorAll('.clip-button'); + + function hideTooltip(elem) { + elem.firstChild.innerText = ""; + elem.className = 'fa fa-copy clip-button'; + } + + function showTooltip(elem, msg) { + elem.firstChild.innerText = msg; + elem.className = 'fa fa-copy tooltipped'; + } + + var clipboardSnippets = new ClipboardJS('.clip-button', { + text: function (trigger) { + hideTooltip(trigger); + let playground = trigger.closest("pre"); + return playground_text(playground, false); + } + }); + + Array.from(clipButtons).forEach(function (clipButton) { + clipButton.addEventListener('mouseout', function (e) { + hideTooltip(e.currentTarget); + }); + }); + + clipboardSnippets.on('success', function (e) { + e.clearSelection(); + showTooltip(e.trigger, "Copied!"); + }); + + clipboardSnippets.on('error', function (e) { + showTooltip(e.trigger, "Clipboard error!"); + }); +})(); + +(function scrollToTop () { + var menuTitle = document.querySelector('.menu-title'); + + menuTitle.addEventListener('click', function () { + document.scrollingElement.scrollTo({ top: 0, behavior: 'smooth' }); + }); +})(); + +(function controllMenu() { + var menu = document.getElementById('menu-bar'); + + (function controllPosition() { + var scrollTop = document.scrollingElement.scrollTop; + var prevScrollTop = scrollTop; + var minMenuY = -menu.clientHeight - 50; + // When the script loads, the page can be at any scroll (e.g. if you reforesh it). + menu.style.top = scrollTop + 'px'; + // Same as parseInt(menu.style.top.slice(0, -2), but faster + var topCache = menu.style.top.slice(0, -2); + menu.classList.remove('sticky'); + var stickyCache = false; // Same as menu.classList.contains('sticky'), but faster + document.addEventListener('scroll', function () { + scrollTop = Math.max(document.scrollingElement.scrollTop, 0); + // `null` means that it doesn't need to be updated + var nextSticky = null; + var nextTop = null; + var scrollDown = scrollTop > prevScrollTop; + var menuPosAbsoluteY = topCache - scrollTop; + if (scrollDown) { + nextSticky = false; + if (menuPosAbsoluteY > 0) { + nextTop = prevScrollTop; + } + } else { + if (menuPosAbsoluteY > 0) { + nextSticky = true; + } else if (menuPosAbsoluteY < minMenuY) { + nextTop = prevScrollTop + minMenuY; + } + } + if (nextSticky === true && stickyCache === false) { + menu.classList.add('sticky'); + stickyCache = true; + } else if (nextSticky === false && stickyCache === true) { + menu.classList.remove('sticky'); + stickyCache = false; + } + if (nextTop !== null) { + menu.style.top = nextTop + 'px'; + topCache = nextTop; + } + prevScrollTop = scrollTop; + }, { passive: true }); + })(); + (function controllBorder() { + function updateBorder() { + if (menu.offsetTop === 0) { + menu.classList.remove('bordered'); + } else { + menu.classList.add('bordered'); + } + } + updateBorder(); + document.addEventListener('scroll', updateBorder, { passive: true }); + })(); +})(); diff --git a/clipboard.min.js b/clipboard.min.js new file mode 100644 index 00000000..02c549e3 --- /dev/null +++ b/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.4 + * https://zenorocha.github.io/clipboard.js + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return function(n){var o={};function r(t){if(o[t])return o[t].exports;var e=o[t]={i:t,l:!1,exports:{}};return n[t].call(e.exports,e,e.exports,r),e.l=!0,e.exports}return r.m=n,r.c=o,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=0)}([function(t,e,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i=function(){function o(t,e){for(var n=0;n + + + + + Core concepts - Chronos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Concepts

+

Async/await is a programming model that relies on cooperative multitasking to +coordinate the concurrent execution of procedures, using event notifications +from the operating system or other treads to resume execution.

+

Code execution happens in a loop that alternates between making progress on +tasks and handling events.

+ +

The dispatcher

+

The event handler loop is called a "dispatcher" and a single instance per +thread is created, as soon as one is needed.

+

Scheduling is done by calling async procedures that return +Future objects - each time a procedure is unable to make further +progress, for example because it's waiting for some data to arrive, it hands +control back to the dispatcher which ensures that the procedure is resumed when +ready.

+

A single thread, and thus a single dispatcher, is typically able to handle +thousands of concurrent in-progress requests.

+

The Future type

+

Future objects encapsulate the outcome of executing an async procedure. The +Future may be pending meaning that the outcome is not yet known or +finished meaning that the return value is available, the operation failed +with an exception or was cancelled.

+

Inside an async procedure, you can await the outcome of another async +procedure - if the Future representing that operation is still pending, a +callback representing where to resume execution will be added to it and the +dispatcher will be given back control to deal with other tasks.

+

When a Future is finished, all its callbacks are scheduled to be run by +the dispatcher, thus continuing any operations that were waiting for an outcome.

+

The poll call

+

To trigger the processing step of the dispatcher, we need to call poll() - +either directly or through a wrapper like runForever() or waitFor().

+

Each call to poll handles any file descriptors, timers and callbacks that are +ready to be processed.

+

Using waitFor, the result of a single asynchronous operation can be obtained:

+
proc myApp() {.async.} =
+  echo "Waiting for a second..."
+  await sleepAsync(1.seconds)
+  echo "done!"
+
+waitFor myApp()
+
+

It is also possible to keep running the event loop forever using runForever:

+
proc myApp() {.async.} =
+  while true:
+    await sleepAsync(1.seconds)
+    echo "A bit more than a second passed!"
+
+let future = myApp()
+runForever()
+
+

Such an application never terminates, thus it is rare that applications are +structured this way.

+
Both `waitFor` and `runForever` call `poll` which offers fine-grained
+control over the event loop steps.
+
+Nested calls to `poll` - directly or indirectly via `waitFor` and `runForever`
+are not allowed.
+
+

Cancellation

+

Any pending Future can be cancelled. This can be used for timeouts, to start +multiple parallel operations and cancel the rest as soon as one finishes, +to initiate the orderely shutdown of an application etc.

+
## Simple cancellation example
+
+import chronos
+
+proc someTask() {.async.} = await sleepAsync(10.minutes)
+
+proc cancellationExample() {.async.} =
+  # Start a task but don't wait for it to finish
+  let future = someTask()
+  future.cancelSoon()
+  # `cancelSoon` schedules but does not wait for the future to get cancelled -
+  # it might still be pending here
+
+  let future2 = someTask() # Start another task concurrently
+  await future2.cancelAndWait()
+  # Using `cancelAndWait`, we can be sure that `future2` is either
+  # complete, failed or cancelled at this point. `future` could still be
+  # pending!
+  assert future2.finished()
+
+waitFor(cancellationExample())
+
+

Even if cancellation is initiated, it is not guaranteed that the operation gets +cancelled - the future might still be completed or fail depending on the +order of events in the dispatcher and the specifics of the operation.

+

If the future indeed gets cancelled, await will raise a +CancelledError as is likely to happen in the following example:

+
proc c1 {.async.} =
+  echo "Before sleep"
+  try:
+    await sleepAsync(10.minutes)
+    echo "After sleep" # not reach due to cancellation
+  except CancelledError as exc:
+    echo "We got cancelled!"
+    # `CancelledError` is typically re-raised to notify the caller that the
+    # operation is being cancelled
+    raise exc
+
+proc c2 {.async.} =
+  await c1()
+  echo "Never reached, since the CancelledError got re-raised"
+
+let work = c2()
+waitFor(work.cancelAndWait())
+
+

The CancelledError will now travel up the stack like any other exception. +It can be caught for instance to free some resources and is then typically +re-raised for the whole chain operations to get cancelled.

+

Alternatively, the cancellation request can be translated to a regular outcome +of the operation - for example, a read operation might return an empty result.

+

Cancelling an already-finished Future has no effect, as the following example +of downloading two web pages concurrently shows:

+
## Make two http requests concurrently and output the one that wins
+
+import chronos
+import ./httpget
+
+proc twoGets() {.async.} =
+  let
+    futs = @[
+      # Both pages will start downloading concurrently...
+      httpget.retrievePage("https://duckduckgo.com/?q=chronos"),
+      httpget.retrievePage("https://www.google.fr/search?q=chronos")
+    ]
+
+  # Wait for at least one request to finish..
+  let winner = await one(futs)
+  # ..and cancel the others since we won't need them
+  for fut in futs:
+    # Trying to cancel an already-finished future is harmless
+    fut.cancelSoon()
+
+  # An exception could be raised here if the winning request failed!
+  echo "Result: ", winner.read()
+
+waitFor(twoGets())
+
+

Ownership

+

When calling a procedure that returns a Future, ownership of that Future is +shared between the callee that created it and the caller that waits for it to be +finished.

+

The Future can be thought of as a single-item channel between a producer and a +consumer. The producer creates the Future and is responsible for completing or +failing it while the caller waits for completion and may cancel it.

+

Although it is technically possible, callers must not complete or fail +futures and callees or other intermediate observers must not cancel them as +this may lead to panics and shutdown (ie if the future is completed twice or a +cancalletion is not handled by the original caller).

+

noCancel

+

Certain operations must not be cancelled for semantic reasons. Common scenarios +include closeWait that releases a resources irrevocably and composed +operations whose individual steps should be performed together or not at all.

+

In such cases, the noCancel modifier to await can be used to temporarily +disable cancellation propagation, allowing the operation to complete even if +the caller initiates a cancellation request:

+
proc deepSleep(dur: Duration) {.async.} =
+  # `noCancel` prevents any cancellation request by the caller of `deepSleep`
+  # from reaching `sleepAsync` - even if `deepSleep` is cancelled, its future
+  # will not complete until the sleep finishes.
+  await noCancel sleepAsync(dur)
+
+let future = deepSleep(10.minutes)
+
+# This will take ~10 minutes even if we try to cancel the call to `deepSleep`!
+await cancelAndWait(future)
+
+

join

+

The join modifier to await allows cancelling an async procedure without +propagating the cancellation to the awaited operation. This is useful when +await:ing a Future for monitoring purposes, ie when a procedure is not the +owner of the future that's being await:ed.

+

One situation where this happens is when implementing the "observer" pattern, +where a helper monitors an operation it did not initiate:

+
var tick: Future[void]
+proc ticker() {.async.} =
+  while true:
+    tick = sleepAsync(1.second)
+    await tick
+    echo "tick!"
+
+proc tocker() {.async.} =
+  # This operation does not own or implement the operation behind `tick`,
+  # so it should not cancel it when `tocker` is cancelled
+  await join tick
+  echo "tock!"
+
+let
+  fut = ticker() # `ticker` is now looping and most likely waiting for `tick`
+  fut2 = tocker() # both `ticker` and `tocker` are waiting for `tick`
+
+# We don't want `tocker` to cancel a future that was created in `ticker`
+waitFor fut2.cancelAndWait()
+
+waitFor fut # keeps printing `tick!` every second.
+
+

Compile-time configuration

+

chronos contains several compile-time +configuration options enabling stricter compile-time +checks and debugging helpers whose runtime cost may be significant.

+

Strictness options generally will become default in future chronos releases and +allow adapting existing code without changing the new version - see the +config.nim module for more information.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/css/chrome.css b/css/chrome.css new file mode 100644 index 00000000..8b78255d --- /dev/null +++ b/css/chrome.css @@ -0,0 +1,606 @@ +/* CSS for UI elements (a.k.a. chrome) */ + +@import 'variables.css'; + +html { + scrollbar-color: var(--scrollbar) var(--bg); +} +#searchresults a, +.content a:link, +a:visited, +a > .hljs { + color: var(--links); +} + +/* + body-container is necessary because mobile browsers don't seem to like + overflow-x on the body tag when there is a tag. +*/ +#body-container { + /* + This is used when the sidebar pushes the body content off the side of + the screen on small screens. Without it, dragging on mobile Safari + will want to reposition the viewport in a weird way. + */ + overflow-x: clip; +} + +/* Menu Bar */ + +#menu-bar, +#menu-bar-hover-placeholder { + z-index: 101; + margin: auto calc(0px - var(--page-padding)); +} +#menu-bar { + position: relative; + display: flex; + flex-wrap: wrap; + background-color: var(--bg); + border-block-end-color: var(--bg); + border-block-end-width: 1px; + border-block-end-style: solid; +} +#menu-bar.sticky, +.js #menu-bar-hover-placeholder:hover + #menu-bar, +.js #menu-bar:hover, +.js.sidebar-visible #menu-bar { + position: -webkit-sticky; + position: sticky; + top: 0 !important; +} +#menu-bar-hover-placeholder { + position: sticky; + position: -webkit-sticky; + top: 0; + height: var(--menu-bar-height); +} +#menu-bar.bordered { + border-block-end-color: var(--table-border-color); +} +#menu-bar i, #menu-bar .icon-button { + position: relative; + padding: 0 8px; + z-index: 10; + line-height: var(--menu-bar-height); + cursor: pointer; + transition: color 0.5s; +} +@media only screen and (max-width: 420px) { + #menu-bar i, #menu-bar .icon-button { + padding: 0 5px; + } +} + +.icon-button { + border: none; + background: none; + padding: 0; + color: inherit; +} +.icon-button i { + margin: 0; +} + +.right-buttons { + margin: 0 15px; +} +.right-buttons a { + text-decoration: none; +} + +.left-buttons { + display: flex; + margin: 0 5px; +} +.no-js .left-buttons button { + display: none; +} + +.menu-title { + display: inline-block; + font-weight: 200; + font-size: 2.4rem; + line-height: var(--menu-bar-height); + text-align: center; + margin: 0; + flex: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.js .menu-title { + cursor: pointer; +} + +.menu-bar, +.menu-bar:visited, +.nav-chapters, +.nav-chapters:visited, +.mobile-nav-chapters, +.mobile-nav-chapters:visited, +.menu-bar .icon-button, +.menu-bar a i { + color: var(--icons); +} + +.menu-bar i:hover, +.menu-bar .icon-button:hover, +.nav-chapters:hover, +.mobile-nav-chapters i:hover { + color: var(--icons-hover); +} + +/* Nav Icons */ + +.nav-chapters { + font-size: 2.5em; + text-align: center; + text-decoration: none; + + position: fixed; + top: 0; + bottom: 0; + margin: 0; + max-width: 150px; + min-width: 90px; + + display: flex; + justify-content: center; + align-content: center; + flex-direction: column; + + transition: color 0.5s, background-color 0.5s; +} + +.nav-chapters:hover { + text-decoration: none; + background-color: var(--theme-hover); + transition: background-color 0.15s, color 0.15s; +} + +.nav-wrapper { + margin-block-start: 50px; + display: none; +} + +.mobile-nav-chapters { + font-size: 2.5em; + text-align: center; + text-decoration: none; + width: 90px; + border-radius: 5px; + background-color: var(--sidebar-bg); +} + +/* Only Firefox supports flow-relative values */ +.previous { float: left; } +[dir=rtl] .previous { float: right; } + +/* Only Firefox supports flow-relative values */ +.next { + float: right; + right: var(--page-padding); +} +[dir=rtl] .next { + float: left; + right: unset; + left: var(--page-padding); +} + +/* Use the correct buttons for RTL layouts*/ +[dir=rtl] .previous i.fa-angle-left:before {content:"\f105";} +[dir=rtl] .next i.fa-angle-right:before { content:"\f104"; } + +@media only screen and (max-width: 1080px) { + .nav-wide-wrapper { display: none; } + .nav-wrapper { display: block; } +} + +/* sidebar-visible */ +@media only screen and (max-width: 1380px) { + #sidebar-toggle-anchor:checked ~ .page-wrapper .nav-wide-wrapper { display: none; } + #sidebar-toggle-anchor:checked ~ .page-wrapper .nav-wrapper { display: block; } +} + +/* Inline code */ + +:not(pre) > .hljs { + display: inline; + padding: 0.1em 0.3em; + border-radius: 3px; +} + +:not(pre):not(a) > .hljs { + color: var(--inline-code-color); + overflow-x: initial; +} + +a:hover > .hljs { + text-decoration: underline; +} + +pre { + position: relative; +} +pre > .buttons { + position: absolute; + z-index: 100; + right: 0px; + top: 2px; + margin: 0px; + padding: 2px 0px; + + color: var(--sidebar-fg); + cursor: pointer; + visibility: hidden; + opacity: 0; + transition: visibility 0.1s linear, opacity 0.1s linear; +} +pre:hover > .buttons { + visibility: visible; + opacity: 1 +} +pre > .buttons :hover { + color: var(--sidebar-active); + border-color: var(--icons-hover); + background-color: var(--theme-hover); +} +pre > .buttons i { + margin-inline-start: 8px; +} +pre > .buttons button { + cursor: inherit; + margin: 0px 5px; + padding: 3px 5px; + font-size: 14px; + + border-style: solid; + border-width: 1px; + border-radius: 4px; + border-color: var(--icons); + background-color: var(--theme-popup-bg); + transition: 100ms; + transition-property: color,border-color,background-color; + color: var(--icons); +} +@media (pointer: coarse) { + pre > .buttons button { + /* On mobile, make it easier to tap buttons. */ + padding: 0.3rem 1rem; + } + + .sidebar-resize-indicator { + /* Hide resize indicator on devices with limited accuracy */ + display: none; + } +} +pre > code { + display: block; + padding: 1rem; +} + +/* FIXME: ACE editors overlap their buttons because ACE does absolute + positioning within the code block which breaks padding. The only solution I + can think of is to move the padding to the outer pre tag (or insert a div + wrapper), but that would require fixing a whole bunch of CSS rules. +*/ +.hljs.ace_editor { + padding: 0rem 0rem; +} + +pre > .result { + margin-block-start: 10px; +} + +/* Search */ + +#searchresults a { + text-decoration: none; +} + +mark { + border-radius: 2px; + padding-block-start: 0; + padding-block-end: 1px; + padding-inline-start: 3px; + padding-inline-end: 3px; + margin-block-start: 0; + margin-block-end: -1px; + margin-inline-start: -3px; + margin-inline-end: -3px; + background-color: var(--search-mark-bg); + transition: background-color 300ms linear; + cursor: pointer; +} + +mark.fade-out { + background-color: rgba(0,0,0,0) !important; + cursor: auto; +} + +.searchbar-outer { + margin-inline-start: auto; + margin-inline-end: auto; + max-width: var(--content-max-width); +} + +#searchbar { + width: 100%; + margin-block-start: 5px; + margin-block-end: 0; + margin-inline-start: auto; + margin-inline-end: auto; + padding: 10px 16px; + transition: box-shadow 300ms ease-in-out; + border: 1px solid var(--searchbar-border-color); + border-radius: 3px; + background-color: var(--searchbar-bg); + color: var(--searchbar-fg); +} +#searchbar:focus, +#searchbar.active { + box-shadow: 0 0 3px var(--searchbar-shadow-color); +} + +.searchresults-header { + font-weight: bold; + font-size: 1em; + padding-block-start: 18px; + padding-block-end: 0; + padding-inline-start: 5px; + padding-inline-end: 0; + color: var(--searchresults-header-fg); +} + +.searchresults-outer { + margin-inline-start: auto; + margin-inline-end: auto; + max-width: var(--content-max-width); + border-block-end: 1px dashed var(--searchresults-border-color); +} + +ul#searchresults { + list-style: none; + padding-inline-start: 20px; +} +ul#searchresults li { + margin: 10px 0px; + padding: 2px; + border-radius: 2px; +} +ul#searchresults li.focus { + background-color: var(--searchresults-li-bg); +} +ul#searchresults span.teaser { + display: block; + clear: both; + margin-block-start: 5px; + margin-block-end: 0; + margin-inline-start: 20px; + margin-inline-end: 0; + font-size: 0.8em; +} +ul#searchresults span.teaser em { + font-weight: bold; + font-style: normal; +} + +/* Sidebar */ + +.sidebar { + position: fixed; + left: 0; + top: 0; + bottom: 0; + width: var(--sidebar-width); + font-size: 0.875em; + box-sizing: border-box; + -webkit-overflow-scrolling: touch; + overscroll-behavior-y: contain; + background-color: var(--sidebar-bg); + color: var(--sidebar-fg); +} +[dir=rtl] .sidebar { left: unset; right: 0; } +.sidebar-resizing { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} +.no-js .sidebar, +.js:not(.sidebar-resizing) .sidebar { + transition: transform 0.3s; /* Animation: slide away */ +} +.sidebar code { + line-height: 2em; +} +.sidebar .sidebar-scrollbox { + overflow-y: auto; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + padding: 10px 10px; +} +.sidebar .sidebar-resize-handle { + position: absolute; + cursor: col-resize; + width: 0; + right: calc(var(--sidebar-resize-indicator-width) * -1); + top: 0; + bottom: 0; + display: flex; + align-items: center; +} + +.sidebar-resize-handle .sidebar-resize-indicator { + width: 100%; + height: 12px; + background-color: var(--icons); + margin-inline-start: var(--sidebar-resize-indicator-space); +} + +[dir=rtl] .sidebar .sidebar-resize-handle { + left: calc(var(--sidebar-resize-indicator-width) * -1); + right: unset; +} +.js .sidebar .sidebar-resize-handle { + cursor: col-resize; + width: calc(var(--sidebar-resize-indicator-width) - var(--sidebar-resize-indicator-space)); +} +/* sidebar-hidden */ +#sidebar-toggle-anchor:not(:checked) ~ .sidebar { + transform: translateX(calc(0px - var(--sidebar-width) - var(--sidebar-resize-indicator-width))); + z-index: -1; +} +[dir=rtl] #sidebar-toggle-anchor:not(:checked) ~ .sidebar { + transform: translateX(calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width))); +} +.sidebar::-webkit-scrollbar { + background: var(--sidebar-bg); +} +.sidebar::-webkit-scrollbar-thumb { + background: var(--scrollbar); +} + +/* sidebar-visible */ +#sidebar-toggle-anchor:checked ~ .page-wrapper { + transform: translateX(calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width))); +} +[dir=rtl] #sidebar-toggle-anchor:checked ~ .page-wrapper { + transform: translateX(calc(0px - var(--sidebar-width) - var(--sidebar-resize-indicator-width))); +} +@media only screen and (min-width: 620px) { + #sidebar-toggle-anchor:checked ~ .page-wrapper { + transform: none; + margin-inline-start: calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width)); + } + [dir=rtl] #sidebar-toggle-anchor:checked ~ .page-wrapper { + transform: none; + } +} + +.chapter { + list-style: none outside none; + padding-inline-start: 0; + line-height: 2.2em; +} + +.chapter ol { + width: 100%; +} + +.chapter li { + display: flex; + color: var(--sidebar-non-existant); +} +.chapter li a { + display: block; + padding: 0; + text-decoration: none; + color: var(--sidebar-fg); +} + +.chapter li a:hover { + color: var(--sidebar-active); +} + +.chapter li a.active { + color: var(--sidebar-active); +} + +.chapter li > a.toggle { + cursor: pointer; + display: block; + margin-inline-start: auto; + padding: 0 10px; + user-select: none; + opacity: 0.68; +} + +.chapter li > a.toggle div { + transition: transform 0.5s; +} + +/* collapse the section */ +.chapter li:not(.expanded) + li > ol { + display: none; +} + +.chapter li.chapter-item { + line-height: 1.5em; + margin-block-start: 0.6em; +} + +.chapter li.expanded > a.toggle div { + transform: rotate(90deg); +} + +.spacer { + width: 100%; + height: 3px; + margin: 5px 0px; +} +.chapter .spacer { + background-color: var(--sidebar-spacer); +} + +@media (-moz-touch-enabled: 1), (pointer: coarse) { + .chapter li a { padding: 5px 0; } + .spacer { margin: 10px 0; } +} + +.section { + list-style: none outside none; + padding-inline-start: 20px; + line-height: 1.9em; +} + +/* Theme Menu Popup */ + +.theme-popup { + position: absolute; + left: 10px; + top: var(--menu-bar-height); + z-index: 1000; + border-radius: 4px; + font-size: 0.7em; + color: var(--fg); + background: var(--theme-popup-bg); + border: 1px solid var(--theme-popup-border); + margin: 0; + padding: 0; + list-style: none; + display: none; + /* Don't let the children's background extend past the rounded corners. */ + overflow: hidden; +} +[dir=rtl] .theme-popup { left: unset; right: 10px; } +.theme-popup .default { + color: var(--icons); +} +.theme-popup .theme { + width: 100%; + border: 0; + margin: 0; + padding: 2px 20px; + line-height: 25px; + white-space: nowrap; + text-align: start; + cursor: pointer; + color: inherit; + background: inherit; + font-size: inherit; +} +.theme-popup .theme:hover { + background-color: var(--theme-hover); +} + +.theme-selected::before { + display: inline-block; + content: "✓"; + margin-inline-start: -14px; + width: 14px; +} diff --git a/css/general.css b/css/general.css new file mode 100644 index 00000000..e7d20da7 --- /dev/null +++ b/css/general.css @@ -0,0 +1,234 @@ +/* Base styles and content styles */ + +@import 'variables.css'; + +:root { + /* Browser default font-size is 16px, this way 1 rem = 10px */ + font-size: 62.5%; + color-scheme: var(--color-scheme); +} + +html { + font-family: "Open Sans", sans-serif; + color: var(--fg); + background-color: var(--bg); + text-size-adjust: none; + -webkit-text-size-adjust: none; +} + +body { + margin: 0; + font-size: 1.6rem; + overflow-x: hidden; +} + +code { + font-family: var(--mono-font) !important; + font-size: var(--code-font-size); + direction: ltr !important; +} + +/* make long words/inline code not x overflow */ +main { + overflow-wrap: break-word; +} + +/* make wide tables scroll if they overflow */ +.table-wrapper { + overflow-x: auto; +} + +/* Don't change font size in headers. */ +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + font-size: unset; +} + +.left { float: left; } +.right { float: right; } +.boring { opacity: 0.6; } +.hide-boring .boring { display: none; } +.hidden { display: none !important; } + +h2, h3 { margin-block-start: 2.5em; } +h4, h5 { margin-block-start: 2em; } + +.header + .header h3, +.header + .header h4, +.header + .header h5 { + margin-block-start: 1em; +} + +h1:target::before, +h2:target::before, +h3:target::before, +h4:target::before, +h5:target::before, +h6:target::before { + display: inline-block; + content: "»"; + margin-inline-start: -30px; + width: 30px; +} + +/* This is broken on Safari as of version 14, but is fixed + in Safari Technology Preview 117 which I think will be Safari 14.2. + https://bugs.webkit.org/show_bug.cgi?id=218076 +*/ +:target { + /* Safari does not support logical properties */ + scroll-margin-top: calc(var(--menu-bar-height) + 0.5em); +} + +.page { + outline: 0; + padding: 0 var(--page-padding); + margin-block-start: calc(0px - var(--menu-bar-height)); /* Compensate for the #menu-bar-hover-placeholder */ +} +.page-wrapper { + box-sizing: border-box; + background-color: var(--bg); +} +.no-js .page-wrapper, +.js:not(.sidebar-resizing) .page-wrapper { + transition: margin-left 0.3s ease, transform 0.3s ease; /* Animation: slide away */ +} +[dir=rtl] .js:not(.sidebar-resizing) .page-wrapper { + transition: margin-right 0.3s ease, transform 0.3s ease; /* Animation: slide away */ +} + +.content { + overflow-y: auto; + padding: 0 5px 50px 5px; +} +.content main { + margin-inline-start: auto; + margin-inline-end: auto; + max-width: var(--content-max-width); +} +.content p { line-height: 1.45em; } +.content ol { line-height: 1.45em; } +.content ul { line-height: 1.45em; } +.content a { text-decoration: none; } +.content a:hover { text-decoration: underline; } +.content img, .content video { max-width: 100%; } +.content .header:link, +.content .header:visited { + color: var(--fg); +} +.content .header:link, +.content .header:visited:hover { + text-decoration: none; +} + +table { + margin: 0 auto; + border-collapse: collapse; +} +table td { + padding: 3px 20px; + border: 1px var(--table-border-color) solid; +} +table thead { + background: var(--table-header-bg); +} +table thead td { + font-weight: 700; + border: none; +} +table thead th { + padding: 3px 20px; +} +table thead tr { + border: 1px var(--table-header-bg) solid; +} +/* Alternate background colors for rows */ +table tbody tr:nth-child(2n) { + background: var(--table-alternate-bg); +} + + +blockquote { + margin: 20px 0; + padding: 0 20px; + color: var(--fg); + background-color: var(--quote-bg); + border-block-start: .1em solid var(--quote-border); + border-block-end: .1em solid var(--quote-border); +} + +.warning { + margin: 20px; + padding: 0 20px; + border-inline-start: 2px solid var(--warning-border); +} + +.warning:before { + position: absolute; + width: 3rem; + height: 3rem; + margin-inline-start: calc(-1.5rem - 21px); + content: "ⓘ"; + text-align: center; + background-color: var(--bg); + color: var(--warning-border); + font-weight: bold; + font-size: 2rem; +} + +blockquote .warning:before { + background-color: var(--quote-bg); +} + +kbd { + background-color: var(--table-border-color); + border-radius: 4px; + border: solid 1px var(--theme-popup-border); + box-shadow: inset 0 -1px 0 var(--theme-hover); + display: inline-block; + font-size: var(--code-font-size); + font-family: var(--mono-font); + line-height: 10px; + padding: 4px 5px; + vertical-align: middle; +} + +:not(.footnote-definition) + .footnote-definition, +.footnote-definition + :not(.footnote-definition) { + margin-block-start: 2em; +} +.footnote-definition { + font-size: 0.9em; + margin: 0.5em 0; +} +.footnote-definition p { + display: inline; +} + +.tooltiptext { + position: absolute; + visibility: hidden; + color: #fff; + background-color: #333; + transform: translateX(-50%); /* Center by moving tooltip 50% of its width left */ + left: -8px; /* Half of the width of the icon */ + top: -35px; + font-size: 0.8em; + text-align: center; + border-radius: 6px; + padding: 5px 8px; + margin: 5px; + z-index: 1000; +} +.tooltipped .tooltiptext { + visibility: visible; +} + +.chapter li.part-title { + color: var(--sidebar-fg); + margin: 5px 0px; + font-weight: bold; +} + +.result-no-output { + font-style: italic; +} diff --git a/css/print.css b/css/print.css new file mode 100644 index 00000000..80ec3a54 --- /dev/null +++ b/css/print.css @@ -0,0 +1,50 @@ + +#sidebar, +#menu-bar, +.nav-chapters, +.mobile-nav-chapters { + display: none; +} + +#page-wrapper.page-wrapper { + transform: none !important; + margin-inline-start: 0px; + overflow-y: initial; +} + +#content { + max-width: none; + margin: 0; + padding: 0; +} + +.page { + overflow-y: initial; +} + +code { + direction: ltr !important; +} + +pre > .buttons { + z-index: 2; +} + +a, a:visited, a:active, a:hover { + color: #4183c4; + text-decoration: none; +} + +h1, h2, h3, h4, h5, h6 { + page-break-inside: avoid; + page-break-after: avoid; +} + +pre, code { + page-break-inside: avoid; + white-space: pre-wrap; +} + +.fa { + display: none !important; +} diff --git a/css/variables.css b/css/variables.css new file mode 100644 index 00000000..0da55e8c --- /dev/null +++ b/css/variables.css @@ -0,0 +1,279 @@ + +/* Globals */ + +:root { + --sidebar-width: 300px; + --sidebar-resize-indicator-width: 8px; + --sidebar-resize-indicator-space: 2px; + --page-padding: 15px; + --content-max-width: 750px; + --menu-bar-height: 50px; + --mono-font: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace; + --code-font-size: 0.875em /* please adjust the ace font size accordingly in editor.js */ +} + +/* Themes */ + +.ayu { + --bg: hsl(210, 25%, 8%); + --fg: #c5c5c5; + + --sidebar-bg: #14191f; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #5c6773; + --sidebar-active: #ffb454; + --sidebar-spacer: #2d334f; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #b7b9cc; + + --links: #0096cf; + + --inline-code-color: #ffb454; + + --theme-popup-bg: #14191f; + --theme-popup-border: #5c6773; + --theme-hover: #191f26; + + --quote-bg: hsl(226, 15%, 17%); + --quote-border: hsl(226, 15%, 22%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(210, 25%, 13%); + --table-header-bg: hsl(210, 25%, 28%); + --table-alternate-bg: hsl(210, 25%, 11%); + + --searchbar-border-color: #848484; + --searchbar-bg: #424242; + --searchbar-fg: #fff; + --searchbar-shadow-color: #d4c89f; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #252932; + --search-mark-bg: #e3b171; + + --color-scheme: dark; +} + +.coal { + --bg: hsl(200, 7%, 8%); + --fg: #98a3ad; + + --sidebar-bg: #292c2f; + --sidebar-fg: #a1adb8; + --sidebar-non-existant: #505254; + --sidebar-active: #3473ad; + --sidebar-spacer: #393939; + + --scrollbar: var(--sidebar-fg); + + --icons: #43484d; + --icons-hover: #b3c0cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #141617; + --theme-popup-border: #43484d; + --theme-hover: #1f2124; + + --quote-bg: hsl(234, 21%, 18%); + --quote-border: hsl(234, 21%, 23%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(200, 7%, 13%); + --table-header-bg: hsl(200, 7%, 28%); + --table-alternate-bg: hsl(200, 7%, 11%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #b7b7b7; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #98a3ad; + --searchresults-li-bg: #2b2b2f; + --search-mark-bg: #355c7d; + + --color-scheme: dark; +} + +.light { + --bg: hsl(0, 0%, 100%); + --fg: hsl(0, 0%, 0%); + + --sidebar-bg: #fafafa; + --sidebar-fg: hsl(0, 0%, 0%); + --sidebar-non-existant: #aaaaaa; + --sidebar-active: #1f1fff; + --sidebar-spacer: #f4f4f4; + + --scrollbar: #8F8F8F; + + --icons: #747474; + --icons-hover: #000000; + + --links: #20609f; + + --inline-code-color: #301900; + + --theme-popup-bg: #fafafa; + --theme-popup-border: #cccccc; + --theme-hover: #e6e6e6; + + --quote-bg: hsl(197, 37%, 96%); + --quote-border: hsl(197, 37%, 91%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(0, 0%, 95%); + --table-header-bg: hsl(0, 0%, 80%); + --table-alternate-bg: hsl(0, 0%, 97%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #fafafa; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #e4f2fe; + --search-mark-bg: #a2cff5; + + --color-scheme: light; +} + +.navy { + --bg: hsl(226, 23%, 11%); + --fg: #bcbdd0; + + --sidebar-bg: #282d3f; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #505274; + --sidebar-active: #2b79a2; + --sidebar-spacer: #2d334f; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #b7b9cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #161923; + --theme-popup-border: #737480; + --theme-hover: #282e40; + + --quote-bg: hsl(226, 15%, 17%); + --quote-border: hsl(226, 15%, 22%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(226, 23%, 16%); + --table-header-bg: hsl(226, 23%, 31%); + --table-alternate-bg: hsl(226, 23%, 14%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #aeaec6; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #5f5f71; + --searchresults-border-color: #5c5c68; + --searchresults-li-bg: #242430; + --search-mark-bg: #a2cff5; + + --color-scheme: dark; +} + +.rust { + --bg: hsl(60, 9%, 87%); + --fg: #262625; + + --sidebar-bg: #3b2e2a; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #505254; + --sidebar-active: #e69f67; + --sidebar-spacer: #45373a; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #262625; + + --links: #2b79a2; + + --inline-code-color: #6e6b5e; + + --theme-popup-bg: #e1e1db; + --theme-popup-border: #b38f6b; + --theme-hover: #99908a; + + --quote-bg: hsl(60, 5%, 75%); + --quote-border: hsl(60, 5%, 70%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(60, 9%, 82%); + --table-header-bg: #b3a497; + --table-alternate-bg: hsl(60, 9%, 84%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #fafafa; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #dec2a2; + --search-mark-bg: #e69f67; + + --color-scheme: light; +} + +@media (prefers-color-scheme: dark) { + .light.no-js { + --bg: hsl(200, 7%, 8%); + --fg: #98a3ad; + + --sidebar-bg: #292c2f; + --sidebar-fg: #a1adb8; + --sidebar-non-existant: #505254; + --sidebar-active: #3473ad; + --sidebar-spacer: #393939; + + --scrollbar: var(--sidebar-fg); + + --icons: #43484d; + --icons-hover: #b3c0cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #141617; + --theme-popup-border: #43484d; + --theme-hover: #1f2124; + + --quote-bg: hsl(234, 21%, 18%); + --quote-border: hsl(234, 21%, 23%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(200, 7%, 13%); + --table-header-bg: hsl(200, 7%, 28%); + --table-alternate-bg: hsl(200, 7%, 11%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #b7b7b7; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #98a3ad; + --searchresults-li-bg: #2b2b2f; + --search-mark-bg: #355c7d; + } +} diff --git a/elasticlunr.min.js b/elasticlunr.min.js new file mode 100644 index 00000000..94b20dd2 --- /dev/null +++ b/elasticlunr.min.js @@ -0,0 +1,10 @@ +/** + * elasticlunr - http://weixsong.github.io + * Lightweight full-text search engine in Javascript for browser search and offline search. - 0.9.5 + * + * Copyright (C) 2017 Oliver Nightingale + * Copyright (C) 2017 Wei Song + * MIT Licensed + * @license + */ +!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.toArray();o + + + + + Errors and exceptions - Chronos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Errors and exceptions

+ +

Exceptions

+

Exceptions inheriting from CatchableError +interrupt execution of an async procedure. The exception is placed in the +Future.error field while changing the status of the Future to Failed +and callbacks are scheduled.

+

When a future is read or awaited the exception is re-raised, traversing the +async execution chain until handled.

+
proc p1() {.async.} =
+  await sleepAsync(1.seconds)
+  raise newException(ValueError, "ValueError inherits from CatchableError")
+
+proc p2() {.async.} =
+  await sleepAsync(1.seconds)
+
+proc p3() {.async.} =
+  let
+    fut1 = p1()
+    fut2 = p2()
+  await fut1
+  echo "unreachable code here"
+  await fut2
+
+# `waitFor()` would call `Future.read()` unconditionally, which would raise the
+# exception in `Future.error`.
+let fut3 = p3()
+while not(fut3.finished()):
+  poll()
+
+echo "fut3.state = ", fut3.state # "Failed"
+if fut3.failed():
+  echo "p3() failed: ", fut3.error.name, ": ", fut3.error.msg
+  # prints "p3() failed: ValueError: ValueError inherits from CatchableError"
+
+

You can put the await in a try block, to deal with that exception sooner:

+
proc p3() {.async.} =
+  let
+    fut1 = p1()
+    fut2 = p2()
+  try:
+    await fut1
+  except CachableError:
+    echo "p1() failed: ", fut1.error.name, ": ", fut1.error.msg
+  echo "reachable code here"
+  await fut2
+
+

Because chronos ensures that all exceptions are re-routed to the Future, +poll will not itself raise exceptions.

+

poll may still panic / raise Defect if such are raised in user code due to +undefined behavior.

+

Checked exceptions

+

By specifying a raises list to an async procedure, you can check which +exceptions can be raised by it:

+
proc p1(): Future[void] {.async: (raises: [IOError]).} =
+  assert not (compiles do: raise newException(ValueError, "uh-uh"))
+  raise newException(IOError, "works") # Or any child of IOError
+
+proc p2(): Future[void] {.async, (raises: [IOError]).} =
+  await p1() # Works, because await knows that p1
+             # can only raise IOError
+
+

Under the hood, the return type of p1 will be rewritten to an internal type +which will convey raises informations to await.

+
Most `async` include `CancelledError` in the list of `raises`, indicating that
+the operation they implement might get cancelled resulting in neither value nor
+error!
+
+

When using checked exceptions, the Future type is modified to include +raises information - it can be constructed with the Raising helper:

+
# Create a variable of the type that will be returned by a an async function
+# raising `[CancelledError]`:
+var fut: Future[int].Raising([CancelledError])
+
+
`Raising` creates a specialization of `InternalRaisesFuture` type - as the name
+suggests, this is an internal type whose implementation details are likely to
+change in future `chronos` versions.
+
+

The Exception type

+

Exceptions deriving from Exception are not caught by default as these may +include Defect and other forms undefined or uncatchable behavior.

+

Because exception effect tracking is turned on for async functions, this may +sometimes lead to compile errors around forward declarations, methods and +closures as Nim conservatively asssumes that any Exception might be raised +from those.

+

Make sure to explicitly annotate these with {.raises.}:

+
# Forward declarations need to explicitly include a raises list:
+proc myfunction() {.raises: [ValueError].}
+
+# ... as do `proc` types
+type MyClosure = proc() {.raises: [ValueError].}
+
+proc myfunction() =
+  raise (ref ValueError)(msg: "Implementation here")
+
+let closure: MyClosure = myfunction
+
+

Compatibility modes

+

Individual functions. For compatibility, async functions can be instructed +to handle Exception as well, specifying handleException: true. Any +Exception that is not a Defect and not a CatchableError will then be +caught and remapped to AsyncExceptionError:

+
proc raiseException() {.async: (handleException: true, raises: [AsyncExceptionError]).} =
+  raise (ref Exception)(msg: "Raising Exception is UB")
+
+proc callRaiseException() {.async: (raises: []).} =
+  try:
+    await raiseException()
+  except AsyncExceptionError as exc:
+    # The original Exception is available from the `parent` field
+    echo exc.parent.msg
+
+

Global flag. This mode can be enabled globally with +-d:chronosHandleException as a help when porting code to chronos. The +behavior in this case will be that:

+
    +
  1. +

    old-style functions annotated with plain async will behave as if they had +been annotated with async: (handleException: true).

    +

    This is functionally equivalent to +async: (handleException: true, raises: [CatchableError]) and will, as +before, remap any Exception that is not Defect into +AsyncExceptionError, while also allowing any CatchableError (including +AsyncExceptionError) to get through without compilation errors.

    +
  2. +
  3. +

    New-style functions with async: (raises: [...]) annotations or their own +handleException annotations will not be affected.

    +
  4. +
+

The rationale here is to allow one to incrementally introduce exception +annotations and get compiler feedback while not requiring that every bit of +legacy code is updated at once.

+

This should be used sparingly and with care, however, as global configuration +settings may interfere with libraries that use chronos leading to unexpected +behavior.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/examples.html b/examples.html new file mode 100644 index 00000000..67a14ac8 --- /dev/null +++ b/examples.html @@ -0,0 +1,253 @@ + + + + + + Examples - Chronos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Examples

+

Examples are available in the docs/examples/ folder.

+

Basic concepts

+ +

Threads

+ +

TCP

+
    +
  • tcpserver - Simple TCP/IP v4/v6 echo server
  • +
+

HTTP

+
    +
  • httpget - Downloading a web page using the http client
  • +
  • twogets - Download two pages concurrently
  • +
  • middleware - Deploy multiple HTTP server middlewares
  • +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/favicon.png b/favicon.png new file mode 100644 index 00000000..a5b1aa16 Binary files /dev/null and b/favicon.png differ diff --git a/favicon.svg b/favicon.svg new file mode 100644 index 00000000..90e0ea58 --- /dev/null +++ b/favicon.svg @@ -0,0 +1,22 @@ + + + + + diff --git a/fonts/OPEN-SANS-LICENSE.txt b/fonts/OPEN-SANS-LICENSE.txt new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/fonts/OPEN-SANS-LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/fonts/SOURCE-CODE-PRO-LICENSE.txt b/fonts/SOURCE-CODE-PRO-LICENSE.txt new file mode 100644 index 00000000..366206f5 --- /dev/null +++ b/fonts/SOURCE-CODE-PRO-LICENSE.txt @@ -0,0 +1,93 @@ +Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/fonts/fonts.css b/fonts/fonts.css new file mode 100644 index 00000000..858efa59 --- /dev/null +++ b/fonts/fonts.css @@ -0,0 +1,100 @@ +/* Open Sans is licensed under the Apache License, Version 2.0. See http://www.apache.org/licenses/LICENSE-2.0 */ +/* Source Code Pro is under the Open Font License. See https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL */ + +/* open-sans-300 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 300; + src: local('Open Sans Light'), local('OpenSans-Light'), + url('open-sans-v17-all-charsets-300.woff2') format('woff2'); +} + +/* open-sans-300italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 300; + src: local('Open Sans Light Italic'), local('OpenSans-LightItalic'), + url('open-sans-v17-all-charsets-300italic.woff2') format('woff2'); +} + +/* open-sans-regular - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 400; + src: local('Open Sans Regular'), local('OpenSans-Regular'), + url('open-sans-v17-all-charsets-regular.woff2') format('woff2'); +} + +/* open-sans-italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 400; + src: local('Open Sans Italic'), local('OpenSans-Italic'), + url('open-sans-v17-all-charsets-italic.woff2') format('woff2'); +} + +/* open-sans-600 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 600; + src: local('Open Sans SemiBold'), local('OpenSans-SemiBold'), + url('open-sans-v17-all-charsets-600.woff2') format('woff2'); +} + +/* open-sans-600italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 600; + src: local('Open Sans SemiBold Italic'), local('OpenSans-SemiBoldItalic'), + url('open-sans-v17-all-charsets-600italic.woff2') format('woff2'); +} + +/* open-sans-700 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 700; + src: local('Open Sans Bold'), local('OpenSans-Bold'), + url('open-sans-v17-all-charsets-700.woff2') format('woff2'); +} + +/* open-sans-700italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 700; + src: local('Open Sans Bold Italic'), local('OpenSans-BoldItalic'), + url('open-sans-v17-all-charsets-700italic.woff2') format('woff2'); +} + +/* open-sans-800 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 800; + src: local('Open Sans ExtraBold'), local('OpenSans-ExtraBold'), + url('open-sans-v17-all-charsets-800.woff2') format('woff2'); +} + +/* open-sans-800italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 800; + src: local('Open Sans ExtraBold Italic'), local('OpenSans-ExtraBoldItalic'), + url('open-sans-v17-all-charsets-800italic.woff2') format('woff2'); +} + +/* source-code-pro-500 - latin_vietnamese_latin-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; + src: url('source-code-pro-v11-all-charsets-500.woff2') format('woff2'); +} diff --git a/fonts/open-sans-v17-all-charsets-300.woff2 b/fonts/open-sans-v17-all-charsets-300.woff2 new file mode 100644 index 00000000..9f51be37 Binary files /dev/null and b/fonts/open-sans-v17-all-charsets-300.woff2 differ diff --git a/fonts/open-sans-v17-all-charsets-300italic.woff2 b/fonts/open-sans-v17-all-charsets-300italic.woff2 new file mode 100644 index 00000000..2f545448 Binary files /dev/null and b/fonts/open-sans-v17-all-charsets-300italic.woff2 differ diff --git a/fonts/open-sans-v17-all-charsets-600.woff2 b/fonts/open-sans-v17-all-charsets-600.woff2 new file mode 100644 index 00000000..f503d558 Binary files /dev/null and b/fonts/open-sans-v17-all-charsets-600.woff2 differ diff --git a/fonts/open-sans-v17-all-charsets-600italic.woff2 b/fonts/open-sans-v17-all-charsets-600italic.woff2 new file mode 100644 index 00000000..c99aabe8 Binary files /dev/null and b/fonts/open-sans-v17-all-charsets-600italic.woff2 differ diff --git a/fonts/open-sans-v17-all-charsets-700.woff2 b/fonts/open-sans-v17-all-charsets-700.woff2 new file mode 100644 index 00000000..421a1ab2 Binary files /dev/null and b/fonts/open-sans-v17-all-charsets-700.woff2 differ diff --git a/fonts/open-sans-v17-all-charsets-700italic.woff2 b/fonts/open-sans-v17-all-charsets-700italic.woff2 new file mode 100644 index 00000000..12ce3d20 Binary files /dev/null and b/fonts/open-sans-v17-all-charsets-700italic.woff2 differ diff --git a/fonts/open-sans-v17-all-charsets-800.woff2 b/fonts/open-sans-v17-all-charsets-800.woff2 new file mode 100644 index 00000000..c94a223b Binary files /dev/null and b/fonts/open-sans-v17-all-charsets-800.woff2 differ diff --git a/fonts/open-sans-v17-all-charsets-800italic.woff2 b/fonts/open-sans-v17-all-charsets-800italic.woff2 new file mode 100644 index 00000000..eed7d3c6 Binary files /dev/null and b/fonts/open-sans-v17-all-charsets-800italic.woff2 differ diff --git a/fonts/open-sans-v17-all-charsets-italic.woff2 b/fonts/open-sans-v17-all-charsets-italic.woff2 new file mode 100644 index 00000000..398b68a0 Binary files /dev/null and b/fonts/open-sans-v17-all-charsets-italic.woff2 differ diff --git a/fonts/open-sans-v17-all-charsets-regular.woff2 b/fonts/open-sans-v17-all-charsets-regular.woff2 new file mode 100644 index 00000000..8383e94c Binary files /dev/null and b/fonts/open-sans-v17-all-charsets-regular.woff2 differ diff --git a/fonts/source-code-pro-v11-all-charsets-500.woff2 b/fonts/source-code-pro-v11-all-charsets-500.woff2 new file mode 100644 index 00000000..72224568 Binary files /dev/null and b/fonts/source-code-pro-v11-all-charsets-500.woff2 differ diff --git a/highlight.css b/highlight.css new file mode 100644 index 00000000..ba57b82b --- /dev/null +++ b/highlight.css @@ -0,0 +1,82 @@ +/* + * An increased contrast highlighting scheme loosely based on the + * "Base16 Atelier Dune Light" theme by Bram de Haan + * (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) + * Original Base16 color scheme by Chris Kempson + * (https://github.com/chriskempson/base16) + */ + +/* Comment */ +.hljs-comment, +.hljs-quote { + color: #575757; +} + +/* Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #d70025; +} + +/* Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #b21e00; +} + +/* Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #008200; +} + +/* Blue */ +.hljs-title, +.hljs-section { + color: #0030f2; +} + +/* Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #9d00ec; +} + +.hljs { + display: block; + overflow-x: auto; + background: #f6f7f6; + color: #000; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-addition { + color: #22863a; + background-color: #f0fff4; +} + +.hljs-deletion { + color: #b31d28; + background-color: #ffeef0; +} diff --git a/highlight.js b/highlight.js new file mode 100644 index 00000000..3256c00e --- /dev/null +++ b/highlight.js @@ -0,0 +1,53 @@ +/* + Highlight.js 10.1.1 (93fd0d73) + License: BSD-3-Clause + Copyright (c) 2006-2020, Ivan Sagalaev +*/ +var hljs=function(){"use strict";function e(n){Object.freeze(n);var t="function"==typeof n;return Object.getOwnPropertyNames(n).forEach((function(r){!Object.hasOwnProperty.call(n,r)||null===n[r]||"object"!=typeof n[r]&&"function"!=typeof n[r]||t&&("caller"===r||"callee"===r||"arguments"===r)||Object.isFrozen(n[r])||e(n[r])})),n}class n{constructor(e){void 0===e.data&&(e.data={}),this.data=e.data}ignoreMatch(){this.ignore=!0}}function t(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function r(e,...n){var t={};for(const n in e)t[n]=e[n];return n.forEach((function(e){for(const n in e)t[n]=e[n]})),t}function a(e){return e.nodeName.toLowerCase()}var i=Object.freeze({__proto__:null,escapeHTML:t,inherit:r,nodeStream:function(e){var n=[];return function e(t,r){for(var i=t.firstChild;i;i=i.nextSibling)3===i.nodeType?r+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:r,node:i}),r=e(i,r),a(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:r,node:i}));return r}(e,0),n},mergeStreams:function(e,n,r){var i=0,s="",o=[];function l(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset"}function u(e){s+=""}function d(e){("start"===e.event?c:u)(e.node)}for(;e.length||n.length;){var g=l();if(s+=t(r.substring(i,g[0].offset)),i=g[0].offset,g===e){o.reverse().forEach(u);do{d(g.splice(0,1)[0]),g=l()}while(g===e&&g.length&&g[0].offset===i);o.reverse().forEach(c)}else"start"===g[0].event?o.push(g[0].node):o.pop(),d(g.splice(0,1)[0])}return s+t(r.substr(i))}});const s="",o=e=>!!e.kind;class l{constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){this.buffer+=t(e)}openNode(e){if(!o(e))return;let n=e.kind;e.sublanguage||(n=`${this.classPrefix}${n}`),this.span(n)}closeNode(e){o(e)&&(this.buffer+=s)}value(){return this.buffer}span(e){this.buffer+=``}}class c{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){const n={kind:e,children:[]};this.add(n),this.stack.push(n)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n),n.children.forEach(n=>this._walk(e,n)),e.closeNode(n)),e}static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(e=>"string"==typeof e)?e.children=[e.children.join("")]:e.children.forEach(e=>{c._collapse(e)}))}}class u extends c{constructor(e){super(),this.options=e}addKeyword(e,n){""!==e&&(this.openNode(n),this.addText(e),this.closeNode())}addText(e){""!==e&&this.add(e)}addSublanguage(e,n){const t=e.root;t.kind=n,t.sublanguage=!0,this.add(t)}toHTML(){return new l(this,this.options).value()}finalize(){return!0}}function d(e){return e?"string"==typeof e?e:e.source:null}const g="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",h={begin:"\\\\[\\s\\S]",relevance:0},f={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[h]},p={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[h]},b={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},m=function(e,n,t={}){var a=r({className:"comment",begin:e,end:n,contains:[]},t);return a.contains.push(b),a.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),a},v=m("//","$"),x=m("/\\*","\\*/"),E=m("#","$");var _=Object.freeze({__proto__:null,IDENT_RE:"[a-zA-Z]\\w*",UNDERSCORE_IDENT_RE:"[a-zA-Z_]\\w*",NUMBER_RE:"\\b\\d+(\\.\\d+)?",C_NUMBER_RE:g,BINARY_NUMBER_RE:"\\b(0b[01]+)",RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(e={})=>{const n=/^#![ ]*\//;return e.binary&&(e.begin=function(...e){return e.map(e=>d(e)).join("")}(n,/.*\b/,e.binary,/\b.*/)),r({className:"meta",begin:n,end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)},BACKSLASH_ESCAPE:h,APOS_STRING_MODE:f,QUOTE_STRING_MODE:p,PHRASAL_WORDS_MODE:b,COMMENT:m,C_LINE_COMMENT_MODE:v,C_BLOCK_COMMENT_MODE:x,HASH_COMMENT_MODE:E,NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?",relevance:0},C_NUMBER_MODE:{className:"number",begin:g,relevance:0},BINARY_NUMBER_MODE:{className:"number",begin:"\\b(0b[01]+)",relevance:0},CSS_NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[h,{begin:/\[/,end:/\]/,relevance:0,contains:[h]}]}]},TITLE_MODE:{className:"title",begin:"[a-zA-Z]\\w*",relevance:0},UNDERSCORE_TITLE_MODE:{className:"title",begin:"[a-zA-Z_]\\w*",relevance:0},METHOD_GUARD:{begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{n.data._beginMatch!==e[1]&&n.ignoreMatch()}})}}),N="of and for in not or if then".split(" ");function w(e,n){return n?+n:function(e){return N.includes(e.toLowerCase())}(e)?0:1}const R=t,y=r,{nodeStream:k,mergeStreams:O}=i,M=Symbol("nomatch");return function(t){var a=[],i={},s={},o=[],l=!0,c=/(^(<[^>]+>|\t|)+|\n)/gm,g="Could not find the language '{}', did you forget to load/include a language module?";const h={disableAutodetect:!0,name:"Plain text",contains:[]};var f={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:u};function p(e){return f.noHighlightRe.test(e)}function b(e,n,t,r){var a={code:n,language:e};S("before:highlight",a);var i=a.result?a.result:m(a.language,a.code,t,r);return i.code=a.code,S("after:highlight",i),i}function m(e,t,a,s){var o=t;function c(e,n){var t=E.case_insensitive?n[0].toLowerCase():n[0];return Object.prototype.hasOwnProperty.call(e.keywords,t)&&e.keywords[t]}function u(){null!=y.subLanguage?function(){if(""!==A){var e=null;if("string"==typeof y.subLanguage){if(!i[y.subLanguage])return void O.addText(A);e=m(y.subLanguage,A,!0,k[y.subLanguage]),k[y.subLanguage]=e.top}else e=v(A,y.subLanguage.length?y.subLanguage:null);y.relevance>0&&(I+=e.relevance),O.addSublanguage(e.emitter,e.language)}}():function(){if(!y.keywords)return void O.addText(A);let e=0;y.keywordPatternRe.lastIndex=0;let n=y.keywordPatternRe.exec(A),t="";for(;n;){t+=A.substring(e,n.index);const r=c(y,n);if(r){const[e,a]=r;O.addText(t),t="",I+=a,O.addKeyword(n[0],e)}else t+=n[0];e=y.keywordPatternRe.lastIndex,n=y.keywordPatternRe.exec(A)}t+=A.substr(e),O.addText(t)}(),A=""}function h(e){return e.className&&O.openNode(e.className),y=Object.create(e,{parent:{value:y}})}function p(e){return 0===y.matcher.regexIndex?(A+=e[0],1):(L=!0,0)}var b={};function x(t,r){var i=r&&r[0];if(A+=t,null==i)return u(),0;if("begin"===b.type&&"end"===r.type&&b.index===r.index&&""===i){if(A+=o.slice(r.index,r.index+1),!l){const n=Error("0 width match regex");throw n.languageName=e,n.badRule=b.rule,n}return 1}if(b=r,"begin"===r.type)return function(e){var t=e[0],r=e.rule;const a=new n(r),i=[r.__beforeBegin,r["on:begin"]];for(const n of i)if(n&&(n(e,a),a.ignore))return p(t);return r&&r.endSameAsBegin&&(r.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")),r.skip?A+=t:(r.excludeBegin&&(A+=t),u(),r.returnBegin||r.excludeBegin||(A=t)),h(r),r.returnBegin?0:t.length}(r);if("illegal"===r.type&&!a){const e=Error('Illegal lexeme "'+i+'" for mode "'+(y.className||"")+'"');throw e.mode=y,e}if("end"===r.type){var s=function(e){var t=e[0],r=o.substr(e.index),a=function e(t,r,a){let i=function(e,n){var t=e&&e.exec(n);return t&&0===t.index}(t.endRe,a);if(i){if(t["on:end"]){const e=new n(t);t["on:end"](r,e),e.ignore&&(i=!1)}if(i){for(;t.endsParent&&t.parent;)t=t.parent;return t}}if(t.endsWithParent)return e(t.parent,r,a)}(y,e,r);if(!a)return M;var i=y;i.skip?A+=t:(i.returnEnd||i.excludeEnd||(A+=t),u(),i.excludeEnd&&(A=t));do{y.className&&O.closeNode(),y.skip||y.subLanguage||(I+=y.relevance),y=y.parent}while(y!==a.parent);return a.starts&&(a.endSameAsBegin&&(a.starts.endRe=a.endRe),h(a.starts)),i.returnEnd?0:t.length}(r);if(s!==M)return s}if("illegal"===r.type&&""===i)return 1;if(B>1e5&&B>3*r.index)throw Error("potential infinite loop, way more iterations than matches");return A+=i,i.length}var E=T(e);if(!E)throw console.error(g.replace("{}",e)),Error('Unknown language: "'+e+'"');var _=function(e){function n(n,t){return RegExp(d(n),"m"+(e.case_insensitive?"i":"")+(t?"g":""))}class t{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,n){n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]),this.matchAt+=function(e){return RegExp(e.toString()+"|").exec("").length-1}(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const e=this.regexes.map(e=>e[1]);this.matcherRe=n(function(e,n="|"){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i0&&(a+=n),a+="(";o.length>0;){var l=t.exec(o);if(null==l){a+=o;break}a+=o.substring(0,l.index),o=o.substring(l.index+l[0].length),"\\"===l[0][0]&&l[1]?a+="\\"+(+l[1]+s):(a+=l[0],"("===l[0]&&r++)}a+=")"}return a}(e),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;const n=this.matcherRe.exec(e);if(!n)return null;const t=n.findIndex((e,n)=>n>0&&void 0!==e),r=this.matchIndexes[t];return n.splice(0,t),Object.assign(n,r)}}class a{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t;return this.rules.slice(e).forEach(([e,t])=>n.addRule(e,t)),n.compile(),this.multiRegexes[e]=n,n}considerAll(){this.regexIndex=0}addRule(e,n){this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex;const t=n.exec(e);return t&&(this.regexIndex+=t.position+1,this.regexIndex===this.count&&(this.regexIndex=0)),t}}function i(e,n){const t=e.input[e.index-1],r=e.input[e.index+e[0].length];"."!==t&&"."!==r||n.ignoreMatch()}if(e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return function t(s,o){const l=s;if(s.compiled)return l;s.compiled=!0,s.__beforeBegin=null,s.keywords=s.keywords||s.beginKeywords;let c=null;if("object"==typeof s.keywords&&(c=s.keywords.$pattern,delete s.keywords.$pattern),s.keywords&&(s.keywords=function(e,n){var t={};return"string"==typeof e?r("keyword",e):Object.keys(e).forEach((function(n){r(n,e[n])})),t;function r(e,r){n&&(r=r.toLowerCase()),r.split(" ").forEach((function(n){var r=n.split("|");t[r[0]]=[e,w(r[0],r[1])]}))}}(s.keywords,e.case_insensitive)),s.lexemes&&c)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return l.keywordPatternRe=n(s.lexemes||c||/\w+/,!0),o&&(s.beginKeywords&&(s.begin="\\b("+s.beginKeywords.split(" ").join("|")+")(?=\\b|\\s)",s.__beforeBegin=i),s.begin||(s.begin=/\B|\b/),l.beginRe=n(s.begin),s.endSameAsBegin&&(s.end=s.begin),s.end||s.endsWithParent||(s.end=/\B|\b/),s.end&&(l.endRe=n(s.end)),l.terminator_end=d(s.end)||"",s.endsWithParent&&o.terminator_end&&(l.terminator_end+=(s.end?"|":"")+o.terminator_end)),s.illegal&&(l.illegalRe=n(s.illegal)),void 0===s.relevance&&(s.relevance=1),s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((function(e){return function(e){return e.variants&&!e.cached_variants&&(e.cached_variants=e.variants.map((function(n){return r(e,{variants:null},n)}))),e.cached_variants?e.cached_variants:function e(n){return!!n&&(n.endsWithParent||e(n.starts))}(e)?r(e,{starts:e.starts?r(e.starts):null}):Object.isFrozen(e)?r(e):e}("self"===e?s:e)}))),s.contains.forEach((function(e){t(e,l)})),s.starts&&t(s.starts,o),l.matcher=function(e){const n=new a;return e.contains.forEach(e=>n.addRule(e.begin,{rule:e,type:"begin"})),e.terminator_end&&n.addRule(e.terminator_end,{type:"end"}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n}(l),l}(e)}(E),N="",y=s||_,k={},O=new f.__emitter(f);!function(){for(var e=[],n=y;n!==E;n=n.parent)n.className&&e.unshift(n.className);e.forEach(e=>O.openNode(e))}();var A="",I=0,S=0,B=0,L=!1;try{for(y.matcher.considerAll();;){B++,L?L=!1:(y.matcher.lastIndex=S,y.matcher.considerAll());const e=y.matcher.exec(o);if(!e)break;const n=x(o.substring(S,e.index),e);S=e.index+n}return x(o.substr(S)),O.closeAllNodes(),O.finalize(),N=O.toHTML(),{relevance:I,value:N,language:e,illegal:!1,emitter:O,top:y}}catch(n){if(n.message&&n.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:n.message,context:o.slice(S-100,S+100),mode:n.mode},sofar:N,relevance:0,value:R(o),emitter:O};if(l)return{illegal:!1,relevance:0,value:R(o),emitter:O,language:e,top:y,errorRaised:n};throw n}}function v(e,n){n=n||f.languages||Object.keys(i);var t=function(e){const n={relevance:0,emitter:new f.__emitter(f),value:R(e),illegal:!1,top:h};return n.emitter.addText(e),n}(e),r=t;return n.filter(T).filter(I).forEach((function(n){var a=m(n,e,!1);a.language=n,a.relevance>r.relevance&&(r=a),a.relevance>t.relevance&&(r=t,t=a)})),r.language&&(t.second_best=r),t}function x(e){return f.tabReplace||f.useBR?e.replace(c,e=>"\n"===e?f.useBR?"
":e:f.tabReplace?e.replace(/\t/g,f.tabReplace):e):e}function E(e){let n=null;const t=function(e){var n=e.className+" ";n+=e.parentNode?e.parentNode.className:"";const t=f.languageDetectRe.exec(n);if(t){var r=T(t[1]);return r||(console.warn(g.replace("{}",t[1])),console.warn("Falling back to no-highlight mode for this block.",e)),r?t[1]:"no-highlight"}return n.split(/\s+/).find(e=>p(e)||T(e))}(e);if(p(t))return;S("before:highlightBlock",{block:e,language:t}),f.useBR?(n=document.createElement("div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n"):n=e;const r=n.textContent,a=t?b(t,r,!0):v(r),i=k(n);if(i.length){const e=document.createElement("div");e.innerHTML=a.value,a.value=O(i,k(e),r)}a.value=x(a.value),S("after:highlightBlock",{block:e,result:a}),e.innerHTML=a.value,e.className=function(e,n,t){var r=n?s[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),e.includes(r)||a.push(r),a.join(" ").trim()}(e.className,t,a.language),e.result={language:a.language,re:a.relevance,relavance:a.relevance},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.relevance,relavance:a.second_best.relevance})}const N=()=>{if(!N.called){N.called=!0;var e=document.querySelectorAll("pre code");a.forEach.call(e,E)}};function T(e){return e=(e||"").toLowerCase(),i[e]||i[s[e]]}function A(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach(e=>{s[e]=n})}function I(e){var n=T(e);return n&&!n.disableAutodetect}function S(e,n){var t=e;o.forEach((function(e){e[t]&&e[t](n)}))}Object.assign(t,{highlight:b,highlightAuto:v,fixMarkup:x,highlightBlock:E,configure:function(e){f=y(f,e)},initHighlighting:N,initHighlightingOnLoad:function(){window.addEventListener("DOMContentLoaded",N,!1)},registerLanguage:function(e,n){var r=null;try{r=n(t)}catch(n){if(console.error("Language definition for '{}' could not be registered.".replace("{}",e)),!l)throw n;console.error(n),r=h}r.name||(r.name=e),i[e]=r,r.rawDefinition=n.bind(null,t),r.aliases&&A(r.aliases,{languageName:e})},listLanguages:function(){return Object.keys(i)},getLanguage:T,registerAliases:A,requireLanguage:function(e){var n=T(e);if(n)return n;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))},autoDetection:I,inherit:y,addPlugin:function(e){o.push(e)}}),t.debugMode=function(){l=!1},t.safeMode=function(){l=!0},t.versionString="10.1.1";for(const n in _)"object"==typeof _[n]&&e(_[n]);return Object.assign(t,_),t}({})}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs); +hljs.registerLanguage("apache",function(){"use strict";return function(e){var n={className:"number",begin:"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?"};return{name:"Apache config",aliases:["apacheconf"],case_insensitive:!0,contains:[e.HASH_COMMENT_MODE,{className:"section",begin:"",contains:[n,{className:"number",begin:":\\d{1,5}"},e.inherit(e.QUOTE_STRING_MODE,{relevance:0})]},{className:"attribute",begin:/\w+/,relevance:0,keywords:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{end:/$/,relevance:0,keywords:{literal:"on off all deny allow"},contains:[{className:"meta",begin:"\\s\\[",end:"\\]$"},{className:"variable",begin:"[\\$%]\\{",end:"\\}",contains:["self",{className:"number",begin:"[\\$%]\\d+"}]},n,{className:"number",begin:"\\d+"},e.QUOTE_STRING_MODE]}}],illegal:/\S/}}}()); +hljs.registerLanguage("bash",function(){"use strict";return function(e){const s={};Object.assign(s,{className:"variable",variants:[{begin:/\$[\w\d#@][\w\d_]*/},{begin:/\$\{/,end:/\}/,contains:[{begin:/:-/,contains:[s]}]}]});const t={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,t]};t.contains.push(n);const a={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,s]},i=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10}),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b-?[a-z\._]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},contains:[i,e.SHEBANG(),c,a,e.HASH_COMMENT_MODE,n,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},s]}}}()); +hljs.registerLanguage("c-like",function(){"use strict";return function(e){function t(e){return"(?:"+e+")?"}var n="(decltype\\(auto\\)|"+t("[a-zA-Z_]\\w*::")+"[a-zA-Z_]\\w*"+t("<.*?>")+")",r={className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},a={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},i={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(a,{className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},o={className:"title",begin:t("[a-zA-Z_]\\w*::")+e.IDENT_RE,relevance:0},c=t("[a-zA-Z_]\\w*::")+e.IDENT_RE+"\\s*\\(",l={keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary",literal:"true false nullptr NULL"},d=[r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,i,a],_={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:l,contains:d.concat([{begin:/\(/,end:/\)/,keywords:l,contains:d.concat(["self"]),relevance:0}]),relevance:0},u={className:"function",begin:"("+n+"[\\*&\\s]+)+"+c,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:l,illegal:/[^\w\s\*&:<>]/,contains:[{begin:"decltype\\(auto\\)",keywords:l,relevance:0},{begin:c,returnBegin:!0,contains:[o],relevance:0},{className:"params",begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r,{begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:["self",e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r]}]},r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s]};return{aliases:["c","cc","h","c++","h++","hpp","hh","hxx","cxx"],keywords:l,disableAutodetect:!0,illegal:"",keywords:l,contains:["self",r]},{begin:e.IDENT_RE+"::",keywords:l},{className:"class",beginKeywords:"class struct",end:/[{;:]/,contains:[{begin://,contains:["self"]},e.TITLE_MODE]}]),exports:{preprocessor:s,strings:a,keywords:l}}}}()); +hljs.registerLanguage("c",function(){"use strict";return function(e){var n=e.getLanguage("c-like").rawDefinition();return n.name="C",n.aliases=["c","h"],n}}()); +hljs.registerLanguage("coffeescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={keyword:e.concat(["then","unless","until","loop","by","when","and","or","is","isnt","not"]).filter((e=>n=>!e.includes(n))(["var","const","let","function","static"])).join(" "),literal:n.concat(["yes","no","on","off"]).join(" "),built_in:a.concat(["npm","print"]).join(" ")},i="[A-Za-z$_][0-9A-Za-z$_]*",s={className:"subst",begin:/#\{/,end:/}/,keywords:t},o=[r.BINARY_NUMBER_MODE,r.inherit(r.C_NUMBER_MODE,{starts:{end:"(\\s*/)?",relevance:0}}),{className:"string",variants:[{begin:/'''/,end:/'''/,contains:[r.BACKSLASH_ESCAPE]},{begin:/'/,end:/'/,contains:[r.BACKSLASH_ESCAPE]},{begin:/"""/,end:/"""/,contains:[r.BACKSLASH_ESCAPE,s]},{begin:/"/,end:/"/,contains:[r.BACKSLASH_ESCAPE,s]}]},{className:"regexp",variants:[{begin:"///",end:"///",contains:[s,r.HASH_COMMENT_MODE]},{begin:"//[gim]{0,3}(?=\\W)",relevance:0},{begin:/\/(?![ *]).*?(?![\\]).\/[gim]{0,3}(?=\W)/}]},{begin:"@"+i},{subLanguage:"javascript",excludeBegin:!0,excludeEnd:!0,variants:[{begin:"```",end:"```"},{begin:"`",end:"`"}]}];s.contains=o;var c=r.inherit(r.TITLE_MODE,{begin:i}),l={className:"params",begin:"\\([^\\(]",returnBegin:!0,contains:[{begin:/\(/,end:/\)/,keywords:t,contains:["self"].concat(o)}]};return{name:"CoffeeScript",aliases:["coffee","cson","iced"],keywords:t,illegal:/\/\*/,contains:o.concat([r.COMMENT("###","###"),r.HASH_COMMENT_MODE,{className:"function",begin:"^\\s*"+i+"\\s*=\\s*(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[c,l]},{begin:/[:\(,=]\s*/,relevance:0,contains:[{className:"function",begin:"(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[l]}]},{className:"class",beginKeywords:"class",end:"$",illegal:/[:="\[\]]/,contains:[{beginKeywords:"extends",endsWithParent:!0,illegal:/[:="\[\]]/,contains:[c]},c]},{begin:i+":",end:":",returnBegin:!0,returnEnd:!0,relevance:0}])}}}()); +hljs.registerLanguage("cpp",function(){"use strict";return function(e){var t=e.getLanguage("c-like").rawDefinition();return t.disableAutodetect=!1,t.name="C++",t.aliases=["cc","c++","h++","hpp","hh","hxx","cxx"],t}}()); +hljs.registerLanguage("csharp",function(){"use strict";return function(e){var n={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let nameof on orderby partial remove select set value var when where yield",literal:"null false true"},i=e.inherit(e.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},t=e.inherit(s,{illegal:/\n/}),l={className:"subst",begin:"{",end:"}",keywords:n},r=e.inherit(l,{illegal:/\n/}),c={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},e.BACKSLASH_ESCAPE,r]},o={className:"string",begin:/\$@"/,end:'"',contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},l]},g=e.inherit(o,{illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},r]});l.contains=[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE],r.contains=[g,c,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];var d={variants:[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},E={begin:"<",end:">",contains:[{beginKeywords:"in out"},i]},_=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",b={begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:"\x3c!--|--\x3e"},{begin:""}]}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},d,a,{beginKeywords:"class interface",end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},i,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",end:/[{;=]/,illegal:/[^\s:]/,contains:[i,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"meta-string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+_+"\\s+)+"+e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{begin:e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,contains:[e.TITLE_MODE,E],relevance:0},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0,contains:[d,a,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},b]}}}()); +hljs.registerLanguage("css",function(){"use strict";return function(e){var n={begin:/(?:[A-Z\_\.\-]+|--[a-zA-Z0-9_-]+)\s*:/,returnBegin:!0,end:";",endsWithParent:!0,contains:[{className:"attribute",begin:/\S/,end:":",excludeEnd:!0,starts:{endsWithParent:!0,excludeEnd:!0,contains:[{begin:/[\w-]+\(/,returnBegin:!0,contains:[{className:"built_in",begin:/[\w-]+/},{begin:/\(/,end:/\)/,contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{className:"number",begin:"#[0-9A-Fa-f]+"},{className:"meta",begin:"!important"}]}}]};return{name:"CSS",case_insensitive:!0,illegal:/[=\/|'\$]/,contains:[e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/},{className:"selector-class",begin:/\.[A-Za-z0-9_-]+/},{className:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",illegal:/:/,returnBegin:!0,contains:[{className:"keyword",begin:/@\-?\w[\w]*(\-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:"and or not only",contains:[{begin:/[a-z-]+:/,className:"attribute"},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0},{begin:"{",end:"}",illegal:/\S/,contains:[e.C_BLOCK_COMMENT_MODE,n]}]}}}()); +hljs.registerLanguage("diff",function(){"use strict";return function(e){return{name:"Diff",aliases:["patch"],contains:[{className:"meta",relevance:10,variants:[{begin:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{begin:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{begin:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{className:"comment",variants:[{begin:/Index: /,end:/$/},{begin:/={3,}/,end:/$/},{begin:/^\-{3}/,end:/$/},{begin:/^\*{3} /,end:/$/},{begin:/^\+{3}/,end:/$/},{begin:/^\*{15}$/}]},{className:"addition",begin:"^\\+",end:"$"},{className:"deletion",begin:"^\\-",end:"$"},{className:"addition",begin:"^\\!",end:"$"}]}}}()); +hljs.registerLanguage("go",function(){"use strict";return function(e){var n={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{name:"Go",aliases:["golang"],keywords:n,illegal:"e(n)).join("")}return function(a){var s={className:"number",relevance:0,variants:[{begin:/([\+\-]+)?[\d]+_[\d_]+/},{begin:a.NUMBER_RE}]},i=a.COMMENT();i.variants=[{begin:/;/,end:/$/},{begin:/#/,end:/$/}];var t={className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)}/}]},r={className:"literal",begin:/\bon|off|true|false|yes|no\b/},l={className:"string",contains:[a.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}]},c={begin:/\[/,end:/\]/,contains:[i,r,t,l,s,"self"],relevance:0},g="("+[/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/].map(n=>e(n)).join("|")+")";return{name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/,contains:[i,{className:"section",begin:/\[+/,end:/\]+/},{begin:n(g,"(\\s*\\.\\s*",g,")*",n("(?=",/\s*=\s*[^#\s]/,")")),className:"attr",starts:{end:/$/,contains:[i,c,r,t,l,s]}}]}}}()); +hljs.registerLanguage("java",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(e){return a("(",e,")?")}function a(...n){return n.map(n=>e(n)).join("")}function s(...n){return"("+n.map(n=>e(n)).join("|")+")"}return function(e){var t="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",i={className:"meta",begin:"@[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",contains:[{begin:/\(/,end:/\)/,contains:["self"]}]},r=e=>a("[",e,"]+([",e,"_]*[",e,"]+)?"),c={className:"number",variants:[{begin:`\\b(0[bB]${r("01")})[lL]?`},{begin:`\\b(0${r("0-7")})[dDfFlL]?`},{begin:a(/\b0[xX]/,s(a(r("a-fA-F0-9"),/\./,r("a-fA-F0-9")),a(r("a-fA-F0-9"),/\.?/),a(/\./,r("a-fA-F0-9"))),/([pP][+-]?(\d+))?/,/[fFdDlL]?/)},{begin:a(/\b/,s(a(/\d*\./,r("\\d")),r("\\d")),/[eE][+-]?[\d]+[dDfF]?/)},{begin:a(/\b/,r(/\d/),n(/\.?/),n(r(/\d/)),/[dDfFlL]?/)}],relevance:0};return{name:"Java",aliases:["jsp"],keywords:t,illegal:/<\/|#/,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"class",beginKeywords:"class interface",end:/[{;=]/,excludeEnd:!0,keywords:"class interface",illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"new throw return else",relevance:0},{className:"function",begin:"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\s*,\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\s+)+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:t,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/,keywords:t,relevance:0,contains:[i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},c,i]}}}()); +hljs.registerLanguage("javascript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);function s(e){return r("(?=",e,")")}function r(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(t){var i="[A-Za-z$_][0-9A-Za-z$_]*",c={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/},o={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.join(" "),literal:n.join(" "),built_in:a.join(" ")},l={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:t.C_NUMBER_RE+"n?"}],relevance:0},E={className:"subst",begin:"\\$\\{",end:"\\}",keywords:o,contains:[]},d={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"xml"}},g={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"css"}},u={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,E]};E.contains=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,l,t.REGEXP_MODE];var b=E.contains.concat([{begin:/\(/,end:/\)/,contains:["self"].concat(E.contains,[t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE])},t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]),_={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:b};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:o,contains:[t.SHEBANG({binary:"node",relevance:5}),{className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,t.C_LINE_COMMENT_MODE,t.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+",contains:[{className:"type",begin:"\\{",end:"\\}",relevance:0},{className:"variable",begin:i+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,l,{begin:r(/[{,\n]\s*/,s(r(/(((\/\/.*)|(\/\*(.|\n)*\*\/))\s*)*/,i+"\\s*:"))),relevance:0,contains:[{className:"attr",begin:i+s("\\s*:"),relevance:0}]},{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,t.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:o,contains:b}]}]},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:"<>",end:""},{begin:c.begin,end:c.end}],subLanguage:"xml",contains:[{begin:c.begin,end:c.end,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[t.inherit(t.TITLE_MODE,{begin:i}),_],illegal:/\[|%/},{begin:/\$[(.]/},t.METHOD_GUARD,{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends"},t.UNDERSCORE_TITLE_MODE]},{beginKeywords:"constructor",end:/\{/,excludeEnd:!0},{begin:"(get|set)\\s+(?="+i+"\\()",end:/{/,keywords:"get set",contains:[t.inherit(t.TITLE_MODE,{begin:i}),{begin:/\(\)/},_]}],illegal:/#(?!!)/}}}()); +hljs.registerLanguage("json",function(){"use strict";return function(n){var e={literal:"true false null"},i=[n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],t=[n.QUOTE_STRING_MODE,n.C_NUMBER_MODE],a={end:",",endsWithParent:!0,excludeEnd:!0,contains:t,keywords:e},l={begin:"{",end:"}",contains:[{className:"attr",begin:/"/,end:/"/,contains:[n.BACKSLASH_ESCAPE],illegal:"\\n"},n.inherit(a,{begin:/:/})].concat(i),illegal:"\\S"},s={begin:"\\[",end:"\\]",contains:[n.inherit(a)],illegal:"\\S"};return t.push(l,s),i.forEach((function(n){t.push(n)})),{name:"JSON",contains:t,keywords:e,illegal:"\\S"}}}()); +hljs.registerLanguage("kotlin",function(){"use strict";return function(e){var n={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual trait volatile transient native default",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},a={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@"},i={className:"subst",begin:"\\${",end:"}",contains:[e.C_NUMBER_MODE]},s={className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},t={className:"string",variants:[{begin:'"""',end:'"""(?=[^"])',contains:[s,i]},{begin:"'",end:"'",illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,s,i]}]};i.contains.push(t);var r={className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?"},l={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[e.inherit(t,{className:"meta-string"})]}]},c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),o={variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,contains:[]}]},d=o;return d.variants[1].contains=[o],o.variants[1].contains=[d],{name:"Kotlin",aliases:["kt"],keywords:n,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,c,{className:"keyword",begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",begin:/@\w+/}]}},a,r,l,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:n,illegal:/fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/,relevance:5,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,endsWithParent:!0,contains:[o,e.C_LINE_COMMENT_MODE,c],relevance:0},e.C_LINE_COMMENT_MODE,c,r,l,t,e.C_NUMBER_MODE]},c]},{className:"class",beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/,excludeBegin:!0,returnEnd:!0},r,l]},t,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:"\n"},{className:"number",begin:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",relevance:0}]}}}()); +hljs.registerLanguage("less",function(){"use strict";return function(e){var n="([\\w-]+|@{[\\w-]+})",a=[],s=[],t=function(e){return{className:"string",begin:"~?"+e+".*?"+e}},r=function(e,n,a){return{className:e,begin:n,relevance:a}},i={begin:"\\(",end:"\\)",contains:s,relevance:0};s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t("'"),t('"'),e.CSS_NUMBER_MODE,{begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",excludeEnd:!0}},r("number","#[0-9A-Fa-f]+\\b"),i,r("variable","@@?[\\w-]+",10),r("variable","@{[\\w-]+}"),r("built_in","~?`[^`]*?`"),{className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0},{className:"meta",begin:"!important"});var c=s.concat({begin:"{",end:"}",contains:a}),l={beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"}].concat(s)},o={begin:n+"\\s*:",returnBegin:!0,end:"[;}]",relevance:0,contains:[{className:"attribute",begin:n,end:":",excludeEnd:!0,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:s}}]},g={className:"keyword",begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{end:"[;{}]",returnEnd:!0,contains:s,relevance:0}},d={className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{begin:"@[\\w-]+"}],starts:{end:"[;}]",returnEnd:!0,contains:c}},b={variants:[{begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:n,end:"{"}],returnBegin:!0,returnEnd:!0,illegal:"[<='$\"]",relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,l,r("keyword","all\\b"),r("variable","@{[\\w-]+}"),r("selector-tag",n+"%?",0),r("selector-id","#"+n),r("selector-class","\\."+n,0),r("selector-tag","&",0),{className:"selector-attr",begin:"\\[",end:"\\]"},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"\\(",end:"\\)",contains:c},{begin:"!important"}]};return a.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,g,d,o,b),{name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:a}}}()); +hljs.registerLanguage("lua",function(){"use strict";return function(e){var t={begin:"\\[=*\\[",end:"\\]=*\\]",contains:["self"]},a=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[","\\]=*\\]",{contains:[t],relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE,literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},contains:a.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[e.inherit(e.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:a}].concat(a)},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string",begin:"\\[=*\\[",end:"\\]=*\\]",contains:[t],relevance:5}])}}}()); +hljs.registerLanguage("makefile",function(){"use strict";return function(e){var i={className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin:"",relevance:10,contains:[a,i,t,s,{begin:"\\[",end:"\\]",contains:[{className:"meta",begin:"",contains:[a,s,i,t]}]}]},e.COMMENT("\x3c!--","--\x3e",{relevance:10}),{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},n,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:")",end:">",keywords:{name:"style"},contains:[c],starts:{end:"",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:")",end:">",keywords:{name:"script"},contains:[c],starts:{end:"<\/script>",returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:"",contains:[{className:"name",begin:/[^\/><\s]+/,relevance:0},c]}]}}}()); +hljs.registerLanguage("markdown",function(){"use strict";return function(n){const e={begin:"<",end:">",subLanguage:"xml",relevance:0},a={begin:"\\[.+?\\][\\(\\[].*?[\\)\\]]",returnBegin:!0,contains:[{className:"string",begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0,relevance:0},{className:"link",begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}],relevance:10},i={className:"strong",contains:[],variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},s={className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{begin:/_(?!_)/,end:/_/,relevance:0}]};i.contains.push(s),s.contains.push(i);var c=[e,a];return i.contains=i.contains.concat(c),s.contains=s.contains.concat(c),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:c=c.concat(i,s)},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:c}]}]},e,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},i,s,{className:"quote",begin:"^>\\s+",contains:c,end:"$"},{className:"code",variants:[{begin:"(`{3,})(.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})(.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{begin:"^[-\\*]{3,}",end:"$"},a,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}}()); +hljs.registerLanguage("nginx",function(){"use strict";return function(e){var n={className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{/,end:/}/},{begin:"[\\$\\@]"+e.UNDERSCORE_IDENT_RE}]},a={endsWithParent:!0,keywords:{$pattern:"[a-z/_]+",literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},relevance:0,illegal:"=>",contains:[e.HASH_COMMENT_MODE,{className:"string",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[n]},{className:"regexp",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:"\\s\\^",end:"\\s|{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|{|;",returnEnd:!0},{begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number",begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{className:"number",begin:"\\b\\d+[kKmMgGdshdwy]*\\b",relevance:0},n]};return{name:"Nginx config",aliases:["nginxconf"],contains:[e.HASH_COMMENT_MODE,{begin:e.UNDERSCORE_IDENT_RE+"\\s+{",returnBegin:!0,end:"{",contains:[{className:"section",begin:e.UNDERSCORE_IDENT_RE}],relevance:0},{begin:e.UNDERSCORE_IDENT_RE+"\\s",end:";|{",returnBegin:!0,contains:[{className:"attribute",begin:e.UNDERSCORE_IDENT_RE,starts:a}],relevance:0}],illegal:"[^\\s\\}]"}}}()); +hljs.registerLanguage("objectivec",function(){"use strict";return function(e){var n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={$pattern:n,keyword:"@interface @class @protocol @implementation"};return{name:"Objective-C",aliases:["mm","objc","obj-c"],keywords:{$pattern:n,keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},illegal:"/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class",begin:"("+_.keyword.split(" ").join("|")+")\\b",end:"({|$)",excludeEnd:!0,keywords:_,contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}}()); +hljs.registerLanguage("perl",function(){"use strict";return function(e){var n={$pattern:/[\w.]+/,keyword:"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qq fileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmget sub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedir ioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when"},t={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:n},s={begin:"->{",end:"}"},r={variants:[{begin:/\$\d/},{begin:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{begin:/[\$%@][^\s\w{]/,relevance:0}]},i=[e.BACKSLASH_ESCAPE,t,r],a=[r,e.HASH_COMMENT_MODE,e.COMMENT("^\\=\\w","\\=cut",{endsWithParent:!0}),s,{className:"string",contains:i,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*\\<",end:"\\>",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE]},{begin:"{\\w+}",contains:[],relevance:0},{begin:"-?\\w+\\s*\\=\\>",contains:[],relevance:0}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[e.HASH_COMMENT_MODE,{className:"regexp",begin:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",relevance:10},{className:"regexp",begin:"(m|qr)?/",end:"/[a-z]*",contains:[e.BACKSLASH_ESCAPE],relevance:0}]},{className:"function",beginKeywords:"sub",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return t.contains=a,s.contains=a,{name:"Perl",aliases:["pl","pm"],keywords:n,contains:a}}}()); +hljs.registerLanguage("php",function(){"use strict";return function(e){var r={begin:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},t={className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{begin:/\?>/}]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:'b"',end:'"'},{begin:"b'",end:"'"},e.inherit(e.APOS_STRING_MODE,{illegal:null}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null})]},n={variants:[e.BINARY_NUMBER_MODE,e.C_NUMBER_MODE]},i={keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list new object or private protected public real return string switch throw trait try unset use var void while xor yield",literal:"false null true",built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Throwable Traversable WeakReference Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass"};return{aliases:["php","php3","php4","php5","php6","php7"],case_insensitive:!0,keywords:i,contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t]}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler"}),{className:"string",begin:/<<<['"]?\w+['"]?$/,end:/^\w+;?$/,contains:[e.BACKSLASH_ESCAPE,{className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]}]},t,{className:"keyword",begin:/\$this\b/},r,{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[e.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:i,contains:["self",r,e.C_BLOCK_COMMENT_MODE,a,n]}]},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,illegal:/[:\(\$"]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",end:";",illegal:/[\.']/,contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",end:";",contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"=>"},a,n]}}}()); +hljs.registerLanguage("php-template",function(){"use strict";return function(n){return{name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},n.inherit(n.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),n.inherit(n.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]}]}}}()); +hljs.registerLanguage("plaintext",function(){"use strict";return function(t){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}}()); +hljs.registerLanguage("properties",function(){"use strict";return function(e){var n="[ \\t\\f]*",t="("+n+"[:=]"+n+"|[ \\t\\f]+)",a="([^\\\\:= \\t\\f\\n]|\\\\.)+",s={end:t,relevance:0,starts:{className:"string",end:/$/,relevance:0,contains:[{begin:"\\\\\\n"}]}};return{name:".properties",case_insensitive:!0,illegal:/\S/,contains:[e.COMMENT("^\\s*[!#]","$"),{begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+"+t,returnBegin:!0,contains:[{className:"attr",begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",endsParent:!0,relevance:0}],starts:s},{begin:a+t,returnBegin:!0,relevance:0,contains:[{className:"meta",begin:a,endsParent:!0,relevance:0}],starts:s},{className:"attr",relevance:0,begin:a+n+"$"}]}}}()); +hljs.registerLanguage("python",function(){"use strict";return function(e){var n={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10",built_in:"Ellipsis NotImplemented",literal:"False None True"},a={className:"meta",begin:/^(>>>|\.\.\.) /},i={className:"subst",begin:/\{/,end:/\}/,keywords:n,illegal:/#/},s={begin:/\{\{/,relevance:0},r={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/(u|b)?r?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(u|b)?r?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(fr|rf|f)'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(fr|rf|f)"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(u|r|ur)'/,end:/'/,relevance:10},{begin:/(u|r|ur)"/,end:/"/,relevance:10},{begin:/(b|br)'/,end:/'/},{begin:/(b|br)"/,end:/"/},{begin:/(fr|rf|f)'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,s,i]},{begin:/(fr|rf|f)"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,i]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},l={className:"number",relevance:0,variants:[{begin:e.BINARY_NUMBER_RE+"[lLjJ]?"},{begin:"\\b(0o[0-7]+)[lLjJ]?"},{begin:e.C_NUMBER_RE+"[lLjJ]?"}]},t={className:"params",variants:[{begin:/\(\s*\)/,skip:!0,className:null},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:["self",a,l,r,e.HASH_COMMENT_MODE]}]};return i.contains=[r,l,a],{name:"Python",aliases:["py","gyp","ipython"],keywords:n,illegal:/(<\/|->|\?)|=>/,contains:[a,l,{beginKeywords:"if",relevance:0},r,e.HASH_COMMENT_MODE,{variants:[{className:"function",beginKeywords:"def"},{className:"class",beginKeywords:"class"}],end:/:/,illegal:/[${=;\n,]/,contains:[e.UNDERSCORE_TITLE_MODE,t,{begin:/->/,endsWithParent:!0,keywords:"None"}]},{className:"meta",begin:/^[\t ]*@/,end:/$/},{begin:/\b(print|exec)\(/}]}}}()); +hljs.registerLanguage("python-repl",function(){"use strict";return function(n){return{aliases:["pycon"],contains:[{className:"meta",starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}}}()); +hljs.registerLanguage("ruby",function(){"use strict";return function(e){var n="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",a={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},s={className:"doctag",begin:"@[A-Za-z]+"},i={begin:"#<",end:">"},r=[e.COMMENT("#","$",{contains:[s]}),e.COMMENT("^\\=begin","^\\=end",{contains:[s],relevance:10}),e.COMMENT("^__END__","\\n$")],c={className:"subst",begin:"#\\{",end:"}",keywords:a},t={className:"string",contains:[e.BACKSLASH_ESCAPE,c],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:"%[qQwWx]?\\(",end:"\\)"},{begin:"%[qQwWx]?\\[",end:"\\]"},{begin:"%[qQwWx]?{",end:"}"},{begin:"%[qQwWx]?<",end:">"},{begin:"%[qQwWx]?/",end:"/"},{begin:"%[qQwWx]?%",end:"%"},{begin:"%[qQwWx]?-",end:"-"},{begin:"%[qQwWx]?\\|",end:"\\|"},{begin:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{begin:/<<[-~]?'?(\w+)(?:.|\n)*?\n\s*\1\b/,returnBegin:!0,contains:[{begin:/<<[-~]?'?/},e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[e.BACKSLASH_ESCAPE,c]})]}]},b={className:"params",begin:"\\(",end:"\\)",endsParent:!0,keywords:a},d=[t,i,{className:"class",beginKeywords:"class module",end:"$|;",illegal:/=/,contains:[e.inherit(e.TITLE_MODE,{begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{begin:"<\\s*",contains:[{begin:"("+e.IDENT_RE+"::)?"+e.IDENT_RE}]}].concat(r)},{className:"function",beginKeywords:"def",end:"$|;",contains:[e.inherit(e.TITLE_MODE,{begin:n}),b].concat(r)},{begin:e.IDENT_RE+"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(\\!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[t,{begin:n}],relevance:0},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{className:"params",begin:/\|/,end:/\|/,keywords:a},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[i,{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:"%r{",end:"}[a-z]*"},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(r),relevance:0}].concat(r);c.contains=d,b.contains=d;var g=[{begin:/^\s*=>/,starts:{end:"$",contains:d}},{className:"meta",begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{end:"$",contains:d}}];return{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:a,illegal:/\/\*/,contains:r.concat(g).concat(d)}}}()); +hljs.registerLanguage("rust",function(){"use strict";return function(e){var n="([ui](8|16|32|64|128|size)|f(32|64))?",t="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!";return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",keyword:"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield",literal:"true false Some None Ok Err",built_in:t},illegal:""}]}}}()); +hljs.registerLanguage("scss",function(){"use strict";return function(e){var t={className:"variable",begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"},i={className:"number",begin:"#[0-9A-Fa-f]+"};return e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{name:"SCSS",case_insensitive:!0,illegal:"[=/|']",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:"\\#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},{className:"selector-attr",begin:"\\[",end:"\\]",illegal:"$"},{className:"selector-tag",begin:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",relevance:0},{className:"selector-pseudo",begin:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{className:"selector-pseudo",begin:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},t,{className:"attribute",begin:"\\b(src|z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",illegal:"[^\\s]"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:":",end:";",contains:[t,i,e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"meta",begin:"!important"}]},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",returnBegin:!0,keywords:"and or not only",contains:[{begin:"@[a-z-]+",className:"keyword"},t,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,i,e.CSS_NUMBER_MODE]}]}}}()); +hljs.registerLanguage("shell",function(){"use strict";return function(s){return{name:"Shell Session",aliases:["console"],contains:[{className:"meta",begin:"^\\s{0,3}[/\\w\\d\\[\\]()@-]*[>%$#]",starts:{end:"$",subLanguage:"bash"}}]}}}()); +hljs.registerLanguage("sql",function(){"use strict";return function(e){var t=e.COMMENT("--","$");return{name:"SQL",case_insensitive:!0,illegal:/[<>{}*]/,contains:[{beginKeywords:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with",end:/;/,endsWithParent:!0,keywords:{$pattern:/[\w\.]+/,keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void"},contains:[{className:"string",begin:"'",end:"'",contains:[{begin:"''"}]},{className:"string",begin:'"',end:'"',contains:[{begin:'""'}]},{className:"string",begin:"`",end:"`"},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]},e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]}}}()); +hljs.registerLanguage("swift",function(){"use strict";return function(e){var i={keyword:"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c compactMap contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},n=e.COMMENT("/\\*","\\*/",{contains:["self"]}),t={className:"subst",begin:/\\\(/,end:"\\)",keywords:i,contains:[]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:/"""/,end:/"""/},{begin:/"/,end:/"/}]},r={className:"number",begin:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",relevance:0};return t.contains=[r],{name:"Swift",keywords:i,contains:[a,e.C_LINE_COMMENT_MODE,n,{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*[!?]"},{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*",relevance:0},r,{className:"function",beginKeywords:"func",end:"{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][0-9A-Za-z$_]*/}),{begin://},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:i,contains:["self",r,a,e.C_BLOCK_COMMENT_MODE,{begin:":"}],illegal:/["']/}],illegal:/\[|%/},{className:"class",beginKeywords:"struct protocol class extension enum",keywords:i,end:"\\{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{className:"meta",begin:"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|@propertyWrapper)\\b"},{beginKeywords:"import",end:/$/,contains:[e.C_LINE_COMMENT_MODE,n]}]}}}()); +hljs.registerLanguage("typescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.concat(["type","namespace","typedef","interface","public","private","protected","implements","declare","abstract","readonly"]).join(" "),literal:n.join(" "),built_in:a.concat(["any","void","number","boolean","string","object","never","enum"]).join(" ")},s={className:"meta",begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},i={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:r.C_NUMBER_RE+"n?"}],relevance:0},o={className:"subst",begin:"\\$\\{",end:"\\}",keywords:t,contains:[]},c={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"xml"}},l={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"css"}},E={className:"string",begin:"`",end:"`",contains:[r.BACKSLASH_ESCAPE,o]};o.contains=[r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,i,r.REGEXP_MODE];var d={begin:"\\(",end:/\)/,keywords:t,contains:["self",r.QUOTE_STRING_MODE,r.APOS_STRING_MODE,r.NUMBER_MODE]},u={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,s,d]};return{name:"TypeScript",aliases:["ts"],keywords:t,contains:[r.SHEBANG(),{className:"meta",begin:/^\s*['"]use strict['"]/},r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,i,{begin:"("+r.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,r.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+r.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:r.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:d.contains}]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/[\{;]/,excludeEnd:!0,keywords:t,contains:["self",r.inherit(r.TITLE_MODE,{begin:"[A-Za-z$_][0-9A-Za-z$_]*"}),u],illegal:/%/,relevance:0},{beginKeywords:"constructor",end:/[\{;]/,excludeEnd:!0,contains:["self",u]},{begin:/module\./,keywords:{built_in:"module"},relevance:0},{beginKeywords:"module",end:/\{/,excludeEnd:!0},{beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:"interface extends"},{begin:/\$[(.]/},{begin:"\\."+r.IDENT_RE,relevance:0},s,d]}}}()); +hljs.registerLanguage("yaml",function(){"use strict";return function(e){var n="true false yes no null",a="[\\w#;/?:@&=+$,.~*\\'()[\\]]+",s={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:"{{",end:"}}"},{begin:"%{",end:"}"}]}]},i=e.inherit(s,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l={end:",",endsWithParent:!0,excludeEnd:!0,contains:[],keywords:n,relevance:0},t={begin:"{",end:"}",contains:[l],illegal:"\\n",relevance:0},g={begin:"\\[",end:"\\]",contains:[l],illegal:"\\n",relevance:0},b=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---s*$",relevance:10},{className:"string",begin:"[\\|>]([0-9]?[+-])?[ ]*\\n( *)[\\S ]+\\n(\\2[\\S ]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type",begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"\\-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},{className:"number",begin:e.C_NUMBER_RE+"\\b"},t,g,s],c=[...b];return c.pop(),c.push(i),l.contains=c,{name:"YAML",case_insensitive:!0,aliases:["yml","YAML"],contains:b}}}()); +hljs.registerLanguage("armasm",function(){"use strict";return function(s){const e={variants:[s.COMMENT("^[ \\t]*(?=#)","$",{relevance:0,excludeBegin:!0}),s.COMMENT("[;@]","$",{relevance:0}),s.C_LINE_COMMENT_MODE,s.C_BLOCK_COMMENT_MODE]};return{name:"ARM Assembly",case_insensitive:!0,aliases:["arm"],keywords:{$pattern:"\\.?"+s.IDENT_RE,meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND ",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @"},contains:[{className:"keyword",begin:"\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?(?=\\s)"},e,s.QUOTE_STRING_MODE,{className:"string",begin:"'",end:"[^\\\\]'",relevance:0},{className:"title",begin:"\\|",end:"\\|",illegal:"\\n",relevance:0},{className:"number",variants:[{begin:"[#$=]?0x[0-9a-f]+"},{begin:"[#$=]?0b[01]+"},{begin:"[#$=]\\d+"},{begin:"\\b\\d+"}],relevance:0},{className:"symbol",variants:[{begin:"^[ \\t]*[a-z_\\.\\$][a-z0-9_\\.\\$]+:"},{begin:"^[a-z_\\.\\$][a-z0-9_\\.\\$]+"},{begin:"[=#]\\w+"}],relevance:0}]}}}()); +hljs.registerLanguage("d",function(){"use strict";return function(e){var a={$pattern:e.UNDERSCORE_IDENT_RE,keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"},d="((0|[1-9][\\d_]*)|0[bB][01_]+|0[xX]([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))",n="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};",t={className:"number",begin:"\\b"+d+"(L|u|U|Lu|LU|uL|UL)?",relevance:0},_={className:"number",begin:"\\b(((0[xX](([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)\\.([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)|\\.?([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))[pP][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))|((0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(\\.\\d*|([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)))|\\d+\\.(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)|\\.(0|[1-9][\\d_]*)([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))?))([fF]|L|i|[fF]i|Li)?|"+d+"(i|[fF]i|Li))",relevance:0},r={className:"string",begin:"'("+n+"|.)",end:"'",illegal:"."},i={className:"string",begin:'"',contains:[{begin:n,relevance:0}],end:'"[cwd]?'},s=e.COMMENT("\\/\\+","\\+\\/",{contains:["self"],relevance:10});return{name:"D",keywords:a,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s,{className:"string",begin:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',relevance:10},i,{className:"string",begin:'[rq]"',end:'"[cwd]?',relevance:5},{className:"string",begin:"`",end:"`[cwd]?"},{className:"string",begin:'q"\\{',end:'\\}"'},_,t,r,{className:"meta",begin:"^#!",end:"$",relevance:5},{className:"meta",begin:"#(line)",end:"$",relevance:5},{className:"keyword",begin:"@[a-zA-Z_][a-zA-Z_\\d]*"}]}}}()); +hljs.registerLanguage("handlebars",function(){"use strict";function e(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(n){const a={"builtin-name":"action bindattr collection component concat debugger each each-in get hash if in input link-to loc log lookup mut outlet partial query-params render template textarea unbound unless view with yield"},t=/\[.*?\]/,s=/[^\s!"#%&'()*+,.\/;<=>@\[\\\]^`{|}~]+/,i=e("(",/'.*?'/,"|",/".*?"/,"|",t,"|",s,"|",/\.|\//,")+"),r=e("(",t,"|",s,")(?==)"),l={begin:i,lexemes:/[\w.\/]+/},c=n.inherit(l,{keywords:{literal:"true false undefined null"}}),o={begin:/\(/,end:/\)/},m={className:"attr",begin:r,relevance:0,starts:{begin:/=/,end:/=/,starts:{contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,c,o]}}},d={contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,{begin:/as\s+\|/,keywords:{keyword:"as"},end:/\|/,contains:[{begin:/\w+/}]},m,c,o],returnEnd:!0},g=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/\)/})});o.contains=[g];const u=n.inherit(l,{keywords:a,className:"name",starts:n.inherit(d,{end:/}}/})}),b=n.inherit(l,{keywords:a,className:"name"}),h=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/}}/})});return{name:"Handlebars",aliases:["hbs","html.hbs","html.handlebars","htmlbars"],case_insensitive:!0,subLanguage:"xml",contains:[{begin:/\\\{\{/,skip:!0},{begin:/\\\\(?=\{\{)/,skip:!0},n.COMMENT(/\{\{!--/,/--\}\}/),n.COMMENT(/\{\{!/,/\}\}/),{className:"template-tag",begin:/\{\{\{\{(?!\/)/,end:/\}\}\}\}/,contains:[u],starts:{end:/\{\{\{\{\//,returnEnd:!0,subLanguage:"xml"}},{className:"template-tag",begin:/\{\{\{\{\//,end:/\}\}\}\}/,contains:[b]},{className:"template-tag",begin:/\{\{#/,end:/\}\}/,contains:[u]},{className:"template-tag",begin:/\{\{(?=else\}\})/,end:/\}\}/,keywords:"else"},{className:"template-tag",begin:/\{\{\//,end:/\}\}/,contains:[b]},{className:"template-variable",begin:/\{\{\{/,end:/\}\}\}/,contains:[h]},{className:"template-variable",begin:/\{\{/,end:/\}\}/,contains:[h]}]}}}()); +hljs.registerLanguage("haskell",function(){"use strict";return function(e){var n={variants:[e.COMMENT("--","$"),e.COMMENT("{-","-}",{contains:["self"]})]},i={className:"meta",begin:"{-#",end:"#-}"},a={className:"meta",begin:"^#",end:"$"},s={className:"type",begin:"\\b[A-Z][\\w']*",relevance:0},l={begin:"\\(",end:"\\)",illegal:'"',contains:[i,a,{className:"type",begin:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},e.inherit(e.TITLE_MODE,{begin:"[_a-z][\\w']*"}),n]};return{name:"Haskell",aliases:["hs"],keywords:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",contains:[{beginKeywords:"module",end:"where",keywords:"module where",contains:[l,n],illegal:"\\W\\.|;"},{begin:"\\bimport\\b",end:"$",keywords:"import qualified as hiding",contains:[l,n],illegal:"\\W\\.|;"},{className:"class",begin:"^(\\s*)?(class|instance)\\b",end:"where",keywords:"class family instance where",contains:[s,l,n]},{className:"class",begin:"\\b(data|(new)?type)\\b",end:"$",keywords:"data family type newtype deriving",contains:[i,s,l,{begin:"{",end:"}",contains:l.contains},n]},{beginKeywords:"default",end:"$",contains:[s,l,n]},{beginKeywords:"infix infixl infixr",end:"$",contains:[e.C_NUMBER_MODE,n]},{begin:"\\bforeign\\b",end:"$",keywords:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",contains:[s,e.QUOTE_STRING_MODE,n]},{className:"meta",begin:"#!\\/usr\\/bin\\/env runhaskell",end:"$"},i,a,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,s,e.inherit(e.TITLE_MODE,{begin:"^[_a-z][\\w']*"}),n,{begin:"->|<-"}]}}}()); +hljs.registerLanguage("julia",function(){"use strict";return function(e){var r="[A-Za-z_\\u00A1-\\uFFFF][A-Za-z_0-9\\u00A1-\\uFFFF]*",t={$pattern:r,keyword:"in isa where baremodule begin break catch ccall const continue do else elseif end export false finally for function global if import importall let local macro module quote return true try using while type immutable abstract bitstype typealias ",literal:"true false ARGS C_NULL DevNull ENDIAN_BOM ENV I Inf Inf16 Inf32 Inf64 InsertionSort JULIA_HOME LOAD_PATH MergeSort NaN NaN16 NaN32 NaN64 PROGRAM_FILE QuickSort RoundDown RoundFromZero RoundNearest RoundNearestTiesAway RoundNearestTiesUp RoundToZero RoundUp STDERR STDIN STDOUT VERSION catalan e|0 eu|0 eulergamma golden im nothing pi γ π φ ",built_in:"ANY AbstractArray AbstractChannel AbstractFloat AbstractMatrix AbstractRNG AbstractSerializer AbstractSet AbstractSparseArray AbstractSparseMatrix AbstractSparseVector AbstractString AbstractUnitRange AbstractVecOrMat AbstractVector Any ArgumentError Array AssertionError Associative Base64DecodePipe Base64EncodePipe Bidiagonal BigFloat BigInt BitArray BitMatrix BitVector Bool BoundsError BufferStream CachingPool CapturedException CartesianIndex CartesianRange Cchar Cdouble Cfloat Channel Char Cint Cintmax_t Clong Clonglong ClusterManager Cmd CodeInfo Colon Complex Complex128 Complex32 Complex64 CompositeException Condition ConjArray ConjMatrix ConjVector Cptrdiff_t Cshort Csize_t Cssize_t Cstring Cuchar Cuint Cuintmax_t Culong Culonglong Cushort Cwchar_t Cwstring DataType Date DateFormat DateTime DenseArray DenseMatrix DenseVecOrMat DenseVector Diagonal Dict DimensionMismatch Dims DirectIndexString Display DivideError DomainError EOFError EachLine Enum Enumerate ErrorException Exception ExponentialBackOff Expr Factorization FileMonitor Float16 Float32 Float64 Function Future GlobalRef GotoNode HTML Hermitian IO IOBuffer IOContext IOStream IPAddr IPv4 IPv6 IndexCartesian IndexLinear IndexStyle InexactError InitError Int Int128 Int16 Int32 Int64 Int8 IntSet Integer InterruptException InvalidStateException Irrational KeyError LabelNode LinSpace LineNumberNode LoadError LowerTriangular MIME Matrix MersenneTwister Method MethodError MethodTable Module NTuple NewvarNode NullException Nullable Number ObjectIdDict OrdinalRange OutOfMemoryError OverflowError Pair ParseError PartialQuickSort PermutedDimsArray Pipe PollingFileWatcher ProcessExitedException Ptr QuoteNode RandomDevice Range RangeIndex Rational RawFD ReadOnlyMemoryError Real ReentrantLock Ref Regex RegexMatch RemoteChannel RemoteException RevString RoundingMode RowVector SSAValue SegmentationFault SerializationState Set SharedArray SharedMatrix SharedVector Signed SimpleVector Slot SlotNumber SparseMatrixCSC SparseVector StackFrame StackOverflowError StackTrace StepRange StepRangeLen StridedArray StridedMatrix StridedVecOrMat StridedVector String SubArray SubString SymTridiagonal Symbol Symmetric SystemError TCPSocket Task Text TextDisplay Timer Tridiagonal Tuple Type TypeError TypeMapEntry TypeMapLevel TypeName TypeVar TypedSlot UDPSocket UInt UInt128 UInt16 UInt32 UInt64 UInt8 UndefRefError UndefVarError UnicodeError UniformScaling Union UnionAll UnitRange Unsigned UpperTriangular Val Vararg VecElement VecOrMat Vector VersionNumber Void WeakKeyDict WeakRef WorkerConfig WorkerPool "},a={keywords:t,illegal:/<\//},n={className:"subst",begin:/\$\(/,end:/\)/,keywords:t},o={className:"variable",begin:"\\$"+r},i={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],variants:[{begin:/\w*"""/,end:/"""\w*/,relevance:10},{begin:/\w*"/,end:/"\w*/}]},l={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],begin:"`",end:"`"},s={className:"meta",begin:"@"+r};return a.name="Julia",a.contains=[{className:"number",begin:/(\b0x[\d_]*(\.[\d_]*)?|0x\.\d[\d_]*)p[-+]?\d+|\b0[box][a-fA-F0-9][a-fA-F0-9_]*|(\b\d[\d_]*(\.[\d_]*)?|\.\d[\d_]*)([eEfF][-+]?\d+)?/,relevance:0},{className:"string",begin:/'(.|\\[xXuU][a-zA-Z0-9]+)'/},i,l,s,{className:"comment",variants:[{begin:"#=",end:"=#",relevance:10},{begin:"#",end:"$"}]},e.HASH_COMMENT_MODE,{className:"keyword",begin:"\\b(((abstract|primitive)\\s+)type|(mutable\\s+)?struct)\\b"},{begin:/<:/}],n.contains=a.contains,a}}()); +hljs.registerLanguage("nim",function(){"use strict";return function(e){return{name:"Nim",aliases:["nim"],keywords:{keyword:"addr and as asm bind block break case cast const continue converter discard distinct div do elif else end enum except export finally for from func generic if import in include interface is isnot iterator let macro method mixin mod nil not notin object of or out proc ptr raise ref return shl shr static template try tuple type using var when while with without xor yield",literal:"shared guarded stdin stdout stderr result true false",built_in:"int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 float float32 float64 bool char string cstring pointer expr stmt void auto any range array openarray varargs seq set clong culong cchar cschar cshort cint csize clonglong cfloat cdouble clongdouble cuchar cushort cuint culonglong cstringarray semistatic"},contains:[{className:"meta",begin:/{\./,end:/\.}/,relevance:10},{className:"string",begin:/[a-zA-Z]\w*"/,end:/"/,contains:[{begin:/""/}]},{className:"string",begin:/([a-zA-Z]\w*)?"""/,end:/"""/},e.QUOTE_STRING_MODE,{className:"type",begin:/\b[A-Z]\w+\b/,relevance:0},{className:"number",relevance:0,variants:[{begin:/\b(0[xX][0-9a-fA-F][_0-9a-fA-F]*)('?[iIuU](8|16|32|64))?/},{begin:/\b(0o[0-7][_0-7]*)('?[iIuUfF](8|16|32|64))?/},{begin:/\b(0(b|B)[01][_01]*)('?[iIuUfF](8|16|32|64))?/},{begin:/\b(\d[_\d]*)('?[iIuUfF](8|16|32|64))?/}]},e.HASH_COMMENT_MODE]}}}()); +hljs.registerLanguage("r",function(){"use strict";return function(e){var n="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{name:"R",contains:[e.HASH_COMMENT_MODE,{begin:n,keywords:{$pattern:n,keyword:"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},relevance:0},{className:"number",begin:"0[xX][0-9a-fA-F]+[Li]?\\b",relevance:0},{className:"number",begin:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",relevance:0},{className:"number",begin:"\\d+\\.(?!\\d)(?:i\\b)?",relevance:0},{className:"number",begin:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{className:"number",begin:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{begin:"`",end:"`",relevance:0},{className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:'"',end:'"'},{begin:"'",end:"'"}]}]}}}()); +hljs.registerLanguage("scala",function(){"use strict";return function(e){var n={className:"subst",variants:[{begin:"\\$[A-Za-z0-9_]+"},{begin:"\\${",end:"}"}]},a={className:"string",variants:[{begin:'"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:'"""',end:'"""',relevance:10},{begin:'[a-z]+"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE,n]},{className:"string",begin:'[a-z]+"""',end:'"""',contains:[n],relevance:10}]},s={className:"type",begin:"\\b[A-Z][A-Za-z0-9_]*",relevance:0},t={className:"title",begin:/[^0-9\n\t "'(),.`{}\[\]:;][^\n\t "'(),.`{}\[\]:;]+|[^0-9\n\t "'(),.`{}\[\]:;=]/,relevance:0},i={className:"class",beginKeywords:"class object trait type",end:/[:={\[\n;]/,excludeEnd:!0,contains:[{beginKeywords:"extends with",relevance:10},{begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},t]},l={className:"function",beginKeywords:"def",end:/[:={\[(\n;]/,excludeEnd:!0,contains:[t]};return{name:"Scala",keywords:{literal:"true false null",keyword:"type yield lazy override def with val var sealed abstract private trait object if forSome for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws implicit"},contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,{className:"symbol",begin:"'\\w[\\w\\d_]*(?!')"},s,l,i,e.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"}]}}}()); +hljs.registerLanguage("x86asm",function(){"use strict";return function(s){return{name:"Intel x86 Assembly",case_insensitive:!0,keywords:{$pattern:"[.%]?"+s.IDENT_RE,keyword:"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63",built_in:"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr",meta:"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__"},contains:[s.COMMENT(";","$",{relevance:0}),{className:"number",variants:[{begin:"\\b(?:([0-9][0-9_]*)?\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\b",relevance:0},{begin:"\\$[0-9][0-9A-Fa-f]*",relevance:0},{begin:"\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\b"},{begin:"\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\b"}]},s.QUOTE_STRING_MODE,{className:"string",variants:[{begin:"'",end:"[^\\\\]'"},{begin:"`",end:"[^\\\\]`"}],relevance:0},{className:"symbol",variants:[{begin:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)"},{begin:"^\\s*%%[A-Za-z0-9_$#@~.?]*:"}],relevance:0},{className:"subst",begin:"%[0-9]+",relevance:0},{className:"subst",begin:"%!S+",relevance:0},{className:"meta",begin:/^\s*\.[\w_-]+/}]}}}()); \ No newline at end of file diff --git a/http_server_middleware.html b/http_server_middleware.html new file mode 100644 index 00000000..189bcf95 --- /dev/null +++ b/http_server_middleware.html @@ -0,0 +1,312 @@ + + + + + + HTTP server middleware - Chronos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

HTTP server middleware

+

Chronos provides a powerful mechanism for customizing HTTP request handlers via +middlewares.

+

A middleware is a coroutine that can modify, block or filter HTTP request.

+

Single HTTP server could support unlimited number of middlewares, but you need to consider that each request in worst case could go through all the middlewares, and therefore a huge number of middlewares can have a significant impact on HTTP server performance.

+

Order of middlewares is also important: right after HTTP server has received request, it will be sent to the first middleware in list, and each middleware will be responsible for passing control to other middlewares. Therefore, when building a list, it would be a good idea to place the request handlers at the end of the list, while keeping the middleware that could block or modify the request at the beginning of the list.

+

Middleware could also modify HTTP server request, and these changes will be visible to all handlers (either middlewares or the original request handler). This can be done using the following helpers:

+
  proc updateRequest*(request: HttpRequestRef, scheme: string, meth: HttpMethod,
+                      version: HttpVersion, requestUri: string,
+                      headers: HttpTable): HttpResultMessage[void]
+
+  proc updateRequest*(request: HttpRequestRef, meth: HttpMethod,
+                      requestUri: string,
+                      headers: HttpTable): HttpResultMessage[void]
+
+  proc updateRequest*(request: HttpRequestRef, requestUri: string,
+                      headers: HttpTable): HttpResultMessage[void]
+
+  proc updateRequest*(request: HttpRequestRef,
+                      requestUri: string): HttpResultMessage[void]
+
+  proc updateRequest*(request: HttpRequestRef,
+                      headers: HttpTable): HttpResultMessage[void]
+
+

As you can see all the HTTP request parameters could be modified: request method, version, request path and request headers.

+

Middleware could also use helpers to obtain more information about remote and local addresses of request's connection (this could be helpful when you need to do some IP address filtering).

+
  proc remote*(request: HttpRequestRef): Opt[TransportAddress]
+    ## Returns remote address of HTTP request's connection.
+  proc local*(request: HttpRequestRef): Opt[TransportAddress] =
+    ## Returns local address of HTTP request's connection.
+
+

Every middleware is the coroutine which looks like this:

+
  proc middlewareHandler(
+      middleware: HttpServerMiddlewareRef,
+      reqfence: RequestFence,
+      nextHandler: HttpProcessCallback2
+  ): Future[HttpResponseRef] {.async: (raises: [CancelledError]).} =
+
+

Where middleware argument is the object which could hold some specific values, reqfence is HTTP request which is enclosed with HTTP server error information and nextHandler is reference to next request handler, it could be either middleware handler or the original request processing callback handler.

+
  await nextHandler(reqfence)
+
+

You should perform await for the response from the nextHandler(reqfence). Usually you should call next handler when you dont want to handle request or you dont know how to handle it, for example:

+
  proc middlewareHandler(
+      middleware: HttpServerMiddlewareRef,
+      reqfence: RequestFence,
+      nextHandler: HttpProcessCallback2
+  ): Future[HttpResponseRef] {.async: (raises: [CancelledError]).} =
+  if reqfence.isErr():
+    # We dont know or do not want to handle failed requests, so we call next handler.
+    return await nextHandler(reqfence)
+  let request = reqfence.get()
+  if request.uri.path == "/path/we/able/to/respond":
+    try:
+      # Sending some response.
+      await request.respond(Http200, "TEST")
+    except HttpWriteError as exc:
+      # We could also return default response for exception or other types of error.
+      defaultResponse(exc)
+  elif request.uri.path == "/path/for/rewrite":
+    # We going to modify request object for this request, next handler will receive it with different request path.
+    let res = request.updateRequest("/path/to/new/location")
+    if res.isErr():
+      return defaultResponse(res.error)
+    await nextHandler(reqfence)
+  elif request.uri.path == "/restricted/path":
+    if request.remote().isNone():
+      # We can't obtain remote address, so we force HTTP server to respond with `401 Unauthorized` status code.
+      return codeResponse(Http401)
+    if $(request.remote().get()).startsWith("127.0.0.1"):
+      # Remote peer's address starts with "127.0.0.1", sending proper response.
+      await request.respond(Http200, "AUTHORIZED")
+    else:
+      # Force HTTP server to respond with `403 Forbidden` status code.
+      codeResponse(Http403)
+  elif request.uri.path == "/blackhole":
+    # Force HTTP server to drop connection with remote peer.
+    dropResponse()
+  else:
+    # All other requests should be handled by somebody else.
+    await nextHandler(reqfence)
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/index.html b/index.html new file mode 100644 index 00000000..f3d53316 --- /dev/null +++ b/index.html @@ -0,0 +1,274 @@ + + + + + + Introduction - Chronos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Introduction

+

Chronos implements the async/await +paradigm in a self-contained library using macro and closure iterator +transformation features provided by Nim.

+

Features include:

+
    +
  • Asynchronous socket and process I/O
  • +
  • HTTP client / server with SSL/TLS support out of the box (no OpenSSL needed)
  • +
  • Synchronization primitivies like queues, events and locks
  • +
  • Cancellation
  • +
  • Efficient dispatch pipeline with excellent multi-platform support
  • +
  • Exception effect support
  • +
+

Installation

+

Install chronos using nimble:

+
nimble install chronos
+
+

or add a dependency to your .nimble file:

+
requires "chronos"
+
+

and start using it:

+
import chronos/apps/http/httpclient
+
+proc retrievePage*(uri: string): Future[string] {.async.} =
+  # Create a new HTTP session
+  let httpSession = HttpSessionRef.new()
+  try:
+    # Fetch page contents
+    let resp = await httpSession.fetch(parseUri(uri))
+    # Convert response to a string, assuming its encoding matches the terminal!
+    bytesToString(resp.data)
+  finally: # Close the session
+    await noCancel(httpSession.closeWait())
+
+echo waitFor retrievePage(
+  "https://raw.githubusercontent.com/status-im/nim-chronos/master/README.md")
+
+

There are more examples throughout the manual!

+

Platform support

+

Several platforms are supported, with different backend options:

+
    +
  • Windows: IOCP
  • +
  • Linux: epoll / poll
  • +
  • OSX / BSD: kqueue / poll
  • +
  • Android / Emscripten / posix: poll
  • +
+

API documentation

+

This guide covers basic usage of chronos - for details, see the +API reference.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/introduction.html b/introduction.html new file mode 100644 index 00000000..f3d53316 --- /dev/null +++ b/introduction.html @@ -0,0 +1,274 @@ + + + + + + Introduction - Chronos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Introduction

+

Chronos implements the async/await +paradigm in a self-contained library using macro and closure iterator +transformation features provided by Nim.

+

Features include:

+
    +
  • Asynchronous socket and process I/O
  • +
  • HTTP client / server with SSL/TLS support out of the box (no OpenSSL needed)
  • +
  • Synchronization primitivies like queues, events and locks
  • +
  • Cancellation
  • +
  • Efficient dispatch pipeline with excellent multi-platform support
  • +
  • Exception effect support
  • +
+

Installation

+

Install chronos using nimble:

+
nimble install chronos
+
+

or add a dependency to your .nimble file:

+
requires "chronos"
+
+

and start using it:

+
import chronos/apps/http/httpclient
+
+proc retrievePage*(uri: string): Future[string] {.async.} =
+  # Create a new HTTP session
+  let httpSession = HttpSessionRef.new()
+  try:
+    # Fetch page contents
+    let resp = await httpSession.fetch(parseUri(uri))
+    # Convert response to a string, assuming its encoding matches the terminal!
+    bytesToString(resp.data)
+  finally: # Close the session
+    await noCancel(httpSession.closeWait())
+
+echo waitFor retrievePage(
+  "https://raw.githubusercontent.com/status-im/nim-chronos/master/README.md")
+
+

There are more examples throughout the manual!

+

Platform support

+

Several platforms are supported, with different backend options:

+
    +
  • Windows: IOCP
  • +
  • Linux: epoll / poll
  • +
  • OSX / BSD: kqueue / poll
  • +
  • Android / Emscripten / posix: poll
  • +
+

API documentation

+

This guide covers basic usage of chronos - for details, see the +API reference.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/mark.min.js b/mark.min.js new file mode 100644 index 00000000..16362318 --- /dev/null +++ b/mark.min.js @@ -0,0 +1,7 @@ +/*!*************************************************** +* mark.js v8.11.1 +* https://markjs.io/ +* Copyright (c) 2014–2018, Julian Kühnel +* Released under the MIT license https://git.io/vwTVl +*****************************************************/ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Mark=t()}(this,function(){"use strict";var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},n=function(){function e(e,t){for(var n=0;n1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;t(this,e),this.ctx=n,this.iframes=r,this.exclude=i,this.iframesTimeout=o}return n(e,[{key:"getContexts",value:function(){var e=[];return(void 0!==this.ctx&&this.ctx?NodeList.prototype.isPrototypeOf(this.ctx)?Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?this.ctx:"string"==typeof this.ctx?Array.prototype.slice.call(document.querySelectorAll(this.ctx)):[this.ctx]:[]).forEach(function(t){var n=e.filter(function(e){return e.contains(t)}).length>0;-1!==e.indexOf(t)||n||e.push(t)}),e}},{key:"getIframeContents",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},r=void 0;try{var i=e.contentWindow;if(r=i.document,!i||!r)throw new Error("iframe inaccessible")}catch(e){n()}r&&t(r)}},{key:"isIframeBlank",value:function(e){var t="about:blank",n=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&n!==t&&n}},{key:"observeIframeLoad",value:function(e,t,n){var r=this,i=!1,o=null,a=function a(){if(!i){i=!0,clearTimeout(o);try{r.isIframeBlank(e)||(e.removeEventListener("load",a),r.getIframeContents(e,t,n))}catch(e){n()}}};e.addEventListener("load",a),o=setTimeout(a,this.iframesTimeout)}},{key:"onIframeReady",value:function(e,t,n){try{"complete"===e.contentWindow.document.readyState?this.isIframeBlank(e)?this.observeIframeLoad(e,t,n):this.getIframeContents(e,t,n):this.observeIframeLoad(e,t,n)}catch(e){n()}}},{key:"waitForIframes",value:function(e,t){var n=this,r=0;this.forEachIframe(e,function(){return!0},function(e){r++,n.waitForIframes(e.querySelector("html"),function(){--r||t()})},function(e){e||t()})}},{key:"forEachIframe",value:function(t,n,r){var i=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},a=t.querySelectorAll("iframe"),s=a.length,c=0;a=Array.prototype.slice.call(a);var u=function(){--s<=0&&o(c)};s||u(),a.forEach(function(t){e.matches(t,i.exclude)?u():i.onIframeReady(t,function(e){n(t)&&(c++,r(e)),u()},u)})}},{key:"createIterator",value:function(e,t,n){return document.createNodeIterator(e,t,n,!1)}},{key:"createInstanceOnIframe",value:function(t){return new e(t.querySelector("html"),this.iframes)}},{key:"compareNodeIframe",value:function(e,t,n){if(e.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_PRECEDING){if(null===t)return!0;if(t.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING)return!0}return!1}},{key:"getIteratorNode",value:function(e){var t=e.previousNode();return{prevNode:t,node:null===t?e.nextNode():e.nextNode()&&e.nextNode()}}},{key:"checkIframeFilter",value:function(e,t,n,r){var i=!1,o=!1;return r.forEach(function(e,t){e.val===n&&(i=t,o=e.handled)}),this.compareNodeIframe(e,t,n)?(!1!==i||o?!1===i||o||(r[i].handled=!0):r.push({val:n,handled:!0}),!0):(!1===i&&r.push({val:n,handled:!1}),!1)}},{key:"handleOpenIframes",value:function(e,t,n,r){var i=this;e.forEach(function(e){e.handled||i.getIframeContents(e.val,function(e){i.createInstanceOnIframe(e).forEachNode(t,n,r)})})}},{key:"iterateThroughNodes",value:function(e,t,n,r,i){for(var o,a=this,s=this.createIterator(t,e,r),c=[],u=[],l=void 0,h=void 0;void 0,o=a.getIteratorNode(s),h=o.prevNode,l=o.node;)this.iframes&&this.forEachIframe(t,function(e){return a.checkIframeFilter(l,h,e,c)},function(t){a.createInstanceOnIframe(t).forEachNode(e,function(e){return u.push(e)},r)}),u.push(l);u.forEach(function(e){n(e)}),this.iframes&&this.handleOpenIframes(c,e,n,r),i()}},{key:"forEachNode",value:function(e,t,n){var r=this,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},o=this.getContexts(),a=o.length;a||i(),o.forEach(function(o){var s=function(){r.iterateThroughNodes(e,o,t,n,function(){--a<=0&&i()})};r.iframes?r.waitForIframes(o,s):s()})}}],[{key:"matches",value:function(e,t){var n="string"==typeof t?[t]:t,r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(r){var i=!1;return n.every(function(t){return!r.call(e,t)||(i=!0,!1)}),i}return!1}}]),e}(),o=function(){function e(n){t(this,e),this.opt=r({},{diacritics:!0,synonyms:{},accuracy:"partially",caseSensitive:!1,ignoreJoiners:!1,ignorePunctuation:[],wildcards:"disabled"},n)}return n(e,[{key:"create",value:function(e){return"disabled"!==this.opt.wildcards&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),"disabled"!==this.opt.wildcards&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),new RegExp(e,"gm"+(this.opt.caseSensitive?"":"i"))}},{key:"escapeStr",value:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}},{key:"createSynonymsRegExp",value:function(e){var t=this.opt.synonyms,n=this.opt.caseSensitive?"":"i",r=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(var i in t)if(t.hasOwnProperty(i)){var o=t[i],a="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(i):this.escapeStr(i),s="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(o):this.escapeStr(o);""!==a&&""!==s&&(e=e.replace(new RegExp("("+this.escapeStr(a)+"|"+this.escapeStr(s)+")","gm"+n),r+"("+this.processSynonyms(a)+"|"+this.processSynonyms(s)+")"+r))}return e}},{key:"processSynonyms",value:function(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}},{key:"setupWildcardsRegExp",value:function(e){return(e=e.replace(/(?:\\)*\?/g,function(e){return"\\"===e.charAt(0)?"?":""})).replace(/(?:\\)*\*/g,function(e){return"\\"===e.charAt(0)?"*":""})}},{key:"createWildcardsRegExp",value:function(e){var t="withSpaces"===this.opt.wildcards;return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}},{key:"setupIgnoreJoinersRegExp",value:function(e){return e.replace(/[^(|)\\]/g,function(e,t,n){var r=n.charAt(t+1);return/[(|)\\]/.test(r)||""===r?e:e+"\0"})}},{key:"createJoinersRegExp",value:function(e){var t=[],n=this.opt.ignorePunctuation;return Array.isArray(n)&&n.length&&t.push(this.escapeStr(n.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join("["+t.join("")+"]*"):e}},{key:"createDiacriticsRegExp",value:function(e){var t=this.opt.caseSensitive?"":"i",n=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"],r=[];return e.split("").forEach(function(i){n.every(function(n){if(-1!==n.indexOf(i)){if(r.indexOf(n)>-1)return!1;e=e.replace(new RegExp("["+n+"]","gm"+t),"["+n+"]"),r.push(n)}return!0})}),e}},{key:"createMergedBlanksRegExp",value:function(e){return e.replace(/[\s]+/gim,"[\\s]+")}},{key:"createAccuracyRegExp",value:function(e){var t=this,n=this.opt.accuracy,r="string"==typeof n?n:n.value,i="";switch(("string"==typeof n?[]:n.limiters).forEach(function(e){i+="|"+t.escapeStr(e)}),r){case"partially":default:return"()("+e+")";case"complementary":return"()([^"+(i="\\s"+(i||this.escapeStr("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿")))+"]*"+e+"[^"+i+"]*)";case"exactly":return"(^|\\s"+i+")("+e+")(?=$|\\s"+i+")"}}}]),e}(),a=function(){function a(e){t(this,a),this.ctx=e,this.ie=!1;var n=window.navigator.userAgent;(n.indexOf("MSIE")>-1||n.indexOf("Trident")>-1)&&(this.ie=!0)}return n(a,[{key:"log",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"debug",r=this.opt.log;this.opt.debug&&"object"===(void 0===r?"undefined":e(r))&&"function"==typeof r[n]&&r[n]("mark.js: "+t)}},{key:"getSeparatedKeywords",value:function(e){var t=this,n=[];return e.forEach(function(e){t.opt.separateWordSearch?e.split(" ").forEach(function(e){e.trim()&&-1===n.indexOf(e)&&n.push(e)}):e.trim()&&-1===n.indexOf(e)&&n.push(e)}),{keywords:n.sort(function(e,t){return t.length-e.length}),length:n.length}}},{key:"isNumeric",value:function(e){return Number(parseFloat(e))==e}},{key:"checkRanges",value:function(e){var t=this;if(!Array.isArray(e)||"[object Object]"!==Object.prototype.toString.call(e[0]))return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];var n=[],r=0;return e.sort(function(e,t){return e.start-t.start}).forEach(function(e){var i=t.callNoMatchOnInvalidRanges(e,r),o=i.start,a=i.end;i.valid&&(e.start=o,e.length=a-o,n.push(e),r=a)}),n}},{key:"callNoMatchOnInvalidRanges",value:function(e,t){var n=void 0,r=void 0,i=!1;return e&&void 0!==e.start?(r=(n=parseInt(e.start,10))+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&r-t>0&&r-n>0?i=!0:(this.log("Ignoring invalid or overlapping range: "+JSON.stringify(e)),this.opt.noMatch(e))):(this.log("Ignoring invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:n,end:r,valid:i}}},{key:"checkWhitespaceRanges",value:function(e,t,n){var r=void 0,i=!0,o=n.length,a=t-o,s=parseInt(e.start,10)-a;return(r=(s=s>o?o:s)+parseInt(e.length,10))>o&&(r=o,this.log("End range automatically set to the max value of "+o)),s<0||r-s<0||s>o||r>o?(i=!1,this.log("Invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)):""===n.substring(s,r).replace(/\s+/g,"")&&(i=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:s,end:r,valid:i}}},{key:"getTextNodes",value:function(e){var t=this,n="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,function(e){r.push({start:n.length,end:(n+=e.textContent).length,node:e})},function(e){return t.matchesExclude(e.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},function(){e({value:n,nodes:r})})}},{key:"matchesExclude",value:function(e){return i.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}},{key:"wrapRangeInTextNode",value:function(e,t,n){var r=this.opt.element?this.opt.element:"mark",i=e.splitText(t),o=i.splitText(n-t),a=document.createElement(r);return a.setAttribute("data-markjs","true"),this.opt.className&&a.setAttribute("class",this.opt.className),a.textContent=i.textContent,i.parentNode.replaceChild(a,i),o}},{key:"wrapRangeInMappedTextNode",value:function(e,t,n,r,i){var o=this;e.nodes.every(function(a,s){var c=e.nodes[s+1];if(void 0===c||c.start>t){if(!r(a.node))return!1;var u=t-a.start,l=(n>a.end?a.end:n)-a.start,h=e.value.substr(0,a.start),f=e.value.substr(l+a.start);if(a.node=o.wrapRangeInTextNode(a.node,u,l),e.value=h+f,e.nodes.forEach(function(t,n){n>=s&&(e.nodes[n].start>0&&n!==s&&(e.nodes[n].start-=l),e.nodes[n].end-=l)}),n-=l,i(a.node.previousSibling,a.start),!(n>a.end))return!1;t=a.end}return!0})}},{key:"wrapGroups",value:function(e,t,n,r){return r((e=this.wrapRangeInTextNode(e,t,t+n)).previousSibling),e}},{key:"separateGroups",value:function(e,t,n,r,i){for(var o=t.length,a=1;a-1&&r(t[a],e)&&(e=this.wrapGroups(e,s,t[a].length,i))}return e}},{key:"wrapMatches",value:function(e,t,n,r,i){var o=this,a=0===t?0:t+1;this.getTextNodes(function(t){t.nodes.forEach(function(t){t=t.node;for(var i=void 0;null!==(i=e.exec(t.textContent))&&""!==i[a];){if(o.opt.separateGroups)t=o.separateGroups(t,i,a,n,r);else{if(!n(i[a],t))continue;var s=i.index;if(0!==a)for(var c=1;c + + + + + Porting code to chronos - Chronos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Porting code to chronos v4

+ +

Thanks to its macro support, Nim allows async/await to be implemented in +libraries with only minimal support from the language - as such, multiple +async libraries exist, including chronos and asyncdispatch, and more may +come to be developed in the futures.

+

Chronos v3

+

Chronos v4 introduces new features for IPv6, exception effects, a stand-alone +Future type as well as several other changes - when upgrading from chronos v3, +here are several things to consider:

+
    +
  • Exception handling is now strict by default - see the error handling +chapter for how to deal with raises effects
  • +
  • AsyncEventBus was removed - use AsyncEventQueue instead
  • +
  • Future.value and Future.error panic when accessed in the wrong state
  • +
  • Future.read and Future.readError raise FutureError instead of +ValueError when accessed in the wrong state
  • +
+

asyncdispatch

+

Code written for asyncdispatch and chronos looks similar but there are +several differences to be aware of:

+
    +
  • chronos has its own dispatch loop - you can typically not mix chronos and +asyncdispatch in the same thread
  • +
  • import chronos instead of import asyncdispatch
  • +
  • cleanup is important - make sure to use closeWait to release any resources +you're using or file descriptor and other leaks will ensue
  • +
  • cancellation support means that CancelledError may be raised from most +{.async.} functions
  • +
  • Calling yield directly in tasks is not supported - instead, use awaitne.
  • +
  • asyncSpawn is used instead of asyncCheck - note that exceptions raised +in tasks that are asyncSpawn:ed cause panic
  • +
+

Supporting multiple backends

+

Libraries built on top of async/await may wish to support multiple async +backends - the best way to do so is to create separate modules for each backend +that may be imported side-by-side - see nim-metrics +for an example.

+

An alternative way is to select backend using a global compile flag - this +method makes it diffucult to compose applications that use both backends as may +happen with transitive dependencies, but may be appropriate in some cases - +libraries choosing this path should call the flag asyncBackend, allowing +applications to choose the backend with -d:asyncBackend=<backend_name>.

+

Known async backends include:

+
    +
  • chronos - this library (-d:asyncBackend=chronos)
  • +
  • asyncdispatch the standard library asyncdispatch module (-d:asyncBackend=asyncdispatch)
  • +
  • none - -d:asyncBackend=none - disable async support completely
  • +
+

none can be used when a library supports both a synchronous and +asynchronous API, to disable the latter.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/print.html b/print.html new file mode 100644 index 00000000..d9bd801c --- /dev/null +++ b/print.html @@ -0,0 +1,1020 @@ + + + + + + Chronos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Introduction

+

Chronos implements the async/await +paradigm in a self-contained library using macro and closure iterator +transformation features provided by Nim.

+

Features include:

+
    +
  • Asynchronous socket and process I/O
  • +
  • HTTP client / server with SSL/TLS support out of the box (no OpenSSL needed)
  • +
  • Synchronization primitivies like queues, events and locks
  • +
  • Cancellation
  • +
  • Efficient dispatch pipeline with excellent multi-platform support
  • +
  • Exception effect support
  • +
+

Installation

+

Install chronos using nimble:

+
nimble install chronos
+
+

or add a dependency to your .nimble file:

+
requires "chronos"
+
+

and start using it:

+
import chronos/apps/http/httpclient
+
+proc retrievePage*(uri: string): Future[string] {.async.} =
+  # Create a new HTTP session
+  let httpSession = HttpSessionRef.new()
+  try:
+    # Fetch page contents
+    let resp = await httpSession.fetch(parseUri(uri))
+    # Convert response to a string, assuming its encoding matches the terminal!
+    bytesToString(resp.data)
+  finally: # Close the session
+    await noCancel(httpSession.closeWait())
+
+echo waitFor retrievePage(
+  "https://raw.githubusercontent.com/status-im/nim-chronos/master/README.md")
+
+

There are more examples throughout the manual!

+

Platform support

+

Several platforms are supported, with different backend options:

+
    +
  • Windows: IOCP
  • +
  • Linux: epoll / poll
  • +
  • OSX / BSD: kqueue / poll
  • +
  • Android / Emscripten / posix: poll
  • +
+

API documentation

+

This guide covers basic usage of chronos - for details, see the +API reference.

+

Examples

+

Examples are available in the docs/examples/ folder.

+

Basic concepts

+ +

Threads

+ +

TCP

+
    +
  • tcpserver - Simple TCP/IP v4/v6 echo server
  • +
+

HTTP

+
    +
  • httpget - Downloading a web page using the http client
  • +
  • twogets - Download two pages concurrently
  • +
  • middleware - Deploy multiple HTTP server middlewares
  • +
+

Concepts

+

Async/await is a programming model that relies on cooperative multitasking to +coordinate the concurrent execution of procedures, using event notifications +from the operating system or other treads to resume execution.

+

Code execution happens in a loop that alternates between making progress on +tasks and handling events.

+ +

The dispatcher

+

The event handler loop is called a "dispatcher" and a single instance per +thread is created, as soon as one is needed.

+

Scheduling is done by calling async procedures that return +Future objects - each time a procedure is unable to make further +progress, for example because it's waiting for some data to arrive, it hands +control back to the dispatcher which ensures that the procedure is resumed when +ready.

+

A single thread, and thus a single dispatcher, is typically able to handle +thousands of concurrent in-progress requests.

+

The Future type

+

Future objects encapsulate the outcome of executing an async procedure. The +Future may be pending meaning that the outcome is not yet known or +finished meaning that the return value is available, the operation failed +with an exception or was cancelled.

+

Inside an async procedure, you can await the outcome of another async +procedure - if the Future representing that operation is still pending, a +callback representing where to resume execution will be added to it and the +dispatcher will be given back control to deal with other tasks.

+

When a Future is finished, all its callbacks are scheduled to be run by +the dispatcher, thus continuing any operations that were waiting for an outcome.

+

The poll call

+

To trigger the processing step of the dispatcher, we need to call poll() - +either directly or through a wrapper like runForever() or waitFor().

+

Each call to poll handles any file descriptors, timers and callbacks that are +ready to be processed.

+

Using waitFor, the result of a single asynchronous operation can be obtained:

+
proc myApp() {.async.} =
+  echo "Waiting for a second..."
+  await sleepAsync(1.seconds)
+  echo "done!"
+
+waitFor myApp()
+
+

It is also possible to keep running the event loop forever using runForever:

+
proc myApp() {.async.} =
+  while true:
+    await sleepAsync(1.seconds)
+    echo "A bit more than a second passed!"
+
+let future = myApp()
+runForever()
+
+

Such an application never terminates, thus it is rare that applications are +structured this way.

+
Both `waitFor` and `runForever` call `poll` which offers fine-grained
+control over the event loop steps.
+
+Nested calls to `poll` - directly or indirectly via `waitFor` and `runForever`
+are not allowed.
+
+

Cancellation

+

Any pending Future can be cancelled. This can be used for timeouts, to start +multiple parallel operations and cancel the rest as soon as one finishes, +to initiate the orderely shutdown of an application etc.

+
## Simple cancellation example
+
+import chronos
+
+proc someTask() {.async.} = await sleepAsync(10.minutes)
+
+proc cancellationExample() {.async.} =
+  # Start a task but don't wait for it to finish
+  let future = someTask()
+  future.cancelSoon()
+  # `cancelSoon` schedules but does not wait for the future to get cancelled -
+  # it might still be pending here
+
+  let future2 = someTask() # Start another task concurrently
+  await future2.cancelAndWait()
+  # Using `cancelAndWait`, we can be sure that `future2` is either
+  # complete, failed or cancelled at this point. `future` could still be
+  # pending!
+  assert future2.finished()
+
+waitFor(cancellationExample())
+
+

Even if cancellation is initiated, it is not guaranteed that the operation gets +cancelled - the future might still be completed or fail depending on the +order of events in the dispatcher and the specifics of the operation.

+

If the future indeed gets cancelled, await will raise a +CancelledError as is likely to happen in the following example:

+
proc c1 {.async.} =
+  echo "Before sleep"
+  try:
+    await sleepAsync(10.minutes)
+    echo "After sleep" # not reach due to cancellation
+  except CancelledError as exc:
+    echo "We got cancelled!"
+    # `CancelledError` is typically re-raised to notify the caller that the
+    # operation is being cancelled
+    raise exc
+
+proc c2 {.async.} =
+  await c1()
+  echo "Never reached, since the CancelledError got re-raised"
+
+let work = c2()
+waitFor(work.cancelAndWait())
+
+

The CancelledError will now travel up the stack like any other exception. +It can be caught for instance to free some resources and is then typically +re-raised for the whole chain operations to get cancelled.

+

Alternatively, the cancellation request can be translated to a regular outcome +of the operation - for example, a read operation might return an empty result.

+

Cancelling an already-finished Future has no effect, as the following example +of downloading two web pages concurrently shows:

+
## Make two http requests concurrently and output the one that wins
+
+import chronos
+import ./httpget
+
+proc twoGets() {.async.} =
+  let
+    futs = @[
+      # Both pages will start downloading concurrently...
+      httpget.retrievePage("https://duckduckgo.com/?q=chronos"),
+      httpget.retrievePage("https://www.google.fr/search?q=chronos")
+    ]
+
+  # Wait for at least one request to finish..
+  let winner = await one(futs)
+  # ..and cancel the others since we won't need them
+  for fut in futs:
+    # Trying to cancel an already-finished future is harmless
+    fut.cancelSoon()
+
+  # An exception could be raised here if the winning request failed!
+  echo "Result: ", winner.read()
+
+waitFor(twoGets())
+
+

Ownership

+

When calling a procedure that returns a Future, ownership of that Future is +shared between the callee that created it and the caller that waits for it to be +finished.

+

The Future can be thought of as a single-item channel between a producer and a +consumer. The producer creates the Future and is responsible for completing or +failing it while the caller waits for completion and may cancel it.

+

Although it is technically possible, callers must not complete or fail +futures and callees or other intermediate observers must not cancel them as +this may lead to panics and shutdown (ie if the future is completed twice or a +cancalletion is not handled by the original caller).

+

noCancel

+

Certain operations must not be cancelled for semantic reasons. Common scenarios +include closeWait that releases a resources irrevocably and composed +operations whose individual steps should be performed together or not at all.

+

In such cases, the noCancel modifier to await can be used to temporarily +disable cancellation propagation, allowing the operation to complete even if +the caller initiates a cancellation request:

+
proc deepSleep(dur: Duration) {.async.} =
+  # `noCancel` prevents any cancellation request by the caller of `deepSleep`
+  # from reaching `sleepAsync` - even if `deepSleep` is cancelled, its future
+  # will not complete until the sleep finishes.
+  await noCancel sleepAsync(dur)
+
+let future = deepSleep(10.minutes)
+
+# This will take ~10 minutes even if we try to cancel the call to `deepSleep`!
+await cancelAndWait(future)
+
+

join

+

The join modifier to await allows cancelling an async procedure without +propagating the cancellation to the awaited operation. This is useful when +await:ing a Future for monitoring purposes, ie when a procedure is not the +owner of the future that's being await:ed.

+

One situation where this happens is when implementing the "observer" pattern, +where a helper monitors an operation it did not initiate:

+
var tick: Future[void]
+proc ticker() {.async.} =
+  while true:
+    tick = sleepAsync(1.second)
+    await tick
+    echo "tick!"
+
+proc tocker() {.async.} =
+  # This operation does not own or implement the operation behind `tick`,
+  # so it should not cancel it when `tocker` is cancelled
+  await join tick
+  echo "tock!"
+
+let
+  fut = ticker() # `ticker` is now looping and most likely waiting for `tick`
+  fut2 = tocker() # both `ticker` and `tocker` are waiting for `tick`
+
+# We don't want `tocker` to cancel a future that was created in `ticker`
+waitFor fut2.cancelAndWait()
+
+waitFor fut # keeps printing `tick!` every second.
+
+

Compile-time configuration

+

chronos contains several compile-time +configuration options enabling stricter compile-time +checks and debugging helpers whose runtime cost may be significant.

+

Strictness options generally will become default in future chronos releases and +allow adapting existing code without changing the new version - see the +config.nim module for more information.

+

Async procedures

+

Async procedures are those that interact with chronos to cooperatively +suspend and resume their execution depending on the completion of other +async procedures, timers, tasks on other threads or asynchronous I/O scheduled +with the operating system.

+

Async procedures are marked with the {.async.} pragma and return a Future +indicating the state of the operation.

+ +

The async pragma

+

The {.async.} pragma will transform a procedure (or a method) returning a +Future into a closure iterator. If there is no return type specified, +Future[void] is returned.

+
proc p() {.async.} =
+  await sleepAsync(100.milliseconds)
+
+echo p().type # prints "Future[system.void]"
+
+

await keyword

+

The await keyword operates on Future instances typically returned from an +async procedure.

+

Whenever await is encountered inside an async procedure, control is given +back to the dispatcher for as many steps as it's necessary for the awaited +future to complete, fail or be cancelled. await calls the +equivalent of Future.read() on the completed future to return the +encapsulated value when the operation finishes.

+
proc p1() {.async.} =
+  await sleepAsync(1.seconds)
+
+proc p2() {.async.} =
+  await sleepAsync(1.seconds)
+
+proc p3() {.async.} =
+  let
+    fut1 = p1()
+    fut2 = p2()
+  # Just by executing the async procs, both resulting futures entered the
+  # dispatcher queue and their "clocks" started ticking.
+  await fut1
+  await fut2
+  # Only one second passed while awaiting them both, not two.
+
+waitFor p3()
+
+
Because `async` procedures are executed concurrently, they are subject to many
+of the same risks that typically accompany multithreaded programming.
+
+In particular, if two `async` procedures have access to the same mutable state,
+the value before and after `await` might not be the same as the order of execution is not guaranteed!
+
+

Raw async procedures

+

Raw async procedures are those that interact with chronos via the Future +type but whose body does not go through the async transformation.

+

Such functions are created by adding raw: true to the async parameters:

+
proc rawAsync(): Future[void] {.async: (raw: true).} =
+  let fut = newFuture[void]("rawAsync")
+  fut.complete()
+  fut
+
+

Raw functions must not raise exceptions directly - they are implicitly declared +as raises: [] - instead they should store exceptions in the returned Future:

+
proc rawFailure(): Future[void] {.async: (raw: true).} =
+  let fut = newFuture[void]("rawAsync")
+  fut.fail((ref ValueError)(msg: "Oh no!"))
+  fut
+
+

Raw procedures can also use checked exceptions:

+
proc rawAsyncRaises(): Future[void] {.async: (raw: true, raises: [IOError]).} =
+  let fut = newFuture[void]()
+  assert not (compiles do: fut.fail((ref ValueError)(msg: "uh-uh")))
+  fut.fail((ref IOError)(msg: "IO"))
+  fut
+
+

Callbacks and closures

+

Callback/closure types are declared using the async annotation as usual:

+
type MyCallback = proc(): Future[void] {.async.}
+
+proc runCallback(cb: MyCallback) {.async: (raises: []).} =
+  try:
+    await cb()
+  except CatchableError:
+    discard # handle errors as usual
+
+

When calling a callback, it is important to remember that it may raise exceptions that need to be handled.

+

Checked exceptions can be used to limit the exceptions that a callback can +raise:

+
type MyEasyCallback = proc(): Future[void] {.async: (raises: []).}
+
+proc runCallback(cb: MyEasyCallback) {.async: (raises: [])} =
+  await cb()
+
+

Errors and exceptions

+ +

Exceptions

+

Exceptions inheriting from CatchableError +interrupt execution of an async procedure. The exception is placed in the +Future.error field while changing the status of the Future to Failed +and callbacks are scheduled.

+

When a future is read or awaited the exception is re-raised, traversing the +async execution chain until handled.

+
proc p1() {.async.} =
+  await sleepAsync(1.seconds)
+  raise newException(ValueError, "ValueError inherits from CatchableError")
+
+proc p2() {.async.} =
+  await sleepAsync(1.seconds)
+
+proc p3() {.async.} =
+  let
+    fut1 = p1()
+    fut2 = p2()
+  await fut1
+  echo "unreachable code here"
+  await fut2
+
+# `waitFor()` would call `Future.read()` unconditionally, which would raise the
+# exception in `Future.error`.
+let fut3 = p3()
+while not(fut3.finished()):
+  poll()
+
+echo "fut3.state = ", fut3.state # "Failed"
+if fut3.failed():
+  echo "p3() failed: ", fut3.error.name, ": ", fut3.error.msg
+  # prints "p3() failed: ValueError: ValueError inherits from CatchableError"
+
+

You can put the await in a try block, to deal with that exception sooner:

+
proc p3() {.async.} =
+  let
+    fut1 = p1()
+    fut2 = p2()
+  try:
+    await fut1
+  except CachableError:
+    echo "p1() failed: ", fut1.error.name, ": ", fut1.error.msg
+  echo "reachable code here"
+  await fut2
+
+

Because chronos ensures that all exceptions are re-routed to the Future, +poll will not itself raise exceptions.

+

poll may still panic / raise Defect if such are raised in user code due to +undefined behavior.

+

Checked exceptions

+

By specifying a raises list to an async procedure, you can check which +exceptions can be raised by it:

+
proc p1(): Future[void] {.async: (raises: [IOError]).} =
+  assert not (compiles do: raise newException(ValueError, "uh-uh"))
+  raise newException(IOError, "works") # Or any child of IOError
+
+proc p2(): Future[void] {.async, (raises: [IOError]).} =
+  await p1() # Works, because await knows that p1
+             # can only raise IOError
+
+

Under the hood, the return type of p1 will be rewritten to an internal type +which will convey raises informations to await.

+
Most `async` include `CancelledError` in the list of `raises`, indicating that
+the operation they implement might get cancelled resulting in neither value nor
+error!
+
+

When using checked exceptions, the Future type is modified to include +raises information - it can be constructed with the Raising helper:

+
# Create a variable of the type that will be returned by a an async function
+# raising `[CancelledError]`:
+var fut: Future[int].Raising([CancelledError])
+
+
`Raising` creates a specialization of `InternalRaisesFuture` type - as the name
+suggests, this is an internal type whose implementation details are likely to
+change in future `chronos` versions.
+
+

The Exception type

+

Exceptions deriving from Exception are not caught by default as these may +include Defect and other forms undefined or uncatchable behavior.

+

Because exception effect tracking is turned on for async functions, this may +sometimes lead to compile errors around forward declarations, methods and +closures as Nim conservatively asssumes that any Exception might be raised +from those.

+

Make sure to explicitly annotate these with {.raises.}:

+
# Forward declarations need to explicitly include a raises list:
+proc myfunction() {.raises: [ValueError].}
+
+# ... as do `proc` types
+type MyClosure = proc() {.raises: [ValueError].}
+
+proc myfunction() =
+  raise (ref ValueError)(msg: "Implementation here")
+
+let closure: MyClosure = myfunction
+
+

Compatibility modes

+

Individual functions. For compatibility, async functions can be instructed +to handle Exception as well, specifying handleException: true. Any +Exception that is not a Defect and not a CatchableError will then be +caught and remapped to AsyncExceptionError:

+
proc raiseException() {.async: (handleException: true, raises: [AsyncExceptionError]).} =
+  raise (ref Exception)(msg: "Raising Exception is UB")
+
+proc callRaiseException() {.async: (raises: []).} =
+  try:
+    await raiseException()
+  except AsyncExceptionError as exc:
+    # The original Exception is available from the `parent` field
+    echo exc.parent.msg
+
+

Global flag. This mode can be enabled globally with +-d:chronosHandleException as a help when porting code to chronos. The +behavior in this case will be that:

+
    +
  1. +

    old-style functions annotated with plain async will behave as if they had +been annotated with async: (handleException: true).

    +

    This is functionally equivalent to +async: (handleException: true, raises: [CatchableError]) and will, as +before, remap any Exception that is not Defect into +AsyncExceptionError, while also allowing any CatchableError (including +AsyncExceptionError) to get through without compilation errors.

    +
  2. +
  3. +

    New-style functions with async: (raises: [...]) annotations or their own +handleException annotations will not be affected.

    +
  4. +
+

The rationale here is to allow one to incrementally introduce exception +annotations and get compiler feedback while not requiring that every bit of +legacy code is updated at once.

+

This should be used sparingly and with care, however, as global configuration +settings may interfere with libraries that use chronos leading to unexpected +behavior.

+

Threads

+

While the cooperative async model offers an efficient model +for dealing with many tasks that often are blocked on I/O, it is not suitable +for long-running computations that would prevent concurrent tasks from progressing.

+

Multithreading offers a way to offload heavy computations to be executed in +parallel with the async work, or, in cases where a single event loop gets +overloaded, to manage multiple event loops in parallel.

+

For interaction between threads, the ThreadSignalPtr type (found in the +(chronos/threadsync)(https://github.com/status-im/nim-chronos/blob/master/chronos/threadsync.nim) +module) is used - both to wait for notifications coming from other threads and +to notify other threads of progress from within an async procedure.

+
import chronos, chronos/threadsync
+import os
+
+type
+  Context = object
+    # Context allocated by `createShared` should contain no garbage-collected
+    # types!
+    signal: ThreadSignalPtr
+    value: int
+
+proc myThread(ctx: ptr Context) {.thread.} =
+  echo "Doing some work in a thread"
+  sleep(3000)
+  ctx.value = 42
+  echo "Done, firing the signal"
+  discard ctx.signal.fireSync().expect("correctly initialized signal should not fail")
+
+proc main() {.async.} =
+  let
+    signal = ThreadSignalPtr.new().expect("free file descriptor for signal")
+    context = createShared(Context)
+  context.signal = signal
+
+  var thread: Thread[ptr Context]
+
+  echo "Starting thread"
+  createThread(thread, myThread, context)
+
+  await signal.wait()
+
+  echo "Work done: ", context.value
+
+  joinThread(thread)
+
+  signal.close().expect("closing once works")
+  deallocShared(context)
+
+waitFor main()
+
+

Tips, tricks and best practices

+

Timeouts

+

To prevent a single task from taking too long, withTimeout can be used:

+
## Simple timeouts
+import chronos
+
+proc longTask {.async.} =
+  try:
+    await sleepAsync(10.minutes)
+  except CancelledError as exc:
+    echo "Long task was cancelled!"
+    raise exc # Propagate cancellation to the next operation
+
+proc simpleTimeout() {.async.} =
+  let
+    task = longTask() # Start a task but don't `await` it
+
+  if not await task.withTimeout(1.seconds):
+    echo "Timeout reached - withTimeout should have cancelled the task"
+  else:
+    echo "Task completed"
+
+waitFor simpleTimeout()
+
+

When several tasks should share a single timeout, a common timer can be created +with sleepAsync:

+
## Single timeout for several operations
+import chronos
+
+proc shortTask {.async.} =
+  try:
+    await sleepAsync(1.seconds)
+  except CancelledError as exc:
+    echo "Short task was cancelled!"
+    raise exc # Propagate cancellation to the next operation
+
+proc composedTimeout()  {.async.} =
+  let
+    # Common timout for several sub-tasks
+    timeout = sleepAsync(10.seconds)
+
+  while not timeout.finished():
+    let task = shortTask() # Start a task but don't `await` it
+    if (await race(task, timeout)) == task:
+      echo "Ran one more task"
+    else:
+      # This cancellation may or may not happen as task might have finished
+      # right at the timeout!
+      task.cancelSoon()
+
+waitFor composedTimeout()
+
+

discard

+

When calling an asynchronous procedure without await, the operation is started +but its result is not processed until corresponding Future is read.

+

It is therefore important to never discard futures directly - instead, one +can discard the result of awaiting the future or use asyncSpawn to monitor +the outcome of the future as if it were running in a separate thread.

+

Similar to threads, tasks managed by asyncSpawn may causes the application to +crash if any exceptions leak out of it - use +checked exceptions to avoid this +problem.

+
## The peculiarities of `discard` in `async` procedures
+import chronos
+
+proc failingOperation() {.async.} =
+  echo "Raising!"
+  raise (ref ValueError)(msg: "My error")
+
+proc myApp() {.async.} =
+  # This style of discard causes the `ValueError` to be discarded, hiding the
+  # failure of the operation - avoid!
+  discard failingOperation()
+
+  proc runAsTask(fut: Future[void]): Future[void] {.async: (raises: []).} =
+    # runAsTask uses `raises: []` to ensure at compile-time that no exceptions
+    # escape it!
+    try:
+      await fut
+    except CatchableError as exc:
+      echo "The task failed! ", exc.msg
+
+  # asyncSpawn ensures that errors don't leak unnoticed from tasks without
+  # blocking:
+  asyncSpawn runAsTask(failingOperation())
+
+  # If we didn't catch the exception with `runAsTask`, the program will crash:
+  asyncSpawn failingOperation()
+
+waitFor myApp()
+
+

Porting code to chronos v4

+ +

Thanks to its macro support, Nim allows async/await to be implemented in +libraries with only minimal support from the language - as such, multiple +async libraries exist, including chronos and asyncdispatch, and more may +come to be developed in the futures.

+

Chronos v3

+

Chronos v4 introduces new features for IPv6, exception effects, a stand-alone +Future type as well as several other changes - when upgrading from chronos v3, +here are several things to consider:

+
    +
  • Exception handling is now strict by default - see the error handling +chapter for how to deal with raises effects
  • +
  • AsyncEventBus was removed - use AsyncEventQueue instead
  • +
  • Future.value and Future.error panic when accessed in the wrong state
  • +
  • Future.read and Future.readError raise FutureError instead of +ValueError when accessed in the wrong state
  • +
+

asyncdispatch

+

Code written for asyncdispatch and chronos looks similar but there are +several differences to be aware of:

+
    +
  • chronos has its own dispatch loop - you can typically not mix chronos and +asyncdispatch in the same thread
  • +
  • import chronos instead of import asyncdispatch
  • +
  • cleanup is important - make sure to use closeWait to release any resources +you're using or file descriptor and other leaks will ensue
  • +
  • cancellation support means that CancelledError may be raised from most +{.async.} functions
  • +
  • Calling yield directly in tasks is not supported - instead, use awaitne.
  • +
  • asyncSpawn is used instead of asyncCheck - note that exceptions raised +in tasks that are asyncSpawn:ed cause panic
  • +
+

Supporting multiple backends

+

Libraries built on top of async/await may wish to support multiple async +backends - the best way to do so is to create separate modules for each backend +that may be imported side-by-side - see nim-metrics +for an example.

+

An alternative way is to select backend using a global compile flag - this +method makes it diffucult to compose applications that use both backends as may +happen with transitive dependencies, but may be appropriate in some cases - +libraries choosing this path should call the flag asyncBackend, allowing +applications to choose the backend with -d:asyncBackend=<backend_name>.

+

Known async backends include:

+
    +
  • chronos - this library (-d:asyncBackend=chronos)
  • +
  • asyncdispatch the standard library asyncdispatch module (-d:asyncBackend=asyncdispatch)
  • +
  • none - -d:asyncBackend=none - disable async support completely
  • +
+

none can be used when a library supports both a synchronous and +asynchronous API, to disable the latter.

+

HTTP server middleware

+

Chronos provides a powerful mechanism for customizing HTTP request handlers via +middlewares.

+

A middleware is a coroutine that can modify, block or filter HTTP request.

+

Single HTTP server could support unlimited number of middlewares, but you need to consider that each request in worst case could go through all the middlewares, and therefore a huge number of middlewares can have a significant impact on HTTP server performance.

+

Order of middlewares is also important: right after HTTP server has received request, it will be sent to the first middleware in list, and each middleware will be responsible for passing control to other middlewares. Therefore, when building a list, it would be a good idea to place the request handlers at the end of the list, while keeping the middleware that could block or modify the request at the beginning of the list.

+

Middleware could also modify HTTP server request, and these changes will be visible to all handlers (either middlewares or the original request handler). This can be done using the following helpers:

+
  proc updateRequest*(request: HttpRequestRef, scheme: string, meth: HttpMethod,
+                      version: HttpVersion, requestUri: string,
+                      headers: HttpTable): HttpResultMessage[void]
+
+  proc updateRequest*(request: HttpRequestRef, meth: HttpMethod,
+                      requestUri: string,
+                      headers: HttpTable): HttpResultMessage[void]
+
+  proc updateRequest*(request: HttpRequestRef, requestUri: string,
+                      headers: HttpTable): HttpResultMessage[void]
+
+  proc updateRequest*(request: HttpRequestRef,
+                      requestUri: string): HttpResultMessage[void]
+
+  proc updateRequest*(request: HttpRequestRef,
+                      headers: HttpTable): HttpResultMessage[void]
+
+

As you can see all the HTTP request parameters could be modified: request method, version, request path and request headers.

+

Middleware could also use helpers to obtain more information about remote and local addresses of request's connection (this could be helpful when you need to do some IP address filtering).

+
  proc remote*(request: HttpRequestRef): Opt[TransportAddress]
+    ## Returns remote address of HTTP request's connection.
+  proc local*(request: HttpRequestRef): Opt[TransportAddress] =
+    ## Returns local address of HTTP request's connection.
+
+

Every middleware is the coroutine which looks like this:

+
  proc middlewareHandler(
+      middleware: HttpServerMiddlewareRef,
+      reqfence: RequestFence,
+      nextHandler: HttpProcessCallback2
+  ): Future[HttpResponseRef] {.async: (raises: [CancelledError]).} =
+
+

Where middleware argument is the object which could hold some specific values, reqfence is HTTP request which is enclosed with HTTP server error information and nextHandler is reference to next request handler, it could be either middleware handler or the original request processing callback handler.

+
  await nextHandler(reqfence)
+
+

You should perform await for the response from the nextHandler(reqfence). Usually you should call next handler when you dont want to handle request or you dont know how to handle it, for example:

+
  proc middlewareHandler(
+      middleware: HttpServerMiddlewareRef,
+      reqfence: RequestFence,
+      nextHandler: HttpProcessCallback2
+  ): Future[HttpResponseRef] {.async: (raises: [CancelledError]).} =
+  if reqfence.isErr():
+    # We dont know or do not want to handle failed requests, so we call next handler.
+    return await nextHandler(reqfence)
+  let request = reqfence.get()
+  if request.uri.path == "/path/we/able/to/respond":
+    try:
+      # Sending some response.
+      await request.respond(Http200, "TEST")
+    except HttpWriteError as exc:
+      # We could also return default response for exception or other types of error.
+      defaultResponse(exc)
+  elif request.uri.path == "/path/for/rewrite":
+    # We going to modify request object for this request, next handler will receive it with different request path.
+    let res = request.updateRequest("/path/to/new/location")
+    if res.isErr():
+      return defaultResponse(res.error)
+    await nextHandler(reqfence)
+  elif request.uri.path == "/restricted/path":
+    if request.remote().isNone():
+      # We can't obtain remote address, so we force HTTP server to respond with `401 Unauthorized` status code.
+      return codeResponse(Http401)
+    if $(request.remote().get()).startsWith("127.0.0.1"):
+      # Remote peer's address starts with "127.0.0.1", sending proper response.
+      await request.respond(Http200, "AUTHORIZED")
+    else:
+      # Force HTTP server to respond with `403 Forbidden` status code.
+      codeResponse(Http403)
+  elif request.uri.path == "/blackhole":
+    # Force HTTP server to drop connection with remote peer.
+    dropResponse()
+  else:
+    # All other requests should be handled by somebody else.
+    await nextHandler(reqfence)
+
+

Updating this book

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/searcher.js b/searcher.js new file mode 100644 index 00000000..d2b0aeed --- /dev/null +++ b/searcher.js @@ -0,0 +1,483 @@ +"use strict"; +window.search = window.search || {}; +(function search(search) { + // Search functionality + // + // You can use !hasFocus() to prevent keyhandling in your key + // event handlers while the user is typing their search. + + if (!Mark || !elasticlunr) { + return; + } + + //IE 11 Compatibility from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith + if (!String.prototype.startsWith) { + String.prototype.startsWith = function(search, pos) { + return this.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search; + }; + } + + var search_wrap = document.getElementById('search-wrapper'), + searchbar = document.getElementById('searchbar'), + searchbar_outer = document.getElementById('searchbar-outer'), + searchresults = document.getElementById('searchresults'), + searchresults_outer = document.getElementById('searchresults-outer'), + searchresults_header = document.getElementById('searchresults-header'), + searchicon = document.getElementById('search-toggle'), + content = document.getElementById('content'), + + searchindex = null, + doc_urls = [], + results_options = { + teaser_word_count: 30, + limit_results: 30, + }, + search_options = { + bool: "AND", + expand: true, + fields: { + title: {boost: 1}, + body: {boost: 1}, + breadcrumbs: {boost: 0} + } + }, + mark_exclude = [], + marker = new Mark(content), + current_searchterm = "", + URL_SEARCH_PARAM = 'search', + URL_MARK_PARAM = 'highlight', + teaser_count = 0, + + SEARCH_HOTKEY_KEYCODE = 83, + ESCAPE_KEYCODE = 27, + DOWN_KEYCODE = 40, + UP_KEYCODE = 38, + SELECT_KEYCODE = 13; + + function hasFocus() { + return searchbar === document.activeElement; + } + + function removeChildren(elem) { + while (elem.firstChild) { + elem.removeChild(elem.firstChild); + } + } + + // Helper to parse a url into its building blocks. + function parseURL(url) { + var a = document.createElement('a'); + a.href = url; + return { + source: url, + protocol: a.protocol.replace(':',''), + host: a.hostname, + port: a.port, + params: (function(){ + var ret = {}; + var seg = a.search.replace(/^\?/,'').split('&'); + var len = seg.length, i = 0, s; + for (;i': '>', + '"': '"', + "'": ''' + }; + var repl = function(c) { return MAP[c]; }; + return function(s) { + return s.replace(/[&<>'"]/g, repl); + }; + })(); + + function formatSearchMetric(count, searchterm) { + if (count == 1) { + return count + " search result for '" + searchterm + "':"; + } else if (count == 0) { + return "No search results for '" + searchterm + "'."; + } else { + return count + " search results for '" + searchterm + "':"; + } + } + + function formatSearchResult(result, searchterms) { + var teaser = makeTeaser(escapeHTML(result.doc.body), searchterms); + teaser_count++; + + // The ?URL_MARK_PARAM= parameter belongs inbetween the page and the #heading-anchor + var url = doc_urls[result.ref].split("#"); + if (url.length == 1) { // no anchor found + url.push(""); + } + + // encodeURIComponent escapes all chars that could allow an XSS except + // for '. Due to that we also manually replace ' with its url-encoded + // representation (%27). + var searchterms = encodeURIComponent(searchterms.join(" ")).replace(/\'/g, "%27"); + + return '' + result.doc.breadcrumbs + '' + + '' + + teaser + ''; + } + + function makeTeaser(body, searchterms) { + // The strategy is as follows: + // First, assign a value to each word in the document: + // Words that correspond to search terms (stemmer aware): 40 + // Normal words: 2 + // First word in a sentence: 8 + // Then use a sliding window with a constant number of words and count the + // sum of the values of the words within the window. Then use the window that got the + // maximum sum. If there are multiple maximas, then get the last one. + // Enclose the terms in . + var stemmed_searchterms = searchterms.map(function(w) { + return elasticlunr.stemmer(w.toLowerCase()); + }); + var searchterm_weight = 40; + var weighted = []; // contains elements of ["word", weight, index_in_document] + // split in sentences, then words + var sentences = body.toLowerCase().split('. '); + var index = 0; + var value = 0; + var searchterm_found = false; + for (var sentenceindex in sentences) { + var words = sentences[sentenceindex].split(' '); + value = 8; + for (var wordindex in words) { + var word = words[wordindex]; + if (word.length > 0) { + for (var searchtermindex in stemmed_searchterms) { + if (elasticlunr.stemmer(word).startsWith(stemmed_searchterms[searchtermindex])) { + value = searchterm_weight; + searchterm_found = true; + } + }; + weighted.push([word, value, index]); + value = 2; + } + index += word.length; + index += 1; // ' ' or '.' if last word in sentence + }; + index += 1; // because we split at a two-char boundary '. ' + }; + + if (weighted.length == 0) { + return body; + } + + var window_weight = []; + var window_size = Math.min(weighted.length, results_options.teaser_word_count); + + var cur_sum = 0; + for (var wordindex = 0; wordindex < window_size; wordindex++) { + cur_sum += weighted[wordindex][1]; + }; + window_weight.push(cur_sum); + for (var wordindex = 0; wordindex < weighted.length - window_size; wordindex++) { + cur_sum -= weighted[wordindex][1]; + cur_sum += weighted[wordindex + window_size][1]; + window_weight.push(cur_sum); + }; + + if (searchterm_found) { + var max_sum = 0; + var max_sum_window_index = 0; + // backwards + for (var i = window_weight.length - 1; i >= 0; i--) { + if (window_weight[i] > max_sum) { + max_sum = window_weight[i]; + max_sum_window_index = i; + } + }; + } else { + max_sum_window_index = 0; + } + + // add around searchterms + var teaser_split = []; + var index = weighted[max_sum_window_index][2]; + for (var i = max_sum_window_index; i < max_sum_window_index+window_size; i++) { + var word = weighted[i]; + if (index < word[2]) { + // missing text from index to start of `word` + teaser_split.push(body.substring(index, word[2])); + index = word[2]; + } + if (word[1] == searchterm_weight) { + teaser_split.push("") + } + index = word[2] + word[0].length; + teaser_split.push(body.substring(word[2], index)); + if (word[1] == searchterm_weight) { + teaser_split.push("") + } + }; + + return teaser_split.join(''); + } + + function init(config) { + results_options = config.results_options; + search_options = config.search_options; + searchbar_outer = config.searchbar_outer; + doc_urls = config.doc_urls; + searchindex = elasticlunr.Index.load(config.index); + + // Set up events + searchicon.addEventListener('click', function(e) { searchIconClickHandler(); }, false); + searchbar.addEventListener('keyup', function(e) { searchbarKeyUpHandler(); }, false); + document.addEventListener('keydown', function(e) { globalKeyHandler(e); }, false); + // If the user uses the browser buttons, do the same as if a reload happened + window.onpopstate = function(e) { doSearchOrMarkFromUrl(); }; + // Suppress "submit" events so the page doesn't reload when the user presses Enter + document.addEventListener('submit', function(e) { e.preventDefault(); }, false); + + // If reloaded, do the search or mark again, depending on the current url parameters + doSearchOrMarkFromUrl(); + } + + function unfocusSearchbar() { + // hacky, but just focusing a div only works once + var tmp = document.createElement('input'); + tmp.setAttribute('style', 'position: absolute; opacity: 0;'); + searchicon.appendChild(tmp); + tmp.focus(); + tmp.remove(); + } + + // On reload or browser history backwards/forwards events, parse the url and do search or mark + function doSearchOrMarkFromUrl() { + // Check current URL for search request + var url = parseURL(window.location.href); + if (url.params.hasOwnProperty(URL_SEARCH_PARAM) + && url.params[URL_SEARCH_PARAM] != "") { + showSearch(true); + searchbar.value = decodeURIComponent( + (url.params[URL_SEARCH_PARAM]+'').replace(/\+/g, '%20')); + searchbarKeyUpHandler(); // -> doSearch() + } else { + showSearch(false); + } + + if (url.params.hasOwnProperty(URL_MARK_PARAM)) { + var words = decodeURIComponent(url.params[URL_MARK_PARAM]).split(' '); + marker.mark(words, { + exclude: mark_exclude + }); + + var markers = document.querySelectorAll("mark"); + function hide() { + for (var i = 0; i < markers.length; i++) { + markers[i].classList.add("fade-out"); + window.setTimeout(function(e) { marker.unmark(); }, 300); + } + } + for (var i = 0; i < markers.length; i++) { + markers[i].addEventListener('click', hide); + } + } + } + + // Eventhandler for keyevents on `document` + function globalKeyHandler(e) { + if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey || e.target.type === 'textarea' || e.target.type === 'text') { return; } + + if (e.keyCode === ESCAPE_KEYCODE) { + e.preventDefault(); + searchbar.classList.remove("active"); + setSearchUrlParameters("", + (searchbar.value.trim() !== "") ? "push" : "replace"); + if (hasFocus()) { + unfocusSearchbar(); + } + showSearch(false); + marker.unmark(); + } else if (!hasFocus() && e.keyCode === SEARCH_HOTKEY_KEYCODE) { + e.preventDefault(); + showSearch(true); + window.scrollTo(0, 0); + searchbar.select(); + } else if (hasFocus() && e.keyCode === DOWN_KEYCODE) { + e.preventDefault(); + unfocusSearchbar(); + searchresults.firstElementChild.classList.add("focus"); + } else if (!hasFocus() && (e.keyCode === DOWN_KEYCODE + || e.keyCode === UP_KEYCODE + || e.keyCode === SELECT_KEYCODE)) { + // not `:focus` because browser does annoying scrolling + var focused = searchresults.querySelector("li.focus"); + if (!focused) return; + e.preventDefault(); + if (e.keyCode === DOWN_KEYCODE) { + var next = focused.nextElementSibling; + if (next) { + focused.classList.remove("focus"); + next.classList.add("focus"); + } + } else if (e.keyCode === UP_KEYCODE) { + focused.classList.remove("focus"); + var prev = focused.previousElementSibling; + if (prev) { + prev.classList.add("focus"); + } else { + searchbar.select(); + } + } else { // SELECT_KEYCODE + window.location.assign(focused.querySelector('a')); + } + } + } + + function showSearch(yes) { + if (yes) { + search_wrap.classList.remove('hidden'); + searchicon.setAttribute('aria-expanded', 'true'); + } else { + search_wrap.classList.add('hidden'); + searchicon.setAttribute('aria-expanded', 'false'); + var results = searchresults.children; + for (var i = 0; i < results.length; i++) { + results[i].classList.remove("focus"); + } + } + } + + function showResults(yes) { + if (yes) { + searchresults_outer.classList.remove('hidden'); + } else { + searchresults_outer.classList.add('hidden'); + } + } + + // Eventhandler for search icon + function searchIconClickHandler() { + if (search_wrap.classList.contains('hidden')) { + showSearch(true); + window.scrollTo(0, 0); + searchbar.select(); + } else { + showSearch(false); + } + } + + // Eventhandler for keyevents while the searchbar is focused + function searchbarKeyUpHandler() { + var searchterm = searchbar.value.trim(); + if (searchterm != "") { + searchbar.classList.add("active"); + doSearch(searchterm); + } else { + searchbar.classList.remove("active"); + showResults(false); + removeChildren(searchresults); + } + + setSearchUrlParameters(searchterm, "push_if_new_search_else_replace"); + + // Remove marks + marker.unmark(); + } + + // Update current url with ?URL_SEARCH_PARAM= parameter, remove ?URL_MARK_PARAM and #heading-anchor . + // `action` can be one of "push", "replace", "push_if_new_search_else_replace" + // and replaces or pushes a new browser history item. + // "push_if_new_search_else_replace" pushes if there is no `?URL_SEARCH_PARAM=abc` yet. + function setSearchUrlParameters(searchterm, action) { + var url = parseURL(window.location.href); + var first_search = ! url.params.hasOwnProperty(URL_SEARCH_PARAM); + if (searchterm != "" || action == "push_if_new_search_else_replace") { + url.params[URL_SEARCH_PARAM] = searchterm; + delete url.params[URL_MARK_PARAM]; + url.hash = ""; + } else { + delete url.params[URL_MARK_PARAM]; + delete url.params[URL_SEARCH_PARAM]; + } + // A new search will also add a new history item, so the user can go back + // to the page prior to searching. A updated search term will only replace + // the url. + if (action == "push" || (action == "push_if_new_search_else_replace" && first_search) ) { + history.pushState({}, document.title, renderURL(url)); + } else if (action == "replace" || (action == "push_if_new_search_else_replace" && !first_search) ) { + history.replaceState({}, document.title, renderURL(url)); + } + } + + function doSearch(searchterm) { + + // Don't search the same twice + if (current_searchterm == searchterm) { return; } + else { current_searchterm = searchterm; } + + if (searchindex == null) { return; } + + // Do the actual search + var results = searchindex.search(searchterm, search_options); + var resultcount = Math.min(results.length, results_options.limit_results); + + // Display search metrics + searchresults_header.innerText = formatSearchMetric(resultcount, searchterm); + + // Clear and insert results + var searchterms = searchterm.split(' '); + removeChildren(searchresults); + for(var i = 0; i < resultcount ; i++){ + var resultElem = document.createElement('li'); + resultElem.innerHTML = formatSearchResult(results[i], searchterms); + searchresults.appendChild(resultElem); + } + + // Display results + showResults(true); + } + + fetch(path_to_root + 'searchindex.json') + .then(response => response.json()) + .then(json => init(json)) + .catch(error => { // Try to load searchindex.js if fetch failed + var script = document.createElement('script'); + script.src = path_to_root + 'searchindex.js'; + script.onload = () => init(window.search); + document.head.appendChild(script); + }); + + // Exported functions + search.hasFocus = hasFocus; +})(window.search); diff --git a/searchindex.js b/searchindex.js new file mode 100644 index 00000000..522009cc --- /dev/null +++ b/searchindex.js @@ -0,0 +1 @@ +Object.assign(window.search, {"doc_urls":["introduction.html#introduction","introduction.html#installation","introduction.html#platform-support","introduction.html#api-documentation","examples.html#examples","examples.html#basic-concepts","examples.html#threads","examples.html#tcp","examples.html#http","concepts.html#concepts","concepts.html#the-dispatcher","concepts.html#the-future-type","concepts.html#the-poll-call","concepts.html#cancellation","concepts.html#ownership","concepts.html#nocancel","concepts.html#join","concepts.html#compile-time-configuration","async_procs.html#async-procedures","async_procs.html#the-async-pragma","async_procs.html#await-keyword","async_procs.html#raw-async-procedures","async_procs.html#callbacks-and-closures","error_handling.html#errors-and-exceptions","error_handling.html#exceptions","error_handling.html#checked-exceptions","error_handling.html#the-exception-type","error_handling.html#compatibility-modes","threads.html#threads","tips.html#tips-tricks-and-best-practices","tips.html#timeouts","tips.html#discard","porting.html#porting-code-to-chronos-v4","porting.html#chronos-v3","porting.html#asyncdispatch","porting.html#supporting-multiple-backends","http_server_middleware.html#http-server-middleware","book.html#updating-this-book"],"index":{"documentStore":{"docInfo":{"0":{"body":46,"breadcrumbs":2,"title":1},"1":{"body":58,"breadcrumbs":2,"title":1},"10":{"body":52,"breadcrumbs":3,"title":1},"11":{"body":56,"breadcrumbs":4,"title":2},"12":{"body":94,"breadcrumbs":4,"title":2},"13":{"body":237,"breadcrumbs":3,"title":1},"14":{"body":53,"breadcrumbs":3,"title":1},"15":{"body":72,"breadcrumbs":3,"title":1},"16":{"body":92,"breadcrumbs":3,"title":1},"17":{"body":44,"breadcrumbs":5,"title":3},"18":{"body":40,"breadcrumbs":4,"title":2},"19":{"body":23,"breadcrumbs":4,"title":2},"2":{"body":19,"breadcrumbs":3,"title":2},"20":{"body":107,"breadcrumbs":4,"title":2},"21":{"body":83,"breadcrumbs":5,"title":3},"22":{"body":59,"breadcrumbs":4,"title":2},"23":{"body":7,"breadcrumbs":4,"title":2},"24":{"body":139,"breadcrumbs":3,"title":1},"25":{"body":102,"breadcrumbs":4,"title":2},"26":{"body":65,"breadcrumbs":4,"title":2},"27":{"body":134,"breadcrumbs":4,"title":2},"28":{"body":142,"breadcrumbs":2,"title":1},"29":{"body":0,"breadcrumbs":8,"title":4},"3":{"body":14,"breadcrumbs":3,"title":2},"30":{"body":121,"breadcrumbs":5,"title":1},"31":{"body":128,"breadcrumbs":5,"title":1},"32":{"body":29,"breadcrumbs":7,"title":4},"33":{"body":54,"breadcrumbs":5,"title":2},"34":{"body":63,"breadcrumbs":4,"title":1},"35":{"body":89,"breadcrumbs":6,"title":3},"36":{"body":370,"breadcrumbs":6,"title":3},"37":{"body":5,"breadcrumbs":4,"title":2},"4":{"body":4,"breadcrumbs":2,"title":1},"5":{"body":11,"breadcrumbs":3,"title":2},"6":{"body":4,"breadcrumbs":2,"title":1},"7":{"body":6,"breadcrumbs":2,"title":1},"8":{"body":23,"breadcrumbs":2,"title":1},"9":{"body":38,"breadcrumbs":3,"title":1}},"docs":{"0":{"body":"Chronos implements the async/await paradigm in a self-contained library using macro and closure iterator transformation features provided by Nim. Features include: Asynchronous socket and process I/O HTTP client / server with SSL/TLS support out of the box (no OpenSSL needed) Synchronization primitivies like queues, events and locks Cancellation Efficient dispatch pipeline with excellent multi-platform support Exception effect support","breadcrumbs":"Introduction » Introduction","id":"0","title":"Introduction"},"1":{"body":"Install chronos using nimble: nimble install chronos or add a dependency to your .nimble file: requires \"chronos\" and start using it: import chronos/apps/http/httpclient proc retrievePage*(uri: string): Future[string] {.async.} = # Create a new HTTP session let httpSession = HttpSessionRef.new() try: # Fetch page contents let resp = await httpSession.fetch(parseUri(uri)) # Convert response to a string, assuming its encoding matches the terminal! bytesToString(resp.data) finally: # Close the session await noCancel(httpSession.closeWait()) echo waitFor retrievePage( \"https://raw.githubusercontent.com/status-im/nim-chronos/master/README.md\") There are more examples throughout the manual!","breadcrumbs":"Introduction » Installation","id":"1","title":"Installation"},"10":{"body":"The event handler loop is called a \"dispatcher\" and a single instance per thread is created, as soon as one is needed. Scheduling is done by calling async procedures that return Future objects - each time a procedure is unable to make further progress, for example because it's waiting for some data to arrive, it hands control back to the dispatcher which ensures that the procedure is resumed when ready. A single thread, and thus a single dispatcher, is typically able to handle thousands of concurrent in-progress requests.","breadcrumbs":"Core concepts » The dispatcher","id":"10","title":"The dispatcher"},"11":{"body":"Future objects encapsulate the outcome of executing an async procedure. The Future may be pending meaning that the outcome is not yet known or finished meaning that the return value is available, the operation failed with an exception or was cancelled. Inside an async procedure, you can await the outcome of another async procedure - if the Future representing that operation is still pending, a callback representing where to resume execution will be added to it and the dispatcher will be given back control to deal with other tasks. When a Future is finished, all its callbacks are scheduled to be run by the dispatcher, thus continuing any operations that were waiting for an outcome.","breadcrumbs":"Core concepts » The Future type","id":"11","title":"The Future type"},"12":{"body":"To trigger the processing step of the dispatcher, we need to call poll() - either directly or through a wrapper like runForever() or waitFor(). Each call to poll handles any file descriptors, timers and callbacks that are ready to be processed. Using waitFor, the result of a single asynchronous operation can be obtained: proc myApp() {.async.} = echo \"Waiting for a second...\" await sleepAsync(1.seconds) echo \"done!\" waitFor myApp() It is also possible to keep running the event loop forever using runForever: proc myApp() {.async.} = while true: await sleepAsync(1.seconds) echo \"A bit more than a second passed!\" let future = myApp()\nrunForever() Such an application never terminates, thus it is rare that applications are structured this way. Both `waitFor` and `runForever` call `poll` which offers fine-grained\ncontrol over the event loop steps. Nested calls to `poll` - directly or indirectly via `waitFor` and `runForever`\nare not allowed.","breadcrumbs":"Core concepts » The poll call","id":"12","title":"The poll call"},"13":{"body":"Any pending Future can be cancelled. This can be used for timeouts, to start multiple parallel operations and cancel the rest as soon as one finishes, to initiate the orderely shutdown of an application etc. ## Simple cancellation example import chronos proc someTask() {.async.} = await sleepAsync(10.minutes) proc cancellationExample() {.async.} = # Start a task but don't wait for it to finish let future = someTask() future.cancelSoon() # `cancelSoon` schedules but does not wait for the future to get cancelled - # it might still be pending here let future2 = someTask() # Start another task concurrently await future2.cancelAndWait() # Using `cancelAndWait`, we can be sure that `future2` is either # complete, failed or cancelled at this point. `future` could still be # pending! assert future2.finished() waitFor(cancellationExample()) Even if cancellation is initiated, it is not guaranteed that the operation gets cancelled - the future might still be completed or fail depending on the order of events in the dispatcher and the specifics of the operation. If the future indeed gets cancelled, await will raise a CancelledError as is likely to happen in the following example: proc c1 {.async.} = echo \"Before sleep\" try: await sleepAsync(10.minutes) echo \"After sleep\" # not reach due to cancellation except CancelledError as exc: echo \"We got cancelled!\" # `CancelledError` is typically re-raised to notify the caller that the # operation is being cancelled raise exc proc c2 {.async.} = await c1() echo \"Never reached, since the CancelledError got re-raised\" let work = c2()\nwaitFor(work.cancelAndWait()) The CancelledError will now travel up the stack like any other exception. It can be caught for instance to free some resources and is then typically re-raised for the whole chain operations to get cancelled. Alternatively, the cancellation request can be translated to a regular outcome of the operation - for example, a read operation might return an empty result. Cancelling an already-finished Future has no effect, as the following example of downloading two web pages concurrently shows: ## Make two http requests concurrently and output the one that wins import chronos\nimport ./httpget proc twoGets() {.async.} = let futs = @[ # Both pages will start downloading concurrently... httpget.retrievePage(\"https://duckduckgo.com/?q=chronos\"), httpget.retrievePage(\"https://www.google.fr/search?q=chronos\") ] # Wait for at least one request to finish.. let winner = await one(futs) # ..and cancel the others since we won't need them for fut in futs: # Trying to cancel an already-finished future is harmless fut.cancelSoon() # An exception could be raised here if the winning request failed! echo \"Result: \", winner.read() waitFor(twoGets())","breadcrumbs":"Core concepts » Cancellation","id":"13","title":"Cancellation"},"14":{"body":"When calling a procedure that returns a Future, ownership of that Future is shared between the callee that created it and the caller that waits for it to be finished. The Future can be thought of as a single-item channel between a producer and a consumer. The producer creates the Future and is responsible for completing or failing it while the caller waits for completion and may cancel it. Although it is technically possible, callers must not complete or fail futures and callees or other intermediate observers must not cancel them as this may lead to panics and shutdown (ie if the future is completed twice or a cancalletion is not handled by the original caller).","breadcrumbs":"Core concepts » Ownership","id":"14","title":"Ownership"},"15":{"body":"Certain operations must not be cancelled for semantic reasons. Common scenarios include closeWait that releases a resources irrevocably and composed operations whose individual steps should be performed together or not at all. In such cases, the noCancel modifier to await can be used to temporarily disable cancellation propagation, allowing the operation to complete even if the caller initiates a cancellation request: proc deepSleep(dur: Duration) {.async.} = # `noCancel` prevents any cancellation request by the caller of `deepSleep` # from reaching `sleepAsync` - even if `deepSleep` is cancelled, its future # will not complete until the sleep finishes. await noCancel sleepAsync(dur) let future = deepSleep(10.minutes) # This will take ~10 minutes even if we try to cancel the call to `deepSleep`!\nawait cancelAndWait(future)","breadcrumbs":"Core concepts » noCancel","id":"15","title":"noCancel"},"16":{"body":"The join modifier to await allows cancelling an async procedure without propagating the cancellation to the awaited operation. This is useful when await:ing a Future for monitoring purposes, ie when a procedure is not the owner of the future that's being await:ed. One situation where this happens is when implementing the \"observer\" pattern, where a helper monitors an operation it did not initiate: var tick: Future[void]\nproc ticker() {.async.} = while true: tick = sleepAsync(1.second) await tick echo \"tick!\" proc tocker() {.async.} = # This operation does not own or implement the operation behind `tick`, # so it should not cancel it when `tocker` is cancelled await join tick echo \"tock!\" let fut = ticker() # `ticker` is now looping and most likely waiting for `tick` fut2 = tocker() # both `ticker` and `tocker` are waiting for `tick` # We don't want `tocker` to cancel a future that was created in `ticker`\nwaitFor fut2.cancelAndWait() waitFor fut # keeps printing `tick!` every second.","breadcrumbs":"Core concepts » join","id":"16","title":"join"},"17":{"body":"chronos contains several compile-time configuration options enabling stricter compile-time checks and debugging helpers whose runtime cost may be significant. Strictness options generally will become default in future chronos releases and allow adapting existing code without changing the new version - see the config.nim module for more information. Found a bug? Edit this page on GitHub.","breadcrumbs":"Core concepts » Compile-time configuration","id":"17","title":"Compile-time configuration"},"18":{"body":"Async procedures are those that interact with chronos to cooperatively suspend and resume their execution depending on the completion of other async procedures, timers, tasks on other threads or asynchronous I/O scheduled with the operating system. Async procedures are marked with the {.async.} pragma and return a Future indicating the state of the operation. The async pragma await keyword Raw async procedures Callbacks and closures","breadcrumbs":"async functions » Async procedures","id":"18","title":"Async procedures"},"19":{"body":"The {.async.} pragma will transform a procedure (or a method) returning a Future into a closure iterator. If there is no return type specified, Future[void] is returned. proc p() {.async.} = await sleepAsync(100.milliseconds) echo p().type # prints \"Future[system.void]\"","breadcrumbs":"async functions » The async pragma","id":"19","title":"The async pragma"},"2":{"body":"Several platforms are supported, with different backend options : Windows: IOCP Linux: epoll / poll OSX / BSD: kqueue / poll Android / Emscripten / posix: poll","breadcrumbs":"Introduction » Platform support","id":"2","title":"Platform support"},"20":{"body":"The await keyword operates on Future instances typically returned from an async procedure. Whenever await is encountered inside an async procedure, control is given back to the dispatcher for as many steps as it's necessary for the awaited future to complete, fail or be cancelled. await calls the equivalent of Future.read() on the completed future to return the encapsulated value when the operation finishes. proc p1() {.async.} = await sleepAsync(1.seconds) proc p2() {.async.} = await sleepAsync(1.seconds) proc p3() {.async.} = let fut1 = p1() fut2 = p2() # Just by executing the async procs, both resulting futures entered the # dispatcher queue and their \"clocks\" started ticking. await fut1 await fut2 # Only one second passed while awaiting them both, not two. waitFor p3() Because `async` procedures are executed concurrently, they are subject to many\nof the same risks that typically accompany multithreaded programming. In particular, if two `async` procedures have access to the same mutable state,\nthe value before and after `await` might not be the same as the order of execution is not guaranteed!","breadcrumbs":"async functions » await keyword","id":"20","title":"await keyword"},"21":{"body":"Raw async procedures are those that interact with chronos via the Future type but whose body does not go through the async transformation. Such functions are created by adding raw: true to the async parameters: proc rawAsync(): Future[void] {.async: (raw: true).} = let fut = newFuture[void](\"rawAsync\") fut.complete() fut Raw functions must not raise exceptions directly - they are implicitly declared as raises: [] - instead they should store exceptions in the returned Future: proc rawFailure(): Future[void] {.async: (raw: true).} = let fut = newFuture[void](\"rawAsync\") fut.fail((ref ValueError)(msg: \"Oh no!\")) fut Raw procedures can also use checked exceptions: proc rawAsyncRaises(): Future[void] {.async: (raw: true, raises: [IOError]).} = let fut = newFuture[void]() assert not (compiles do: fut.fail((ref ValueError)(msg: \"uh-uh\"))) fut.fail((ref IOError)(msg: \"IO\")) fut","breadcrumbs":"async functions » Raw async procedures","id":"21","title":"Raw async procedures"},"22":{"body":"Callback/closure types are declared using the async annotation as usual: type MyCallback = proc(): Future[void] {.async.} proc runCallback(cb: MyCallback) {.async: (raises: []).} = try: await cb() except CatchableError: discard # handle errors as usual When calling a callback, it is important to remember that it may raise exceptions that need to be handled. Checked exceptions can be used to limit the exceptions that a callback can raise: type MyEasyCallback = proc(): Future[void] {.async: (raises: []).} proc runCallback(cb: MyEasyCallback) {.async: (raises: [])} = await cb() Found a bug? Edit this page on GitHub.","breadcrumbs":"async functions » Callbacks and closures","id":"22","title":"Callbacks and closures"},"23":{"body":"Exceptions Checked exceptions The Exception type Compatibility modes","breadcrumbs":"Errors and exceptions » Errors and exceptions","id":"23","title":"Errors and exceptions"},"24":{"body":"Exceptions inheriting from CatchableError interrupt execution of an async procedure. The exception is placed in the Future.error field while changing the status of the Future to Failed and callbacks are scheduled. When a future is read or awaited the exception is re-raised, traversing the async execution chain until handled. proc p1() {.async.} = await sleepAsync(1.seconds) raise newException(ValueError, \"ValueError inherits from CatchableError\") proc p2() {.async.} = await sleepAsync(1.seconds) proc p3() {.async.} = let fut1 = p1() fut2 = p2() await fut1 echo \"unreachable code here\" await fut2 # `waitFor()` would call `Future.read()` unconditionally, which would raise the\n# exception in `Future.error`.\nlet fut3 = p3()\nwhile not(fut3.finished()): poll() echo \"fut3.state = \", fut3.state # \"Failed\"\nif fut3.failed(): echo \"p3() failed: \", fut3.error.name, \": \", fut3.error.msg # prints \"p3() failed: ValueError: ValueError inherits from CatchableError\" You can put the await in a try block, to deal with that exception sooner: proc p3() {.async.} = let fut1 = p1() fut2 = p2() try: await fut1 except CachableError: echo \"p1() failed: \", fut1.error.name, \": \", fut1.error.msg echo \"reachable code here\" await fut2 Because chronos ensures that all exceptions are re-routed to the Future, poll will not itself raise exceptions. poll may still panic / raise Defect if such are raised in user code due to undefined behavior.","breadcrumbs":"Errors and exceptions » Exceptions","id":"24","title":"Exceptions"},"25":{"body":"By specifying a raises list to an async procedure, you can check which exceptions can be raised by it: proc p1(): Future[void] {.async: (raises: [IOError]).} = assert not (compiles do: raise newException(ValueError, \"uh-uh\")) raise newException(IOError, \"works\") # Or any child of IOError proc p2(): Future[void] {.async, (raises: [IOError]).} = await p1() # Works, because await knows that p1 # can only raise IOError Under the hood, the return type of p1 will be rewritten to an internal type which will convey raises informations to await. Most `async` include `CancelledError` in the list of `raises`, indicating that\nthe operation they implement might get cancelled resulting in neither value nor\nerror! When using checked exceptions, the Future type is modified to include raises information - it can be constructed with the Raising helper: # Create a variable of the type that will be returned by a an async function\n# raising `[CancelledError]`:\nvar fut: Future[int].Raising([CancelledError]) `Raising` creates a specialization of `InternalRaisesFuture` type - as the name\nsuggests, this is an internal type whose implementation details are likely to\nchange in future `chronos` versions.","breadcrumbs":"Errors and exceptions » Checked exceptions","id":"25","title":"Checked exceptions"},"26":{"body":"Exceptions deriving from Exception are not caught by default as these may include Defect and other forms undefined or uncatchable behavior. Because exception effect tracking is turned on for async functions, this may sometimes lead to compile errors around forward declarations, methods and closures as Nim conservatively asssumes that any Exception might be raised from those. Make sure to explicitly annotate these with {.raises.}: # Forward declarations need to explicitly include a raises list:\nproc myfunction() {.raises: [ValueError].} # ... as do `proc` types\ntype MyClosure = proc() {.raises: [ValueError].} proc myfunction() = raise (ref ValueError)(msg: \"Implementation here\") let closure: MyClosure = myfunction","breadcrumbs":"Errors and exceptions » The Exception type","id":"26","title":"The Exception type"},"27":{"body":"Individual functions. For compatibility, async functions can be instructed to handle Exception as well, specifying handleException: true. Any Exception that is not a Defect and not a CatchableError will then be caught and remapped to AsyncExceptionError: proc raiseException() {.async: (handleException: true, raises: [AsyncExceptionError]).} = raise (ref Exception)(msg: \"Raising Exception is UB\") proc callRaiseException() {.async: (raises: []).} = try: await raiseException() except AsyncExceptionError as exc: # The original Exception is available from the `parent` field echo exc.parent.msg Global flag. This mode can be enabled globally with -d:chronosHandleException as a help when porting code to chronos. The behavior in this case will be that: old-style functions annotated with plain async will behave as if they had been annotated with async: (handleException: true). This is functionally equivalent to async: (handleException: true, raises: [CatchableError]) and will, as before, remap any Exception that is not Defect into AsyncExceptionError, while also allowing any CatchableError (including AsyncExceptionError) to get through without compilation errors. New-style functions with async: (raises: [...]) annotations or their own handleException annotations will not be affected. The rationale here is to allow one to incrementally introduce exception annotations and get compiler feedback while not requiring that every bit of legacy code is updated at once. This should be used sparingly and with care, however, as global configuration settings may interfere with libraries that use chronos leading to unexpected behavior. Found a bug? Edit this page on GitHub.","breadcrumbs":"Errors and exceptions » Compatibility modes","id":"27","title":"Compatibility modes"},"28":{"body":"While the cooperative async model offers an efficient model for dealing with many tasks that often are blocked on I/O, it is not suitable for long-running computations that would prevent concurrent tasks from progressing. Multithreading offers a way to offload heavy computations to be executed in parallel with the async work, or, in cases where a single event loop gets overloaded, to manage multiple event loops in parallel. For interaction between threads, the ThreadSignalPtr type (found in the (chronos/threadsync)(https://github.com/status-im/nim-chronos/blob/master/chronos/threadsync.nim) module) is used - both to wait for notifications coming from other threads and to notify other threads of progress from within an async procedure. import chronos, chronos/threadsync\nimport os type Context = object # Context allocated by `createShared` should contain no garbage-collected # types! signal: ThreadSignalPtr value: int proc myThread(ctx: ptr Context) {.thread.} = echo \"Doing some work in a thread\" sleep(3000) ctx.value = 42 echo \"Done, firing the signal\" discard ctx.signal.fireSync().expect(\"correctly initialized signal should not fail\") proc main() {.async.} = let signal = ThreadSignalPtr.new().expect(\"free file descriptor for signal\") context = createShared(Context) context.signal = signal var thread: Thread[ptr Context] echo \"Starting thread\" createThread(thread, myThread, context) await signal.wait() echo \"Work done: \", context.value joinThread(thread) signal.close().expect(\"closing once works\") deallocShared(context) waitFor main() Found a bug? Edit this page on GitHub.","breadcrumbs":"Threads » Threads","id":"28","title":"Threads"},"29":{"body":"","breadcrumbs":"Tips, tricks and best practices » Tips, tricks and best practices","id":"29","title":"Tips, tricks and best practices"},"3":{"body":"This guide covers basic usage of chronos - for details, see the API reference . Found a bug? Edit this page on GitHub.","breadcrumbs":"Introduction » API documentation","id":"3","title":"API documentation"},"30":{"body":"To prevent a single task from taking too long, withTimeout can be used: ## Simple timeouts\nimport chronos proc longTask {.async.} = try: await sleepAsync(10.minutes) except CancelledError as exc: echo \"Long task was cancelled!\" raise exc # Propagate cancellation to the next operation proc simpleTimeout() {.async.} = let task = longTask() # Start a task but don't `await` it if not await task.withTimeout(1.seconds): echo \"Timeout reached - withTimeout should have cancelled the task\" else: echo \"Task completed\" waitFor simpleTimeout() When several tasks should share a single timeout, a common timer can be created with sleepAsync: ## Single timeout for several operations\nimport chronos proc shortTask {.async.} = try: await sleepAsync(1.seconds) except CancelledError as exc: echo \"Short task was cancelled!\" raise exc # Propagate cancellation to the next operation proc composedTimeout() {.async.} = let # Common timout for several sub-tasks timeout = sleepAsync(10.seconds) while not timeout.finished(): let task = shortTask() # Start a task but don't `await` it if (await race(task, timeout)) == task: echo \"Ran one more task\" else: # This cancellation may or may not happen as task might have finished # right at the timeout! task.cancelSoon() waitFor composedTimeout()","breadcrumbs":"Tips, tricks and best practices » Timeouts","id":"30","title":"Timeouts"},"31":{"body":"When calling an asynchronous procedure without await, the operation is started but its result is not processed until corresponding Future is read. It is therefore important to never discard futures directly - instead, one can discard the result of awaiting the future or use asyncSpawn to monitor the outcome of the future as if it were running in a separate thread. Similar to threads, tasks managed by asyncSpawn may causes the application to crash if any exceptions leak out of it - use checked exceptions to avoid this problem. ## The peculiarities of `discard` in `async` procedures\nimport chronos proc failingOperation() {.async.} = echo \"Raising!\" raise (ref ValueError)(msg: \"My error\") proc myApp() {.async.} = # This style of discard causes the `ValueError` to be discarded, hiding the # failure of the operation - avoid! discard failingOperation() proc runAsTask(fut: Future[void]): Future[void] {.async: (raises: []).} = # runAsTask uses `raises: []` to ensure at compile-time that no exceptions # escape it! try: await fut except CatchableError as exc: echo \"The task failed! \", exc.msg # asyncSpawn ensures that errors don't leak unnoticed from tasks without # blocking: asyncSpawn runAsTask(failingOperation()) # If we didn't catch the exception with `runAsTask`, the program will crash: asyncSpawn failingOperation() waitFor myApp() Found a bug? Edit this page on GitHub.","breadcrumbs":"Tips, tricks and best practices » discard","id":"31","title":"discard"},"32":{"body":"Chronos v3 asyncdispatch Supporting multiple backends Thanks to its macro support, Nim allows async/await to be implemented in libraries with only minimal support from the language - as such, multiple async libraries exist, including chronos and asyncdispatch, and more may come to be developed in the futures.","breadcrumbs":"Porting code to chronos » Porting code to chronos v4","id":"32","title":"Porting code to chronos v4"},"33":{"body":"Chronos v4 introduces new features for IPv6, exception effects, a stand-alone Future type as well as several other changes - when upgrading from chronos v3, here are several things to consider: Exception handling is now strict by default - see the error handling chapter for how to deal with raises effects AsyncEventBus was removed - use AsyncEventQueue instead Future.value and Future.error panic when accessed in the wrong state Future.read and Future.readError raise FutureError instead of ValueError when accessed in the wrong state","breadcrumbs":"Porting code to chronos » Chronos v3","id":"33","title":"Chronos v3"},"34":{"body":"Code written for asyncdispatch and chronos looks similar but there are several differences to be aware of: chronos has its own dispatch loop - you can typically not mix chronos and asyncdispatch in the same thread import chronos instead of import asyncdispatch cleanup is important - make sure to use closeWait to release any resources you're using or file descriptor and other leaks will ensue cancellation support means that CancelledError may be raised from most {.async.} functions Calling yield directly in tasks is not supported - instead, use awaitne. asyncSpawn is used instead of asyncCheck - note that exceptions raised in tasks that are asyncSpawn:ed cause panic","breadcrumbs":"Porting code to chronos » asyncdispatch","id":"34","title":"asyncdispatch"},"35":{"body":"Libraries built on top of async/await may wish to support multiple async backends - the best way to do so is to create separate modules for each backend that may be imported side-by-side - see nim-metrics for an example. An alternative way is to select backend using a global compile flag - this method makes it diffucult to compose applications that use both backends as may happen with transitive dependencies, but may be appropriate in some cases - libraries choosing this path should call the flag asyncBackend, allowing applications to choose the backend with -d:asyncBackend=. Known async backends include: chronos - this library (-d:asyncBackend=chronos) asyncdispatch the standard library asyncdispatch module (-d:asyncBackend=asyncdispatch) none - -d:asyncBackend=none - disable async support completely none can be used when a library supports both a synchronous and asynchronous API, to disable the latter. Found a bug? Edit this page on GitHub.","breadcrumbs":"Porting code to chronos » Supporting multiple backends","id":"35","title":"Supporting multiple backends"},"36":{"body":"Chronos provides a powerful mechanism for customizing HTTP request handlers via middlewares. A middleware is a coroutine that can modify, block or filter HTTP request. Single HTTP server could support unlimited number of middlewares, but you need to consider that each request in worst case could go through all the middlewares, and therefore a huge number of middlewares can have a significant impact on HTTP server performance. Order of middlewares is also important: right after HTTP server has received request, it will be sent to the first middleware in list, and each middleware will be responsible for passing control to other middlewares. Therefore, when building a list, it would be a good idea to place the request handlers at the end of the list, while keeping the middleware that could block or modify the request at the beginning of the list. Middleware could also modify HTTP server request, and these changes will be visible to all handlers (either middlewares or the original request handler). This can be done using the following helpers: proc updateRequest*(request: HttpRequestRef, scheme: string, meth: HttpMethod, version: HttpVersion, requestUri: string, headers: HttpTable): HttpResultMessage[void] proc updateRequest*(request: HttpRequestRef, meth: HttpMethod, requestUri: string, headers: HttpTable): HttpResultMessage[void] proc updateRequest*(request: HttpRequestRef, requestUri: string, headers: HttpTable): HttpResultMessage[void] proc updateRequest*(request: HttpRequestRef, requestUri: string): HttpResultMessage[void] proc updateRequest*(request: HttpRequestRef, headers: HttpTable): HttpResultMessage[void] As you can see all the HTTP request parameters could be modified: request method, version, request path and request headers. Middleware could also use helpers to obtain more information about remote and local addresses of request's connection (this could be helpful when you need to do some IP address filtering). proc remote*(request: HttpRequestRef): Opt[TransportAddress] ## Returns remote address of HTTP request's connection. proc local*(request: HttpRequestRef): Opt[TransportAddress] = ## Returns local address of HTTP request's connection. Every middleware is the coroutine which looks like this: proc middlewareHandler( middleware: HttpServerMiddlewareRef, reqfence: RequestFence, nextHandler: HttpProcessCallback2 ): Future[HttpResponseRef] {.async: (raises: [CancelledError]).} = Where middleware argument is the object which could hold some specific values, reqfence is HTTP request which is enclosed with HTTP server error information and nextHandler is reference to next request handler, it could be either middleware handler or the original request processing callback handler. await nextHandler(reqfence) You should perform await for the response from the nextHandler(reqfence). Usually you should call next handler when you dont want to handle request or you dont know how to handle it, for example: proc middlewareHandler( middleware: HttpServerMiddlewareRef, reqfence: RequestFence, nextHandler: HttpProcessCallback2 ): Future[HttpResponseRef] {.async: (raises: [CancelledError]).} = if reqfence.isErr(): # We dont know or do not want to handle failed requests, so we call next handler. return await nextHandler(reqfence) let request = reqfence.get() if request.uri.path == \"/path/we/able/to/respond\": try: # Sending some response. await request.respond(Http200, \"TEST\") except HttpWriteError as exc: # We could also return default response for exception or other types of error. defaultResponse(exc) elif request.uri.path == \"/path/for/rewrite\": # We going to modify request object for this request, next handler will receive it with different request path. let res = request.updateRequest(\"/path/to/new/location\") if res.isErr(): return defaultResponse(res.error) await nextHandler(reqfence) elif request.uri.path == \"/restricted/path\": if request.remote().isNone(): # We can't obtain remote address, so we force HTTP server to respond with `401 Unauthorized` status code. return codeResponse(Http401) if $(request.remote().get()).startsWith(\"127.0.0.1\"): # Remote peer's address starts with \"127.0.0.1\", sending proper response. await request.respond(Http200, \"AUTHORIZED\") else: # Force HTTP server to respond with `403 Forbidden` status code. codeResponse(Http403) elif request.uri.path == \"/blackhole\": # Force HTTP server to drop connection with remote peer. dropResponse() else: # All other requests should be handled by somebody else. await nextHandler(reqfence) Found a bug? Edit this page on GitHub.","breadcrumbs":"HTTP server middleware » HTTP server middleware","id":"36","title":"HTTP server middleware"},"37":{"body":"Found a bug? Edit this page on GitHub.","breadcrumbs":"Updating this book » Updating this book","id":"37","title":"Updating this book"},"4":{"body":"Examples are available in the docs/examples/ folder.","breadcrumbs":"Examples » Examples","id":"4","title":"Examples"},"5":{"body":"cancellation - Cancellation primer timeoutsimple - Simple timeouts timeoutcomposed - Shared timeout of multiple tasks","breadcrumbs":"Examples » Basic concepts","id":"5","title":"Basic concepts"},"6":{"body":"signalling - Cross-thread signalling","breadcrumbs":"Examples » Threads","id":"6","title":"Threads"},"7":{"body":"tcpserver - Simple TCP/IP v4/v6 echo server","breadcrumbs":"Examples » TCP","id":"7","title":"TCP"},"8":{"body":"httpget - Downloading a web page using the http client twogets - Download two pages concurrently middleware - Deploy multiple HTTP server middlewares Found a bug? Edit this page on GitHub.","breadcrumbs":"Examples » HTTP","id":"8","title":"HTTP"},"9":{"body":"Async/await is a programming model that relies on cooperative multitasking to coordinate the concurrent execution of procedures, using event notifications from the operating system or other treads to resume execution. Code execution happens in a loop that alternates between making progress on tasks and handling events. The dispatcher The Future type The poll call Cancellation Compile-time configuration","breadcrumbs":"Core concepts » Concepts","id":"9","title":"Concepts"}},"length":38,"save":true},"fields":["title","body","breadcrumbs"],"index":{"body":{"root":{"1":{"0":{"df":1,"docs":{"15":{"tf":1.0}}},"2":{"7":{".":{"0":{".":{"0":{".":{"1":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"0":{"1":{"df":1,"docs":{"36":{"tf":1.0}}},"3":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"a":{"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"20":{"tf":1.0},"33":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":1,"docs":{"20":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"d":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}}},"d":{"df":1,"docs":{"1":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"36":{"tf":2.449489742783178}}}}}}},"df":2,"docs":{"11":{"tf":1.0},"21":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{},"w":{"df":7,"docs":{"12":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"27":{"tf":1.4142135623730951},"32":{"tf":1.0},"35":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"33":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"13":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":3,"docs":{"13":{"tf":1.0},"35":{"tf":1.0},"9":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}},"n":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":3,"docs":{"22":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":2.23606797749979}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"11":{"tf":1.0},"13":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"i":{"df":2,"docs":{"3":{"tf":1.4142135623730951},"35":{"tf":1.0}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":4,"docs":{"12":{"tf":1.4142135623730951},"13":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"35":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"26":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":3,"docs":{"13":{"tf":1.0},"21":{"tf":1.0},"25":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"26":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"1":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"n":{"c":{"/":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.0},"32":{"tf":1.0},"35":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"35":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":3,"docs":{"32":{"tf":1.4142135623730951},"34":{"tf":2.0},"35":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":23,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.7320508075688772},"12":{"tf":1.4142135623730951},"13":{"tf":2.23606797749979},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"18":{"tf":2.6457513110645907},"19":{"tf":1.7320508075688772},"20":{"tf":2.8284271247461903},"21":{"tf":2.6457513110645907},"22":{"tf":2.23606797749979},"24":{"tf":2.449489742783178},"25":{"tf":2.23606797749979},"26":{"tf":1.0},"27":{"tf":2.6457513110645907},"28":{"tf":2.0},"30":{"tf":2.0},"31":{"tf":2.0},"32":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.7320508075688772},"36":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"u":{"df":1,"docs":{"33":{"tf":1.0}}}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}}}},"x":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"27":{"tf":2.23606797749979}}}}}}}}}}}}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":5,"docs":{"0":{"tf":1.0},"12":{"tf":1.0},"18":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{":":{"df":1,"docs":{"34":{"tf":1.0}}},"df":2,"docs":{"31":{"tf":2.23606797749979},"34":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"11":{"tf":1.0},"27":{"tf":1.0},"4":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"31":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{":":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}},"df":17,"docs":{"1":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.4142135623730951},"13":{"tf":2.449489742783178},"15":{"tf":1.7320508075688772},"16":{"tf":2.0},"18":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":3.3166247903554},"22":{"tf":1.4142135623730951},"24":{"tf":2.8284271247461903},"25":{"tf":1.7320508075688772},"27":{"tf":1.0},"28":{"tf":1.0},"30":{"tf":2.449489742783178},"31":{"tf":1.7320508075688772},"36":{"tf":2.6457513110645907}},"n":{"df":1,"docs":{"34":{"tf":1.0}}}}},"r":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":3,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"20":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"2":{"tf":1.0},"32":{"tf":1.0},"35":{"tf":2.6457513110645907}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"3":{"tf":1.0},"5":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"17":{"tf":1.0}}}}},"df":2,"docs":{"13":{"tf":1.0},"16":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"13":{"tf":1.0},"20":{"tf":1.0},"27":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"v":{"df":1,"docs":{"27":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"24":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"29":{"tf":1.0},"35":{"tf":1.0}}}},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"14":{"tf":1.4142135623730951},"28":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"12":{"tf":1.0},"27":{"tf":1.0}}}},"l":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":4,"docs":{"24":{"tf":1.0},"28":{"tf":1.0},"31":{"tf":1.0},"36":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"o":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"21":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"37":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":6,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"16":{"tf":1.0},"20":{"tf":1.4142135623730951},"28":{"tf":1.0},"35":{"tf":1.4142135623730951}}}},"x":{"df":1,"docs":{"0":{"tf":1.0}}}},"s":{"d":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"g":{"df":10,"docs":{"17":{"tf":1.0},"22":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"3":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"8":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":1,"docs":{"35":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{".":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}}}}}}},"c":{"1":{"df":1,"docs":{"13":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"13":{"tf":1.4142135623730951}}},"a":{"c":{"df":0,"docs":{},"h":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"/":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"22":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":6,"docs":{"11":{"tf":1.4142135623730951},"12":{"tf":1.0},"18":{"tf":1.0},"22":{"tf":1.7320508075688772},"24":{"tf":1.0},"36":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"12":{"tf":2.23606797749979},"14":{"tf":1.0},"15":{"tf":1.0},"20":{"tf":1.0},"22":{"tf":1.0},"24":{"tf":1.0},"31":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"9":{"tf":1.0}},"e":{"df":1,"docs":{"14":{"tf":1.4142135623730951}},"r":{"df":3,"docs":{"13":{"tf":1.0},"14":{"tf":2.0},"15":{"tf":1.4142135623730951}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"df":1,"docs":{"13":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":12,"docs":{"0":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":4.123105625617661},"14":{"tf":1.4142135623730951},"15":{"tf":2.449489742783178},"16":{"tf":2.23606797749979},"20":{"tf":1.0},"25":{"tf":1.0},"30":{"tf":2.449489742783178},"34":{"tf":1.0},"5":{"tf":1.4142135623730951},"9":{"tf":1.0}},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":5,"docs":{"13":{"tf":2.23606797749979},"25":{"tf":1.4142135623730951},"30":{"tf":1.4142135623730951},"34":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"27":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":5,"docs":{"15":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"22":{"tf":1.0},"24":{"tf":1.7320508075688772},"27":{"tf":1.7320508075688772},"31":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":3,"docs":{"13":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.0}}}}},"s":{"df":2,"docs":{"31":{"tf":1.4142135623730951},"34":{"tf":1.0}}}}},"b":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}}}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"13":{"tf":1.0},"24":{"tf":1.0}}}},"n":{"df":0,"docs":{},"g":{"df":5,"docs":{"17":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"33":{"tf":1.0},"36":{"tf":1.0}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"14":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"33":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":6,"docs":{"17":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.7320508075688772},"31":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"35":{"tf":1.4142135623730951}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":18,"docs":{"0":{"tf":1.0},"1":{"tf":1.7320508075688772},"13":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"18":{"tf":1.0},"21":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"27":{"tf":1.4142135623730951},"28":{"tf":1.0},"3":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0},"32":{"tf":1.7320508075688772},"33":{"tf":1.7320508075688772},"34":{"tf":2.0},"35":{"tf":1.0},"36":{"tf":1.0}},"s":{"/":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"b":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"28":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{")":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{"/":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"28":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"34":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"0":{"tf":1.0},"8":{"tf":1.0}}}}}},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"20":{"tf":1.0}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"1":{"tf":1.0}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"15":{"tf":1.0},"34":{"tf":1.0}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"r":{"df":5,"docs":{"0":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"22":{"tf":1.0},"26":{"tf":1.4142135623730951}}}}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":7,"docs":{"17":{"tf":1.0},"24":{"tf":1.7320508075688772},"27":{"tf":1.4142135623730951},"32":{"tf":1.0},"34":{"tf":1.0},"36":{"tf":1.4142135623730951},"9":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"4":{"0":{"1":{"df":1,"docs":{"36":{"tf":1.0}}},"3":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"e":{"df":2,"docs":{"28":{"tf":1.0},"32":{"tf":1.0}}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"15":{"tf":1.0},"30":{"tf":1.4142135623730951}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"23":{"tf":1.0},"27":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":8,"docs":{"17":{"tf":1.7320508075688772},"21":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.4142135623730951},"31":{"tf":1.0},"35":{"tf":1.0},"9":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":7,"docs":{"13":{"tf":1.4142135623730951},"14":{"tf":2.0},"15":{"tf":1.4142135623730951},"18":{"tf":1.0},"20":{"tf":1.4142135623730951},"30":{"tf":1.0},"35":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"15":{"tf":1.0},"35":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}}}}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.4142135623730951}}}}}},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"5":{"tf":1.0},"9":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":6,"docs":{"10":{"tf":1.0},"13":{"tf":2.0},"20":{"tf":1.0},"28":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"17":{"tf":1.4142135623730951},"27":{"tf":1.0},"9":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":2.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":1,"docs":{"26":{"tf":1.0}}}}},"i":{"d":{"df":2,"docs":{"33":{"tf":1.0},"36":{"tf":1.0}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"14":{"tf":1.0}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"0":{"tf":1.0},"17":{"tf":1.0},"28":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}}}},"x":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"28":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"28":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"28":{"tf":2.449489742783178}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"11":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":5,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"20":{"tf":1.0},"36":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}}}},"y":{"df":1,"docs":{"25":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"18":{"tf":1.0},"28":{"tf":1.0},"9":{"tf":1.0}}}}},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"31":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"3":{"tf":1.0}}}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"31":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":8,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"14":{"tf":1.4142135623730951},"16":{"tf":1.0},"21":{"tf":1.0},"25":{"tf":1.4142135623730951},"30":{"tf":1.0},"35":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"28":{"tf":1.0}},"e":{"d":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"6":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"28":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"28":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}},"d":{":":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"=":{"<":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"35":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"35":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"35":{"tf":1.0}}}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"35":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"11":{"tf":1.0},"24":{"tf":1.0},"28":{"tf":1.0},"33":{"tf":1.0}},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"17":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"21":{"tf":1.0},"22":{"tf":1.0},"26":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"(":{"1":{"0":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"15":{"tf":1.7320508075688772}}}}}}}}},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":4,"docs":{"17":{"tf":1.0},"26":{"tf":1.0},"33":{"tf":1.0},"36":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"c":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"24":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"18":{"tf":1.0},"35":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":1,"docs":{"8":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"26":{"tf":1.0}}}}},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"12":{"tf":1.0},"28":{"tf":1.0},"34":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"25":{"tf":1.0},"3":{"tf":1.0}}}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"32":{"tf":1.0}}}}}}}},"i":{"d":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"2":{"tf":1.0},"34":{"tf":1.0},"36":{"tf":1.0}}}},"u":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"35":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":4,"docs":{"12":{"tf":1.4142135623730951},"21":{"tf":1.0},"31":{"tf":1.0},"34":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"15":{"tf":1.0},"35":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"22":{"tf":1.0},"28":{"tf":1.0},"31":{"tf":2.6457513110645907}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":8,"docs":{"0":{"tf":1.0},"10":{"tf":2.0},"11":{"tf":1.4142135623730951},"12":{"tf":1.0},"13":{"tf":1.0},"20":{"tf":1.4142135623730951},"34":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"o":{"c":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"4":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}}}}}},"df":1,"docs":{"28":{"tf":1.0}},"n":{"'":{"df":0,"docs":{},"t":{"df":4,"docs":{"13":{"tf":1.0},"16":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":4,"docs":{"10":{"tf":1.0},"12":{"tf":1.0},"28":{"tf":1.4142135623730951},"36":{"tf":1.0}}},"t":{"df":1,"docs":{"36":{"tf":1.7320508075688772}}}},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":2,"docs":{"13":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"36":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}}}}}},"u":{"df":0,"docs":{},"e":{"df":2,"docs":{"13":{"tf":1.0},"24":{"tf":1.0}}},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":4,"docs":{"10":{"tf":1.0},"12":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":11,"docs":{"1":{"tf":1.0},"12":{"tf":1.7320508075688772},"13":{"tf":2.23606797749979},"16":{"tf":1.4142135623730951},"19":{"tf":1.0},"24":{"tf":2.23606797749979},"27":{"tf":1.0},"28":{"tf":2.0},"30":{"tf":2.23606797749979},"31":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":10,"docs":{"17":{"tf":1.0},"22":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"3":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.0},"13":{"tf":1.0},"26":{"tf":1.0},"33":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"i":{"df":2,"docs":{"0":{"tf":1.0},"28":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"36":{"tf":1.7320508075688772}}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"13":{"tf":1.0}}}}},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"17":{"tf":1.0},"27":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":2,"docs":{"11":{"tf":1.0},"20":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"36":{"tf":1.0}}}}},"o":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}}}}},"d":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":1,"docs":{"34":{"tf":1.0}},"r":{"df":3,"docs":{"10":{"tf":1.0},"24":{"tf":1.0},"31":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"2":{"tf":1.0}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"20":{"tf":1.0},"27":{"tf":1.0}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":8,"docs":{"22":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.0},"31":{"tf":1.4142135623730951},"33":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}}},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"c":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"13":{"tf":1.0},"15":{"tf":1.7320508075688772}},"t":{"df":6,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"12":{"tf":1.4142135623730951},"13":{"tf":1.0},"28":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":6,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"13":{"tf":2.0},"35":{"tf":1.0},"36":{"tf":1.0},"4":{"tf":1.4142135623730951}}}}}},"c":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"31":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":5,"docs":{"13":{"tf":1.4142135623730951},"27":{"tf":1.0},"30":{"tf":2.0},"31":{"tf":1.0},"36":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}},"p":{"df":0,"docs":{},"t":{"df":15,"docs":{"0":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":1.7320508075688772},"21":{"tf":1.7320508075688772},"22":{"tf":2.0},"23":{"tf":2.0},"24":{"tf":3.0},"25":{"tf":1.7320508075688772},"26":{"tf":2.23606797749979},"27":{"tf":2.6457513110645907},"30":{"tf":1.4142135623730951},"31":{"tf":2.23606797749979},"33":{"tf":1.4142135623730951},"34":{"tf":1.0},"36":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{")":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":6,"docs":{"11":{"tf":1.4142135623730951},"18":{"tf":1.0},"20":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951},"28":{"tf":1.0},"9":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"17":{"tf":1.0},"32":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":8,"docs":{"11":{"tf":1.0},"13":{"tf":1.7320508075688772},"14":{"tf":1.4142135623730951},"20":{"tf":1.0},"24":{"tf":2.23606797749979},"28":{"tf":1.0},"31":{"tf":1.0},"36":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.7320508075688772}}}}}}}}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"0":{"tf":1.4142135623730951},"33":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"d":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"24":{"tf":1.0},"27":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"df":4,"docs":{"1":{"tf":1.0},"12":{"tf":1.0},"28":{"tf":1.0},"34":{"tf":1.0}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"12":{"tf":1.0}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":6,"docs":{"11":{"tf":1.4142135623730951},"13":{"tf":2.23606797749979},"14":{"tf":1.0},"15":{"tf":1.0},"20":{"tf":1.0},"30":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"28":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}},"l":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"27":{"tf":1.0},"35":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"4":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"13":{"tf":1.4142135623730951},"36":{"tf":1.0}}}}}},"r":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":1,"docs":{"36":{"tf":1.7320508075688772}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"12":{"tf":1.0}}}},"m":{"df":1,"docs":{"26":{"tf":1.0}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"df":10,"docs":{"17":{"tf":1.0},"22":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.4142135623730951},"3":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":1,"docs":{"13":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":5,"docs":{"21":{"tf":1.4142135623730951},"25":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":2.23606797749979},"34":{"tf":1.0}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.0}}}}}}},"t":{".":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"21":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"(":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"21":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"1":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"24":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":2,"docs":{"20":{"tf":1.4142135623730951},"24":{"tf":2.0}}},"2":{".":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"16":{"tf":1.0},"20":{"tf":1.4142135623730951},"24":{"tf":2.0}}},"3":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"24":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"24":{"tf":1.0}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":1,"docs":{"24":{"tf":1.0}}},"df":5,"docs":{"13":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"21":{"tf":2.449489742783178},"25":{"tf":1.0},"31":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":18,"docs":{"10":{"tf":1.0},"11":{"tf":2.23606797749979},"12":{"tf":1.0},"13":{"tf":2.8284271247461903},"14":{"tf":2.449489742783178},"15":{"tf":1.4142135623730951},"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":2.0},"21":{"tf":1.4142135623730951},"24":{"tf":1.7320508075688772},"25":{"tf":1.4142135623730951},"31":{"tf":2.0},"32":{"tf":1.0},"33":{"tf":1.0},"9":{"tf":1.0}},"e":{".":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"24":{"tf":1.4142135623730951},"33":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":3,"docs":{"20":{"tf":1.0},"24":{"tf":1.0},"33":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"33":{"tf":1.0}}}}},"df":0,"docs":{}}},"2":{".":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}}},"df":1,"docs":{"13":{"tf":1.4142135623730951}}},"[":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}}}}}}}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"]":{".":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"[":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"1":{"tf":1.0}}}},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":6,"docs":{"16":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.7320508075688772},"22":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}}}}}}},"g":{"a":{"df":0,"docs":{},"r":{"b":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.0}}}}},"t":{"df":2,"docs":{"13":{"tf":1.4142135623730951},"28":{"tf":1.0}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{"df":10,"docs":{"17":{"tf":1.0},"22":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"3":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"11":{"tf":1.0},"20":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"b":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"27":{"tf":1.7320508075688772},"35":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"df":2,"docs":{"21":{"tf":1.0},"36":{"tf":1.4142135623730951}},"o":{"d":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"12":{"tf":1.0}}}}},"df":0,"docs":{}},"u":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":2,"docs":{"13":{"tf":1.0},"20":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"10":{"tf":1.0}},"l":{"df":9,"docs":{"10":{"tf":1.0},"12":{"tf":1.0},"14":{"tf":1.0},"22":{"tf":1.4142135623730951},"24":{"tf":1.0},"27":{"tf":1.0},"33":{"tf":1.4142135623730951},"36":{"tf":2.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":2.23606797749979}}}}}},"df":0,"docs":{}}},"r":{"df":2,"docs":{"10":{"tf":1.0},"36":{"tf":3.1622776601683795}}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":5,"docs":{"13":{"tf":1.0},"16":{"tf":1.0},"30":{"tf":1.0},"35":{"tf":1.0},"9":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":2.23606797749979}}}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":1,"docs":{"28":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":2,"docs":{"27":{"tf":1.0},"36":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"25":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}}},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"13":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"26":{"tf":1.0},"27":{"tf":1.0},"33":{"tf":1.0}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}},"o":{"d":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":5,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"13":{"tf":1.0},"36":{"tf":3.872983346207417},"8":{"tf":1.7320508075688772}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{"/":{"/":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"k":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"?":{"df":0,"docs":{},"q":{"=":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"w":{"df":0,"docs":{},"w":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"?":{"df":0,"docs":{},"q":{"=":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}}},"df":2,"docs":{"13":{"tf":1.0},"8":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"2":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"36":{"tf":2.6457513110645907}}}}}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"[":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"36":{"tf":2.23606797749979}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}}},"s":{":":{"/":{"/":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"d":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":1,"docs":{"1":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":2.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}}}}}}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":1,"docs":{"36":{"tf":1.0}}}}}},"i":{"/":{"df":0,"docs":{},"o":{"df":3,"docs":{"0":{"tf":1.0},"18":{"tf":1.0},"28":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"a":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":2,"docs":{"14":{"tf":1.0},"16":{"tf":1.0}}},"m":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"1":{"tf":1.0},"28":{"tf":1.0}}}}}},"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"0":{"tf":1.0},"16":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"26":{"tf":1.0},"32":{"tf":1.0}}}}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"21":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":9,"docs":{"1":{"tf":1.0},"13":{"tf":1.7320508075688772},"22":{"tf":1.0},"28":{"tf":1.4142135623730951},"30":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951},"34":{"tf":1.7320508075688772},"35":{"tf":1.0},"36":{"tf":1.0}}}}}}},"n":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":7,"docs":{"0":{"tf":1.0},"15":{"tf":1.0},"25":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"27":{"tf":1.0},"32":{"tf":1.0},"35":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"13":{"tf":1.0}}},"i":{"c":{"df":2,"docs":{"18":{"tf":1.0},"25":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"12":{"tf":1.0}}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"u":{"df":2,"docs":{"15":{"tf":1.0},"27":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"17":{"tf":1.0},"25":{"tf":1.4142135623730951},"36":{"tf":1.4142135623730951}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.7320508075688772}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":4,"docs":{"13":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.0},"28":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"11":{"tf":1.0},"20":{"tf":1.0}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":1.7320508075688772}}},"n":{"c":{"df":3,"docs":{"10":{"tf":1.0},"13":{"tf":1.0},"20":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"d":{"df":4,"docs":{"21":{"tf":1.0},"31":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":1,"docs":{"28":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"18":{"tf":1.0},"21":{"tf":1.0},"28":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"27":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"25":{"tf":1.4142135623730951}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":2,"docs":{"27":{"tf":1.0},"33":{"tf":1.0}},"t":{"df":1,"docs":{"0":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"c":{"df":0,"docs":{},"p":{"df":1,"docs":{"2":{"tf":1.0}}}},"df":1,"docs":{"21":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{")":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"21":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":2,"docs":{"21":{"tf":1.0},"25":{"tf":2.0}}}}}}}},"p":{"df":1,"docs":{"36":{"tf":1.0}},"v":{"6":{"df":1,"docs":{"33":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}}}}}},"t":{"'":{"df":2,"docs":{"10":{"tf":1.0},"20":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"14":{"tf":1.0}}},"r":{"df":2,"docs":{"0":{"tf":1.0},"19":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"16":{"tf":1.7320508075688772}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":3,"docs":{"12":{"tf":1.0},"16":{"tf":1.0},"36":{"tf":1.0}}}},"y":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"18":{"tf":1.0},"20":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"25":{"tf":1.0},"36":{"tf":1.4142135623730951}},"n":{"df":2,"docs":{"11":{"tf":1.0},"35":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"32":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"35":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":3,"docs":{"14":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.0}}},"df":0,"docs":{},"k":{"df":2,"docs":{"31":{"tf":1.4142135623730951},"34":{"tf":1.0}}}},"df":0,"docs":{},"g":{"a":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"0":{"tf":1.0},"27":{"tf":1.0},"32":{"tf":1.4142135623730951},"35":{"tf":2.23606797749979}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"22":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"x":{"df":1,"docs":{"2":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"25":{"tf":1.4142135623730951},"26":{"tf":1.0},"36":{"tf":2.0}}}}},"o":{"c":{"a":{"df":0,"docs":{},"l":{"*":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"36":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"k":{"df":1,"docs":{"0":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"28":{"tf":1.0},"30":{"tf":1.4142135623730951}},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"k":{"df":2,"docs":{"34":{"tf":1.0},"36":{"tf":1.0}}},"p":{"df":6,"docs":{"10":{"tf":1.0},"12":{"tf":1.4142135623730951},"16":{"tf":1.0},"28":{"tf":1.4142135623730951},"34":{"tf":1.0},"9":{"tf":1.0}}}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":2,"docs":{"0":{"tf":1.0},"32":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"28":{"tf":1.4142135623730951}}}},"k":{"df":0,"docs":{},"e":{"df":6,"docs":{"10":{"tf":1.0},"13":{"tf":1.0},"26":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"9":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"28":{"tf":1.0},"31":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":2,"docs":{"20":{"tf":1.4142135623730951},"28":{"tf":1.0}}},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"18":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"11":{"tf":1.4142135623730951},"34":{"tf":1.0}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"36":{"tf":1.4142135623730951}},"o":{"d":{"df":4,"docs":{"19":{"tf":1.0},"26":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"35":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"d":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"36":{"tf":4.358898943540674},"8":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"32":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}},"x":{"df":1,"docs":{"34":{"tf":1.0}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":2,"docs":{"23":{"tf":1.0},"27":{"tf":1.4142135623730951}},"l":{"df":2,"docs":{"28":{"tf":1.4142135623730951},"9":{"tf":1.0}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":4,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"25":{"tf":1.0},"36":{"tf":2.23606797749979}}}}},"u":{"df":0,"docs":{},"l":{"df":3,"docs":{"17":{"tf":1.0},"28":{"tf":1.0},"35":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"16":{"tf":1.4142135623730951},"31":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":6,"docs":{"1":{"tf":1.0},"12":{"tf":1.0},"17":{"tf":1.0},"30":{"tf":1.0},"32":{"tf":1.0},"36":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"0":{"tf":1.0}},"p":{"df":0,"docs":{},"l":{"df":6,"docs":{"13":{"tf":1.0},"28":{"tf":1.0},"32":{"tf":1.4142135623730951},"35":{"tf":1.4142135623730951},"5":{"tf":1.0},"8":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"9":{"tf":1.0}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":2,"docs":{"20":{"tf":1.0},"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"20":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"y":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":2,"docs":{"12":{"tf":2.0},"31":{"tf":1.4142135623730951}}}}},"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"28":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"25":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"20":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"d":{"df":7,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"22":{"tf":1.0},"26":{"tf":1.0},"36":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"31":{"tf":1.0}}}}},"w":{"df":4,"docs":{"1":{"tf":1.0},"17":{"tf":1.0},"27":{"tf":1.0},"33":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"24":{"tf":1.0},"25":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"[":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"]":{"(":{"\"":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"21":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"21":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"30":{"tf":1.4142135623730951},"36":{"tf":2.0}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"f":{"df":1,"docs":{"36":{"tf":2.23606797749979}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":1.7320508075688772}}}},"df":4,"docs":{"0":{"tf":1.0},"26":{"tf":1.0},"32":{"tf":1.0},"35":{"tf":1.0}}}},"o":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}},"df":1,"docs":{"15":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"35":{"tf":1.4142135623730951}}}},"t":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"3":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"34":{"tf":1.0}}},"i":{"df":0,"docs":{},"f":{"df":2,"docs":{"28":{"tf":1.0},"9":{"tf":1.0}},"i":{"df":2,"docs":{"13":{"tf":1.0},"28":{"tf":1.0}}}}}},"w":{"df":3,"docs":{"13":{"tf":1.0},"16":{"tf":1.0},"33":{"tf":1.0}}}},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"28":{"tf":1.0},"36":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":2,"docs":{"14":{"tf":1.0},"16":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"12":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"12":{"tf":1.0},"28":{"tf":1.4142135623730951}}}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"h":{"df":1,"docs":{"21":{"tf":1.0}}},"l":{"d":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}},"n":{"c":{"df":2,"docs":{"27":{"tf":1.0},"28":{"tf":1.0}}},"df":7,"docs":{"10":{"tf":1.0},"13":{"tf":1.7320508075688772},"16":{"tf":1.0},"20":{"tf":1.0},"27":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"r":{"df":11,"docs":{"11":{"tf":1.7320508075688772},"12":{"tf":1.0},"13":{"tf":2.6457513110645907},"15":{"tf":1.7320508075688772},"16":{"tf":2.0},"18":{"tf":1.4142135623730951},"20":{"tf":1.4142135623730951},"25":{"tf":1.0},"30":{"tf":1.7320508075688772},"31":{"tf":1.4142135623730951},"9":{"tf":1.0}}}},"t":{"[":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"17":{"tf":1.4142135623730951},"2":{"tf":1.0}}}}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"13":{"tf":1.4142135623730951},"20":{"tf":1.0},"36":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"14":{"tf":1.0},"27":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}}}},"s":{"df":1,"docs":{"28":{"tf":1.0}},"x":{"df":1,"docs":{"2":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"11":{"tf":2.0},"13":{"tf":1.0},"31":{"tf":1.0}}}}},"df":2,"docs":{"0":{"tf":1.0},"31":{"tf":1.0}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"12":{"tf":1.0}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"14":{"tf":1.4142135623730951}}}}}}}}}}},"p":{"(":{")":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"19":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":3,"docs":{"20":{"tf":1.4142135623730951},"24":{"tf":2.0},"25":{"tf":2.0}}},"2":{"df":3,"docs":{"20":{"tf":1.4142135623730951},"24":{"tf":1.7320508075688772},"25":{"tf":1.0}}},"3":{"df":2,"docs":{"20":{"tf":1.4142135623730951},"24":{"tf":2.23606797749979}}},"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":12,"docs":{"1":{"tf":1.0},"13":{"tf":1.4142135623730951},"17":{"tf":1.0},"22":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"3":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"8":{"tf":1.7320508075688772}}}},"n":{"df":0,"docs":{},"i":{"c":{"df":4,"docs":{"14":{"tf":1.0},"24":{"tf":1.0},"33":{"tf":1.0},"34":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"a":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"13":{"tf":1.0},"28":{"tf":1.4142135623730951}}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"21":{"tf":1.0},"36":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"12":{"tf":1.0},"20":{"tf":1.0},"36":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"e":{"/":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":2,"docs":{"35":{"tf":1.0},"36":{"tf":1.4142135623730951}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"16":{"tf":1.0}}}}}}}},"df":1,"docs":{"19":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"36":{"tf":1.0}}},"df":1,"docs":{"36":{"tf":1.0}}}},"n":{"d":{"df":2,"docs":{"11":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"10":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":2,"docs":{"15":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}}}}},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":2,"docs":{"24":{"tf":1.0},"36":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"27":{"tf":1.0}}}},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":2,"docs":{"0":{"tf":1.0},"2":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"l":{"df":4,"docs":{"12":{"tf":2.23606797749979},"2":{"tf":1.7320508075688772},"24":{"tf":1.7320508075688772},"9":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"27":{"tf":1.0},"32":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"2":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"12":{"tf":1.0},"14":{"tf":1.0}}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"29":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"a":{"df":2,"docs":{"18":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"15":{"tf":1.0},"28":{"tf":1.0},"30":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"16":{"tf":1.0},"19":{"tf":1.0},"24":{"tf":1.0}}}}},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"31":{"tf":1.0}}}}}},"c":{"df":17,"docs":{"1":{"tf":1.0},"12":{"tf":1.4142135623730951},"13":{"tf":2.23606797749979},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"19":{"tf":1.0},"20":{"tf":2.0},"21":{"tf":1.7320508075688772},"22":{"tf":2.0},"24":{"tf":2.0},"25":{"tf":1.4142135623730951},"26":{"tf":2.0},"27":{"tf":1.4142135623730951},"28":{"tf":1.4142135623730951},"30":{"tf":2.0},"31":{"tf":1.7320508075688772},"36":{"tf":3.0}},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":13,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"14":{"tf":1.0},"16":{"tf":1.4142135623730951},"18":{"tf":2.23606797749979},"19":{"tf":1.0},"20":{"tf":2.0},"21":{"tf":1.7320508075688772},"24":{"tf":1.0},"25":{"tf":1.0},"28":{"tf":1.0},"31":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"0":{"tf":1.0},"12":{"tf":1.4142135623730951},"31":{"tf":1.0},"36":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"u":{"c":{"df":1,"docs":{"14":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"20":{"tf":1.0},"31":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"10":{"tf":1.4142135623730951},"28":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}}}},"p":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"30":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"0":{"tf":1.0},"36":{"tf":1.0}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"28":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"20":{"tf":1.0}}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"30":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":12,"docs":{"13":{"tf":2.449489742783178},"21":{"tf":1.7320508075688772},"22":{"tf":2.23606797749979},"24":{"tf":2.449489742783178},"25":{"tf":3.605551275463989},"26":{"tf":2.449489742783178},"27":{"tf":2.449489742783178},"30":{"tf":1.4142135623730951},"31":{"tf":2.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.4142135623730951},"36":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}},"n":{"df":1,"docs":{"30":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"12":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}}}}},"w":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"21":{"tf":1.0}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"21":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":2,"docs":{"18":{"tf":1.0},"21":{"tf":2.8284271247461903}},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"21":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":0,"docs":{}},"df":3,"docs":{"13":{"tf":1.4142135623730951},"15":{"tf":1.0},"30":{"tf":1.0}}}},"d":{"df":3,"docs":{"13":{"tf":1.0},"24":{"tf":1.0},"31":{"tf":1.0}},"i":{"df":2,"docs":{"10":{"tf":1.0},"12":{"tf":1.0}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"15":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}}},"df":3,"docs":{"13":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951},"36":{"tf":1.0}},"f":{"df":3,"docs":{"26":{"tf":1.0},"27":{"tf":1.0},"31":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"3":{"tf":1.0},"36":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":3,"docs":{"15":{"tf":1.0},"17":{"tf":1.0},"34":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":1,"docs":{"9":{"tf":1.0}}}},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":2.23606797749979}},"e":{"*":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"v":{"df":1,"docs":{"33":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}}}},"q":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"36":{"tf":1.7320508075688772}},"e":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"36":{"tf":1.7320508075688772}}},".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{")":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"(":{")":{")":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"(":{"\"":{"1":{"2":{"7":{".":{"0":{".":{"0":{".":{"1":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"2":{"0":{"0":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"\"":{"/":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"36":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":4,"docs":{"10":{"tf":1.0},"13":{"tf":2.0},"15":{"tf":1.4142135623730951},"36":{"tf":4.69041575982343}},"f":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"36":{"tf":2.0}}}}}}}},"i":{"df":0,"docs":{},"r":{"df":2,"docs":{"1":{"tf":1.0},"27":{"tf":1.0}}}}}},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":3,"docs":{"13":{"tf":1.0},"15":{"tf":1.0},"34":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":1,"docs":{"1":{"tf":1.0}},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}},"df":0,"docs":{},"s":{"df":3,"docs":{"1":{"tf":1.0},"14":{"tf":1.0},"36":{"tf":2.23606797749979}}}}}},"t":{"df":1,"docs":{"13":{"tf":1.0}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"d":{"/":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"36":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":5,"docs":{"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"20":{"tf":1.0},"25":{"tf":1.0},"31":{"tf":1.4142135623730951}}}},"m":{"df":4,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"18":{"tf":1.0},"9":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"1":{"tf":1.0}},"e":{"*":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":10,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.7320508075688772},"20":{"tf":1.4142135623730951},"21":{"tf":1.0},"25":{"tf":1.4142135623730951},"36":{"tf":2.449489742783178}}}}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"25":{"tf":1.0}}}}}}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":2,"docs":{"30":{"tf":1.0},"36":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"20":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"(":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}}}},"df":1,"docs":{"31":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"(":{"c":{"b":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":4,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"28":{"tf":1.0},"31":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"12":{"tf":2.23606797749979}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}},"s":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":2,"docs":{"20":{"tf":1.7320508075688772},"34":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"15":{"tf":1.0}}}}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":5,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":1.0},"18":{"tf":1.0},"24":{"tf":1.0}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"36":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"12":{"tf":1.4142135623730951},"16":{"tf":1.0},"20":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":5,"docs":{"17":{"tf":1.0},"3":{"tf":1.0},"33":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"35":{"tf":1.0}}}},"df":0,"docs":{}},"f":{"df":1,"docs":{"0":{"tf":1.0}}}},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"d":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}},"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"31":{"tf":1.0},"35":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"0":{"tf":1.0},"36":{"tf":3.0},"7":{"tf":1.0},"8":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"1":{"tf":1.4142135623730951}}}}}}},"t":{"df":1,"docs":{"27":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"17":{"tf":1.0},"2":{"tf":1.0},"30":{"tf":1.7320508075688772},"33":{"tf":1.4142135623730951},"34":{"tf":1.0}}}}}},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":3,"docs":{"14":{"tf":1.0},"30":{"tf":1.0},"5":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.0}},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"w":{"df":1,"docs":{"13":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":2,"docs":{"13":{"tf":1.0},"14":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"35":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"28":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":2,"docs":{"28":{"tf":2.449489742783178},"6":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"17":{"tf":1.0},"36":{"tf":1.0}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"31":{"tf":1.0},"34":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"l":{"df":4,"docs":{"13":{"tf":1.0},"30":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}}}}}}}}}}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":6,"docs":{"10":{"tf":1.7320508075688772},"12":{"tf":1.0},"14":{"tf":1.0},"28":{"tf":1.0},"30":{"tf":1.7320508075688772},"36":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"(":{"3":{"0":{"0":{"0":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"(":{"1":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"12":{"tf":1.4142135623730951},"16":{"tf":1.0},"20":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"30":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"0":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"13":{"tf":1.4142135623730951},"30":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"30":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"0":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}},"df":2,"docs":{"15":{"tf":1.0},"30":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":2,"docs":{"13":{"tf":1.4142135623730951},"15":{"tf":1.0}}}}}},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"13":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"26":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"10":{"tf":1.0},"13":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"24":{"tf":1.0}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"27":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":2,"docs":{"13":{"tf":1.0},"36":{"tf":1.0}},"i":{"df":3,"docs":{"19":{"tf":1.0},"25":{"tf":1.0},"27":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"l":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"35":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"33":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":7,"docs":{"1":{"tf":1.0},"13":{"tf":2.0},"20":{"tf":1.0},"28":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0},"36":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"18":{"tf":1.0},"20":{"tf":1.0},"33":{"tf":1.4142135623730951}}},"u":{"df":2,"docs":{"24":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":3,"docs":{"12":{"tf":1.4142135623730951},"15":{"tf":1.0},"20":{"tf":1.0}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"11":{"tf":1.0},"13":{"tf":1.7320508075688772},"24":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"21":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"17":{"tf":1.0},"33":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"1":{"tf":1.4142135623730951},"36":{"tf":2.23606797749979}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"12":{"tf":1.0}}}}}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":2,"docs":{"27":{"tf":1.4142135623730951},"31":{"tf":1.0}}}}}},"u":{"b":{"df":1,"docs":{"30":{"tf":1.0}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"h":{"df":5,"docs":{"12":{"tf":1.0},"15":{"tf":1.0},"21":{"tf":1.0},"24":{"tf":1.0},"32":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"25":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":6,"docs":{"0":{"tf":1.7320508075688772},"2":{"tf":1.4142135623730951},"32":{"tf":1.7320508075688772},"34":{"tf":1.4142135623730951},"35":{"tf":2.0},"36":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":3,"docs":{"13":{"tf":1.0},"26":{"tf":1.0},"34":{"tf":1.0}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{}}}}}},"y":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"0":{"tf":1.0},"35":{"tf":1.0}}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"18":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"t":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":2,"docs":{"15":{"tf":1.0},"30":{"tf":1.0}}}},"s":{"df":0,"docs":{},"k":{".":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"30":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{"1":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"30":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}},"df":9,"docs":{"11":{"tf":1.0},"13":{"tf":1.4142135623730951},"18":{"tf":1.0},"28":{"tf":1.4142135623730951},"30":{"tf":3.7416573867739413},"31":{"tf":1.7320508075688772},"34":{"tf":1.4142135623730951},"5":{"tf":1.0},"9":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.0}}}}},"df":1,"docs":{"7":{"tf":1.0}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"15":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"1":{"tf":1.0},"12":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"32":{"tf":1.0}}}},"t":{"'":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"31":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"33":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":3,"docs":{"18":{"tf":1.0},"21":{"tf":1.0},"26":{"tf":1.0}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}},"s":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"[":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"28":{"tf":1.0}}}}}},"df":6,"docs":{"10":{"tf":1.4142135623730951},"18":{"tf":1.0},"28":{"tf":2.8284271247461903},"31":{"tf":1.4142135623730951},"34":{"tf":1.0},"6":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"28":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"28":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":4,"docs":{"12":{"tf":1.0},"21":{"tf":1.0},"27":{"tf":1.0},"36":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}}}}}}}}}},"u":{"df":3,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"16":{"tf":3.0},"20":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":2.23606797749979}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":4,"docs":{"10":{"tf":1.0},"17":{"tf":1.7320508075688772},"31":{"tf":1.0},"9":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"30":{"tf":1.0}}}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":3,"docs":{"13":{"tf":1.0},"30":{"tf":2.8284271247461903},"5":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}}}},"r":{"df":3,"docs":{"12":{"tf":1.0},"18":{"tf":1.0},"30":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.0}}}}}},"p":{"df":1,"docs":{"29":{"tf":1.0}}}},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"16":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":2.23606797749979}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"15":{"tf":1.0}}}}}},"p":{"df":1,"docs":{"35":{"tf":1.0}}}},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"0":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"35":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"13":{"tf":1.0}}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"24":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"29":{"tf":1.0}}}},"df":9,"docs":{"1":{"tf":1.0},"13":{"tf":1.4142135623730951},"15":{"tf":1.0},"22":{"tf":1.0},"24":{"tf":1.4142135623730951},"27":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0},"36":{"tf":1.0}},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"12":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"e":{"df":4,"docs":{"12":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":2.0},"27":{"tf":2.0}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"26":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":3,"docs":{"13":{"tf":1.4142135623730951},"20":{"tf":1.4142135623730951},"8":{"tf":1.0}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"13":{"tf":1.0},"8":{"tf":1.0}}}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":11,"docs":{"11":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.7320508075688772},"23":{"tf":1.0},"25":{"tf":2.449489742783178},"26":{"tf":1.7320508075688772},"28":{"tf":1.7320508075688772},"33":{"tf":1.0},"36":{"tf":1.0},"9":{"tf":1.0}}},"i":{"c":{"df":4,"docs":{"10":{"tf":1.0},"13":{"tf":1.4142135623730951},"20":{"tf":1.4142135623730951},"34":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"b":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{},"h":{"df":2,"docs":{"21":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}},"c":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"24":{"tf":1.0},"26":{"tf":1.0}}}}},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"15":{"tf":1.0},"24":{"tf":1.0},"31":{"tf":1.0}}}}}},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"27":{"tf":1.0},"37":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"*":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":2.23606797749979}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"13":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"a":{"d":{"df":1,"docs":{"33":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":19,"docs":{"0":{"tf":1.0},"1":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.4142135623730951},"25":{"tf":1.0},"27":{"tf":1.4142135623730951},"28":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.7320508075688772},"33":{"tf":1.0},"34":{"tf":2.0},"35":{"tf":1.7320508075688772},"36":{"tf":1.4142135623730951},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"24":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"22":{"tf":1.4142135623730951},"36":{"tf":1.0}}}},"df":0,"docs":{}}}},"v":{"3":{"df":2,"docs":{"32":{"tf":1.0},"33":{"tf":1.4142135623730951}}},"4":{"/":{"df":0,"docs":{},"v":{"6":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"32":{"tf":1.0},"33":{"tf":1.0}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":5,"docs":{"11":{"tf":1.0},"20":{"tf":1.4142135623730951},"25":{"tf":1.0},"28":{"tf":1.0},"36":{"tf":1.0}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{")":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":3,"docs":{"21":{"tf":1.4142135623730951},"26":{"tf":1.0},"31":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":4,"docs":{"24":{"tf":1.7320508075688772},"26":{"tf":1.4142135623730951},"31":{"tf":1.0},"33":{"tf":1.0}}}}}}}}}},"r":{"df":3,"docs":{"16":{"tf":1.0},"25":{"tf":1.0},"28":{"tf":1.0}},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"17":{"tf":1.0},"25":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}}}}},"i":{"a":{"df":3,"docs":{"12":{"tf":1.0},"21":{"tf":1.0},"36":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":7,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.7320508075688772},"14":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"28":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{".":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":8,"docs":{"1":{"tf":1.0},"12":{"tf":2.23606797749979},"16":{"tf":1.4142135623730951},"20":{"tf":1.0},"24":{"tf":1.0},"28":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"36":{"tf":1.4142135623730951}}}},"y":{"df":3,"docs":{"12":{"tf":1.0},"28":{"tf":1.0},"35":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"b":{"df":2,"docs":{"13":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"27":{"tf":1.0},"33":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"13":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":4,"docs":{"15":{"tf":1.0},"17":{"tf":1.0},"21":{"tf":1.0},"25":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"2":{"tf":1.0}}}}},"df":1,"docs":{"13":{"tf":1.4142135623730951}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"13":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"35":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"28":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"27":{"tf":1.0},"31":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}}}}}}}}}}},"o":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"k":{"df":3,"docs":{"13":{"tf":1.0},"25":{"tf":1.4142135623730951},"28":{"tf":2.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"12":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"34":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"33":{"tf":1.4142135623730951}}}}}}},"y":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"34":{"tf":1.0}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"u":{"'":{"df":0,"docs":{},"r":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"breadcrumbs":{"root":{"1":{"0":{"df":1,"docs":{"15":{"tf":1.0}}},"2":{"7":{".":{"0":{".":{"0":{".":{"1":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"0":{"1":{"df":1,"docs":{"36":{"tf":1.0}}},"3":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"a":{"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"20":{"tf":1.0},"33":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":1,"docs":{"20":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"d":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}}},"d":{"df":1,"docs":{"1":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"36":{"tf":2.449489742783178}}}}}}},"df":2,"docs":{"11":{"tf":1.0},"21":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{},"w":{"df":7,"docs":{"12":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"27":{"tf":1.4142135623730951},"32":{"tf":1.0},"35":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"33":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"13":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":3,"docs":{"13":{"tf":1.0},"35":{"tf":1.0},"9":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}},"n":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":3,"docs":{"22":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":2.23606797749979}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"11":{"tf":1.0},"13":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"i":{"df":2,"docs":{"3":{"tf":1.7320508075688772},"35":{"tf":1.0}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":4,"docs":{"12":{"tf":1.4142135623730951},"13":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"35":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"26":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":3,"docs":{"13":{"tf":1.0},"21":{"tf":1.0},"25":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"26":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"1":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"n":{"c":{"/":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.0},"32":{"tf":1.0},"35":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"35":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":3,"docs":{"32":{"tf":1.4142135623730951},"34":{"tf":2.23606797749979},"35":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":23,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.7320508075688772},"12":{"tf":1.4142135623730951},"13":{"tf":2.23606797749979},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"18":{"tf":3.0},"19":{"tf":2.23606797749979},"20":{"tf":3.0},"21":{"tf":3.0},"22":{"tf":2.449489742783178},"24":{"tf":2.449489742783178},"25":{"tf":2.23606797749979},"26":{"tf":1.0},"27":{"tf":2.6457513110645907},"28":{"tf":2.0},"30":{"tf":2.0},"31":{"tf":2.0},"32":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.7320508075688772},"36":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"u":{"df":1,"docs":{"33":{"tf":1.0}}}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}}}},"x":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"27":{"tf":2.23606797749979}}}}}}}}}}}}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":5,"docs":{"0":{"tf":1.0},"12":{"tf":1.0},"18":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{":":{"df":1,"docs":{"34":{"tf":1.0}}},"df":2,"docs":{"31":{"tf":2.23606797749979},"34":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"11":{"tf":1.0},"27":{"tf":1.0},"4":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"31":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{":":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}},"df":17,"docs":{"1":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.4142135623730951},"13":{"tf":2.449489742783178},"15":{"tf":1.7320508075688772},"16":{"tf":2.0},"18":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":3.4641016151377544},"22":{"tf":1.4142135623730951},"24":{"tf":2.8284271247461903},"25":{"tf":1.7320508075688772},"27":{"tf":1.0},"28":{"tf":1.0},"30":{"tf":2.449489742783178},"31":{"tf":1.7320508075688772},"36":{"tf":2.6457513110645907}},"n":{"df":1,"docs":{"34":{"tf":1.0}}}}},"r":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":3,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"20":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"2":{"tf":1.0},"32":{"tf":1.0},"35":{"tf":2.8284271247461903}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"3":{"tf":1.0},"5":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"17":{"tf":1.0}}}}},"df":2,"docs":{"13":{"tf":1.0},"16":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"13":{"tf":1.0},"20":{"tf":1.0},"27":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"v":{"df":1,"docs":{"27":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"24":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"29":{"tf":1.7320508075688772},"30":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.0}}}},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"14":{"tf":1.4142135623730951},"28":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"12":{"tf":1.0},"27":{"tf":1.0}}}},"l":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":4,"docs":{"24":{"tf":1.0},"28":{"tf":1.0},"31":{"tf":1.0},"36":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"o":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"21":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"37":{"tf":1.7320508075688772}}}},"t":{"df":0,"docs":{},"h":{"df":6,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"16":{"tf":1.0},"20":{"tf":1.4142135623730951},"28":{"tf":1.0},"35":{"tf":1.4142135623730951}}}},"x":{"df":1,"docs":{"0":{"tf":1.0}}}},"s":{"d":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"g":{"df":10,"docs":{"17":{"tf":1.0},"22":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"3":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"8":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":1,"docs":{"35":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{".":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}}}}}}},"c":{"1":{"df":1,"docs":{"13":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"13":{"tf":1.4142135623730951}}},"a":{"c":{"df":0,"docs":{},"h":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"/":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"22":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":6,"docs":{"11":{"tf":1.4142135623730951},"12":{"tf":1.0},"18":{"tf":1.0},"22":{"tf":2.0},"24":{"tf":1.0},"36":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"12":{"tf":2.449489742783178},"14":{"tf":1.0},"15":{"tf":1.0},"20":{"tf":1.0},"22":{"tf":1.0},"24":{"tf":1.0},"31":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"9":{"tf":1.0}},"e":{"df":1,"docs":{"14":{"tf":1.4142135623730951}},"r":{"df":3,"docs":{"13":{"tf":1.0},"14":{"tf":2.0},"15":{"tf":1.4142135623730951}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"df":1,"docs":{"13":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":12,"docs":{"0":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":4.242640687119285},"14":{"tf":1.4142135623730951},"15":{"tf":2.449489742783178},"16":{"tf":2.23606797749979},"20":{"tf":1.0},"25":{"tf":1.0},"30":{"tf":2.449489742783178},"34":{"tf":1.0},"5":{"tf":1.4142135623730951},"9":{"tf":1.0}},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":5,"docs":{"13":{"tf":2.23606797749979},"25":{"tf":1.4142135623730951},"30":{"tf":1.4142135623730951},"34":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"27":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":5,"docs":{"15":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"22":{"tf":1.0},"24":{"tf":1.7320508075688772},"27":{"tf":1.7320508075688772},"31":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":3,"docs":{"13":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.0}}}}},"s":{"df":2,"docs":{"31":{"tf":1.4142135623730951},"34":{"tf":1.0}}}}},"b":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}}}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"13":{"tf":1.0},"24":{"tf":1.0}}}},"n":{"df":0,"docs":{},"g":{"df":5,"docs":{"17":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"33":{"tf":1.0},"36":{"tf":1.0}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"14":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"33":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":6,"docs":{"17":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":2.0},"31":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"35":{"tf":1.4142135623730951}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":18,"docs":{"0":{"tf":1.0},"1":{"tf":1.7320508075688772},"13":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"18":{"tf":1.0},"21":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"27":{"tf":1.4142135623730951},"28":{"tf":1.0},"3":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0},"32":{"tf":2.23606797749979},"33":{"tf":2.23606797749979},"34":{"tf":2.23606797749979},"35":{"tf":1.4142135623730951},"36":{"tf":1.0}},"s":{"/":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"b":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"28":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{")":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{"/":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"28":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"34":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"0":{"tf":1.0},"8":{"tf":1.0}}}}}},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"20":{"tf":1.0}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"1":{"tf":1.0}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"15":{"tf":1.0},"34":{"tf":1.0}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"r":{"df":5,"docs":{"0":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"22":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951}}}}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":9,"docs":{"17":{"tf":1.0},"24":{"tf":1.7320508075688772},"27":{"tf":1.4142135623730951},"32":{"tf":1.7320508075688772},"33":{"tf":1.0},"34":{"tf":1.4142135623730951},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"9":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"4":{"0":{"1":{"df":1,"docs":{"36":{"tf":1.0}}},"3":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"e":{"df":2,"docs":{"28":{"tf":1.0},"32":{"tf":1.0}}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"15":{"tf":1.0},"30":{"tf":1.4142135623730951}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"23":{"tf":1.0},"27":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":8,"docs":{"17":{"tf":2.0},"21":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.4142135623730951},"31":{"tf":1.0},"35":{"tf":1.0},"9":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":7,"docs":{"13":{"tf":1.4142135623730951},"14":{"tf":2.0},"15":{"tf":1.4142135623730951},"18":{"tf":1.0},"20":{"tf":1.4142135623730951},"30":{"tf":1.0},"35":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"15":{"tf":1.0},"35":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}}}}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.4142135623730951}}}}}},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":10,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"5":{"tf":1.4142135623730951},"9":{"tf":1.7320508075688772}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":6,"docs":{"10":{"tf":1.0},"13":{"tf":2.0},"20":{"tf":1.0},"28":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"17":{"tf":1.7320508075688772},"27":{"tf":1.0},"9":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":2.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":1,"docs":{"26":{"tf":1.0}}}}},"i":{"d":{"df":2,"docs":{"33":{"tf":1.0},"36":{"tf":1.0}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"14":{"tf":1.0}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"0":{"tf":1.0},"17":{"tf":1.0},"28":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}}}},"x":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"28":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"28":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"28":{"tf":2.449489742783178}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"11":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":5,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"20":{"tf":1.0},"36":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}}}},"y":{"df":1,"docs":{"25":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"18":{"tf":1.0},"28":{"tf":1.0},"9":{"tf":1.0}}}}},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":9,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"31":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"3":{"tf":1.0}}}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"31":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":8,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"14":{"tf":1.4142135623730951},"16":{"tf":1.0},"21":{"tf":1.0},"25":{"tf":1.4142135623730951},"30":{"tf":1.0},"35":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"28":{"tf":1.0}},"e":{"d":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"6":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"28":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"28":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}},"d":{":":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"=":{"<":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"35":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"35":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"35":{"tf":1.0}}}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"35":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"11":{"tf":1.0},"24":{"tf":1.0},"28":{"tf":1.0},"33":{"tf":1.0}},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"17":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"21":{"tf":1.0},"22":{"tf":1.0},"26":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"(":{"1":{"0":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"15":{"tf":1.7320508075688772}}}}}}}}},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":4,"docs":{"17":{"tf":1.0},"26":{"tf":1.0},"33":{"tf":1.0},"36":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"c":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"24":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"18":{"tf":1.0},"35":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":1,"docs":{"8":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"26":{"tf":1.0}}}}},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"12":{"tf":1.0},"28":{"tf":1.0},"34":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"25":{"tf":1.0},"3":{"tf":1.0}}}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"32":{"tf":1.0}}}}}}}},"i":{"d":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"2":{"tf":1.0},"34":{"tf":1.0},"36":{"tf":1.0}}}},"u":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"35":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":4,"docs":{"12":{"tf":1.4142135623730951},"21":{"tf":1.0},"31":{"tf":1.0},"34":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"15":{"tf":1.0},"35":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"22":{"tf":1.0},"28":{"tf":1.0},"31":{"tf":2.8284271247461903}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":8,"docs":{"0":{"tf":1.0},"10":{"tf":2.23606797749979},"11":{"tf":1.4142135623730951},"12":{"tf":1.0},"13":{"tf":1.0},"20":{"tf":1.4142135623730951},"34":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"o":{"c":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"4":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.4142135623730951}}}}}}}},"df":1,"docs":{"28":{"tf":1.0}},"n":{"'":{"df":0,"docs":{},"t":{"df":4,"docs":{"13":{"tf":1.0},"16":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":4,"docs":{"10":{"tf":1.0},"12":{"tf":1.0},"28":{"tf":1.4142135623730951},"36":{"tf":1.0}}},"t":{"df":1,"docs":{"36":{"tf":1.7320508075688772}}}},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":2,"docs":{"13":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"36":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}}}}}},"u":{"df":0,"docs":{},"e":{"df":2,"docs":{"13":{"tf":1.0},"24":{"tf":1.0}}},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":4,"docs":{"10":{"tf":1.0},"12":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":11,"docs":{"1":{"tf":1.0},"12":{"tf":1.7320508075688772},"13":{"tf":2.23606797749979},"16":{"tf":1.4142135623730951},"19":{"tf":1.0},"24":{"tf":2.23606797749979},"27":{"tf":1.0},"28":{"tf":2.0},"30":{"tf":2.23606797749979},"31":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":10,"docs":{"17":{"tf":1.0},"22":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"3":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.0},"13":{"tf":1.0},"26":{"tf":1.0},"33":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"i":{"df":2,"docs":{"0":{"tf":1.0},"28":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"36":{"tf":1.7320508075688772}}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"13":{"tf":1.0}}}}},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"17":{"tf":1.0},"27":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":2,"docs":{"11":{"tf":1.0},"20":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"36":{"tf":1.0}}}}},"o":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}}}}},"d":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":1,"docs":{"34":{"tf":1.0}},"r":{"df":3,"docs":{"10":{"tf":1.0},"24":{"tf":1.0},"31":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"2":{"tf":1.0}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"20":{"tf":1.0},"27":{"tf":1.0}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":9,"docs":{"22":{"tf":1.0},"23":{"tf":1.7320508075688772},"24":{"tf":1.0},"25":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"27":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951},"33":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}}},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"c":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"13":{"tf":1.0},"15":{"tf":1.7320508075688772}},"t":{"df":6,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"12":{"tf":1.4142135623730951},"13":{"tf":1.0},"28":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":10,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"13":{"tf":2.0},"35":{"tf":1.0},"36":{"tf":1.0},"4":{"tf":2.0},"5":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}}}},"c":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"31":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":5,"docs":{"13":{"tf":1.4142135623730951},"27":{"tf":1.0},"30":{"tf":2.0},"31":{"tf":1.0},"36":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}},"p":{"df":0,"docs":{},"t":{"df":15,"docs":{"0":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":1.7320508075688772},"21":{"tf":1.7320508075688772},"22":{"tf":2.0},"23":{"tf":2.449489742783178},"24":{"tf":3.3166247903554},"25":{"tf":2.23606797749979},"26":{"tf":2.6457513110645907},"27":{"tf":2.8284271247461903},"30":{"tf":1.4142135623730951},"31":{"tf":2.23606797749979},"33":{"tf":1.4142135623730951},"34":{"tf":1.0},"36":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{")":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":6,"docs":{"11":{"tf":1.4142135623730951},"18":{"tf":1.0},"20":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951},"28":{"tf":1.0},"9":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"17":{"tf":1.0},"32":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":8,"docs":{"11":{"tf":1.0},"13":{"tf":1.7320508075688772},"14":{"tf":1.4142135623730951},"20":{"tf":1.0},"24":{"tf":2.23606797749979},"28":{"tf":1.0},"31":{"tf":1.0},"36":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.7320508075688772}}}}}}}}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"0":{"tf":1.4142135623730951},"33":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"d":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"24":{"tf":1.0},"27":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"df":4,"docs":{"1":{"tf":1.0},"12":{"tf":1.0},"28":{"tf":1.0},"34":{"tf":1.0}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"12":{"tf":1.0}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":6,"docs":{"11":{"tf":1.4142135623730951},"13":{"tf":2.23606797749979},"14":{"tf":1.0},"15":{"tf":1.0},"20":{"tf":1.0},"30":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"28":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}},"l":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"27":{"tf":1.0},"35":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"4":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"13":{"tf":1.4142135623730951},"36":{"tf":1.0}}}}}},"r":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":1,"docs":{"36":{"tf":1.7320508075688772}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"12":{"tf":1.0}}}},"m":{"df":1,"docs":{"26":{"tf":1.0}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"df":10,"docs":{"17":{"tf":1.0},"22":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.4142135623730951},"3":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":1,"docs":{"13":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":9,"docs":{"18":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.7320508075688772},"22":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":2.23606797749979},"34":{"tf":1.0}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.0}}}}}}},"t":{".":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"21":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"(":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"21":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"1":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"24":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":2,"docs":{"20":{"tf":1.4142135623730951},"24":{"tf":2.0}}},"2":{".":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"16":{"tf":1.0},"20":{"tf":1.4142135623730951},"24":{"tf":2.0}}},"3":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"24":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"24":{"tf":1.0}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":1,"docs":{"24":{"tf":1.0}}},"df":5,"docs":{"13":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"21":{"tf":2.449489742783178},"25":{"tf":1.0},"31":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":18,"docs":{"10":{"tf":1.0},"11":{"tf":2.449489742783178},"12":{"tf":1.0},"13":{"tf":2.8284271247461903},"14":{"tf":2.449489742783178},"15":{"tf":1.4142135623730951},"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":2.0},"21":{"tf":1.4142135623730951},"24":{"tf":1.7320508075688772},"25":{"tf":1.4142135623730951},"31":{"tf":2.0},"32":{"tf":1.0},"33":{"tf":1.0},"9":{"tf":1.0}},"e":{".":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"24":{"tf":1.4142135623730951},"33":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":3,"docs":{"20":{"tf":1.0},"24":{"tf":1.0},"33":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"33":{"tf":1.0}}}}},"df":0,"docs":{}}},"2":{".":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}}},"df":1,"docs":{"13":{"tf":1.4142135623730951}}},"[":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}}}}}}}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"]":{".":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"[":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"1":{"tf":1.0}}}},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":6,"docs":{"16":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.7320508075688772},"22":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}}}}}}},"g":{"a":{"df":0,"docs":{},"r":{"b":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.0}}}}},"t":{"df":2,"docs":{"13":{"tf":1.4142135623730951},"28":{"tf":1.0}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{"df":10,"docs":{"17":{"tf":1.0},"22":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"3":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"11":{"tf":1.0},"20":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"b":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"27":{"tf":1.7320508075688772},"35":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"df":2,"docs":{"21":{"tf":1.0},"36":{"tf":1.4142135623730951}},"o":{"d":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"12":{"tf":1.0}}}}},"df":0,"docs":{}},"u":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":2,"docs":{"13":{"tf":1.0},"20":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"10":{"tf":1.0}},"l":{"df":9,"docs":{"10":{"tf":1.0},"12":{"tf":1.0},"14":{"tf":1.0},"22":{"tf":1.4142135623730951},"24":{"tf":1.0},"27":{"tf":1.0},"33":{"tf":1.4142135623730951},"36":{"tf":2.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":2.23606797749979}}}}}},"df":0,"docs":{}}},"r":{"df":2,"docs":{"10":{"tf":1.0},"36":{"tf":3.1622776601683795}}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":5,"docs":{"13":{"tf":1.0},"16":{"tf":1.0},"30":{"tf":1.0},"35":{"tf":1.0},"9":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":2.23606797749979}}}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":1,"docs":{"28":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":2,"docs":{"27":{"tf":1.0},"36":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"25":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}}},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"13":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"26":{"tf":1.0},"27":{"tf":1.0},"33":{"tf":1.0}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}},"o":{"d":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":5,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"13":{"tf":1.0},"36":{"tf":4.123105625617661},"8":{"tf":2.0}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{"/":{"/":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"k":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"?":{"df":0,"docs":{},"q":{"=":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"w":{"df":0,"docs":{},"w":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"?":{"df":0,"docs":{},"q":{"=":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}}},"df":2,"docs":{"13":{"tf":1.0},"8":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"2":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"36":{"tf":2.6457513110645907}}}}}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"[":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"36":{"tf":2.23606797749979}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}}},"s":{":":{"/":{"/":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"d":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":1,"docs":{"1":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":2.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}}}}}}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":1,"docs":{"36":{"tf":1.0}}}}}},"i":{"/":{"df":0,"docs":{},"o":{"df":3,"docs":{"0":{"tf":1.0},"18":{"tf":1.0},"28":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"a":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":2,"docs":{"14":{"tf":1.0},"16":{"tf":1.0}}},"m":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"1":{"tf":1.0},"28":{"tf":1.0}}}}}},"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"0":{"tf":1.0},"16":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"26":{"tf":1.0},"32":{"tf":1.0}}}}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"21":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":9,"docs":{"1":{"tf":1.0},"13":{"tf":1.7320508075688772},"22":{"tf":1.0},"28":{"tf":1.4142135623730951},"30":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951},"34":{"tf":1.7320508075688772},"35":{"tf":1.0},"36":{"tf":1.0}}}}}}},"n":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":7,"docs":{"0":{"tf":1.0},"15":{"tf":1.0},"25":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"27":{"tf":1.0},"32":{"tf":1.0},"35":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"13":{"tf":1.0}}},"i":{"c":{"df":2,"docs":{"18":{"tf":1.0},"25":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"12":{"tf":1.0}}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"u":{"df":2,"docs":{"15":{"tf":1.0},"27":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"17":{"tf":1.0},"25":{"tf":1.4142135623730951},"36":{"tf":1.4142135623730951}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.7320508075688772}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":4,"docs":{"13":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.0},"28":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"11":{"tf":1.0},"20":{"tf":1.0}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":2.0}}},"n":{"c":{"df":3,"docs":{"10":{"tf":1.0},"13":{"tf":1.0},"20":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"d":{"df":4,"docs":{"21":{"tf":1.0},"31":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":1,"docs":{"28":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"18":{"tf":1.0},"21":{"tf":1.0},"28":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"27":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"25":{"tf":1.4142135623730951}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":2,"docs":{"27":{"tf":1.0},"33":{"tf":1.0}},"t":{"df":4,"docs":{"0":{"tf":1.7320508075688772},"1":{"tf":1.0},"2":{"tf":1.0},"3":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"c":{"df":0,"docs":{},"p":{"df":1,"docs":{"2":{"tf":1.0}}}},"df":1,"docs":{"21":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{")":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"21":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":2,"docs":{"21":{"tf":1.0},"25":{"tf":2.0}}}}}}}},"p":{"df":1,"docs":{"36":{"tf":1.0}},"v":{"6":{"df":1,"docs":{"33":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}}}}}},"t":{"'":{"df":2,"docs":{"10":{"tf":1.0},"20":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"14":{"tf":1.0}}},"r":{"df":2,"docs":{"0":{"tf":1.0},"19":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"16":{"tf":2.0}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":3,"docs":{"12":{"tf":1.0},"16":{"tf":1.0},"36":{"tf":1.0}}}},"y":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"18":{"tf":1.0},"20":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"25":{"tf":1.0},"36":{"tf":1.4142135623730951}},"n":{"df":2,"docs":{"11":{"tf":1.0},"35":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"32":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"35":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":3,"docs":{"14":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.0}}},"df":0,"docs":{},"k":{"df":2,"docs":{"31":{"tf":1.4142135623730951},"34":{"tf":1.0}}}},"df":0,"docs":{},"g":{"a":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"0":{"tf":1.0},"27":{"tf":1.0},"32":{"tf":1.4142135623730951},"35":{"tf":2.23606797749979}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"22":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"x":{"df":1,"docs":{"2":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"25":{"tf":1.4142135623730951},"26":{"tf":1.0},"36":{"tf":2.0}}}}},"o":{"c":{"a":{"df":0,"docs":{},"l":{"*":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"36":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"k":{"df":1,"docs":{"0":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"28":{"tf":1.0},"30":{"tf":1.4142135623730951}},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"k":{"df":2,"docs":{"34":{"tf":1.0},"36":{"tf":1.0}}},"p":{"df":6,"docs":{"10":{"tf":1.0},"12":{"tf":1.4142135623730951},"16":{"tf":1.0},"28":{"tf":1.4142135623730951},"34":{"tf":1.0},"9":{"tf":1.0}}}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":2,"docs":{"0":{"tf":1.0},"32":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"28":{"tf":1.4142135623730951}}}},"k":{"df":0,"docs":{},"e":{"df":6,"docs":{"10":{"tf":1.0},"13":{"tf":1.0},"26":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"9":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"28":{"tf":1.0},"31":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":2,"docs":{"20":{"tf":1.4142135623730951},"28":{"tf":1.0}}},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"18":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"11":{"tf":1.4142135623730951},"34":{"tf":1.0}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"36":{"tf":1.4142135623730951}},"o":{"d":{"df":4,"docs":{"19":{"tf":1.0},"26":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"35":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"d":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"36":{"tf":4.58257569495584},"8":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"32":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}},"x":{"df":1,"docs":{"34":{"tf":1.0}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":2,"docs":{"23":{"tf":1.0},"27":{"tf":1.7320508075688772}},"l":{"df":2,"docs":{"28":{"tf":1.4142135623730951},"9":{"tf":1.0}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":4,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"25":{"tf":1.0},"36":{"tf":2.23606797749979}}}}},"u":{"df":0,"docs":{},"l":{"df":3,"docs":{"17":{"tf":1.0},"28":{"tf":1.0},"35":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"16":{"tf":1.4142135623730951},"31":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":6,"docs":{"1":{"tf":1.0},"12":{"tf":1.0},"17":{"tf":1.0},"30":{"tf":1.0},"32":{"tf":1.0},"36":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"0":{"tf":1.0}},"p":{"df":0,"docs":{},"l":{"df":6,"docs":{"13":{"tf":1.0},"28":{"tf":1.0},"32":{"tf":1.4142135623730951},"35":{"tf":1.7320508075688772},"5":{"tf":1.0},"8":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"9":{"tf":1.0}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":2,"docs":{"20":{"tf":1.0},"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"20":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"y":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":2,"docs":{"12":{"tf":2.0},"31":{"tf":1.4142135623730951}}}}},"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"28":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"25":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"20":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"d":{"df":7,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"22":{"tf":1.0},"26":{"tf":1.0},"36":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"31":{"tf":1.0}}}}},"w":{"df":4,"docs":{"1":{"tf":1.0},"17":{"tf":1.0},"27":{"tf":1.0},"33":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"24":{"tf":1.0},"25":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"[":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"]":{"(":{"\"":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"21":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"21":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"30":{"tf":1.4142135623730951},"36":{"tf":2.0}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"f":{"df":1,"docs":{"36":{"tf":2.23606797749979}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":1.7320508075688772}}}},"df":4,"docs":{"0":{"tf":1.0},"26":{"tf":1.0},"32":{"tf":1.0},"35":{"tf":1.0}}}},"o":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}},"df":1,"docs":{"15":{"tf":2.23606797749979}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"35":{"tf":1.4142135623730951}}}},"t":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"3":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"34":{"tf":1.0}}},"i":{"df":0,"docs":{},"f":{"df":2,"docs":{"28":{"tf":1.0},"9":{"tf":1.0}},"i":{"df":2,"docs":{"13":{"tf":1.0},"28":{"tf":1.0}}}}}},"w":{"df":3,"docs":{"13":{"tf":1.0},"16":{"tf":1.0},"33":{"tf":1.0}}}},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"28":{"tf":1.0},"36":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":2,"docs":{"14":{"tf":1.0},"16":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"12":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"12":{"tf":1.0},"28":{"tf":1.4142135623730951}}}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"h":{"df":1,"docs":{"21":{"tf":1.0}}},"l":{"d":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}},"n":{"c":{"df":2,"docs":{"27":{"tf":1.0},"28":{"tf":1.0}}},"df":7,"docs":{"10":{"tf":1.0},"13":{"tf":1.7320508075688772},"16":{"tf":1.0},"20":{"tf":1.0},"27":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"r":{"df":11,"docs":{"11":{"tf":1.7320508075688772},"12":{"tf":1.0},"13":{"tf":2.6457513110645907},"15":{"tf":1.7320508075688772},"16":{"tf":2.0},"18":{"tf":1.4142135623730951},"20":{"tf":1.4142135623730951},"25":{"tf":1.0},"30":{"tf":1.7320508075688772},"31":{"tf":1.4142135623730951},"9":{"tf":1.0}}}},"t":{"[":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"17":{"tf":1.4142135623730951},"2":{"tf":1.0}}}}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"13":{"tf":1.4142135623730951},"20":{"tf":1.0},"36":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"14":{"tf":1.0},"27":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}}}},"s":{"df":1,"docs":{"28":{"tf":1.0}},"x":{"df":1,"docs":{"2":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"11":{"tf":2.0},"13":{"tf":1.0},"31":{"tf":1.0}}}}},"df":2,"docs":{"0":{"tf":1.0},"31":{"tf":1.0}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"12":{"tf":1.0}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"14":{"tf":1.7320508075688772}}}}}}}}}}},"p":{"(":{")":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"19":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":3,"docs":{"20":{"tf":1.4142135623730951},"24":{"tf":2.0},"25":{"tf":2.0}}},"2":{"df":3,"docs":{"20":{"tf":1.4142135623730951},"24":{"tf":1.7320508075688772},"25":{"tf":1.0}}},"3":{"df":2,"docs":{"20":{"tf":1.4142135623730951},"24":{"tf":2.23606797749979}}},"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":12,"docs":{"1":{"tf":1.0},"13":{"tf":1.4142135623730951},"17":{"tf":1.0},"22":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"3":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"8":{"tf":1.7320508075688772}}}},"n":{"df":0,"docs":{},"i":{"c":{"df":4,"docs":{"14":{"tf":1.0},"24":{"tf":1.0},"33":{"tf":1.0},"34":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"a":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"13":{"tf":1.0},"28":{"tf":1.4142135623730951}}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"21":{"tf":1.0},"36":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"12":{"tf":1.0},"20":{"tf":1.0},"36":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"e":{"/":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":2,"docs":{"35":{"tf":1.0},"36":{"tf":1.4142135623730951}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"16":{"tf":1.0}}}}}}}},"df":1,"docs":{"19":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"36":{"tf":1.0}}},"df":1,"docs":{"36":{"tf":1.0}}}},"n":{"d":{"df":2,"docs":{"11":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"10":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":2,"docs":{"15":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}}}}},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":2,"docs":{"24":{"tf":1.0},"36":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"27":{"tf":1.0}}}},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":2,"docs":{"0":{"tf":1.0},"2":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"l":{"df":4,"docs":{"12":{"tf":2.449489742783178},"2":{"tf":1.7320508075688772},"24":{"tf":1.7320508075688772},"9":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":5,"docs":{"27":{"tf":1.0},"32":{"tf":1.7320508075688772},"33":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"2":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"12":{"tf":1.0},"14":{"tf":1.0}}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":3,"docs":{"29":{"tf":1.7320508075688772},"30":{"tf":1.0},"31":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"a":{"df":2,"docs":{"18":{"tf":1.4142135623730951},"19":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"15":{"tf":1.0},"28":{"tf":1.0},"30":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"16":{"tf":1.0},"19":{"tf":1.0},"24":{"tf":1.0}}}}},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"31":{"tf":1.0}}}}}},"c":{"df":17,"docs":{"1":{"tf":1.0},"12":{"tf":1.4142135623730951},"13":{"tf":2.23606797749979},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"19":{"tf":1.0},"20":{"tf":2.0},"21":{"tf":1.7320508075688772},"22":{"tf":2.0},"24":{"tf":2.0},"25":{"tf":1.4142135623730951},"26":{"tf":2.0},"27":{"tf":1.4142135623730951},"28":{"tf":1.4142135623730951},"30":{"tf":2.0},"31":{"tf":1.7320508075688772},"36":{"tf":3.0}},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":13,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"14":{"tf":1.0},"16":{"tf":1.4142135623730951},"18":{"tf":2.449489742783178},"19":{"tf":1.0},"20":{"tf":2.0},"21":{"tf":2.0},"24":{"tf":1.0},"25":{"tf":1.0},"28":{"tf":1.0},"31":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"0":{"tf":1.0},"12":{"tf":1.4142135623730951},"31":{"tf":1.0},"36":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"u":{"c":{"df":1,"docs":{"14":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"20":{"tf":1.0},"31":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"10":{"tf":1.4142135623730951},"28":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}}}},"p":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"30":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"0":{"tf":1.0},"36":{"tf":1.0}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"28":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"20":{"tf":1.0}}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"30":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":12,"docs":{"13":{"tf":2.449489742783178},"21":{"tf":1.7320508075688772},"22":{"tf":2.23606797749979},"24":{"tf":2.449489742783178},"25":{"tf":3.605551275463989},"26":{"tf":2.449489742783178},"27":{"tf":2.449489742783178},"30":{"tf":1.4142135623730951},"31":{"tf":2.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.4142135623730951},"36":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}},"n":{"df":1,"docs":{"30":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"12":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}}}}},"w":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"21":{"tf":1.0}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"21":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":2,"docs":{"18":{"tf":1.0},"21":{"tf":3.0}},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"21":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":0,"docs":{}},"df":3,"docs":{"13":{"tf":1.4142135623730951},"15":{"tf":1.0},"30":{"tf":1.0}}}},"d":{"df":3,"docs":{"13":{"tf":1.0},"24":{"tf":1.0},"31":{"tf":1.0}},"i":{"df":2,"docs":{"10":{"tf":1.0},"12":{"tf":1.0}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"15":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}}},"df":3,"docs":{"13":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951},"36":{"tf":1.0}},"f":{"df":3,"docs":{"26":{"tf":1.0},"27":{"tf":1.0},"31":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"3":{"tf":1.0},"36":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":3,"docs":{"15":{"tf":1.0},"17":{"tf":1.0},"34":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":1,"docs":{"9":{"tf":1.0}}}},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":2.23606797749979}},"e":{"*":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"v":{"df":1,"docs":{"33":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}}}},"q":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"36":{"tf":1.7320508075688772}},"e":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"36":{"tf":1.7320508075688772}}},".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{")":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"(":{")":{")":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"(":{"\"":{"1":{"2":{"7":{".":{"0":{".":{"0":{".":{"1":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"2":{"0":{"0":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"\"":{"/":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"36":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":4,"docs":{"10":{"tf":1.0},"13":{"tf":2.0},"15":{"tf":1.4142135623730951},"36":{"tf":4.69041575982343}},"f":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"36":{"tf":2.0}}}}}}}},"i":{"df":0,"docs":{},"r":{"df":2,"docs":{"1":{"tf":1.0},"27":{"tf":1.0}}}}}},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":3,"docs":{"13":{"tf":1.0},"15":{"tf":1.0},"34":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":1,"docs":{"1":{"tf":1.0}},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}},"df":0,"docs":{},"s":{"df":3,"docs":{"1":{"tf":1.0},"14":{"tf":1.0},"36":{"tf":2.23606797749979}}}}}},"t":{"df":1,"docs":{"13":{"tf":1.0}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"d":{"/":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"36":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":5,"docs":{"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"20":{"tf":1.0},"25":{"tf":1.0},"31":{"tf":1.4142135623730951}}}},"m":{"df":4,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"18":{"tf":1.0},"9":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"1":{"tf":1.0}},"e":{"*":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":10,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.7320508075688772},"20":{"tf":1.4142135623730951},"21":{"tf":1.0},"25":{"tf":1.4142135623730951},"36":{"tf":2.449489742783178}}}}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"25":{"tf":1.0}}}}}}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":2,"docs":{"30":{"tf":1.0},"36":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"20":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"(":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}}}},"df":1,"docs":{"31":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"(":{"c":{"b":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":4,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"28":{"tf":1.0},"31":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"12":{"tf":2.23606797749979}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}},"s":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":2,"docs":{"20":{"tf":1.7320508075688772},"34":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"15":{"tf":1.0}}}}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":5,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":1.0},"18":{"tf":1.0},"24":{"tf":1.0}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"36":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"12":{"tf":1.4142135623730951},"16":{"tf":1.0},"20":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":5,"docs":{"17":{"tf":1.0},"3":{"tf":1.0},"33":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"35":{"tf":1.0}}}},"df":0,"docs":{}},"f":{"df":1,"docs":{"0":{"tf":1.0}}}},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"d":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}},"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"31":{"tf":1.0},"35":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"0":{"tf":1.0},"36":{"tf":3.3166247903554},"7":{"tf":1.0},"8":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"1":{"tf":1.4142135623730951}}}}}}},"t":{"df":1,"docs":{"27":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"17":{"tf":1.0},"2":{"tf":1.0},"30":{"tf":1.7320508075688772},"33":{"tf":1.4142135623730951},"34":{"tf":1.0}}}}}},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":3,"docs":{"14":{"tf":1.0},"30":{"tf":1.0},"5":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.0}},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"w":{"df":1,"docs":{"13":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":2,"docs":{"13":{"tf":1.0},"14":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"35":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"28":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":2,"docs":{"28":{"tf":2.449489742783178},"6":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"17":{"tf":1.0},"36":{"tf":1.0}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"31":{"tf":1.0},"34":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"l":{"df":4,"docs":{"13":{"tf":1.0},"30":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}}}}}}}}}}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":6,"docs":{"10":{"tf":1.7320508075688772},"12":{"tf":1.0},"14":{"tf":1.0},"28":{"tf":1.0},"30":{"tf":1.7320508075688772},"36":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"(":{"3":{"0":{"0":{"0":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"(":{"1":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"12":{"tf":1.4142135623730951},"16":{"tf":1.0},"20":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"30":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"0":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"13":{"tf":1.4142135623730951},"30":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"30":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"0":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}},"df":2,"docs":{"15":{"tf":1.0},"30":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":2,"docs":{"13":{"tf":1.4142135623730951},"15":{"tf":1.0}}}}}},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"13":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"26":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"10":{"tf":1.0},"13":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"24":{"tf":1.0}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"27":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":2,"docs":{"13":{"tf":1.0},"36":{"tf":1.0}},"i":{"df":3,"docs":{"19":{"tf":1.0},"25":{"tf":1.0},"27":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"l":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"35":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"33":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":7,"docs":{"1":{"tf":1.0},"13":{"tf":2.0},"20":{"tf":1.0},"28":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0},"36":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"18":{"tf":1.0},"20":{"tf":1.0},"33":{"tf":1.4142135623730951}}},"u":{"df":2,"docs":{"24":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":3,"docs":{"12":{"tf":1.4142135623730951},"15":{"tf":1.0},"20":{"tf":1.0}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"11":{"tf":1.0},"13":{"tf":1.7320508075688772},"24":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"21":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"17":{"tf":1.0},"33":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"1":{"tf":1.4142135623730951},"36":{"tf":2.23606797749979}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"12":{"tf":1.0}}}}}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":2,"docs":{"27":{"tf":1.4142135623730951},"31":{"tf":1.0}}}}}},"u":{"b":{"df":1,"docs":{"30":{"tf":1.0}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"h":{"df":5,"docs":{"12":{"tf":1.0},"15":{"tf":1.0},"21":{"tf":1.0},"24":{"tf":1.0},"32":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"25":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":6,"docs":{"0":{"tf":1.7320508075688772},"2":{"tf":1.7320508075688772},"32":{"tf":1.7320508075688772},"34":{"tf":1.4142135623730951},"35":{"tf":2.23606797749979},"36":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":3,"docs":{"13":{"tf":1.0},"26":{"tf":1.0},"34":{"tf":1.0}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{}}}}}},"y":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"0":{"tf":1.0},"35":{"tf":1.0}}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"18":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"t":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":2,"docs":{"15":{"tf":1.0},"30":{"tf":1.0}}}},"s":{"df":0,"docs":{},"k":{".":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"30":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{"1":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"30":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}},"df":9,"docs":{"11":{"tf":1.0},"13":{"tf":1.4142135623730951},"18":{"tf":1.0},"28":{"tf":1.4142135623730951},"30":{"tf":3.7416573867739413},"31":{"tf":1.7320508075688772},"34":{"tf":1.4142135623730951},"5":{"tf":1.0},"9":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.0}}}}},"df":1,"docs":{"7":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"15":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"1":{"tf":1.0},"12":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"32":{"tf":1.0}}}},"t":{"'":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"31":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"33":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":3,"docs":{"18":{"tf":1.0},"21":{"tf":1.0},"26":{"tf":1.0}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}},"s":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"[":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"28":{"tf":1.0}}}}}},"df":6,"docs":{"10":{"tf":1.4142135623730951},"18":{"tf":1.0},"28":{"tf":3.1622776601683795},"31":{"tf":1.4142135623730951},"34":{"tf":1.0},"6":{"tf":1.7320508075688772}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"28":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"28":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":4,"docs":{"12":{"tf":1.0},"21":{"tf":1.0},"27":{"tf":1.0},"36":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}}}}}}}}}},"u":{"df":3,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"16":{"tf":3.0},"20":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":2.23606797749979}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":4,"docs":{"10":{"tf":1.0},"17":{"tf":2.0},"31":{"tf":1.0},"9":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"30":{"tf":1.0}}}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":3,"docs":{"13":{"tf":1.0},"30":{"tf":3.0},"5":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}}}},"r":{"df":3,"docs":{"12":{"tf":1.0},"18":{"tf":1.0},"30":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.0}}}}}},"p":{"df":3,"docs":{"29":{"tf":1.7320508075688772},"30":{"tf":1.0},"31":{"tf":1.0}}}},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"16":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":2.23606797749979}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"15":{"tf":1.0}}}}}},"p":{"df":1,"docs":{"35":{"tf":1.0}}}},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"0":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"35":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"13":{"tf":1.0}}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"24":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"k":{"df":3,"docs":{"29":{"tf":1.7320508075688772},"30":{"tf":1.0},"31":{"tf":1.0}}}},"df":9,"docs":{"1":{"tf":1.0},"13":{"tf":1.4142135623730951},"15":{"tf":1.0},"22":{"tf":1.0},"24":{"tf":1.4142135623730951},"27":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0},"36":{"tf":1.0}},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"12":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"e":{"df":4,"docs":{"12":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":2.0},"27":{"tf":2.0}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"26":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":3,"docs":{"13":{"tf":1.4142135623730951},"20":{"tf":1.4142135623730951},"8":{"tf":1.0}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"13":{"tf":1.0},"8":{"tf":1.0}}}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":11,"docs":{"11":{"tf":1.4142135623730951},"19":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.7320508075688772},"23":{"tf":1.0},"25":{"tf":2.449489742783178},"26":{"tf":2.0},"28":{"tf":1.7320508075688772},"33":{"tf":1.0},"36":{"tf":1.0},"9":{"tf":1.0}}},"i":{"c":{"df":4,"docs":{"10":{"tf":1.0},"13":{"tf":1.4142135623730951},"20":{"tf":1.4142135623730951},"34":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"b":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{},"h":{"df":2,"docs":{"21":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}},"c":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"24":{"tf":1.0},"26":{"tf":1.0}}}}},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"15":{"tf":1.0},"24":{"tf":1.0},"31":{"tf":1.0}}}}}},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"27":{"tf":1.0},"37":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"*":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":2.23606797749979}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"13":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"a":{"d":{"df":1,"docs":{"33":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":19,"docs":{"0":{"tf":1.0},"1":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.4142135623730951},"25":{"tf":1.0},"27":{"tf":1.4142135623730951},"28":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.7320508075688772},"33":{"tf":1.0},"34":{"tf":2.0},"35":{"tf":1.7320508075688772},"36":{"tf":1.4142135623730951},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"24":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"22":{"tf":1.4142135623730951},"36":{"tf":1.0}}}},"df":0,"docs":{}}}},"v":{"3":{"df":2,"docs":{"32":{"tf":1.0},"33":{"tf":1.7320508075688772}}},"4":{"/":{"df":0,"docs":{},"v":{"6":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"32":{"tf":1.4142135623730951},"33":{"tf":1.0}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":5,"docs":{"11":{"tf":1.0},"20":{"tf":1.4142135623730951},"25":{"tf":1.0},"28":{"tf":1.0},"36":{"tf":1.0}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{")":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":3,"docs":{"21":{"tf":1.4142135623730951},"26":{"tf":1.0},"31":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":4,"docs":{"24":{"tf":1.7320508075688772},"26":{"tf":1.4142135623730951},"31":{"tf":1.0},"33":{"tf":1.0}}}}}}}}}},"r":{"df":3,"docs":{"16":{"tf":1.0},"25":{"tf":1.0},"28":{"tf":1.0}},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"17":{"tf":1.0},"25":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}}}}},"i":{"a":{"df":3,"docs":{"12":{"tf":1.0},"21":{"tf":1.0},"36":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":7,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.7320508075688772},"14":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"28":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{".":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":8,"docs":{"1":{"tf":1.0},"12":{"tf":2.23606797749979},"16":{"tf":1.4142135623730951},"20":{"tf":1.0},"24":{"tf":1.0},"28":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"36":{"tf":1.4142135623730951}}}},"y":{"df":3,"docs":{"12":{"tf":1.0},"28":{"tf":1.0},"35":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"b":{"df":2,"docs":{"13":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"27":{"tf":1.0},"33":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"13":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":4,"docs":{"15":{"tf":1.0},"17":{"tf":1.0},"21":{"tf":1.0},"25":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"2":{"tf":1.0}}}}},"df":1,"docs":{"13":{"tf":1.4142135623730951}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"13":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"35":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"28":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"27":{"tf":1.0},"31":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}}}}}}}}}}},"o":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"k":{"df":3,"docs":{"13":{"tf":1.0},"25":{"tf":1.4142135623730951},"28":{"tf":2.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"12":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"34":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"33":{"tf":1.4142135623730951}}}}}}},"y":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"34":{"tf":1.0}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"u":{"'":{"df":0,"docs":{},"r":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"title":{"root":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"3":{"tf":1.0}}}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":3,"docs":{"18":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}}},"df":0,"docs":{}}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"35":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"29":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"37":{"tf":1.0}}}}}},"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"22":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"12":{"tf":1.0}}}},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"13":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":2,"docs":{"32":{"tf":1.0},"33":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"22":{"tf":1.0}}}}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"32":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"5":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"31":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"o":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"4":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":4,"docs":{"23":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0}}}}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}}},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":2,"docs":{"36":{"tf":1.0},"8":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"20":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"m":{"df":0,"docs":{},"i":{"d":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"35":{"tf":1.0}}}}}}}}},"n":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}}}},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"12":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"32":{"tf":1.0}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"29":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"18":{"tf":1.0},"21":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"w":{"df":1,"docs":{"21":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"2":{"tf":1.0},"35":{"tf":1.0}}}}}}}}},"t":{"c":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":2,"docs":{"28":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"17":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.0}}}}}}},"p":{"df":1,"docs":{"29":{"tf":1.0}}}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"29":{"tf":1.0}}}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":2,"docs":{"11":{"tf":1.0},"26":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"37":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"v":{"3":{"df":1,"docs":{"33":{"tf":1.0}}},"4":{"df":1,"docs":{"32":{"tf":1.0}}},"df":0,"docs":{}}}}},"lang":"English","pipeline":["trimmer","stopWordFilter","stemmer"],"ref":"id","version":"0.9.5"},"results_options":{"limit_results":30,"teaser_word_count":30},"search_options":{"bool":"OR","expand":true,"fields":{"body":{"boost":1},"breadcrumbs":{"boost":1},"title":{"boost":2}}}}); \ No newline at end of file diff --git a/searchindex.json b/searchindex.json new file mode 100644 index 00000000..ed036958 --- /dev/null +++ b/searchindex.json @@ -0,0 +1 @@ +{"doc_urls":["introduction.html#introduction","introduction.html#installation","introduction.html#platform-support","introduction.html#api-documentation","examples.html#examples","examples.html#basic-concepts","examples.html#threads","examples.html#tcp","examples.html#http","concepts.html#concepts","concepts.html#the-dispatcher","concepts.html#the-future-type","concepts.html#the-poll-call","concepts.html#cancellation","concepts.html#ownership","concepts.html#nocancel","concepts.html#join","concepts.html#compile-time-configuration","async_procs.html#async-procedures","async_procs.html#the-async-pragma","async_procs.html#await-keyword","async_procs.html#raw-async-procedures","async_procs.html#callbacks-and-closures","error_handling.html#errors-and-exceptions","error_handling.html#exceptions","error_handling.html#checked-exceptions","error_handling.html#the-exception-type","error_handling.html#compatibility-modes","threads.html#threads","tips.html#tips-tricks-and-best-practices","tips.html#timeouts","tips.html#discard","porting.html#porting-code-to-chronos-v4","porting.html#chronos-v3","porting.html#asyncdispatch","porting.html#supporting-multiple-backends","http_server_middleware.html#http-server-middleware","book.html#updating-this-book"],"index":{"documentStore":{"docInfo":{"0":{"body":46,"breadcrumbs":2,"title":1},"1":{"body":58,"breadcrumbs":2,"title":1},"10":{"body":52,"breadcrumbs":3,"title":1},"11":{"body":56,"breadcrumbs":4,"title":2},"12":{"body":94,"breadcrumbs":4,"title":2},"13":{"body":237,"breadcrumbs":3,"title":1},"14":{"body":53,"breadcrumbs":3,"title":1},"15":{"body":72,"breadcrumbs":3,"title":1},"16":{"body":92,"breadcrumbs":3,"title":1},"17":{"body":44,"breadcrumbs":5,"title":3},"18":{"body":40,"breadcrumbs":4,"title":2},"19":{"body":23,"breadcrumbs":4,"title":2},"2":{"body":19,"breadcrumbs":3,"title":2},"20":{"body":107,"breadcrumbs":4,"title":2},"21":{"body":83,"breadcrumbs":5,"title":3},"22":{"body":59,"breadcrumbs":4,"title":2},"23":{"body":7,"breadcrumbs":4,"title":2},"24":{"body":139,"breadcrumbs":3,"title":1},"25":{"body":102,"breadcrumbs":4,"title":2},"26":{"body":65,"breadcrumbs":4,"title":2},"27":{"body":134,"breadcrumbs":4,"title":2},"28":{"body":142,"breadcrumbs":2,"title":1},"29":{"body":0,"breadcrumbs":8,"title":4},"3":{"body":14,"breadcrumbs":3,"title":2},"30":{"body":121,"breadcrumbs":5,"title":1},"31":{"body":128,"breadcrumbs":5,"title":1},"32":{"body":29,"breadcrumbs":7,"title":4},"33":{"body":54,"breadcrumbs":5,"title":2},"34":{"body":63,"breadcrumbs":4,"title":1},"35":{"body":89,"breadcrumbs":6,"title":3},"36":{"body":370,"breadcrumbs":6,"title":3},"37":{"body":5,"breadcrumbs":4,"title":2},"4":{"body":4,"breadcrumbs":2,"title":1},"5":{"body":11,"breadcrumbs":3,"title":2},"6":{"body":4,"breadcrumbs":2,"title":1},"7":{"body":6,"breadcrumbs":2,"title":1},"8":{"body":23,"breadcrumbs":2,"title":1},"9":{"body":38,"breadcrumbs":3,"title":1}},"docs":{"0":{"body":"Chronos implements the async/await paradigm in a self-contained library using macro and closure iterator transformation features provided by Nim. Features include: Asynchronous socket and process I/O HTTP client / server with SSL/TLS support out of the box (no OpenSSL needed) Synchronization primitivies like queues, events and locks Cancellation Efficient dispatch pipeline with excellent multi-platform support Exception effect support","breadcrumbs":"Introduction » Introduction","id":"0","title":"Introduction"},"1":{"body":"Install chronos using nimble: nimble install chronos or add a dependency to your .nimble file: requires \"chronos\" and start using it: import chronos/apps/http/httpclient proc retrievePage*(uri: string): Future[string] {.async.} = # Create a new HTTP session let httpSession = HttpSessionRef.new() try: # Fetch page contents let resp = await httpSession.fetch(parseUri(uri)) # Convert response to a string, assuming its encoding matches the terminal! bytesToString(resp.data) finally: # Close the session await noCancel(httpSession.closeWait()) echo waitFor retrievePage( \"https://raw.githubusercontent.com/status-im/nim-chronos/master/README.md\") There are more examples throughout the manual!","breadcrumbs":"Introduction » Installation","id":"1","title":"Installation"},"10":{"body":"The event handler loop is called a \"dispatcher\" and a single instance per thread is created, as soon as one is needed. Scheduling is done by calling async procedures that return Future objects - each time a procedure is unable to make further progress, for example because it's waiting for some data to arrive, it hands control back to the dispatcher which ensures that the procedure is resumed when ready. A single thread, and thus a single dispatcher, is typically able to handle thousands of concurrent in-progress requests.","breadcrumbs":"Core concepts » The dispatcher","id":"10","title":"The dispatcher"},"11":{"body":"Future objects encapsulate the outcome of executing an async procedure. The Future may be pending meaning that the outcome is not yet known or finished meaning that the return value is available, the operation failed with an exception or was cancelled. Inside an async procedure, you can await the outcome of another async procedure - if the Future representing that operation is still pending, a callback representing where to resume execution will be added to it and the dispatcher will be given back control to deal with other tasks. When a Future is finished, all its callbacks are scheduled to be run by the dispatcher, thus continuing any operations that were waiting for an outcome.","breadcrumbs":"Core concepts » The Future type","id":"11","title":"The Future type"},"12":{"body":"To trigger the processing step of the dispatcher, we need to call poll() - either directly or through a wrapper like runForever() or waitFor(). Each call to poll handles any file descriptors, timers and callbacks that are ready to be processed. Using waitFor, the result of a single asynchronous operation can be obtained: proc myApp() {.async.} = echo \"Waiting for a second...\" await sleepAsync(1.seconds) echo \"done!\" waitFor myApp() It is also possible to keep running the event loop forever using runForever: proc myApp() {.async.} = while true: await sleepAsync(1.seconds) echo \"A bit more than a second passed!\" let future = myApp()\nrunForever() Such an application never terminates, thus it is rare that applications are structured this way. Both `waitFor` and `runForever` call `poll` which offers fine-grained\ncontrol over the event loop steps. Nested calls to `poll` - directly or indirectly via `waitFor` and `runForever`\nare not allowed.","breadcrumbs":"Core concepts » The poll call","id":"12","title":"The poll call"},"13":{"body":"Any pending Future can be cancelled. This can be used for timeouts, to start multiple parallel operations and cancel the rest as soon as one finishes, to initiate the orderely shutdown of an application etc. ## Simple cancellation example import chronos proc someTask() {.async.} = await sleepAsync(10.minutes) proc cancellationExample() {.async.} = # Start a task but don't wait for it to finish let future = someTask() future.cancelSoon() # `cancelSoon` schedules but does not wait for the future to get cancelled - # it might still be pending here let future2 = someTask() # Start another task concurrently await future2.cancelAndWait() # Using `cancelAndWait`, we can be sure that `future2` is either # complete, failed or cancelled at this point. `future` could still be # pending! assert future2.finished() waitFor(cancellationExample()) Even if cancellation is initiated, it is not guaranteed that the operation gets cancelled - the future might still be completed or fail depending on the order of events in the dispatcher and the specifics of the operation. If the future indeed gets cancelled, await will raise a CancelledError as is likely to happen in the following example: proc c1 {.async.} = echo \"Before sleep\" try: await sleepAsync(10.minutes) echo \"After sleep\" # not reach due to cancellation except CancelledError as exc: echo \"We got cancelled!\" # `CancelledError` is typically re-raised to notify the caller that the # operation is being cancelled raise exc proc c2 {.async.} = await c1() echo \"Never reached, since the CancelledError got re-raised\" let work = c2()\nwaitFor(work.cancelAndWait()) The CancelledError will now travel up the stack like any other exception. It can be caught for instance to free some resources and is then typically re-raised for the whole chain operations to get cancelled. Alternatively, the cancellation request can be translated to a regular outcome of the operation - for example, a read operation might return an empty result. Cancelling an already-finished Future has no effect, as the following example of downloading two web pages concurrently shows: ## Make two http requests concurrently and output the one that wins import chronos\nimport ./httpget proc twoGets() {.async.} = let futs = @[ # Both pages will start downloading concurrently... httpget.retrievePage(\"https://duckduckgo.com/?q=chronos\"), httpget.retrievePage(\"https://www.google.fr/search?q=chronos\") ] # Wait for at least one request to finish.. let winner = await one(futs) # ..and cancel the others since we won't need them for fut in futs: # Trying to cancel an already-finished future is harmless fut.cancelSoon() # An exception could be raised here if the winning request failed! echo \"Result: \", winner.read() waitFor(twoGets())","breadcrumbs":"Core concepts » Cancellation","id":"13","title":"Cancellation"},"14":{"body":"When calling a procedure that returns a Future, ownership of that Future is shared between the callee that created it and the caller that waits for it to be finished. The Future can be thought of as a single-item channel between a producer and a consumer. The producer creates the Future and is responsible for completing or failing it while the caller waits for completion and may cancel it. Although it is technically possible, callers must not complete or fail futures and callees or other intermediate observers must not cancel them as this may lead to panics and shutdown (ie if the future is completed twice or a cancalletion is not handled by the original caller).","breadcrumbs":"Core concepts » Ownership","id":"14","title":"Ownership"},"15":{"body":"Certain operations must not be cancelled for semantic reasons. Common scenarios include closeWait that releases a resources irrevocably and composed operations whose individual steps should be performed together or not at all. In such cases, the noCancel modifier to await can be used to temporarily disable cancellation propagation, allowing the operation to complete even if the caller initiates a cancellation request: proc deepSleep(dur: Duration) {.async.} = # `noCancel` prevents any cancellation request by the caller of `deepSleep` # from reaching `sleepAsync` - even if `deepSleep` is cancelled, its future # will not complete until the sleep finishes. await noCancel sleepAsync(dur) let future = deepSleep(10.minutes) # This will take ~10 minutes even if we try to cancel the call to `deepSleep`!\nawait cancelAndWait(future)","breadcrumbs":"Core concepts » noCancel","id":"15","title":"noCancel"},"16":{"body":"The join modifier to await allows cancelling an async procedure without propagating the cancellation to the awaited operation. This is useful when await:ing a Future for monitoring purposes, ie when a procedure is not the owner of the future that's being await:ed. One situation where this happens is when implementing the \"observer\" pattern, where a helper monitors an operation it did not initiate: var tick: Future[void]\nproc ticker() {.async.} = while true: tick = sleepAsync(1.second) await tick echo \"tick!\" proc tocker() {.async.} = # This operation does not own or implement the operation behind `tick`, # so it should not cancel it when `tocker` is cancelled await join tick echo \"tock!\" let fut = ticker() # `ticker` is now looping and most likely waiting for `tick` fut2 = tocker() # both `ticker` and `tocker` are waiting for `tick` # We don't want `tocker` to cancel a future that was created in `ticker`\nwaitFor fut2.cancelAndWait() waitFor fut # keeps printing `tick!` every second.","breadcrumbs":"Core concepts » join","id":"16","title":"join"},"17":{"body":"chronos contains several compile-time configuration options enabling stricter compile-time checks and debugging helpers whose runtime cost may be significant. Strictness options generally will become default in future chronos releases and allow adapting existing code without changing the new version - see the config.nim module for more information. Found a bug? Edit this page on GitHub.","breadcrumbs":"Core concepts » Compile-time configuration","id":"17","title":"Compile-time configuration"},"18":{"body":"Async procedures are those that interact with chronos to cooperatively suspend and resume their execution depending on the completion of other async procedures, timers, tasks on other threads or asynchronous I/O scheduled with the operating system. Async procedures are marked with the {.async.} pragma and return a Future indicating the state of the operation. The async pragma await keyword Raw async procedures Callbacks and closures","breadcrumbs":"async functions » Async procedures","id":"18","title":"Async procedures"},"19":{"body":"The {.async.} pragma will transform a procedure (or a method) returning a Future into a closure iterator. If there is no return type specified, Future[void] is returned. proc p() {.async.} = await sleepAsync(100.milliseconds) echo p().type # prints \"Future[system.void]\"","breadcrumbs":"async functions » The async pragma","id":"19","title":"The async pragma"},"2":{"body":"Several platforms are supported, with different backend options : Windows: IOCP Linux: epoll / poll OSX / BSD: kqueue / poll Android / Emscripten / posix: poll","breadcrumbs":"Introduction » Platform support","id":"2","title":"Platform support"},"20":{"body":"The await keyword operates on Future instances typically returned from an async procedure. Whenever await is encountered inside an async procedure, control is given back to the dispatcher for as many steps as it's necessary for the awaited future to complete, fail or be cancelled. await calls the equivalent of Future.read() on the completed future to return the encapsulated value when the operation finishes. proc p1() {.async.} = await sleepAsync(1.seconds) proc p2() {.async.} = await sleepAsync(1.seconds) proc p3() {.async.} = let fut1 = p1() fut2 = p2() # Just by executing the async procs, both resulting futures entered the # dispatcher queue and their \"clocks\" started ticking. await fut1 await fut2 # Only one second passed while awaiting them both, not two. waitFor p3() Because `async` procedures are executed concurrently, they are subject to many\nof the same risks that typically accompany multithreaded programming. In particular, if two `async` procedures have access to the same mutable state,\nthe value before and after `await` might not be the same as the order of execution is not guaranteed!","breadcrumbs":"async functions » await keyword","id":"20","title":"await keyword"},"21":{"body":"Raw async procedures are those that interact with chronos via the Future type but whose body does not go through the async transformation. Such functions are created by adding raw: true to the async parameters: proc rawAsync(): Future[void] {.async: (raw: true).} = let fut = newFuture[void](\"rawAsync\") fut.complete() fut Raw functions must not raise exceptions directly - they are implicitly declared as raises: [] - instead they should store exceptions in the returned Future: proc rawFailure(): Future[void] {.async: (raw: true).} = let fut = newFuture[void](\"rawAsync\") fut.fail((ref ValueError)(msg: \"Oh no!\")) fut Raw procedures can also use checked exceptions: proc rawAsyncRaises(): Future[void] {.async: (raw: true, raises: [IOError]).} = let fut = newFuture[void]() assert not (compiles do: fut.fail((ref ValueError)(msg: \"uh-uh\"))) fut.fail((ref IOError)(msg: \"IO\")) fut","breadcrumbs":"async functions » Raw async procedures","id":"21","title":"Raw async procedures"},"22":{"body":"Callback/closure types are declared using the async annotation as usual: type MyCallback = proc(): Future[void] {.async.} proc runCallback(cb: MyCallback) {.async: (raises: []).} = try: await cb() except CatchableError: discard # handle errors as usual When calling a callback, it is important to remember that it may raise exceptions that need to be handled. Checked exceptions can be used to limit the exceptions that a callback can raise: type MyEasyCallback = proc(): Future[void] {.async: (raises: []).} proc runCallback(cb: MyEasyCallback) {.async: (raises: [])} = await cb() Found a bug? Edit this page on GitHub.","breadcrumbs":"async functions » Callbacks and closures","id":"22","title":"Callbacks and closures"},"23":{"body":"Exceptions Checked exceptions The Exception type Compatibility modes","breadcrumbs":"Errors and exceptions » Errors and exceptions","id":"23","title":"Errors and exceptions"},"24":{"body":"Exceptions inheriting from CatchableError interrupt execution of an async procedure. The exception is placed in the Future.error field while changing the status of the Future to Failed and callbacks are scheduled. When a future is read or awaited the exception is re-raised, traversing the async execution chain until handled. proc p1() {.async.} = await sleepAsync(1.seconds) raise newException(ValueError, \"ValueError inherits from CatchableError\") proc p2() {.async.} = await sleepAsync(1.seconds) proc p3() {.async.} = let fut1 = p1() fut2 = p2() await fut1 echo \"unreachable code here\" await fut2 # `waitFor()` would call `Future.read()` unconditionally, which would raise the\n# exception in `Future.error`.\nlet fut3 = p3()\nwhile not(fut3.finished()): poll() echo \"fut3.state = \", fut3.state # \"Failed\"\nif fut3.failed(): echo \"p3() failed: \", fut3.error.name, \": \", fut3.error.msg # prints \"p3() failed: ValueError: ValueError inherits from CatchableError\" You can put the await in a try block, to deal with that exception sooner: proc p3() {.async.} = let fut1 = p1() fut2 = p2() try: await fut1 except CachableError: echo \"p1() failed: \", fut1.error.name, \": \", fut1.error.msg echo \"reachable code here\" await fut2 Because chronos ensures that all exceptions are re-routed to the Future, poll will not itself raise exceptions. poll may still panic / raise Defect if such are raised in user code due to undefined behavior.","breadcrumbs":"Errors and exceptions » Exceptions","id":"24","title":"Exceptions"},"25":{"body":"By specifying a raises list to an async procedure, you can check which exceptions can be raised by it: proc p1(): Future[void] {.async: (raises: [IOError]).} = assert not (compiles do: raise newException(ValueError, \"uh-uh\")) raise newException(IOError, \"works\") # Or any child of IOError proc p2(): Future[void] {.async, (raises: [IOError]).} = await p1() # Works, because await knows that p1 # can only raise IOError Under the hood, the return type of p1 will be rewritten to an internal type which will convey raises informations to await. Most `async` include `CancelledError` in the list of `raises`, indicating that\nthe operation they implement might get cancelled resulting in neither value nor\nerror! When using checked exceptions, the Future type is modified to include raises information - it can be constructed with the Raising helper: # Create a variable of the type that will be returned by a an async function\n# raising `[CancelledError]`:\nvar fut: Future[int].Raising([CancelledError]) `Raising` creates a specialization of `InternalRaisesFuture` type - as the name\nsuggests, this is an internal type whose implementation details are likely to\nchange in future `chronos` versions.","breadcrumbs":"Errors and exceptions » Checked exceptions","id":"25","title":"Checked exceptions"},"26":{"body":"Exceptions deriving from Exception are not caught by default as these may include Defect and other forms undefined or uncatchable behavior. Because exception effect tracking is turned on for async functions, this may sometimes lead to compile errors around forward declarations, methods and closures as Nim conservatively asssumes that any Exception might be raised from those. Make sure to explicitly annotate these with {.raises.}: # Forward declarations need to explicitly include a raises list:\nproc myfunction() {.raises: [ValueError].} # ... as do `proc` types\ntype MyClosure = proc() {.raises: [ValueError].} proc myfunction() = raise (ref ValueError)(msg: \"Implementation here\") let closure: MyClosure = myfunction","breadcrumbs":"Errors and exceptions » The Exception type","id":"26","title":"The Exception type"},"27":{"body":"Individual functions. For compatibility, async functions can be instructed to handle Exception as well, specifying handleException: true. Any Exception that is not a Defect and not a CatchableError will then be caught and remapped to AsyncExceptionError: proc raiseException() {.async: (handleException: true, raises: [AsyncExceptionError]).} = raise (ref Exception)(msg: \"Raising Exception is UB\") proc callRaiseException() {.async: (raises: []).} = try: await raiseException() except AsyncExceptionError as exc: # The original Exception is available from the `parent` field echo exc.parent.msg Global flag. This mode can be enabled globally with -d:chronosHandleException as a help when porting code to chronos. The behavior in this case will be that: old-style functions annotated with plain async will behave as if they had been annotated with async: (handleException: true). This is functionally equivalent to async: (handleException: true, raises: [CatchableError]) and will, as before, remap any Exception that is not Defect into AsyncExceptionError, while also allowing any CatchableError (including AsyncExceptionError) to get through without compilation errors. New-style functions with async: (raises: [...]) annotations or their own handleException annotations will not be affected. The rationale here is to allow one to incrementally introduce exception annotations and get compiler feedback while not requiring that every bit of legacy code is updated at once. This should be used sparingly and with care, however, as global configuration settings may interfere with libraries that use chronos leading to unexpected behavior. Found a bug? Edit this page on GitHub.","breadcrumbs":"Errors and exceptions » Compatibility modes","id":"27","title":"Compatibility modes"},"28":{"body":"While the cooperative async model offers an efficient model for dealing with many tasks that often are blocked on I/O, it is not suitable for long-running computations that would prevent concurrent tasks from progressing. Multithreading offers a way to offload heavy computations to be executed in parallel with the async work, or, in cases where a single event loop gets overloaded, to manage multiple event loops in parallel. For interaction between threads, the ThreadSignalPtr type (found in the (chronos/threadsync)(https://github.com/status-im/nim-chronos/blob/master/chronos/threadsync.nim) module) is used - both to wait for notifications coming from other threads and to notify other threads of progress from within an async procedure. import chronos, chronos/threadsync\nimport os type Context = object # Context allocated by `createShared` should contain no garbage-collected # types! signal: ThreadSignalPtr value: int proc myThread(ctx: ptr Context) {.thread.} = echo \"Doing some work in a thread\" sleep(3000) ctx.value = 42 echo \"Done, firing the signal\" discard ctx.signal.fireSync().expect(\"correctly initialized signal should not fail\") proc main() {.async.} = let signal = ThreadSignalPtr.new().expect(\"free file descriptor for signal\") context = createShared(Context) context.signal = signal var thread: Thread[ptr Context] echo \"Starting thread\" createThread(thread, myThread, context) await signal.wait() echo \"Work done: \", context.value joinThread(thread) signal.close().expect(\"closing once works\") deallocShared(context) waitFor main() Found a bug? Edit this page on GitHub.","breadcrumbs":"Threads » Threads","id":"28","title":"Threads"},"29":{"body":"","breadcrumbs":"Tips, tricks and best practices » Tips, tricks and best practices","id":"29","title":"Tips, tricks and best practices"},"3":{"body":"This guide covers basic usage of chronos - for details, see the API reference . Found a bug? Edit this page on GitHub.","breadcrumbs":"Introduction » API documentation","id":"3","title":"API documentation"},"30":{"body":"To prevent a single task from taking too long, withTimeout can be used: ## Simple timeouts\nimport chronos proc longTask {.async.} = try: await sleepAsync(10.minutes) except CancelledError as exc: echo \"Long task was cancelled!\" raise exc # Propagate cancellation to the next operation proc simpleTimeout() {.async.} = let task = longTask() # Start a task but don't `await` it if not await task.withTimeout(1.seconds): echo \"Timeout reached - withTimeout should have cancelled the task\" else: echo \"Task completed\" waitFor simpleTimeout() When several tasks should share a single timeout, a common timer can be created with sleepAsync: ## Single timeout for several operations\nimport chronos proc shortTask {.async.} = try: await sleepAsync(1.seconds) except CancelledError as exc: echo \"Short task was cancelled!\" raise exc # Propagate cancellation to the next operation proc composedTimeout() {.async.} = let # Common timout for several sub-tasks timeout = sleepAsync(10.seconds) while not timeout.finished(): let task = shortTask() # Start a task but don't `await` it if (await race(task, timeout)) == task: echo \"Ran one more task\" else: # This cancellation may or may not happen as task might have finished # right at the timeout! task.cancelSoon() waitFor composedTimeout()","breadcrumbs":"Tips, tricks and best practices » Timeouts","id":"30","title":"Timeouts"},"31":{"body":"When calling an asynchronous procedure without await, the operation is started but its result is not processed until corresponding Future is read. It is therefore important to never discard futures directly - instead, one can discard the result of awaiting the future or use asyncSpawn to monitor the outcome of the future as if it were running in a separate thread. Similar to threads, tasks managed by asyncSpawn may causes the application to crash if any exceptions leak out of it - use checked exceptions to avoid this problem. ## The peculiarities of `discard` in `async` procedures\nimport chronos proc failingOperation() {.async.} = echo \"Raising!\" raise (ref ValueError)(msg: \"My error\") proc myApp() {.async.} = # This style of discard causes the `ValueError` to be discarded, hiding the # failure of the operation - avoid! discard failingOperation() proc runAsTask(fut: Future[void]): Future[void] {.async: (raises: []).} = # runAsTask uses `raises: []` to ensure at compile-time that no exceptions # escape it! try: await fut except CatchableError as exc: echo \"The task failed! \", exc.msg # asyncSpawn ensures that errors don't leak unnoticed from tasks without # blocking: asyncSpawn runAsTask(failingOperation()) # If we didn't catch the exception with `runAsTask`, the program will crash: asyncSpawn failingOperation() waitFor myApp() Found a bug? Edit this page on GitHub.","breadcrumbs":"Tips, tricks and best practices » discard","id":"31","title":"discard"},"32":{"body":"Chronos v3 asyncdispatch Supporting multiple backends Thanks to its macro support, Nim allows async/await to be implemented in libraries with only minimal support from the language - as such, multiple async libraries exist, including chronos and asyncdispatch, and more may come to be developed in the futures.","breadcrumbs":"Porting code to chronos » Porting code to chronos v4","id":"32","title":"Porting code to chronos v4"},"33":{"body":"Chronos v4 introduces new features for IPv6, exception effects, a stand-alone Future type as well as several other changes - when upgrading from chronos v3, here are several things to consider: Exception handling is now strict by default - see the error handling chapter for how to deal with raises effects AsyncEventBus was removed - use AsyncEventQueue instead Future.value and Future.error panic when accessed in the wrong state Future.read and Future.readError raise FutureError instead of ValueError when accessed in the wrong state","breadcrumbs":"Porting code to chronos » Chronos v3","id":"33","title":"Chronos v3"},"34":{"body":"Code written for asyncdispatch and chronos looks similar but there are several differences to be aware of: chronos has its own dispatch loop - you can typically not mix chronos and asyncdispatch in the same thread import chronos instead of import asyncdispatch cleanup is important - make sure to use closeWait to release any resources you're using or file descriptor and other leaks will ensue cancellation support means that CancelledError may be raised from most {.async.} functions Calling yield directly in tasks is not supported - instead, use awaitne. asyncSpawn is used instead of asyncCheck - note that exceptions raised in tasks that are asyncSpawn:ed cause panic","breadcrumbs":"Porting code to chronos » asyncdispatch","id":"34","title":"asyncdispatch"},"35":{"body":"Libraries built on top of async/await may wish to support multiple async backends - the best way to do so is to create separate modules for each backend that may be imported side-by-side - see nim-metrics for an example. An alternative way is to select backend using a global compile flag - this method makes it diffucult to compose applications that use both backends as may happen with transitive dependencies, but may be appropriate in some cases - libraries choosing this path should call the flag asyncBackend, allowing applications to choose the backend with -d:asyncBackend=. Known async backends include: chronos - this library (-d:asyncBackend=chronos) asyncdispatch the standard library asyncdispatch module (-d:asyncBackend=asyncdispatch) none - -d:asyncBackend=none - disable async support completely none can be used when a library supports both a synchronous and asynchronous API, to disable the latter. Found a bug? Edit this page on GitHub.","breadcrumbs":"Porting code to chronos » Supporting multiple backends","id":"35","title":"Supporting multiple backends"},"36":{"body":"Chronos provides a powerful mechanism for customizing HTTP request handlers via middlewares. A middleware is a coroutine that can modify, block or filter HTTP request. Single HTTP server could support unlimited number of middlewares, but you need to consider that each request in worst case could go through all the middlewares, and therefore a huge number of middlewares can have a significant impact on HTTP server performance. Order of middlewares is also important: right after HTTP server has received request, it will be sent to the first middleware in list, and each middleware will be responsible for passing control to other middlewares. Therefore, when building a list, it would be a good idea to place the request handlers at the end of the list, while keeping the middleware that could block or modify the request at the beginning of the list. Middleware could also modify HTTP server request, and these changes will be visible to all handlers (either middlewares or the original request handler). This can be done using the following helpers: proc updateRequest*(request: HttpRequestRef, scheme: string, meth: HttpMethod, version: HttpVersion, requestUri: string, headers: HttpTable): HttpResultMessage[void] proc updateRequest*(request: HttpRequestRef, meth: HttpMethod, requestUri: string, headers: HttpTable): HttpResultMessage[void] proc updateRequest*(request: HttpRequestRef, requestUri: string, headers: HttpTable): HttpResultMessage[void] proc updateRequest*(request: HttpRequestRef, requestUri: string): HttpResultMessage[void] proc updateRequest*(request: HttpRequestRef, headers: HttpTable): HttpResultMessage[void] As you can see all the HTTP request parameters could be modified: request method, version, request path and request headers. Middleware could also use helpers to obtain more information about remote and local addresses of request's connection (this could be helpful when you need to do some IP address filtering). proc remote*(request: HttpRequestRef): Opt[TransportAddress] ## Returns remote address of HTTP request's connection. proc local*(request: HttpRequestRef): Opt[TransportAddress] = ## Returns local address of HTTP request's connection. Every middleware is the coroutine which looks like this: proc middlewareHandler( middleware: HttpServerMiddlewareRef, reqfence: RequestFence, nextHandler: HttpProcessCallback2 ): Future[HttpResponseRef] {.async: (raises: [CancelledError]).} = Where middleware argument is the object which could hold some specific values, reqfence is HTTP request which is enclosed with HTTP server error information and nextHandler is reference to next request handler, it could be either middleware handler or the original request processing callback handler. await nextHandler(reqfence) You should perform await for the response from the nextHandler(reqfence). Usually you should call next handler when you dont want to handle request or you dont know how to handle it, for example: proc middlewareHandler( middleware: HttpServerMiddlewareRef, reqfence: RequestFence, nextHandler: HttpProcessCallback2 ): Future[HttpResponseRef] {.async: (raises: [CancelledError]).} = if reqfence.isErr(): # We dont know or do not want to handle failed requests, so we call next handler. return await nextHandler(reqfence) let request = reqfence.get() if request.uri.path == \"/path/we/able/to/respond\": try: # Sending some response. await request.respond(Http200, \"TEST\") except HttpWriteError as exc: # We could also return default response for exception or other types of error. defaultResponse(exc) elif request.uri.path == \"/path/for/rewrite\": # We going to modify request object for this request, next handler will receive it with different request path. let res = request.updateRequest(\"/path/to/new/location\") if res.isErr(): return defaultResponse(res.error) await nextHandler(reqfence) elif request.uri.path == \"/restricted/path\": if request.remote().isNone(): # We can't obtain remote address, so we force HTTP server to respond with `401 Unauthorized` status code. return codeResponse(Http401) if $(request.remote().get()).startsWith(\"127.0.0.1\"): # Remote peer's address starts with \"127.0.0.1\", sending proper response. await request.respond(Http200, \"AUTHORIZED\") else: # Force HTTP server to respond with `403 Forbidden` status code. codeResponse(Http403) elif request.uri.path == \"/blackhole\": # Force HTTP server to drop connection with remote peer. dropResponse() else: # All other requests should be handled by somebody else. await nextHandler(reqfence) Found a bug? Edit this page on GitHub.","breadcrumbs":"HTTP server middleware » HTTP server middleware","id":"36","title":"HTTP server middleware"},"37":{"body":"Found a bug? Edit this page on GitHub.","breadcrumbs":"Updating this book » Updating this book","id":"37","title":"Updating this book"},"4":{"body":"Examples are available in the docs/examples/ folder.","breadcrumbs":"Examples » Examples","id":"4","title":"Examples"},"5":{"body":"cancellation - Cancellation primer timeoutsimple - Simple timeouts timeoutcomposed - Shared timeout of multiple tasks","breadcrumbs":"Examples » Basic concepts","id":"5","title":"Basic concepts"},"6":{"body":"signalling - Cross-thread signalling","breadcrumbs":"Examples » Threads","id":"6","title":"Threads"},"7":{"body":"tcpserver - Simple TCP/IP v4/v6 echo server","breadcrumbs":"Examples » TCP","id":"7","title":"TCP"},"8":{"body":"httpget - Downloading a web page using the http client twogets - Download two pages concurrently middleware - Deploy multiple HTTP server middlewares Found a bug? Edit this page on GitHub.","breadcrumbs":"Examples » HTTP","id":"8","title":"HTTP"},"9":{"body":"Async/await is a programming model that relies on cooperative multitasking to coordinate the concurrent execution of procedures, using event notifications from the operating system or other treads to resume execution. Code execution happens in a loop that alternates between making progress on tasks and handling events. The dispatcher The Future type The poll call Cancellation Compile-time configuration","breadcrumbs":"Core concepts » Concepts","id":"9","title":"Concepts"}},"length":38,"save":true},"fields":["title","body","breadcrumbs"],"index":{"body":{"root":{"1":{"0":{"df":1,"docs":{"15":{"tf":1.0}}},"2":{"7":{".":{"0":{".":{"0":{".":{"1":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"0":{"1":{"df":1,"docs":{"36":{"tf":1.0}}},"3":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"a":{"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"20":{"tf":1.0},"33":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":1,"docs":{"20":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"d":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}}},"d":{"df":1,"docs":{"1":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"36":{"tf":2.449489742783178}}}}}}},"df":2,"docs":{"11":{"tf":1.0},"21":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{},"w":{"df":7,"docs":{"12":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"27":{"tf":1.4142135623730951},"32":{"tf":1.0},"35":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"33":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"13":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":3,"docs":{"13":{"tf":1.0},"35":{"tf":1.0},"9":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}},"n":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":3,"docs":{"22":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":2.23606797749979}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"11":{"tf":1.0},"13":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"i":{"df":2,"docs":{"3":{"tf":1.4142135623730951},"35":{"tf":1.0}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":4,"docs":{"12":{"tf":1.4142135623730951},"13":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"35":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"26":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":3,"docs":{"13":{"tf":1.0},"21":{"tf":1.0},"25":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"26":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"1":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"n":{"c":{"/":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.0},"32":{"tf":1.0},"35":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"35":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":3,"docs":{"32":{"tf":1.4142135623730951},"34":{"tf":2.0},"35":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":23,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.7320508075688772},"12":{"tf":1.4142135623730951},"13":{"tf":2.23606797749979},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"18":{"tf":2.6457513110645907},"19":{"tf":1.7320508075688772},"20":{"tf":2.8284271247461903},"21":{"tf":2.6457513110645907},"22":{"tf":2.23606797749979},"24":{"tf":2.449489742783178},"25":{"tf":2.23606797749979},"26":{"tf":1.0},"27":{"tf":2.6457513110645907},"28":{"tf":2.0},"30":{"tf":2.0},"31":{"tf":2.0},"32":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.7320508075688772},"36":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"u":{"df":1,"docs":{"33":{"tf":1.0}}}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}}}},"x":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"27":{"tf":2.23606797749979}}}}}}}}}}}}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":5,"docs":{"0":{"tf":1.0},"12":{"tf":1.0},"18":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{":":{"df":1,"docs":{"34":{"tf":1.0}}},"df":2,"docs":{"31":{"tf":2.23606797749979},"34":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"11":{"tf":1.0},"27":{"tf":1.0},"4":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"31":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{":":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}},"df":17,"docs":{"1":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.4142135623730951},"13":{"tf":2.449489742783178},"15":{"tf":1.7320508075688772},"16":{"tf":2.0},"18":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":3.3166247903554},"22":{"tf":1.4142135623730951},"24":{"tf":2.8284271247461903},"25":{"tf":1.7320508075688772},"27":{"tf":1.0},"28":{"tf":1.0},"30":{"tf":2.449489742783178},"31":{"tf":1.7320508075688772},"36":{"tf":2.6457513110645907}},"n":{"df":1,"docs":{"34":{"tf":1.0}}}}},"r":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":3,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"20":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"2":{"tf":1.0},"32":{"tf":1.0},"35":{"tf":2.6457513110645907}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"3":{"tf":1.0},"5":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"17":{"tf":1.0}}}}},"df":2,"docs":{"13":{"tf":1.0},"16":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"13":{"tf":1.0},"20":{"tf":1.0},"27":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"v":{"df":1,"docs":{"27":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"24":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"29":{"tf":1.0},"35":{"tf":1.0}}}},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"14":{"tf":1.4142135623730951},"28":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"12":{"tf":1.0},"27":{"tf":1.0}}}},"l":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":4,"docs":{"24":{"tf":1.0},"28":{"tf":1.0},"31":{"tf":1.0},"36":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"o":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"21":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"37":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":6,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"16":{"tf":1.0},"20":{"tf":1.4142135623730951},"28":{"tf":1.0},"35":{"tf":1.4142135623730951}}}},"x":{"df":1,"docs":{"0":{"tf":1.0}}}},"s":{"d":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"g":{"df":10,"docs":{"17":{"tf":1.0},"22":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"3":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"8":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":1,"docs":{"35":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{".":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}}}}}}},"c":{"1":{"df":1,"docs":{"13":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"13":{"tf":1.4142135623730951}}},"a":{"c":{"df":0,"docs":{},"h":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"/":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"22":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":6,"docs":{"11":{"tf":1.4142135623730951},"12":{"tf":1.0},"18":{"tf":1.0},"22":{"tf":1.7320508075688772},"24":{"tf":1.0},"36":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"12":{"tf":2.23606797749979},"14":{"tf":1.0},"15":{"tf":1.0},"20":{"tf":1.0},"22":{"tf":1.0},"24":{"tf":1.0},"31":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"9":{"tf":1.0}},"e":{"df":1,"docs":{"14":{"tf":1.4142135623730951}},"r":{"df":3,"docs":{"13":{"tf":1.0},"14":{"tf":2.0},"15":{"tf":1.4142135623730951}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"df":1,"docs":{"13":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":12,"docs":{"0":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":4.123105625617661},"14":{"tf":1.4142135623730951},"15":{"tf":2.449489742783178},"16":{"tf":2.23606797749979},"20":{"tf":1.0},"25":{"tf":1.0},"30":{"tf":2.449489742783178},"34":{"tf":1.0},"5":{"tf":1.4142135623730951},"9":{"tf":1.0}},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":5,"docs":{"13":{"tf":2.23606797749979},"25":{"tf":1.4142135623730951},"30":{"tf":1.4142135623730951},"34":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"27":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":5,"docs":{"15":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"22":{"tf":1.0},"24":{"tf":1.7320508075688772},"27":{"tf":1.7320508075688772},"31":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":3,"docs":{"13":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.0}}}}},"s":{"df":2,"docs":{"31":{"tf":1.4142135623730951},"34":{"tf":1.0}}}}},"b":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}}}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"13":{"tf":1.0},"24":{"tf":1.0}}}},"n":{"df":0,"docs":{},"g":{"df":5,"docs":{"17":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"33":{"tf":1.0},"36":{"tf":1.0}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"14":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"33":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":6,"docs":{"17":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.7320508075688772},"31":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"35":{"tf":1.4142135623730951}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":18,"docs":{"0":{"tf":1.0},"1":{"tf":1.7320508075688772},"13":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"18":{"tf":1.0},"21":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"27":{"tf":1.4142135623730951},"28":{"tf":1.0},"3":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0},"32":{"tf":1.7320508075688772},"33":{"tf":1.7320508075688772},"34":{"tf":2.0},"35":{"tf":1.0},"36":{"tf":1.0}},"s":{"/":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"b":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"28":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{")":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{"/":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"28":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"34":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"0":{"tf":1.0},"8":{"tf":1.0}}}}}},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"20":{"tf":1.0}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"1":{"tf":1.0}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"15":{"tf":1.0},"34":{"tf":1.0}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"r":{"df":5,"docs":{"0":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"22":{"tf":1.0},"26":{"tf":1.4142135623730951}}}}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":7,"docs":{"17":{"tf":1.0},"24":{"tf":1.7320508075688772},"27":{"tf":1.4142135623730951},"32":{"tf":1.0},"34":{"tf":1.0},"36":{"tf":1.4142135623730951},"9":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"4":{"0":{"1":{"df":1,"docs":{"36":{"tf":1.0}}},"3":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"e":{"df":2,"docs":{"28":{"tf":1.0},"32":{"tf":1.0}}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"15":{"tf":1.0},"30":{"tf":1.4142135623730951}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"23":{"tf":1.0},"27":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":8,"docs":{"17":{"tf":1.7320508075688772},"21":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.4142135623730951},"31":{"tf":1.0},"35":{"tf":1.0},"9":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":7,"docs":{"13":{"tf":1.4142135623730951},"14":{"tf":2.0},"15":{"tf":1.4142135623730951},"18":{"tf":1.0},"20":{"tf":1.4142135623730951},"30":{"tf":1.0},"35":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"15":{"tf":1.0},"35":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}}}}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.4142135623730951}}}}}},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"5":{"tf":1.0},"9":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":6,"docs":{"10":{"tf":1.0},"13":{"tf":2.0},"20":{"tf":1.0},"28":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"17":{"tf":1.4142135623730951},"27":{"tf":1.0},"9":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":2.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":1,"docs":{"26":{"tf":1.0}}}}},"i":{"d":{"df":2,"docs":{"33":{"tf":1.0},"36":{"tf":1.0}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"14":{"tf":1.0}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"0":{"tf":1.0},"17":{"tf":1.0},"28":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}}}},"x":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"28":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"28":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"28":{"tf":2.449489742783178}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"11":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":5,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"20":{"tf":1.0},"36":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}}}},"y":{"df":1,"docs":{"25":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"18":{"tf":1.0},"28":{"tf":1.0},"9":{"tf":1.0}}}}},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"31":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"3":{"tf":1.0}}}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"31":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":8,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"14":{"tf":1.4142135623730951},"16":{"tf":1.0},"21":{"tf":1.0},"25":{"tf":1.4142135623730951},"30":{"tf":1.0},"35":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"28":{"tf":1.0}},"e":{"d":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"6":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"28":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"28":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}},"d":{":":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"=":{"<":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"35":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"35":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"35":{"tf":1.0}}}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"35":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"11":{"tf":1.0},"24":{"tf":1.0},"28":{"tf":1.0},"33":{"tf":1.0}},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"17":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"21":{"tf":1.0},"22":{"tf":1.0},"26":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"(":{"1":{"0":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"15":{"tf":1.7320508075688772}}}}}}}}},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":4,"docs":{"17":{"tf":1.0},"26":{"tf":1.0},"33":{"tf":1.0},"36":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"c":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"24":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"18":{"tf":1.0},"35":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":1,"docs":{"8":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"26":{"tf":1.0}}}}},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"12":{"tf":1.0},"28":{"tf":1.0},"34":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"25":{"tf":1.0},"3":{"tf":1.0}}}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"32":{"tf":1.0}}}}}}}},"i":{"d":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"2":{"tf":1.0},"34":{"tf":1.0},"36":{"tf":1.0}}}},"u":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"35":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":4,"docs":{"12":{"tf":1.4142135623730951},"21":{"tf":1.0},"31":{"tf":1.0},"34":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"15":{"tf":1.0},"35":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"22":{"tf":1.0},"28":{"tf":1.0},"31":{"tf":2.6457513110645907}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":8,"docs":{"0":{"tf":1.0},"10":{"tf":2.0},"11":{"tf":1.4142135623730951},"12":{"tf":1.0},"13":{"tf":1.0},"20":{"tf":1.4142135623730951},"34":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"o":{"c":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"4":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}}}}}},"df":1,"docs":{"28":{"tf":1.0}},"n":{"'":{"df":0,"docs":{},"t":{"df":4,"docs":{"13":{"tf":1.0},"16":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":4,"docs":{"10":{"tf":1.0},"12":{"tf":1.0},"28":{"tf":1.4142135623730951},"36":{"tf":1.0}}},"t":{"df":1,"docs":{"36":{"tf":1.7320508075688772}}}},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":2,"docs":{"13":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"36":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}}}}}},"u":{"df":0,"docs":{},"e":{"df":2,"docs":{"13":{"tf":1.0},"24":{"tf":1.0}}},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":4,"docs":{"10":{"tf":1.0},"12":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":11,"docs":{"1":{"tf":1.0},"12":{"tf":1.7320508075688772},"13":{"tf":2.23606797749979},"16":{"tf":1.4142135623730951},"19":{"tf":1.0},"24":{"tf":2.23606797749979},"27":{"tf":1.0},"28":{"tf":2.0},"30":{"tf":2.23606797749979},"31":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":10,"docs":{"17":{"tf":1.0},"22":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"3":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.0},"13":{"tf":1.0},"26":{"tf":1.0},"33":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"i":{"df":2,"docs":{"0":{"tf":1.0},"28":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"36":{"tf":1.7320508075688772}}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"13":{"tf":1.0}}}}},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"17":{"tf":1.0},"27":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":2,"docs":{"11":{"tf":1.0},"20":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"36":{"tf":1.0}}}}},"o":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}}}}},"d":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":1,"docs":{"34":{"tf":1.0}},"r":{"df":3,"docs":{"10":{"tf":1.0},"24":{"tf":1.0},"31":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"2":{"tf":1.0}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"20":{"tf":1.0},"27":{"tf":1.0}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":8,"docs":{"22":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.0},"31":{"tf":1.4142135623730951},"33":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}}},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"c":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"13":{"tf":1.0},"15":{"tf":1.7320508075688772}},"t":{"df":6,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"12":{"tf":1.4142135623730951},"13":{"tf":1.0},"28":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":6,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"13":{"tf":2.0},"35":{"tf":1.0},"36":{"tf":1.0},"4":{"tf":1.4142135623730951}}}}}},"c":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"31":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":5,"docs":{"13":{"tf":1.4142135623730951},"27":{"tf":1.0},"30":{"tf":2.0},"31":{"tf":1.0},"36":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}},"p":{"df":0,"docs":{},"t":{"df":15,"docs":{"0":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":1.7320508075688772},"21":{"tf":1.7320508075688772},"22":{"tf":2.0},"23":{"tf":2.0},"24":{"tf":3.0},"25":{"tf":1.7320508075688772},"26":{"tf":2.23606797749979},"27":{"tf":2.6457513110645907},"30":{"tf":1.4142135623730951},"31":{"tf":2.23606797749979},"33":{"tf":1.4142135623730951},"34":{"tf":1.0},"36":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{")":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":6,"docs":{"11":{"tf":1.4142135623730951},"18":{"tf":1.0},"20":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951},"28":{"tf":1.0},"9":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"17":{"tf":1.0},"32":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":8,"docs":{"11":{"tf":1.0},"13":{"tf":1.7320508075688772},"14":{"tf":1.4142135623730951},"20":{"tf":1.0},"24":{"tf":2.23606797749979},"28":{"tf":1.0},"31":{"tf":1.0},"36":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.7320508075688772}}}}}}}}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"0":{"tf":1.4142135623730951},"33":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"d":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"24":{"tf":1.0},"27":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"df":4,"docs":{"1":{"tf":1.0},"12":{"tf":1.0},"28":{"tf":1.0},"34":{"tf":1.0}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"12":{"tf":1.0}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":6,"docs":{"11":{"tf":1.4142135623730951},"13":{"tf":2.23606797749979},"14":{"tf":1.0},"15":{"tf":1.0},"20":{"tf":1.0},"30":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"28":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}},"l":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"27":{"tf":1.0},"35":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"4":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"13":{"tf":1.4142135623730951},"36":{"tf":1.0}}}}}},"r":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":1,"docs":{"36":{"tf":1.7320508075688772}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"12":{"tf":1.0}}}},"m":{"df":1,"docs":{"26":{"tf":1.0}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"df":10,"docs":{"17":{"tf":1.0},"22":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.4142135623730951},"3":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":1,"docs":{"13":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":5,"docs":{"21":{"tf":1.4142135623730951},"25":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":2.23606797749979},"34":{"tf":1.0}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.0}}}}}}},"t":{".":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"21":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"(":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"21":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"1":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"24":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":2,"docs":{"20":{"tf":1.4142135623730951},"24":{"tf":2.0}}},"2":{".":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"16":{"tf":1.0},"20":{"tf":1.4142135623730951},"24":{"tf":2.0}}},"3":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"24":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"24":{"tf":1.0}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":1,"docs":{"24":{"tf":1.0}}},"df":5,"docs":{"13":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"21":{"tf":2.449489742783178},"25":{"tf":1.0},"31":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":18,"docs":{"10":{"tf":1.0},"11":{"tf":2.23606797749979},"12":{"tf":1.0},"13":{"tf":2.8284271247461903},"14":{"tf":2.449489742783178},"15":{"tf":1.4142135623730951},"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":2.0},"21":{"tf":1.4142135623730951},"24":{"tf":1.7320508075688772},"25":{"tf":1.4142135623730951},"31":{"tf":2.0},"32":{"tf":1.0},"33":{"tf":1.0},"9":{"tf":1.0}},"e":{".":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"24":{"tf":1.4142135623730951},"33":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":3,"docs":{"20":{"tf":1.0},"24":{"tf":1.0},"33":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"33":{"tf":1.0}}}}},"df":0,"docs":{}}},"2":{".":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}}},"df":1,"docs":{"13":{"tf":1.4142135623730951}}},"[":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}}}}}}}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"]":{".":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"[":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"1":{"tf":1.0}}}},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":6,"docs":{"16":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.7320508075688772},"22":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}}}}}}},"g":{"a":{"df":0,"docs":{},"r":{"b":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.0}}}}},"t":{"df":2,"docs":{"13":{"tf":1.4142135623730951},"28":{"tf":1.0}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{"df":10,"docs":{"17":{"tf":1.0},"22":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"3":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"11":{"tf":1.0},"20":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"b":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"27":{"tf":1.7320508075688772},"35":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"df":2,"docs":{"21":{"tf":1.0},"36":{"tf":1.4142135623730951}},"o":{"d":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"12":{"tf":1.0}}}}},"df":0,"docs":{}},"u":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":2,"docs":{"13":{"tf":1.0},"20":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"10":{"tf":1.0}},"l":{"df":9,"docs":{"10":{"tf":1.0},"12":{"tf":1.0},"14":{"tf":1.0},"22":{"tf":1.4142135623730951},"24":{"tf":1.0},"27":{"tf":1.0},"33":{"tf":1.4142135623730951},"36":{"tf":2.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":2.23606797749979}}}}}},"df":0,"docs":{}}},"r":{"df":2,"docs":{"10":{"tf":1.0},"36":{"tf":3.1622776601683795}}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":5,"docs":{"13":{"tf":1.0},"16":{"tf":1.0},"30":{"tf":1.0},"35":{"tf":1.0},"9":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":2.23606797749979}}}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":1,"docs":{"28":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":2,"docs":{"27":{"tf":1.0},"36":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"25":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}}},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"13":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"26":{"tf":1.0},"27":{"tf":1.0},"33":{"tf":1.0}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}},"o":{"d":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":5,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"13":{"tf":1.0},"36":{"tf":3.872983346207417},"8":{"tf":1.7320508075688772}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{"/":{"/":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"k":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"?":{"df":0,"docs":{},"q":{"=":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"w":{"df":0,"docs":{},"w":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"?":{"df":0,"docs":{},"q":{"=":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}}},"df":2,"docs":{"13":{"tf":1.0},"8":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"2":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"36":{"tf":2.6457513110645907}}}}}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"[":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"36":{"tf":2.23606797749979}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}}},"s":{":":{"/":{"/":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"d":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":1,"docs":{"1":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":2.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}}}}}}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":1,"docs":{"36":{"tf":1.0}}}}}},"i":{"/":{"df":0,"docs":{},"o":{"df":3,"docs":{"0":{"tf":1.0},"18":{"tf":1.0},"28":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"a":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":2,"docs":{"14":{"tf":1.0},"16":{"tf":1.0}}},"m":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"1":{"tf":1.0},"28":{"tf":1.0}}}}}},"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"0":{"tf":1.0},"16":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"26":{"tf":1.0},"32":{"tf":1.0}}}}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"21":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":9,"docs":{"1":{"tf":1.0},"13":{"tf":1.7320508075688772},"22":{"tf":1.0},"28":{"tf":1.4142135623730951},"30":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951},"34":{"tf":1.7320508075688772},"35":{"tf":1.0},"36":{"tf":1.0}}}}}}},"n":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":7,"docs":{"0":{"tf":1.0},"15":{"tf":1.0},"25":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"27":{"tf":1.0},"32":{"tf":1.0},"35":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"13":{"tf":1.0}}},"i":{"c":{"df":2,"docs":{"18":{"tf":1.0},"25":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"12":{"tf":1.0}}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"u":{"df":2,"docs":{"15":{"tf":1.0},"27":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"17":{"tf":1.0},"25":{"tf":1.4142135623730951},"36":{"tf":1.4142135623730951}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.7320508075688772}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":4,"docs":{"13":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.0},"28":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"11":{"tf":1.0},"20":{"tf":1.0}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":1.7320508075688772}}},"n":{"c":{"df":3,"docs":{"10":{"tf":1.0},"13":{"tf":1.0},"20":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"d":{"df":4,"docs":{"21":{"tf":1.0},"31":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":1,"docs":{"28":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"18":{"tf":1.0},"21":{"tf":1.0},"28":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"27":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"25":{"tf":1.4142135623730951}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":2,"docs":{"27":{"tf":1.0},"33":{"tf":1.0}},"t":{"df":1,"docs":{"0":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"c":{"df":0,"docs":{},"p":{"df":1,"docs":{"2":{"tf":1.0}}}},"df":1,"docs":{"21":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{")":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"21":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":2,"docs":{"21":{"tf":1.0},"25":{"tf":2.0}}}}}}}},"p":{"df":1,"docs":{"36":{"tf":1.0}},"v":{"6":{"df":1,"docs":{"33":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}}}}}},"t":{"'":{"df":2,"docs":{"10":{"tf":1.0},"20":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"14":{"tf":1.0}}},"r":{"df":2,"docs":{"0":{"tf":1.0},"19":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"16":{"tf":1.7320508075688772}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":3,"docs":{"12":{"tf":1.0},"16":{"tf":1.0},"36":{"tf":1.0}}}},"y":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"18":{"tf":1.0},"20":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"25":{"tf":1.0},"36":{"tf":1.4142135623730951}},"n":{"df":2,"docs":{"11":{"tf":1.0},"35":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"32":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"35":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":3,"docs":{"14":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.0}}},"df":0,"docs":{},"k":{"df":2,"docs":{"31":{"tf":1.4142135623730951},"34":{"tf":1.0}}}},"df":0,"docs":{},"g":{"a":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"0":{"tf":1.0},"27":{"tf":1.0},"32":{"tf":1.4142135623730951},"35":{"tf":2.23606797749979}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"22":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"x":{"df":1,"docs":{"2":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"25":{"tf":1.4142135623730951},"26":{"tf":1.0},"36":{"tf":2.0}}}}},"o":{"c":{"a":{"df":0,"docs":{},"l":{"*":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"36":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"k":{"df":1,"docs":{"0":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"28":{"tf":1.0},"30":{"tf":1.4142135623730951}},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"k":{"df":2,"docs":{"34":{"tf":1.0},"36":{"tf":1.0}}},"p":{"df":6,"docs":{"10":{"tf":1.0},"12":{"tf":1.4142135623730951},"16":{"tf":1.0},"28":{"tf":1.4142135623730951},"34":{"tf":1.0},"9":{"tf":1.0}}}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":2,"docs":{"0":{"tf":1.0},"32":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"28":{"tf":1.4142135623730951}}}},"k":{"df":0,"docs":{},"e":{"df":6,"docs":{"10":{"tf":1.0},"13":{"tf":1.0},"26":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"9":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"28":{"tf":1.0},"31":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":2,"docs":{"20":{"tf":1.4142135623730951},"28":{"tf":1.0}}},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"18":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"11":{"tf":1.4142135623730951},"34":{"tf":1.0}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"36":{"tf":1.4142135623730951}},"o":{"d":{"df":4,"docs":{"19":{"tf":1.0},"26":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"35":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"d":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"36":{"tf":4.358898943540674},"8":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"32":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}},"x":{"df":1,"docs":{"34":{"tf":1.0}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":2,"docs":{"23":{"tf":1.0},"27":{"tf":1.4142135623730951}},"l":{"df":2,"docs":{"28":{"tf":1.4142135623730951},"9":{"tf":1.0}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":4,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"25":{"tf":1.0},"36":{"tf":2.23606797749979}}}}},"u":{"df":0,"docs":{},"l":{"df":3,"docs":{"17":{"tf":1.0},"28":{"tf":1.0},"35":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"16":{"tf":1.4142135623730951},"31":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":6,"docs":{"1":{"tf":1.0},"12":{"tf":1.0},"17":{"tf":1.0},"30":{"tf":1.0},"32":{"tf":1.0},"36":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"0":{"tf":1.0}},"p":{"df":0,"docs":{},"l":{"df":6,"docs":{"13":{"tf":1.0},"28":{"tf":1.0},"32":{"tf":1.4142135623730951},"35":{"tf":1.4142135623730951},"5":{"tf":1.0},"8":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"9":{"tf":1.0}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":2,"docs":{"20":{"tf":1.0},"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"20":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"y":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":2,"docs":{"12":{"tf":2.0},"31":{"tf":1.4142135623730951}}}}},"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"28":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"25":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"20":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"d":{"df":7,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"22":{"tf":1.0},"26":{"tf":1.0},"36":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"31":{"tf":1.0}}}}},"w":{"df":4,"docs":{"1":{"tf":1.0},"17":{"tf":1.0},"27":{"tf":1.0},"33":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"24":{"tf":1.0},"25":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"[":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"]":{"(":{"\"":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"21":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"21":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"30":{"tf":1.4142135623730951},"36":{"tf":2.0}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"f":{"df":1,"docs":{"36":{"tf":2.23606797749979}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":1.7320508075688772}}}},"df":4,"docs":{"0":{"tf":1.0},"26":{"tf":1.0},"32":{"tf":1.0},"35":{"tf":1.0}}}},"o":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}},"df":1,"docs":{"15":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"35":{"tf":1.4142135623730951}}}},"t":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"3":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"34":{"tf":1.0}}},"i":{"df":0,"docs":{},"f":{"df":2,"docs":{"28":{"tf":1.0},"9":{"tf":1.0}},"i":{"df":2,"docs":{"13":{"tf":1.0},"28":{"tf":1.0}}}}}},"w":{"df":3,"docs":{"13":{"tf":1.0},"16":{"tf":1.0},"33":{"tf":1.0}}}},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"28":{"tf":1.0},"36":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":2,"docs":{"14":{"tf":1.0},"16":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"12":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"12":{"tf":1.0},"28":{"tf":1.4142135623730951}}}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"h":{"df":1,"docs":{"21":{"tf":1.0}}},"l":{"d":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}},"n":{"c":{"df":2,"docs":{"27":{"tf":1.0},"28":{"tf":1.0}}},"df":7,"docs":{"10":{"tf":1.0},"13":{"tf":1.7320508075688772},"16":{"tf":1.0},"20":{"tf":1.0},"27":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"r":{"df":11,"docs":{"11":{"tf":1.7320508075688772},"12":{"tf":1.0},"13":{"tf":2.6457513110645907},"15":{"tf":1.7320508075688772},"16":{"tf":2.0},"18":{"tf":1.4142135623730951},"20":{"tf":1.4142135623730951},"25":{"tf":1.0},"30":{"tf":1.7320508075688772},"31":{"tf":1.4142135623730951},"9":{"tf":1.0}}}},"t":{"[":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"17":{"tf":1.4142135623730951},"2":{"tf":1.0}}}}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"13":{"tf":1.4142135623730951},"20":{"tf":1.0},"36":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"14":{"tf":1.0},"27":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}}}},"s":{"df":1,"docs":{"28":{"tf":1.0}},"x":{"df":1,"docs":{"2":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"11":{"tf":2.0},"13":{"tf":1.0},"31":{"tf":1.0}}}}},"df":2,"docs":{"0":{"tf":1.0},"31":{"tf":1.0}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"12":{"tf":1.0}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"14":{"tf":1.4142135623730951}}}}}}}}}}},"p":{"(":{")":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"19":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":3,"docs":{"20":{"tf":1.4142135623730951},"24":{"tf":2.0},"25":{"tf":2.0}}},"2":{"df":3,"docs":{"20":{"tf":1.4142135623730951},"24":{"tf":1.7320508075688772},"25":{"tf":1.0}}},"3":{"df":2,"docs":{"20":{"tf":1.4142135623730951},"24":{"tf":2.23606797749979}}},"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":12,"docs":{"1":{"tf":1.0},"13":{"tf":1.4142135623730951},"17":{"tf":1.0},"22":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"3":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"8":{"tf":1.7320508075688772}}}},"n":{"df":0,"docs":{},"i":{"c":{"df":4,"docs":{"14":{"tf":1.0},"24":{"tf":1.0},"33":{"tf":1.0},"34":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"a":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"13":{"tf":1.0},"28":{"tf":1.4142135623730951}}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"21":{"tf":1.0},"36":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"12":{"tf":1.0},"20":{"tf":1.0},"36":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"e":{"/":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":2,"docs":{"35":{"tf":1.0},"36":{"tf":1.4142135623730951}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"16":{"tf":1.0}}}}}}}},"df":1,"docs":{"19":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"36":{"tf":1.0}}},"df":1,"docs":{"36":{"tf":1.0}}}},"n":{"d":{"df":2,"docs":{"11":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"10":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":2,"docs":{"15":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}}}}},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":2,"docs":{"24":{"tf":1.0},"36":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"27":{"tf":1.0}}}},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":2,"docs":{"0":{"tf":1.0},"2":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"l":{"df":4,"docs":{"12":{"tf":2.23606797749979},"2":{"tf":1.7320508075688772},"24":{"tf":1.7320508075688772},"9":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"27":{"tf":1.0},"32":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"2":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"12":{"tf":1.0},"14":{"tf":1.0}}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"29":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"a":{"df":2,"docs":{"18":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"15":{"tf":1.0},"28":{"tf":1.0},"30":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"16":{"tf":1.0},"19":{"tf":1.0},"24":{"tf":1.0}}}}},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"31":{"tf":1.0}}}}}},"c":{"df":17,"docs":{"1":{"tf":1.0},"12":{"tf":1.4142135623730951},"13":{"tf":2.23606797749979},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"19":{"tf":1.0},"20":{"tf":2.0},"21":{"tf":1.7320508075688772},"22":{"tf":2.0},"24":{"tf":2.0},"25":{"tf":1.4142135623730951},"26":{"tf":2.0},"27":{"tf":1.4142135623730951},"28":{"tf":1.4142135623730951},"30":{"tf":2.0},"31":{"tf":1.7320508075688772},"36":{"tf":3.0}},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":13,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"14":{"tf":1.0},"16":{"tf":1.4142135623730951},"18":{"tf":2.23606797749979},"19":{"tf":1.0},"20":{"tf":2.0},"21":{"tf":1.7320508075688772},"24":{"tf":1.0},"25":{"tf":1.0},"28":{"tf":1.0},"31":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"0":{"tf":1.0},"12":{"tf":1.4142135623730951},"31":{"tf":1.0},"36":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"u":{"c":{"df":1,"docs":{"14":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"20":{"tf":1.0},"31":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"10":{"tf":1.4142135623730951},"28":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}}}},"p":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"30":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"0":{"tf":1.0},"36":{"tf":1.0}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"28":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"20":{"tf":1.0}}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"30":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":12,"docs":{"13":{"tf":2.449489742783178},"21":{"tf":1.7320508075688772},"22":{"tf":2.23606797749979},"24":{"tf":2.449489742783178},"25":{"tf":3.605551275463989},"26":{"tf":2.449489742783178},"27":{"tf":2.449489742783178},"30":{"tf":1.4142135623730951},"31":{"tf":2.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.4142135623730951},"36":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}},"n":{"df":1,"docs":{"30":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"12":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}}}}},"w":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"21":{"tf":1.0}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"21":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":2,"docs":{"18":{"tf":1.0},"21":{"tf":2.8284271247461903}},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"21":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":0,"docs":{}},"df":3,"docs":{"13":{"tf":1.4142135623730951},"15":{"tf":1.0},"30":{"tf":1.0}}}},"d":{"df":3,"docs":{"13":{"tf":1.0},"24":{"tf":1.0},"31":{"tf":1.0}},"i":{"df":2,"docs":{"10":{"tf":1.0},"12":{"tf":1.0}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"15":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}}},"df":3,"docs":{"13":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951},"36":{"tf":1.0}},"f":{"df":3,"docs":{"26":{"tf":1.0},"27":{"tf":1.0},"31":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"3":{"tf":1.0},"36":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":3,"docs":{"15":{"tf":1.0},"17":{"tf":1.0},"34":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":1,"docs":{"9":{"tf":1.0}}}},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":2.23606797749979}},"e":{"*":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"v":{"df":1,"docs":{"33":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}}}},"q":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"36":{"tf":1.7320508075688772}},"e":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"36":{"tf":1.7320508075688772}}},".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{")":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"(":{")":{")":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"(":{"\"":{"1":{"2":{"7":{".":{"0":{".":{"0":{".":{"1":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"2":{"0":{"0":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"\"":{"/":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"36":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":4,"docs":{"10":{"tf":1.0},"13":{"tf":2.0},"15":{"tf":1.4142135623730951},"36":{"tf":4.69041575982343}},"f":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"36":{"tf":2.0}}}}}}}},"i":{"df":0,"docs":{},"r":{"df":2,"docs":{"1":{"tf":1.0},"27":{"tf":1.0}}}}}},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":3,"docs":{"13":{"tf":1.0},"15":{"tf":1.0},"34":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":1,"docs":{"1":{"tf":1.0}},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}},"df":0,"docs":{},"s":{"df":3,"docs":{"1":{"tf":1.0},"14":{"tf":1.0},"36":{"tf":2.23606797749979}}}}}},"t":{"df":1,"docs":{"13":{"tf":1.0}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"d":{"/":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"36":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":5,"docs":{"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"20":{"tf":1.0},"25":{"tf":1.0},"31":{"tf":1.4142135623730951}}}},"m":{"df":4,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"18":{"tf":1.0},"9":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"1":{"tf":1.0}},"e":{"*":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":10,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.7320508075688772},"20":{"tf":1.4142135623730951},"21":{"tf":1.0},"25":{"tf":1.4142135623730951},"36":{"tf":2.449489742783178}}}}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"25":{"tf":1.0}}}}}}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":2,"docs":{"30":{"tf":1.0},"36":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"20":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"(":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}}}},"df":1,"docs":{"31":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"(":{"c":{"b":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":4,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"28":{"tf":1.0},"31":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"12":{"tf":2.23606797749979}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}},"s":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":2,"docs":{"20":{"tf":1.7320508075688772},"34":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"15":{"tf":1.0}}}}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":5,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":1.0},"18":{"tf":1.0},"24":{"tf":1.0}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"36":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"12":{"tf":1.4142135623730951},"16":{"tf":1.0},"20":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":5,"docs":{"17":{"tf":1.0},"3":{"tf":1.0},"33":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"35":{"tf":1.0}}}},"df":0,"docs":{}},"f":{"df":1,"docs":{"0":{"tf":1.0}}}},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"d":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}},"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"31":{"tf":1.0},"35":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"0":{"tf":1.0},"36":{"tf":3.0},"7":{"tf":1.0},"8":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"1":{"tf":1.4142135623730951}}}}}}},"t":{"df":1,"docs":{"27":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"17":{"tf":1.0},"2":{"tf":1.0},"30":{"tf":1.7320508075688772},"33":{"tf":1.4142135623730951},"34":{"tf":1.0}}}}}},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":3,"docs":{"14":{"tf":1.0},"30":{"tf":1.0},"5":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.0}},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"w":{"df":1,"docs":{"13":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":2,"docs":{"13":{"tf":1.0},"14":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"35":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"28":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":2,"docs":{"28":{"tf":2.449489742783178},"6":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"17":{"tf":1.0},"36":{"tf":1.0}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"31":{"tf":1.0},"34":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"l":{"df":4,"docs":{"13":{"tf":1.0},"30":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}}}}}}}}}}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":6,"docs":{"10":{"tf":1.7320508075688772},"12":{"tf":1.0},"14":{"tf":1.0},"28":{"tf":1.0},"30":{"tf":1.7320508075688772},"36":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"(":{"3":{"0":{"0":{"0":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"(":{"1":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"12":{"tf":1.4142135623730951},"16":{"tf":1.0},"20":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"30":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"0":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"13":{"tf":1.4142135623730951},"30":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"30":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"0":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}},"df":2,"docs":{"15":{"tf":1.0},"30":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":2,"docs":{"13":{"tf":1.4142135623730951},"15":{"tf":1.0}}}}}},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"13":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"26":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"10":{"tf":1.0},"13":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"24":{"tf":1.0}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"27":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":2,"docs":{"13":{"tf":1.0},"36":{"tf":1.0}},"i":{"df":3,"docs":{"19":{"tf":1.0},"25":{"tf":1.0},"27":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"l":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"35":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"33":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":7,"docs":{"1":{"tf":1.0},"13":{"tf":2.0},"20":{"tf":1.0},"28":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0},"36":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"18":{"tf":1.0},"20":{"tf":1.0},"33":{"tf":1.4142135623730951}}},"u":{"df":2,"docs":{"24":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":3,"docs":{"12":{"tf":1.4142135623730951},"15":{"tf":1.0},"20":{"tf":1.0}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"11":{"tf":1.0},"13":{"tf":1.7320508075688772},"24":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"21":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"17":{"tf":1.0},"33":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"1":{"tf":1.4142135623730951},"36":{"tf":2.23606797749979}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"12":{"tf":1.0}}}}}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":2,"docs":{"27":{"tf":1.4142135623730951},"31":{"tf":1.0}}}}}},"u":{"b":{"df":1,"docs":{"30":{"tf":1.0}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"h":{"df":5,"docs":{"12":{"tf":1.0},"15":{"tf":1.0},"21":{"tf":1.0},"24":{"tf":1.0},"32":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"25":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":6,"docs":{"0":{"tf":1.7320508075688772},"2":{"tf":1.4142135623730951},"32":{"tf":1.7320508075688772},"34":{"tf":1.4142135623730951},"35":{"tf":2.0},"36":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":3,"docs":{"13":{"tf":1.0},"26":{"tf":1.0},"34":{"tf":1.0}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{}}}}}},"y":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"0":{"tf":1.0},"35":{"tf":1.0}}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"18":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"t":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":2,"docs":{"15":{"tf":1.0},"30":{"tf":1.0}}}},"s":{"df":0,"docs":{},"k":{".":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"30":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{"1":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"30":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}},"df":9,"docs":{"11":{"tf":1.0},"13":{"tf":1.4142135623730951},"18":{"tf":1.0},"28":{"tf":1.4142135623730951},"30":{"tf":3.7416573867739413},"31":{"tf":1.7320508075688772},"34":{"tf":1.4142135623730951},"5":{"tf":1.0},"9":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.0}}}}},"df":1,"docs":{"7":{"tf":1.0}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"15":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"1":{"tf":1.0},"12":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"32":{"tf":1.0}}}},"t":{"'":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"31":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"33":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":3,"docs":{"18":{"tf":1.0},"21":{"tf":1.0},"26":{"tf":1.0}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}},"s":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"[":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"28":{"tf":1.0}}}}}},"df":6,"docs":{"10":{"tf":1.4142135623730951},"18":{"tf":1.0},"28":{"tf":2.8284271247461903},"31":{"tf":1.4142135623730951},"34":{"tf":1.0},"6":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"28":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"28":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":4,"docs":{"12":{"tf":1.0},"21":{"tf":1.0},"27":{"tf":1.0},"36":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}}}}}}}}}},"u":{"df":3,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"16":{"tf":3.0},"20":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":2.23606797749979}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":4,"docs":{"10":{"tf":1.0},"17":{"tf":1.7320508075688772},"31":{"tf":1.0},"9":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"30":{"tf":1.0}}}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":3,"docs":{"13":{"tf":1.0},"30":{"tf":2.8284271247461903},"5":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}}}},"r":{"df":3,"docs":{"12":{"tf":1.0},"18":{"tf":1.0},"30":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.0}}}}}},"p":{"df":1,"docs":{"29":{"tf":1.0}}}},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"16":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":2.23606797749979}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"15":{"tf":1.0}}}}}},"p":{"df":1,"docs":{"35":{"tf":1.0}}}},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"0":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"35":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"13":{"tf":1.0}}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"24":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"29":{"tf":1.0}}}},"df":9,"docs":{"1":{"tf":1.0},"13":{"tf":1.4142135623730951},"15":{"tf":1.0},"22":{"tf":1.0},"24":{"tf":1.4142135623730951},"27":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0},"36":{"tf":1.0}},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"12":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"e":{"df":4,"docs":{"12":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":2.0},"27":{"tf":2.0}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"26":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":3,"docs":{"13":{"tf":1.4142135623730951},"20":{"tf":1.4142135623730951},"8":{"tf":1.0}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"13":{"tf":1.0},"8":{"tf":1.0}}}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":11,"docs":{"11":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.7320508075688772},"23":{"tf":1.0},"25":{"tf":2.449489742783178},"26":{"tf":1.7320508075688772},"28":{"tf":1.7320508075688772},"33":{"tf":1.0},"36":{"tf":1.0},"9":{"tf":1.0}}},"i":{"c":{"df":4,"docs":{"10":{"tf":1.0},"13":{"tf":1.4142135623730951},"20":{"tf":1.4142135623730951},"34":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"b":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{},"h":{"df":2,"docs":{"21":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}},"c":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"24":{"tf":1.0},"26":{"tf":1.0}}}}},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"15":{"tf":1.0},"24":{"tf":1.0},"31":{"tf":1.0}}}}}},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"27":{"tf":1.0},"37":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"*":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":2.23606797749979}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"13":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"a":{"d":{"df":1,"docs":{"33":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":19,"docs":{"0":{"tf":1.0},"1":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.4142135623730951},"25":{"tf":1.0},"27":{"tf":1.4142135623730951},"28":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.7320508075688772},"33":{"tf":1.0},"34":{"tf":2.0},"35":{"tf":1.7320508075688772},"36":{"tf":1.4142135623730951},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"24":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"22":{"tf":1.4142135623730951},"36":{"tf":1.0}}}},"df":0,"docs":{}}}},"v":{"3":{"df":2,"docs":{"32":{"tf":1.0},"33":{"tf":1.4142135623730951}}},"4":{"/":{"df":0,"docs":{},"v":{"6":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"32":{"tf":1.0},"33":{"tf":1.0}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":5,"docs":{"11":{"tf":1.0},"20":{"tf":1.4142135623730951},"25":{"tf":1.0},"28":{"tf":1.0},"36":{"tf":1.0}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{")":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":3,"docs":{"21":{"tf":1.4142135623730951},"26":{"tf":1.0},"31":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":4,"docs":{"24":{"tf":1.7320508075688772},"26":{"tf":1.4142135623730951},"31":{"tf":1.0},"33":{"tf":1.0}}}}}}}}}},"r":{"df":3,"docs":{"16":{"tf":1.0},"25":{"tf":1.0},"28":{"tf":1.0}},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"17":{"tf":1.0},"25":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}}}}},"i":{"a":{"df":3,"docs":{"12":{"tf":1.0},"21":{"tf":1.0},"36":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":7,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.7320508075688772},"14":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"28":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{".":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":8,"docs":{"1":{"tf":1.0},"12":{"tf":2.23606797749979},"16":{"tf":1.4142135623730951},"20":{"tf":1.0},"24":{"tf":1.0},"28":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"36":{"tf":1.4142135623730951}}}},"y":{"df":3,"docs":{"12":{"tf":1.0},"28":{"tf":1.0},"35":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"b":{"df":2,"docs":{"13":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"27":{"tf":1.0},"33":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"13":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":4,"docs":{"15":{"tf":1.0},"17":{"tf":1.0},"21":{"tf":1.0},"25":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"2":{"tf":1.0}}}}},"df":1,"docs":{"13":{"tf":1.4142135623730951}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"13":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"35":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"28":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"27":{"tf":1.0},"31":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}}}}}}}}}}},"o":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"k":{"df":3,"docs":{"13":{"tf":1.0},"25":{"tf":1.4142135623730951},"28":{"tf":2.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"12":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"34":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"33":{"tf":1.4142135623730951}}}}}}},"y":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"34":{"tf":1.0}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"u":{"'":{"df":0,"docs":{},"r":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"breadcrumbs":{"root":{"1":{"0":{"df":1,"docs":{"15":{"tf":1.0}}},"2":{"7":{".":{"0":{".":{"0":{".":{"1":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"0":{"1":{"df":1,"docs":{"36":{"tf":1.0}}},"3":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"a":{"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"20":{"tf":1.0},"33":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":1,"docs":{"20":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"d":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}}},"d":{"df":1,"docs":{"1":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"36":{"tf":2.449489742783178}}}}}}},"df":2,"docs":{"11":{"tf":1.0},"21":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{},"w":{"df":7,"docs":{"12":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"27":{"tf":1.4142135623730951},"32":{"tf":1.0},"35":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"33":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"13":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":3,"docs":{"13":{"tf":1.0},"35":{"tf":1.0},"9":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}},"n":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":3,"docs":{"22":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":2.23606797749979}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"11":{"tf":1.0},"13":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"i":{"df":2,"docs":{"3":{"tf":1.7320508075688772},"35":{"tf":1.0}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":4,"docs":{"12":{"tf":1.4142135623730951},"13":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"35":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"26":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":3,"docs":{"13":{"tf":1.0},"21":{"tf":1.0},"25":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"26":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"1":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"n":{"c":{"/":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.0},"32":{"tf":1.0},"35":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"35":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":3,"docs":{"32":{"tf":1.4142135623730951},"34":{"tf":2.23606797749979},"35":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":23,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.7320508075688772},"12":{"tf":1.4142135623730951},"13":{"tf":2.23606797749979},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"18":{"tf":3.0},"19":{"tf":2.23606797749979},"20":{"tf":3.0},"21":{"tf":3.0},"22":{"tf":2.449489742783178},"24":{"tf":2.449489742783178},"25":{"tf":2.23606797749979},"26":{"tf":1.0},"27":{"tf":2.6457513110645907},"28":{"tf":2.0},"30":{"tf":2.0},"31":{"tf":2.0},"32":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.7320508075688772},"36":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"u":{"df":1,"docs":{"33":{"tf":1.0}}}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}}}},"x":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"27":{"tf":2.23606797749979}}}}}}}}}}}}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":5,"docs":{"0":{"tf":1.0},"12":{"tf":1.0},"18":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{":":{"df":1,"docs":{"34":{"tf":1.0}}},"df":2,"docs":{"31":{"tf":2.23606797749979},"34":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"11":{"tf":1.0},"27":{"tf":1.0},"4":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"31":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{":":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}},"df":17,"docs":{"1":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.4142135623730951},"13":{"tf":2.449489742783178},"15":{"tf":1.7320508075688772},"16":{"tf":2.0},"18":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":3.4641016151377544},"22":{"tf":1.4142135623730951},"24":{"tf":2.8284271247461903},"25":{"tf":1.7320508075688772},"27":{"tf":1.0},"28":{"tf":1.0},"30":{"tf":2.449489742783178},"31":{"tf":1.7320508075688772},"36":{"tf":2.6457513110645907}},"n":{"df":1,"docs":{"34":{"tf":1.0}}}}},"r":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":3,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"20":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"2":{"tf":1.0},"32":{"tf":1.0},"35":{"tf":2.8284271247461903}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"3":{"tf":1.0},"5":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"17":{"tf":1.0}}}}},"df":2,"docs":{"13":{"tf":1.0},"16":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"13":{"tf":1.0},"20":{"tf":1.0},"27":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"v":{"df":1,"docs":{"27":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"24":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"29":{"tf":1.7320508075688772},"30":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.0}}}},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"14":{"tf":1.4142135623730951},"28":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"12":{"tf":1.0},"27":{"tf":1.0}}}},"l":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":4,"docs":{"24":{"tf":1.0},"28":{"tf":1.0},"31":{"tf":1.0},"36":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"o":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"21":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"37":{"tf":1.7320508075688772}}}},"t":{"df":0,"docs":{},"h":{"df":6,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"16":{"tf":1.0},"20":{"tf":1.4142135623730951},"28":{"tf":1.0},"35":{"tf":1.4142135623730951}}}},"x":{"df":1,"docs":{"0":{"tf":1.0}}}},"s":{"d":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"g":{"df":10,"docs":{"17":{"tf":1.0},"22":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"3":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"8":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":1,"docs":{"35":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{".":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}}}}}}},"c":{"1":{"df":1,"docs":{"13":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"13":{"tf":1.4142135623730951}}},"a":{"c":{"df":0,"docs":{},"h":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"/":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"22":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":6,"docs":{"11":{"tf":1.4142135623730951},"12":{"tf":1.0},"18":{"tf":1.0},"22":{"tf":2.0},"24":{"tf":1.0},"36":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"12":{"tf":2.449489742783178},"14":{"tf":1.0},"15":{"tf":1.0},"20":{"tf":1.0},"22":{"tf":1.0},"24":{"tf":1.0},"31":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"9":{"tf":1.0}},"e":{"df":1,"docs":{"14":{"tf":1.4142135623730951}},"r":{"df":3,"docs":{"13":{"tf":1.0},"14":{"tf":2.0},"15":{"tf":1.4142135623730951}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"df":1,"docs":{"13":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":12,"docs":{"0":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":4.242640687119285},"14":{"tf":1.4142135623730951},"15":{"tf":2.449489742783178},"16":{"tf":2.23606797749979},"20":{"tf":1.0},"25":{"tf":1.0},"30":{"tf":2.449489742783178},"34":{"tf":1.0},"5":{"tf":1.4142135623730951},"9":{"tf":1.0}},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":5,"docs":{"13":{"tf":2.23606797749979},"25":{"tf":1.4142135623730951},"30":{"tf":1.4142135623730951},"34":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"27":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":5,"docs":{"15":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"22":{"tf":1.0},"24":{"tf":1.7320508075688772},"27":{"tf":1.7320508075688772},"31":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":3,"docs":{"13":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.0}}}}},"s":{"df":2,"docs":{"31":{"tf":1.4142135623730951},"34":{"tf":1.0}}}}},"b":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}}}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"13":{"tf":1.0},"24":{"tf":1.0}}}},"n":{"df":0,"docs":{},"g":{"df":5,"docs":{"17":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"33":{"tf":1.0},"36":{"tf":1.0}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"14":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"33":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":6,"docs":{"17":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":2.0},"31":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"35":{"tf":1.4142135623730951}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":18,"docs":{"0":{"tf":1.0},"1":{"tf":1.7320508075688772},"13":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"18":{"tf":1.0},"21":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"27":{"tf":1.4142135623730951},"28":{"tf":1.0},"3":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0},"32":{"tf":2.23606797749979},"33":{"tf":2.23606797749979},"34":{"tf":2.23606797749979},"35":{"tf":1.4142135623730951},"36":{"tf":1.0}},"s":{"/":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"b":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"28":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{")":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{"/":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"28":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"34":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"0":{"tf":1.0},"8":{"tf":1.0}}}}}},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"20":{"tf":1.0}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"1":{"tf":1.0}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"15":{"tf":1.0},"34":{"tf":1.0}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"r":{"df":5,"docs":{"0":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"22":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951}}}}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":9,"docs":{"17":{"tf":1.0},"24":{"tf":1.7320508075688772},"27":{"tf":1.4142135623730951},"32":{"tf":1.7320508075688772},"33":{"tf":1.0},"34":{"tf":1.4142135623730951},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"9":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"4":{"0":{"1":{"df":1,"docs":{"36":{"tf":1.0}}},"3":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"e":{"df":2,"docs":{"28":{"tf":1.0},"32":{"tf":1.0}}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"15":{"tf":1.0},"30":{"tf":1.4142135623730951}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"23":{"tf":1.0},"27":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":8,"docs":{"17":{"tf":2.0},"21":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.4142135623730951},"31":{"tf":1.0},"35":{"tf":1.0},"9":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":7,"docs":{"13":{"tf":1.4142135623730951},"14":{"tf":2.0},"15":{"tf":1.4142135623730951},"18":{"tf":1.0},"20":{"tf":1.4142135623730951},"30":{"tf":1.0},"35":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"15":{"tf":1.0},"35":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}}}}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.4142135623730951}}}}}},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":10,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"5":{"tf":1.4142135623730951},"9":{"tf":1.7320508075688772}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":6,"docs":{"10":{"tf":1.0},"13":{"tf":2.0},"20":{"tf":1.0},"28":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"17":{"tf":1.7320508075688772},"27":{"tf":1.0},"9":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":2.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":1,"docs":{"26":{"tf":1.0}}}}},"i":{"d":{"df":2,"docs":{"33":{"tf":1.0},"36":{"tf":1.0}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"14":{"tf":1.0}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"0":{"tf":1.0},"17":{"tf":1.0},"28":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}}}},"x":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"28":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"28":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"28":{"tf":2.449489742783178}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"11":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":5,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"20":{"tf":1.0},"36":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}}}},"y":{"df":1,"docs":{"25":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"18":{"tf":1.0},"28":{"tf":1.0},"9":{"tf":1.0}}}}},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":9,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"31":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"3":{"tf":1.0}}}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"31":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":8,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"14":{"tf":1.4142135623730951},"16":{"tf":1.0},"21":{"tf":1.0},"25":{"tf":1.4142135623730951},"30":{"tf":1.0},"35":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"28":{"tf":1.0}},"e":{"d":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"6":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"28":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"28":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}},"d":{":":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"=":{"<":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"35":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"35":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"35":{"tf":1.0}}}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"35":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"11":{"tf":1.0},"24":{"tf":1.0},"28":{"tf":1.0},"33":{"tf":1.0}},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"17":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"21":{"tf":1.0},"22":{"tf":1.0},"26":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"(":{"1":{"0":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"15":{"tf":1.7320508075688772}}}}}}}}},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":4,"docs":{"17":{"tf":1.0},"26":{"tf":1.0},"33":{"tf":1.0},"36":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"c":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"24":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"18":{"tf":1.0},"35":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":1,"docs":{"8":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"26":{"tf":1.0}}}}},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"12":{"tf":1.0},"28":{"tf":1.0},"34":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"25":{"tf":1.0},"3":{"tf":1.0}}}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"32":{"tf":1.0}}}}}}}},"i":{"d":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"2":{"tf":1.0},"34":{"tf":1.0},"36":{"tf":1.0}}}},"u":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"35":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":4,"docs":{"12":{"tf":1.4142135623730951},"21":{"tf":1.0},"31":{"tf":1.0},"34":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"15":{"tf":1.0},"35":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"22":{"tf":1.0},"28":{"tf":1.0},"31":{"tf":2.8284271247461903}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":8,"docs":{"0":{"tf":1.0},"10":{"tf":2.23606797749979},"11":{"tf":1.4142135623730951},"12":{"tf":1.0},"13":{"tf":1.0},"20":{"tf":1.4142135623730951},"34":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"o":{"c":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"4":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.4142135623730951}}}}}}}},"df":1,"docs":{"28":{"tf":1.0}},"n":{"'":{"df":0,"docs":{},"t":{"df":4,"docs":{"13":{"tf":1.0},"16":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":4,"docs":{"10":{"tf":1.0},"12":{"tf":1.0},"28":{"tf":1.4142135623730951},"36":{"tf":1.0}}},"t":{"df":1,"docs":{"36":{"tf":1.7320508075688772}}}},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":2,"docs":{"13":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"36":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}}}}}},"u":{"df":0,"docs":{},"e":{"df":2,"docs":{"13":{"tf":1.0},"24":{"tf":1.0}}},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":4,"docs":{"10":{"tf":1.0},"12":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":11,"docs":{"1":{"tf":1.0},"12":{"tf":1.7320508075688772},"13":{"tf":2.23606797749979},"16":{"tf":1.4142135623730951},"19":{"tf":1.0},"24":{"tf":2.23606797749979},"27":{"tf":1.0},"28":{"tf":2.0},"30":{"tf":2.23606797749979},"31":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":10,"docs":{"17":{"tf":1.0},"22":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"3":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.0},"13":{"tf":1.0},"26":{"tf":1.0},"33":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"i":{"df":2,"docs":{"0":{"tf":1.0},"28":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"36":{"tf":1.7320508075688772}}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"13":{"tf":1.0}}}}},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"17":{"tf":1.0},"27":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":2,"docs":{"11":{"tf":1.0},"20":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"36":{"tf":1.0}}}}},"o":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}}}}},"d":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":1,"docs":{"34":{"tf":1.0}},"r":{"df":3,"docs":{"10":{"tf":1.0},"24":{"tf":1.0},"31":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"2":{"tf":1.0}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"20":{"tf":1.0},"27":{"tf":1.0}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":9,"docs":{"22":{"tf":1.0},"23":{"tf":1.7320508075688772},"24":{"tf":1.0},"25":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"27":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951},"33":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}}},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"c":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"13":{"tf":1.0},"15":{"tf":1.7320508075688772}},"t":{"df":6,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"12":{"tf":1.4142135623730951},"13":{"tf":1.0},"28":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":10,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"13":{"tf":2.0},"35":{"tf":1.0},"36":{"tf":1.0},"4":{"tf":2.0},"5":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}}}},"c":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"31":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":5,"docs":{"13":{"tf":1.4142135623730951},"27":{"tf":1.0},"30":{"tf":2.0},"31":{"tf":1.0},"36":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}},"p":{"df":0,"docs":{},"t":{"df":15,"docs":{"0":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":1.7320508075688772},"21":{"tf":1.7320508075688772},"22":{"tf":2.0},"23":{"tf":2.449489742783178},"24":{"tf":3.3166247903554},"25":{"tf":2.23606797749979},"26":{"tf":2.6457513110645907},"27":{"tf":2.8284271247461903},"30":{"tf":1.4142135623730951},"31":{"tf":2.23606797749979},"33":{"tf":1.4142135623730951},"34":{"tf":1.0},"36":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{")":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":6,"docs":{"11":{"tf":1.4142135623730951},"18":{"tf":1.0},"20":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951},"28":{"tf":1.0},"9":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"17":{"tf":1.0},"32":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":8,"docs":{"11":{"tf":1.0},"13":{"tf":1.7320508075688772},"14":{"tf":1.4142135623730951},"20":{"tf":1.0},"24":{"tf":2.23606797749979},"28":{"tf":1.0},"31":{"tf":1.0},"36":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.7320508075688772}}}}}}}}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"0":{"tf":1.4142135623730951},"33":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"d":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"24":{"tf":1.0},"27":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"df":4,"docs":{"1":{"tf":1.0},"12":{"tf":1.0},"28":{"tf":1.0},"34":{"tf":1.0}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"12":{"tf":1.0}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":6,"docs":{"11":{"tf":1.4142135623730951},"13":{"tf":2.23606797749979},"14":{"tf":1.0},"15":{"tf":1.0},"20":{"tf":1.0},"30":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"28":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}},"l":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"27":{"tf":1.0},"35":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"4":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"13":{"tf":1.4142135623730951},"36":{"tf":1.0}}}}}},"r":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":1,"docs":{"36":{"tf":1.7320508075688772}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"12":{"tf":1.0}}}},"m":{"df":1,"docs":{"26":{"tf":1.0}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"df":10,"docs":{"17":{"tf":1.0},"22":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.4142135623730951},"3":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":1,"docs":{"13":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":9,"docs":{"18":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.7320508075688772},"22":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":2.23606797749979},"34":{"tf":1.0}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.0}}}}}}},"t":{".":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"21":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"(":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"21":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"1":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"24":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":2,"docs":{"20":{"tf":1.4142135623730951},"24":{"tf":2.0}}},"2":{".":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"16":{"tf":1.0},"20":{"tf":1.4142135623730951},"24":{"tf":2.0}}},"3":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"24":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"24":{"tf":1.0}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":1,"docs":{"24":{"tf":1.0}}},"df":5,"docs":{"13":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"21":{"tf":2.449489742783178},"25":{"tf":1.0},"31":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":18,"docs":{"10":{"tf":1.0},"11":{"tf":2.449489742783178},"12":{"tf":1.0},"13":{"tf":2.8284271247461903},"14":{"tf":2.449489742783178},"15":{"tf":1.4142135623730951},"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":2.0},"21":{"tf":1.4142135623730951},"24":{"tf":1.7320508075688772},"25":{"tf":1.4142135623730951},"31":{"tf":2.0},"32":{"tf":1.0},"33":{"tf":1.0},"9":{"tf":1.0}},"e":{".":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"24":{"tf":1.4142135623730951},"33":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":3,"docs":{"20":{"tf":1.0},"24":{"tf":1.0},"33":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"33":{"tf":1.0}}}}},"df":0,"docs":{}}},"2":{".":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}}},"df":1,"docs":{"13":{"tf":1.4142135623730951}}},"[":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}}}}}}}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"]":{".":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"[":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"1":{"tf":1.0}}}},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":6,"docs":{"16":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.7320508075688772},"22":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}}}}}}},"g":{"a":{"df":0,"docs":{},"r":{"b":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.0}}}}},"t":{"df":2,"docs":{"13":{"tf":1.4142135623730951},"28":{"tf":1.0}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{"df":10,"docs":{"17":{"tf":1.0},"22":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"3":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"11":{"tf":1.0},"20":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"b":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"27":{"tf":1.7320508075688772},"35":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"df":2,"docs":{"21":{"tf":1.0},"36":{"tf":1.4142135623730951}},"o":{"d":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"12":{"tf":1.0}}}}},"df":0,"docs":{}},"u":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":2,"docs":{"13":{"tf":1.0},"20":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"10":{"tf":1.0}},"l":{"df":9,"docs":{"10":{"tf":1.0},"12":{"tf":1.0},"14":{"tf":1.0},"22":{"tf":1.4142135623730951},"24":{"tf":1.0},"27":{"tf":1.0},"33":{"tf":1.4142135623730951},"36":{"tf":2.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":2.23606797749979}}}}}},"df":0,"docs":{}}},"r":{"df":2,"docs":{"10":{"tf":1.0},"36":{"tf":3.1622776601683795}}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":5,"docs":{"13":{"tf":1.0},"16":{"tf":1.0},"30":{"tf":1.0},"35":{"tf":1.0},"9":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":2.23606797749979}}}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":1,"docs":{"28":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":2,"docs":{"27":{"tf":1.0},"36":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"25":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}}},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"13":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"26":{"tf":1.0},"27":{"tf":1.0},"33":{"tf":1.0}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}},"o":{"d":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":5,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"13":{"tf":1.0},"36":{"tf":4.123105625617661},"8":{"tf":2.0}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{"/":{"/":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"k":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"?":{"df":0,"docs":{},"q":{"=":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"w":{"df":0,"docs":{},"w":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"?":{"df":0,"docs":{},"q":{"=":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}}},"df":2,"docs":{"13":{"tf":1.0},"8":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"2":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"36":{"tf":2.6457513110645907}}}}}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"[":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"36":{"tf":2.23606797749979}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}}},"s":{":":{"/":{"/":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"d":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":1,"docs":{"1":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":2.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}}}}}}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":1,"docs":{"36":{"tf":1.0}}}}}},"i":{"/":{"df":0,"docs":{},"o":{"df":3,"docs":{"0":{"tf":1.0},"18":{"tf":1.0},"28":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"a":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":2,"docs":{"14":{"tf":1.0},"16":{"tf":1.0}}},"m":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"1":{"tf":1.0},"28":{"tf":1.0}}}}}},"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"0":{"tf":1.0},"16":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"26":{"tf":1.0},"32":{"tf":1.0}}}}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"21":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":9,"docs":{"1":{"tf":1.0},"13":{"tf":1.7320508075688772},"22":{"tf":1.0},"28":{"tf":1.4142135623730951},"30":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951},"34":{"tf":1.7320508075688772},"35":{"tf":1.0},"36":{"tf":1.0}}}}}}},"n":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":7,"docs":{"0":{"tf":1.0},"15":{"tf":1.0},"25":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"27":{"tf":1.0},"32":{"tf":1.0},"35":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"13":{"tf":1.0}}},"i":{"c":{"df":2,"docs":{"18":{"tf":1.0},"25":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"12":{"tf":1.0}}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"u":{"df":2,"docs":{"15":{"tf":1.0},"27":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"17":{"tf":1.0},"25":{"tf":1.4142135623730951},"36":{"tf":1.4142135623730951}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.7320508075688772}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":4,"docs":{"13":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.0},"28":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"11":{"tf":1.0},"20":{"tf":1.0}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":2.0}}},"n":{"c":{"df":3,"docs":{"10":{"tf":1.0},"13":{"tf":1.0},"20":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"d":{"df":4,"docs":{"21":{"tf":1.0},"31":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":1,"docs":{"28":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"18":{"tf":1.0},"21":{"tf":1.0},"28":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"27":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"25":{"tf":1.4142135623730951}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":2,"docs":{"27":{"tf":1.0},"33":{"tf":1.0}},"t":{"df":4,"docs":{"0":{"tf":1.7320508075688772},"1":{"tf":1.0},"2":{"tf":1.0},"3":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"c":{"df":0,"docs":{},"p":{"df":1,"docs":{"2":{"tf":1.0}}}},"df":1,"docs":{"21":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{")":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"21":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":2,"docs":{"21":{"tf":1.0},"25":{"tf":2.0}}}}}}}},"p":{"df":1,"docs":{"36":{"tf":1.0}},"v":{"6":{"df":1,"docs":{"33":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}}}}}},"t":{"'":{"df":2,"docs":{"10":{"tf":1.0},"20":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"14":{"tf":1.0}}},"r":{"df":2,"docs":{"0":{"tf":1.0},"19":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"16":{"tf":2.0}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":3,"docs":{"12":{"tf":1.0},"16":{"tf":1.0},"36":{"tf":1.0}}}},"y":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"18":{"tf":1.0},"20":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"25":{"tf":1.0},"36":{"tf":1.4142135623730951}},"n":{"df":2,"docs":{"11":{"tf":1.0},"35":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"32":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"35":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":3,"docs":{"14":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.0}}},"df":0,"docs":{},"k":{"df":2,"docs":{"31":{"tf":1.4142135623730951},"34":{"tf":1.0}}}},"df":0,"docs":{},"g":{"a":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"0":{"tf":1.0},"27":{"tf":1.0},"32":{"tf":1.4142135623730951},"35":{"tf":2.23606797749979}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"22":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"x":{"df":1,"docs":{"2":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"25":{"tf":1.4142135623730951},"26":{"tf":1.0},"36":{"tf":2.0}}}}},"o":{"c":{"a":{"df":0,"docs":{},"l":{"*":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"36":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"k":{"df":1,"docs":{"0":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"28":{"tf":1.0},"30":{"tf":1.4142135623730951}},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"k":{"df":2,"docs":{"34":{"tf":1.0},"36":{"tf":1.0}}},"p":{"df":6,"docs":{"10":{"tf":1.0},"12":{"tf":1.4142135623730951},"16":{"tf":1.0},"28":{"tf":1.4142135623730951},"34":{"tf":1.0},"9":{"tf":1.0}}}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":2,"docs":{"0":{"tf":1.0},"32":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"28":{"tf":1.4142135623730951}}}},"k":{"df":0,"docs":{},"e":{"df":6,"docs":{"10":{"tf":1.0},"13":{"tf":1.0},"26":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"9":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"28":{"tf":1.0},"31":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":2,"docs":{"20":{"tf":1.4142135623730951},"28":{"tf":1.0}}},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"18":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"11":{"tf":1.4142135623730951},"34":{"tf":1.0}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"36":{"tf":1.4142135623730951}},"o":{"d":{"df":4,"docs":{"19":{"tf":1.0},"26":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"35":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"d":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"36":{"tf":4.58257569495584},"8":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"32":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}},"x":{"df":1,"docs":{"34":{"tf":1.0}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":2,"docs":{"23":{"tf":1.0},"27":{"tf":1.7320508075688772}},"l":{"df":2,"docs":{"28":{"tf":1.4142135623730951},"9":{"tf":1.0}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":4,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"25":{"tf":1.0},"36":{"tf":2.23606797749979}}}}},"u":{"df":0,"docs":{},"l":{"df":3,"docs":{"17":{"tf":1.0},"28":{"tf":1.0},"35":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"16":{"tf":1.4142135623730951},"31":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":6,"docs":{"1":{"tf":1.0},"12":{"tf":1.0},"17":{"tf":1.0},"30":{"tf":1.0},"32":{"tf":1.0},"36":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"0":{"tf":1.0}},"p":{"df":0,"docs":{},"l":{"df":6,"docs":{"13":{"tf":1.0},"28":{"tf":1.0},"32":{"tf":1.4142135623730951},"35":{"tf":1.7320508075688772},"5":{"tf":1.0},"8":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"9":{"tf":1.0}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":2,"docs":{"20":{"tf":1.0},"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"20":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"y":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":2,"docs":{"12":{"tf":2.0},"31":{"tf":1.4142135623730951}}}}},"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"28":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"25":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"20":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"d":{"df":7,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"22":{"tf":1.0},"26":{"tf":1.0},"36":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"31":{"tf":1.0}}}}},"w":{"df":4,"docs":{"1":{"tf":1.0},"17":{"tf":1.0},"27":{"tf":1.0},"33":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"24":{"tf":1.0},"25":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"[":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"]":{"(":{"\"":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"21":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"21":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"30":{"tf":1.4142135623730951},"36":{"tf":2.0}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"f":{"df":1,"docs":{"36":{"tf":2.23606797749979}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":1.7320508075688772}}}},"df":4,"docs":{"0":{"tf":1.0},"26":{"tf":1.0},"32":{"tf":1.0},"35":{"tf":1.0}}}},"o":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}},"df":1,"docs":{"15":{"tf":2.23606797749979}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"35":{"tf":1.4142135623730951}}}},"t":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"3":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"34":{"tf":1.0}}},"i":{"df":0,"docs":{},"f":{"df":2,"docs":{"28":{"tf":1.0},"9":{"tf":1.0}},"i":{"df":2,"docs":{"13":{"tf":1.0},"28":{"tf":1.0}}}}}},"w":{"df":3,"docs":{"13":{"tf":1.0},"16":{"tf":1.0},"33":{"tf":1.0}}}},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"28":{"tf":1.0},"36":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":2,"docs":{"14":{"tf":1.0},"16":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"12":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"12":{"tf":1.0},"28":{"tf":1.4142135623730951}}}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"h":{"df":1,"docs":{"21":{"tf":1.0}}},"l":{"d":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}},"n":{"c":{"df":2,"docs":{"27":{"tf":1.0},"28":{"tf":1.0}}},"df":7,"docs":{"10":{"tf":1.0},"13":{"tf":1.7320508075688772},"16":{"tf":1.0},"20":{"tf":1.0},"27":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"r":{"df":11,"docs":{"11":{"tf":1.7320508075688772},"12":{"tf":1.0},"13":{"tf":2.6457513110645907},"15":{"tf":1.7320508075688772},"16":{"tf":2.0},"18":{"tf":1.4142135623730951},"20":{"tf":1.4142135623730951},"25":{"tf":1.0},"30":{"tf":1.7320508075688772},"31":{"tf":1.4142135623730951},"9":{"tf":1.0}}}},"t":{"[":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"17":{"tf":1.4142135623730951},"2":{"tf":1.0}}}}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"13":{"tf":1.4142135623730951},"20":{"tf":1.0},"36":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"14":{"tf":1.0},"27":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}}}},"s":{"df":1,"docs":{"28":{"tf":1.0}},"x":{"df":1,"docs":{"2":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"11":{"tf":2.0},"13":{"tf":1.0},"31":{"tf":1.0}}}}},"df":2,"docs":{"0":{"tf":1.0},"31":{"tf":1.0}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"12":{"tf":1.0}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"14":{"tf":1.7320508075688772}}}}}}}}}}},"p":{"(":{")":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"19":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":3,"docs":{"20":{"tf":1.4142135623730951},"24":{"tf":2.0},"25":{"tf":2.0}}},"2":{"df":3,"docs":{"20":{"tf":1.4142135623730951},"24":{"tf":1.7320508075688772},"25":{"tf":1.0}}},"3":{"df":2,"docs":{"20":{"tf":1.4142135623730951},"24":{"tf":2.23606797749979}}},"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":12,"docs":{"1":{"tf":1.0},"13":{"tf":1.4142135623730951},"17":{"tf":1.0},"22":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"3":{"tf":1.0},"31":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"8":{"tf":1.7320508075688772}}}},"n":{"df":0,"docs":{},"i":{"c":{"df":4,"docs":{"14":{"tf":1.0},"24":{"tf":1.0},"33":{"tf":1.0},"34":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"a":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"13":{"tf":1.0},"28":{"tf":1.4142135623730951}}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"21":{"tf":1.0},"36":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"12":{"tf":1.0},"20":{"tf":1.0},"36":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"e":{"/":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":2,"docs":{"35":{"tf":1.0},"36":{"tf":1.4142135623730951}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"16":{"tf":1.0}}}}}}}},"df":1,"docs":{"19":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"36":{"tf":1.0}}},"df":1,"docs":{"36":{"tf":1.0}}}},"n":{"d":{"df":2,"docs":{"11":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"10":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":2,"docs":{"15":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}}}}},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":2,"docs":{"24":{"tf":1.0},"36":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"27":{"tf":1.0}}}},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":2,"docs":{"0":{"tf":1.0},"2":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"l":{"df":4,"docs":{"12":{"tf":2.449489742783178},"2":{"tf":1.7320508075688772},"24":{"tf":1.7320508075688772},"9":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":5,"docs":{"27":{"tf":1.0},"32":{"tf":1.7320508075688772},"33":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"2":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"12":{"tf":1.0},"14":{"tf":1.0}}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":3,"docs":{"29":{"tf":1.7320508075688772},"30":{"tf":1.0},"31":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"a":{"df":2,"docs":{"18":{"tf":1.4142135623730951},"19":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"15":{"tf":1.0},"28":{"tf":1.0},"30":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"16":{"tf":1.0},"19":{"tf":1.0},"24":{"tf":1.0}}}}},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"31":{"tf":1.0}}}}}},"c":{"df":17,"docs":{"1":{"tf":1.0},"12":{"tf":1.4142135623730951},"13":{"tf":2.23606797749979},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"19":{"tf":1.0},"20":{"tf":2.0},"21":{"tf":1.7320508075688772},"22":{"tf":2.0},"24":{"tf":2.0},"25":{"tf":1.4142135623730951},"26":{"tf":2.0},"27":{"tf":1.4142135623730951},"28":{"tf":1.4142135623730951},"30":{"tf":2.0},"31":{"tf":1.7320508075688772},"36":{"tf":3.0}},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":13,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"14":{"tf":1.0},"16":{"tf":1.4142135623730951},"18":{"tf":2.449489742783178},"19":{"tf":1.0},"20":{"tf":2.0},"21":{"tf":2.0},"24":{"tf":1.0},"25":{"tf":1.0},"28":{"tf":1.0},"31":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"0":{"tf":1.0},"12":{"tf":1.4142135623730951},"31":{"tf":1.0},"36":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"u":{"c":{"df":1,"docs":{"14":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"20":{"tf":1.0},"31":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"10":{"tf":1.4142135623730951},"28":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}}}},"p":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"30":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"0":{"tf":1.0},"36":{"tf":1.0}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"28":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"20":{"tf":1.0}}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"30":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":12,"docs":{"13":{"tf":2.449489742783178},"21":{"tf":1.7320508075688772},"22":{"tf":2.23606797749979},"24":{"tf":2.449489742783178},"25":{"tf":3.605551275463989},"26":{"tf":2.449489742783178},"27":{"tf":2.449489742783178},"30":{"tf":1.4142135623730951},"31":{"tf":2.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.4142135623730951},"36":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}},"n":{"df":1,"docs":{"30":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"12":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}}}}},"w":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"21":{"tf":1.0}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"21":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":2,"docs":{"18":{"tf":1.0},"21":{"tf":3.0}},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"21":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":0,"docs":{}},"df":3,"docs":{"13":{"tf":1.4142135623730951},"15":{"tf":1.0},"30":{"tf":1.0}}}},"d":{"df":3,"docs":{"13":{"tf":1.0},"24":{"tf":1.0},"31":{"tf":1.0}},"i":{"df":2,"docs":{"10":{"tf":1.0},"12":{"tf":1.0}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"15":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}}},"df":3,"docs":{"13":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951},"36":{"tf":1.0}},"f":{"df":3,"docs":{"26":{"tf":1.0},"27":{"tf":1.0},"31":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"3":{"tf":1.0},"36":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":3,"docs":{"15":{"tf":1.0},"17":{"tf":1.0},"34":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":1,"docs":{"9":{"tf":1.0}}}},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":2.23606797749979}},"e":{"*":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"v":{"df":1,"docs":{"33":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}}}},"q":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"36":{"tf":1.7320508075688772}},"e":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"36":{"tf":1.7320508075688772}}},".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{")":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"(":{")":{")":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"(":{"\"":{"1":{"2":{"7":{".":{"0":{".":{"0":{".":{"1":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"2":{"0":{"0":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"\"":{"/":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"36":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":4,"docs":{"10":{"tf":1.0},"13":{"tf":2.0},"15":{"tf":1.4142135623730951},"36":{"tf":4.69041575982343}},"f":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"36":{"tf":2.0}}}}}}}},"i":{"df":0,"docs":{},"r":{"df":2,"docs":{"1":{"tf":1.0},"27":{"tf":1.0}}}}}},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":3,"docs":{"13":{"tf":1.0},"15":{"tf":1.0},"34":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":1,"docs":{"1":{"tf":1.0}},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}},"df":0,"docs":{},"s":{"df":3,"docs":{"1":{"tf":1.0},"14":{"tf":1.0},"36":{"tf":2.23606797749979}}}}}},"t":{"df":1,"docs":{"13":{"tf":1.0}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"d":{"/":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"36":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":5,"docs":{"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"20":{"tf":1.0},"25":{"tf":1.0},"31":{"tf":1.4142135623730951}}}},"m":{"df":4,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"18":{"tf":1.0},"9":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"1":{"tf":1.0}},"e":{"*":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":10,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.7320508075688772},"20":{"tf":1.4142135623730951},"21":{"tf":1.0},"25":{"tf":1.4142135623730951},"36":{"tf":2.449489742783178}}}}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"25":{"tf":1.0}}}}}}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":2,"docs":{"30":{"tf":1.0},"36":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"20":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"(":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}}}},"df":1,"docs":{"31":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"(":{"c":{"b":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":4,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"28":{"tf":1.0},"31":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"12":{"tf":2.23606797749979}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}},"s":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":2,"docs":{"20":{"tf":1.7320508075688772},"34":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"15":{"tf":1.0}}}}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":5,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":1.0},"18":{"tf":1.0},"24":{"tf":1.0}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"36":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"12":{"tf":1.4142135623730951},"16":{"tf":1.0},"20":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":5,"docs":{"17":{"tf":1.0},"3":{"tf":1.0},"33":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"35":{"tf":1.0}}}},"df":0,"docs":{}},"f":{"df":1,"docs":{"0":{"tf":1.0}}}},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"d":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}},"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"31":{"tf":1.0},"35":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"0":{"tf":1.0},"36":{"tf":3.3166247903554},"7":{"tf":1.0},"8":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"1":{"tf":1.4142135623730951}}}}}}},"t":{"df":1,"docs":{"27":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"17":{"tf":1.0},"2":{"tf":1.0},"30":{"tf":1.7320508075688772},"33":{"tf":1.4142135623730951},"34":{"tf":1.0}}}}}},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":3,"docs":{"14":{"tf":1.0},"30":{"tf":1.0},"5":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.0}},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"w":{"df":1,"docs":{"13":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":2,"docs":{"13":{"tf":1.0},"14":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"35":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"28":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":2,"docs":{"28":{"tf":2.449489742783178},"6":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"17":{"tf":1.0},"36":{"tf":1.0}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"31":{"tf":1.0},"34":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"l":{"df":4,"docs":{"13":{"tf":1.0},"30":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}}}}}}}}}}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":6,"docs":{"10":{"tf":1.7320508075688772},"12":{"tf":1.0},"14":{"tf":1.0},"28":{"tf":1.0},"30":{"tf":1.7320508075688772},"36":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"(":{"3":{"0":{"0":{"0":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"(":{"1":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"12":{"tf":1.4142135623730951},"16":{"tf":1.0},"20":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"30":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"0":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"13":{"tf":1.4142135623730951},"30":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"30":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"0":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}},"df":2,"docs":{"15":{"tf":1.0},"30":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":2,"docs":{"13":{"tf":1.4142135623730951},"15":{"tf":1.0}}}}}},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"13":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"26":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"10":{"tf":1.0},"13":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"24":{"tf":1.0}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"27":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":2,"docs":{"13":{"tf":1.0},"36":{"tf":1.0}},"i":{"df":3,"docs":{"19":{"tf":1.0},"25":{"tf":1.0},"27":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"l":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"35":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"33":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":7,"docs":{"1":{"tf":1.0},"13":{"tf":2.0},"20":{"tf":1.0},"28":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0},"36":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"18":{"tf":1.0},"20":{"tf":1.0},"33":{"tf":1.4142135623730951}}},"u":{"df":2,"docs":{"24":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":3,"docs":{"12":{"tf":1.4142135623730951},"15":{"tf":1.0},"20":{"tf":1.0}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"11":{"tf":1.0},"13":{"tf":1.7320508075688772},"24":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"21":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"17":{"tf":1.0},"33":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"1":{"tf":1.4142135623730951},"36":{"tf":2.23606797749979}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"12":{"tf":1.0}}}}}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":2,"docs":{"27":{"tf":1.4142135623730951},"31":{"tf":1.0}}}}}},"u":{"b":{"df":1,"docs":{"30":{"tf":1.0}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"h":{"df":5,"docs":{"12":{"tf":1.0},"15":{"tf":1.0},"21":{"tf":1.0},"24":{"tf":1.0},"32":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"25":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":6,"docs":{"0":{"tf":1.7320508075688772},"2":{"tf":1.7320508075688772},"32":{"tf":1.7320508075688772},"34":{"tf":1.4142135623730951},"35":{"tf":2.23606797749979},"36":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":3,"docs":{"13":{"tf":1.0},"26":{"tf":1.0},"34":{"tf":1.0}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{}}}}}},"y":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"0":{"tf":1.0},"35":{"tf":1.0}}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"18":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"t":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":2,"docs":{"15":{"tf":1.0},"30":{"tf":1.0}}}},"s":{"df":0,"docs":{},"k":{".":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"30":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{"1":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"30":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}},"df":9,"docs":{"11":{"tf":1.0},"13":{"tf":1.4142135623730951},"18":{"tf":1.0},"28":{"tf":1.4142135623730951},"30":{"tf":3.7416573867739413},"31":{"tf":1.7320508075688772},"34":{"tf":1.4142135623730951},"5":{"tf":1.0},"9":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.0}}}}},"df":1,"docs":{"7":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"15":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"1":{"tf":1.0},"12":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"32":{"tf":1.0}}}},"t":{"'":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"31":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"33":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":3,"docs":{"18":{"tf":1.0},"21":{"tf":1.0},"26":{"tf":1.0}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}},"s":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"[":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"28":{"tf":1.0}}}}}},"df":6,"docs":{"10":{"tf":1.4142135623730951},"18":{"tf":1.0},"28":{"tf":3.1622776601683795},"31":{"tf":1.4142135623730951},"34":{"tf":1.0},"6":{"tf":1.7320508075688772}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"28":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"28":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":4,"docs":{"12":{"tf":1.0},"21":{"tf":1.0},"27":{"tf":1.0},"36":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}}}}}}}}}},"u":{"df":3,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"16":{"tf":3.0},"20":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":2.23606797749979}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":4,"docs":{"10":{"tf":1.0},"17":{"tf":2.0},"31":{"tf":1.0},"9":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"30":{"tf":1.0}}}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":3,"docs":{"13":{"tf":1.0},"30":{"tf":3.0},"5":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}}}},"r":{"df":3,"docs":{"12":{"tf":1.0},"18":{"tf":1.0},"30":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.0}}}}}},"p":{"df":3,"docs":{"29":{"tf":1.7320508075688772},"30":{"tf":1.0},"31":{"tf":1.0}}}},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"16":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":2.23606797749979}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"15":{"tf":1.0}}}}}},"p":{"df":1,"docs":{"35":{"tf":1.0}}}},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"0":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"35":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"13":{"tf":1.0}}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"24":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"k":{"df":3,"docs":{"29":{"tf":1.7320508075688772},"30":{"tf":1.0},"31":{"tf":1.0}}}},"df":9,"docs":{"1":{"tf":1.0},"13":{"tf":1.4142135623730951},"15":{"tf":1.0},"22":{"tf":1.0},"24":{"tf":1.4142135623730951},"27":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0},"36":{"tf":1.0}},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"12":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"e":{"df":4,"docs":{"12":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":2.0},"27":{"tf":2.0}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"26":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":3,"docs":{"13":{"tf":1.4142135623730951},"20":{"tf":1.4142135623730951},"8":{"tf":1.0}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"13":{"tf":1.0},"8":{"tf":1.0}}}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":11,"docs":{"11":{"tf":1.4142135623730951},"19":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.7320508075688772},"23":{"tf":1.0},"25":{"tf":2.449489742783178},"26":{"tf":2.0},"28":{"tf":1.7320508075688772},"33":{"tf":1.0},"36":{"tf":1.0},"9":{"tf":1.0}}},"i":{"c":{"df":4,"docs":{"10":{"tf":1.0},"13":{"tf":1.4142135623730951},"20":{"tf":1.4142135623730951},"34":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"b":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{},"h":{"df":2,"docs":{"21":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}},"c":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"24":{"tf":1.0},"26":{"tf":1.0}}}}},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"15":{"tf":1.0},"24":{"tf":1.0},"31":{"tf":1.0}}}}}},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"27":{"tf":1.0},"37":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"*":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":2.23606797749979}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"13":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"a":{"d":{"df":1,"docs":{"33":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":19,"docs":{"0":{"tf":1.0},"1":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.4142135623730951},"25":{"tf":1.0},"27":{"tf":1.4142135623730951},"28":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.7320508075688772},"33":{"tf":1.0},"34":{"tf":2.0},"35":{"tf":1.7320508075688772},"36":{"tf":1.4142135623730951},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"24":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"22":{"tf":1.4142135623730951},"36":{"tf":1.0}}}},"df":0,"docs":{}}}},"v":{"3":{"df":2,"docs":{"32":{"tf":1.0},"33":{"tf":1.7320508075688772}}},"4":{"/":{"df":0,"docs":{},"v":{"6":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"32":{"tf":1.4142135623730951},"33":{"tf":1.0}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":5,"docs":{"11":{"tf":1.0},"20":{"tf":1.4142135623730951},"25":{"tf":1.0},"28":{"tf":1.0},"36":{"tf":1.0}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{")":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":3,"docs":{"21":{"tf":1.4142135623730951},"26":{"tf":1.0},"31":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":4,"docs":{"24":{"tf":1.7320508075688772},"26":{"tf":1.4142135623730951},"31":{"tf":1.0},"33":{"tf":1.0}}}}}}}}}},"r":{"df":3,"docs":{"16":{"tf":1.0},"25":{"tf":1.0},"28":{"tf":1.0}},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"17":{"tf":1.0},"25":{"tf":1.0},"36":{"tf":1.4142135623730951}}}}}}}},"i":{"a":{"df":3,"docs":{"12":{"tf":1.0},"21":{"tf":1.0},"36":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":7,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.7320508075688772},"14":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"28":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}}}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{".":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":8,"docs":{"1":{"tf":1.0},"12":{"tf":2.23606797749979},"16":{"tf":1.4142135623730951},"20":{"tf":1.0},"24":{"tf":1.0},"28":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"36":{"tf":1.4142135623730951}}}},"y":{"df":3,"docs":{"12":{"tf":1.0},"28":{"tf":1.0},"35":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"b":{"df":2,"docs":{"13":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"27":{"tf":1.0},"33":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"13":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":4,"docs":{"15":{"tf":1.0},"17":{"tf":1.0},"21":{"tf":1.0},"25":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"2":{"tf":1.0}}}}},"df":1,"docs":{"13":{"tf":1.4142135623730951}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"13":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"35":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"28":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"27":{"tf":1.0},"31":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}}}}}}}}}}},"o":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"k":{"df":3,"docs":{"13":{"tf":1.0},"25":{"tf":1.4142135623730951},"28":{"tf":2.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"12":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"34":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"33":{"tf":1.4142135623730951}}}}}}},"y":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"34":{"tf":1.0}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"u":{"'":{"df":0,"docs":{},"r":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"title":{"root":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"3":{"tf":1.0}}}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":3,"docs":{"18":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}}},"df":0,"docs":{}}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"35":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"29":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"37":{"tf":1.0}}}}}},"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"22":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"12":{"tf":1.0}}}},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"13":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":2,"docs":{"32":{"tf":1.0},"33":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"22":{"tf":1.0}}}}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"32":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"5":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"31":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"o":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"4":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":4,"docs":{"23":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0}}}}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}}},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":2,"docs":{"36":{"tf":1.0},"8":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"20":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"m":{"df":0,"docs":{},"i":{"d":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"35":{"tf":1.0}}}}}}}}},"n":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}}}},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"12":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"32":{"tf":1.0}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"29":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"18":{"tf":1.0},"21":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"w":{"df":1,"docs":{"21":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"2":{"tf":1.0},"35":{"tf":1.0}}}}}}}}},"t":{"c":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":2,"docs":{"28":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"17":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.0}}}}}}},"p":{"df":1,"docs":{"29":{"tf":1.0}}}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"29":{"tf":1.0}}}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":2,"docs":{"11":{"tf":1.0},"26":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"37":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"v":{"3":{"df":1,"docs":{"33":{"tf":1.0}}},"4":{"df":1,"docs":{"32":{"tf":1.0}}},"df":0,"docs":{}}}}},"lang":"English","pipeline":["trimmer","stopWordFilter","stemmer"],"ref":"id","version":"0.9.5"},"results_options":{"limit_results":30,"teaser_word_count":30},"search_options":{"bool":"OR","expand":true,"fields":{"body":{"boost":1},"breadcrumbs":{"boost":1},"title":{"boost":2}}}} \ No newline at end of file diff --git a/threads.html b/threads.html new file mode 100644 index 00000000..2fda561f --- /dev/null +++ b/threads.html @@ -0,0 +1,281 @@ + + + + + + Threads - Chronos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Threads

+

While the cooperative async model offers an efficient model +for dealing with many tasks that often are blocked on I/O, it is not suitable +for long-running computations that would prevent concurrent tasks from progressing.

+

Multithreading offers a way to offload heavy computations to be executed in +parallel with the async work, or, in cases where a single event loop gets +overloaded, to manage multiple event loops in parallel.

+

For interaction between threads, the ThreadSignalPtr type (found in the +(chronos/threadsync)(https://github.com/status-im/nim-chronos/blob/master/chronos/threadsync.nim) +module) is used - both to wait for notifications coming from other threads and +to notify other threads of progress from within an async procedure.

+
import chronos, chronos/threadsync
+import os
+
+type
+  Context = object
+    # Context allocated by `createShared` should contain no garbage-collected
+    # types!
+    signal: ThreadSignalPtr
+    value: int
+
+proc myThread(ctx: ptr Context) {.thread.} =
+  echo "Doing some work in a thread"
+  sleep(3000)
+  ctx.value = 42
+  echo "Done, firing the signal"
+  discard ctx.signal.fireSync().expect("correctly initialized signal should not fail")
+
+proc main() {.async.} =
+  let
+    signal = ThreadSignalPtr.new().expect("free file descriptor for signal")
+    context = createShared(Context)
+  context.signal = signal
+
+  var thread: Thread[ptr Context]
+
+  echo "Starting thread"
+  createThread(thread, myThread, context)
+
+  await signal.wait()
+
+  echo "Work done: ", context.value
+
+  joinThread(thread)
+
+  signal.close().expect("closing once works")
+  deallocShared(context)
+
+waitFor main()
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/tips.html b/tips.html new file mode 100644 index 00000000..418e04a6 --- /dev/null +++ b/tips.html @@ -0,0 +1,322 @@ + + + + + + Tips, tricks and best practices - Chronos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Tips, tricks and best practices

+

Timeouts

+

To prevent a single task from taking too long, withTimeout can be used:

+
## Simple timeouts
+import chronos
+
+proc longTask {.async.} =
+  try:
+    await sleepAsync(10.minutes)
+  except CancelledError as exc:
+    echo "Long task was cancelled!"
+    raise exc # Propagate cancellation to the next operation
+
+proc simpleTimeout() {.async.} =
+  let
+    task = longTask() # Start a task but don't `await` it
+
+  if not await task.withTimeout(1.seconds):
+    echo "Timeout reached - withTimeout should have cancelled the task"
+  else:
+    echo "Task completed"
+
+waitFor simpleTimeout()
+
+

When several tasks should share a single timeout, a common timer can be created +with sleepAsync:

+
## Single timeout for several operations
+import chronos
+
+proc shortTask {.async.} =
+  try:
+    await sleepAsync(1.seconds)
+  except CancelledError as exc:
+    echo "Short task was cancelled!"
+    raise exc # Propagate cancellation to the next operation
+
+proc composedTimeout()  {.async.} =
+  let
+    # Common timout for several sub-tasks
+    timeout = sleepAsync(10.seconds)
+
+  while not timeout.finished():
+    let task = shortTask() # Start a task but don't `await` it
+    if (await race(task, timeout)) == task:
+      echo "Ran one more task"
+    else:
+      # This cancellation may or may not happen as task might have finished
+      # right at the timeout!
+      task.cancelSoon()
+
+waitFor composedTimeout()
+
+

discard

+

When calling an asynchronous procedure without await, the operation is started +but its result is not processed until corresponding Future is read.

+

It is therefore important to never discard futures directly - instead, one +can discard the result of awaiting the future or use asyncSpawn to monitor +the outcome of the future as if it were running in a separate thread.

+

Similar to threads, tasks managed by asyncSpawn may causes the application to +crash if any exceptions leak out of it - use +checked exceptions to avoid this +problem.

+
## The peculiarities of `discard` in `async` procedures
+import chronos
+
+proc failingOperation() {.async.} =
+  echo "Raising!"
+  raise (ref ValueError)(msg: "My error")
+
+proc myApp() {.async.} =
+  # This style of discard causes the `ValueError` to be discarded, hiding the
+  # failure of the operation - avoid!
+  discard failingOperation()
+
+  proc runAsTask(fut: Future[void]): Future[void] {.async: (raises: []).} =
+    # runAsTask uses `raises: []` to ensure at compile-time that no exceptions
+    # escape it!
+    try:
+      await fut
+    except CatchableError as exc:
+      echo "The task failed! ", exc.msg
+
+  # asyncSpawn ensures that errors don't leak unnoticed from tasks without
+  # blocking:
+  asyncSpawn runAsTask(failingOperation())
+
+  # If we didn't catch the exception with `runAsTask`, the program will crash:
+  asyncSpawn failingOperation()
+
+waitFor myApp()
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/tomorrow-night.css b/tomorrow-night.css new file mode 100644 index 00000000..81fe276e --- /dev/null +++ b/tomorrow-night.css @@ -0,0 +1,102 @@ +/* Tomorrow Night Theme */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment { + color: #969896; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #cc6666; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #de935f; +} + +/* Tomorrow Yellow */ +.ruby .hljs-class .hljs-title, +.css .hljs-rule .hljs-attribute { + color: #f0c674; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.hljs-name, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #b5bd68; +} + +/* Tomorrow Aqua */ +.hljs-title, +.css .hljs-hexcolor { + color: #8abeb7; +} + +/* Tomorrow Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #81a2be; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #b294bb; +} + +.hljs { + display: block; + overflow-x: auto; + background: #1d1f21; + color: #c5c8c6; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} + +.hljs-addition { + color: #718c00; +} + +.hljs-deletion { + color: #c82829; +}