From 8eefa2126bb55d89247feab0491cf6c5516a08ee Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Fri, 2 Aug 2013 08:22:53 -0600 Subject: [PATCH] add `current-library-collection-links' parameter Also, the initial value causes `curent-library-collection-paths' before collection links files, instead of after. --- .../scribblings/reference/collects.scrbl | 292 ++- .../reference/module-reflect.scrbl | 9 +- .../racket-test/tests/racket/collects.rktl | 73 + .../racket-test/tests/racket/mz-tests.rktl | 1 + pkgs/sandbox-lib/racket/sandbox.rkt | 33 +- pkgs/shell-completion/list-collects.rkt | 34 +- racket/collects/racket/HISTORY.txt | 8 + racket/collects/racket/private/misc.rkt | 1 + racket/collects/setup/setup-unit.rkt | 59 +- racket/src/racket/include/scheme.h | 1 + racket/src/racket/include/schthread.h | 2 - racket/src/racket/src/cstartup.inc | 1869 ++++++++--------- racket/src/racket/src/eval.c | 8 + racket/src/racket/src/file.c | 118 +- racket/src/racket/src/place.c | 8 + racket/src/racket/src/schminc.h | 2 +- racket/src/racket/src/schpriv.h | 1 + racket/src/racket/src/schvers.h | 4 +- racket/src/racket/src/startup.inc | 107 +- racket/src/racket/src/startup.rktl | 164 +- racket/src/racket/src/thread.c | 2 +- 21 files changed, 1541 insertions(+), 1255 deletions(-) create mode 100644 pkgs/racket-pkgs/racket-test/tests/racket/collects.rktl diff --git a/pkgs/racket-pkgs/racket-doc/scribblings/reference/collects.scrbl b/pkgs/racket-pkgs/racket-doc/scribblings/reference/collects.scrbl index 65d226bff1..0e38b81874 100644 --- a/pkgs/racket-pkgs/racket-doc/scribblings/reference/collects.scrbl +++ b/pkgs/racket-pkgs/racket-doc/scribblings/reference/collects.scrbl @@ -5,29 +5,18 @@ @title[#:tag "collects"]{Libraries and Collections} A @deftech{library} is @racket[module] declaration for use by multiple -programs. Racket further groups libraries into @deftech{collections} -that can be easily distributed and added to a local Racket -installation. +programs. Racket further groups libraries into @deftech{collections}. +Typically, collections are added via @deftech{packages} (see +@other-doc['(lib "pkg/scribblings/pkg.scrbl")]); the package manager +works outside of the Racket core, but it configures the core run-time +system through @tech{collection links files}. -Some libraries are distributed via @|PLaneT| packages. Such libraries are -referenced through a @racket[planet] module path (see -@racket[require]) and are downloaded by Racket on demand. - -Other collections are distributed with Racket, in which case each -collection is a directory that is located in a @filepath{collects} -directory relative to the Racket executable. A collection can also be -installed in a user-specific directory. More generally, the search -path for installed collections can be configured through the -@racket[current-library-collection-paths] parameter. Finally, the -location of collections can be specified through the @tech{collection -links files}; see @secref["links-file"] for more information. In all -of these cases, the collections are referenced through @racket[lib] -paths (see @racket[require]) or symbolic shorthands. - -For example, the following module uses the @filepath{getinfo.rkt} -library module from the @filepath{setup} collection, and the -@filepath{cards.rkt} library module from the @filepath{games} -collection's @filepath{cards} subcollection: +Libraries in collections are referenced through @racket[lib] paths +(see @racket[require]) or symbolic shorthands. For example, the +following module uses the @filepath{getinfo.rkt} library module from +the @filepath{setup} collection, and the @filepath{cards.rkt} library +module from the @filepath{games} collection's @filepath{cards} +subcollection: @racketmod[ racket @@ -58,35 +47,137 @@ element that names a library file; the path elements are separated by @racket[_rel-string] contains @litchar{/} but does not end with a file suffix, then @litchar{.rkt} is implicitly appended to the path. +Libraries also can be distributed via @|PLaneT| packages. Such +libraries are referenced through a @racket[planet] module path (see +@racket[require]) and are downloaded by Racket on demand, instead of +referenced through @tech{collections}. + The translation of a @racket[planet] or @racket[lib] path to a @racket[module] declaration is determined by the @tech{module name resolver}, as specified by the @racket[current-module-name-resolver] parameter. +@; ---------------------------------------------------------------------- + +@section[#:tag "collects-search"]{Collection Search Configuration} + For the default @tech{module name resolver}, the search path for -collections is determined by the content of the @tech{collection links files} -and the -@racket[current-library-collection-paths] parameter. The collection -links and then list of paths in -@racket[current-library-collection-paths] are searched from first to -last to locate the first that contains @racket[_rel-string]. In other -words, the filesystem tree for each element in the link table and -search path is spliced together with the filesystem trees of other -path elements. Some Racket tools rely on unique resolution of module -path names, so an installation and -@racket[current-library-collection-paths] configuration should not -allow multiple files to match the same collection and file name. +collections is determined by the +@racket[current-library-collection-links] parameter and the +@racket[current-library-collection-paths] parameter: -The value of the @racket[current-library-collection-paths] parameter -is initialized in the Racket executable to the result of -@racket[(find-library-collection-paths)]. +@itemlist[ + @item{The most primitive @tech{collection}-based modules are located + in @filepath{collects} directory relative to the Racket + executable. Libraries for a collection are grouped within a + directory whose name matches the collection name. The path to + the @filepath{collects} directory is normally included in + @racket[current-library-collection-paths].} + + @item{Collection-based libraries also can be installed other + directories, perhaps user-specific, that are structured like + the @filepath{collects} directory. Those additional directories + can be included in the + @racket[current-library-collection-paths] parameter either + dynamically, through command-line arguments to @exec{racket}, + or by setting the @envvar{PLTCOLLECTS} environment variable; + see @racket[find-library-collection-paths].} + + @item{@tech{Collection links files} provide a mapping from top-level + collection names to directories, plus additional + @filepath{collects}-like directories (that have subdirectories + with names that match collection names). Each @tech{collection + links file} to be searched is referenced by the + @racket[current-library-collection-links] parameter; the parameter + references the file, and not the file's content, so + that changes to the file can be detected and affect later + module resolution. See also + @racket[find-library-collection-links].} + + @item{The @racket[current-library-collection-links] parameter's value + can also include hash tables that provide the same content as + @tech{collection links files}: a mapping from collection names + in symbol form to a list of paths for the collection, or from + @racket[#f] to a list of @filepath{collects}-like paths.} + + @item{Finally, the @racket[current-library-collection-links] + parameter's value includes @racket[#f] to indicate the point in + the search process at which the @tech{module-name resolver} should + check @racket[current-library-collection-paths] relative to the + files and hash tables in @racket[current-library-collection-links].} + +] + +To resolve a module reference @racket[_rel-string], the default +@tech{module name resolver} searches collection links in +@racket[current-library-collection-links] from first to last to locate +the first directory that contains @racket[_rel-string], splicing a +search through in @racket[current-library-collection-paths] where in +@racket[current-library-collection-links] contains @racket[#f]. The +filesystem tree for each element in the link table and search path is +effectively spliced together with the filesystem trees of other path +elements that correspond to the same collection. Some Racket tools +rely on unique resolution of module path names, so an installation and +configuration should not allow multiple files to match the same +collection and file name. + +The value of the @racket[current-library-collection-links] parameter +is initialized by the @exec{racket} executable to the result of +@racket[(find-library-collection-links)], and the value of the +@racket[current-library-collection-paths] parameter is initialized to +the result of @racket[(find-library-collection-paths)]. + +@; ---------------------------------------------------------------------- + +@section[#:tag "links-file"]{Collection Links} + +@deftech{Collection links files} are used by +@racket[collection-file-path], @racket[collection-path], and the +default @tech{module name resolver} to locate collections before +trying the @racket[(current-library-collection-paths)] search +path. The @tech{collection links files} to use are determined by the +@racket[current-library-collection-links] parameter, which is +initialized to the result of @racket[find-library-collection-links]. + +A @tech{collection links file} is @racket[read] with default reader +parameter settings to obtain a list. Every element of the list must be +a link specification with one of the forms @racket[(list _string +_path)], @racket[(list _string _path _regexp)], @racket[(list 'root +_path)], @racket[(list 'root _path _regexp)], @racket[(list 'static-root +_path)], @racket[(list 'static-root _path _regexp)]. A @racket[_string] names a +top-level @tech{collection}, in which case @racket[_path] is a path +that can be used as the collection's path (directly, as opposed to a +subdirectory of @racket[_path] named by @racket[_string]). A +@racket['root] entry, in contrast, acts like an path in +@racket[(current-library-collection-paths)]. A +@racket['static-root] entry is like a @racket['root] entry, but +where the immediate content of the directory is assumed not to change unless the +@tech{collection links file} changes. If @racket[_path] is a +relative path, it is relative to the directory containing the +@tech{collection links file}. If @racket[_regexp] is specified in a +link, then the link is used only if @racket[(regexp-match? _regexp +(version))] produces a true result. + +A single top-level collection can have multiple links in a +@tech{collection links file}, and any number of @racket['root] entries +can appear. The corresponding paths are effectively spliced together, +since the paths are tried in order to locate a file or sub-collection. + +The @exec{raco link} command-link tool can display, install, and +remove links in a @tech{collection links file}. See @secref[#:doc +raco-doc "link"] in @other-manual[raco-doc] for more information. + +@; ---------------------------------------- + +@section[#:tag "collects-api"]{Collection Paths and Parameters} @defproc[(find-library-collection-paths [pre-extras (listof path-string?) null] [post-extras (listof path-string?) null]) (listof path?)]{ -Produces a list of paths as follows: +Produces a list of paths, which is normally used to initialize +@racket[current-library-collection-paths], as follows: @itemize[ @@ -110,9 +201,11 @@ Produces a list of paths as follows: @item{If the @indexed-envvar{PLTCOLLECTS} environment variable is defined, it is combined with the default list using - @racket[path-list-string->path-list]. If it is not defined, the - default collection path list (as constructed by the first three - bullets above) is used directly. + @racket[path-list-string->path-list], as long as the value of + @racket[use-user-specific-search-paths] is true. If it is not + defined or if the value @racket[use-user-specific-search-paths] is + @racket[#f], the default collection path list (as constructed by the + first three bullets above) is used directly. Note that on @|AllUnix|, paths are separated by @litchar{:}, and on Windows by @litchar{;}. Also, @@ -124,6 +217,36 @@ Produces a list of paths as follows: ]} +@defproc[(find-library-collection-links) + (listof (or/c #f (and/c path? complete-path?)))]{ + +Produces a list of paths and @racket[#f], which is normally used to +initialized @racket[current-library-collection-links], as follows: + +@itemlist[ + + @item{The list starts with @racket[#f], which causes the default + @tech{module name resolver}, @racket[collection-file-path], + and @racket[collection-path] to try paths in + @racket[current-library-collection-paths] before + @tech{collection links files}.} + + @item{As long as the values of + @racket[use-user-specific-search-paths] and + @racket[use-collection-link-paths] are true, the second element + in the result list is the path of the user--specific + @tech{collection links file}, which is @racket[(build-path + (find-system-path 'addon-dir) (get-installation-name) + "links.rktd")].} + + @item{As long as the value of @racket[use-collection-link-paths] is + true, the rest of the list contains the result of + @racket[get-links-search-files]. Typically, that function + produces a list with a single path, @racket[(build-path + (find-config-dir) "links.rktd")].} + +]} + @defproc*[([(collection-file-path [file path-string?] [collection path-string?] ...+) path?] @@ -133,7 +256,9 @@ Produces a list of paths as follows: Returns the path to the file indicated by @racket[file] in the collection specified by the @racket[collection]s, where the second -@racket[collection] (if any) names a sub-collection, and so on. +@racket[collection] (if any) names a sub-collection, and so on. The +search uses the values of @racket[current-library-collection-links] +and @racket[current-library-collection-paths]. If @racket[file] is not found, but @racket[file] ends in @filepath{.rkt} and a file with the suffix @filepath{.ss} exists, then @@ -170,8 +295,31 @@ the file level.} (listof (and/c path? complete-path?))]{ Parameter that determines a list of complete directory paths for -library collections used by @racket[require]. See -@secref["collects"] for more information.} +finding libraries (as referenced in @racket[require], for example) +through the default @tech{module name resolver} and for finding paths +through @racket[collection-path] and +@racket[collection-file-path]. See @secref["collects-search"] for more +information.} + + +@defparam*[current-library-collection-links paths + (listof (or/c #f + (and/c path-string? complete-path?) + (hash/c (or/c (and/c symbol? module-path?) #f) + (listof (and/c path-string? complete-path?))))) + (listof (or/c #f + (and/c path? complete-path?) + (hash/c (or/c (and/c symbol? module-path?) #f) + (listof (and/c path? complete-path?)))))]{ + + +Parameter that determines @tech{collection links files}, additional +paths, and the relative search order of +@racket[current-library-collection-paths] for finding libraries (as +referenced in @racket[require], for example) through the default +@tech{module name resolver} and for finding paths through +@racket[collection-path] and @racket[collection-file-path]. See +@secref["collects-search"] for more information.} @defboolparam[use-user-specific-search-paths on?]{ @@ -181,12 +329,17 @@ the directory produced by @racket[(find-system-path 'addon-dir)], are included in search paths for collections and other files. For example, the initial value of @racket[find-library-collection-paths] omits the user-specific collection directory when this parameter's value is +@racket[#f]. + +If @Flag{U} or @DFlag{no-user-path} argument to @exec{racket}, then +@racket[use-user-specific-search-paths] is initialized to @racket[#f].} + @defboolparam[use-collection-link-paths on?]{ Parameter that determines whether @tech{collection links files} are -used to locate collections. +included in the result of @racket[find-library-collection-links]. If this parameter's value is @racket[#f] on start-up, then @tech{collection links files} are effectively disabled permanently for @@ -196,52 +349,3 @@ only is @racket[current-library-collection-paths] initialized to the empty list, but @racket[use-collection-link-paths] is initialized to @racket[#f].} -@; ---------------------------------------------------------------------- - -@section[#:tag "links-file"]{Collection Links} - -The @deftech{collection links files} are used by -@racket[collection-file-path], @racket[collection-path], and the -default @tech{module name resolver} to locate collections before -trying the @racket[(current-library-collection-paths)] search -path, but only if the @racket[use-collection-link-paths] parameter is set to -@racket[#t]. Furthermore, a user-specific @tech{collection links file} takes -precedence over an installation-wide @tech{collection links file}. -The user-specific @tech{collection links file} is used only if the -@racket[use-user-specific-search-paths] parameter is set to -@racket[#t]. - -The path of the user--specific @tech{collection links file} is -@racket[(build-path (find-system-path 'addon-dir) (get-installation-name) "links.rktd")]. -The path of the installation-wide @tech{collection links file} is -@racket[(build-path (find-config-dir) "links.rktd")]. -Each @tech{collection links file} is cached by Racket, but -the file is re-read if its content changes. - -A @tech{collection links file} is @racket[read] with default reader -parameter settings to obtain a list. Every element of the list must be -a link specification with one of the forms @racket[(list _string -_path)], @racket[(list _string _path _regexp)], @racket[(list 'root -_path)], @racket[(list 'root _path _regexp)], @racket[(list 'static-root -_path)], @racket[(list 'static-root _path _regexp)]. A @racket[_string] names a -top-level @tech{collection}, in which case @racket[_path] is a path -that can be used as the collection's path (directly, as opposed to a -subdirectory of @racket[_path] named by @racket[_string]). A -@racket['root] entry, in contrast, acts like an path in -@racket[(current-library-collection-paths)]. A -@racket['static-root] entry is like a @racket['root] entry, but -where the immediate content of the directory is assumed not to change unless the -@tech{collection links file} changes. If @racket[_path] is a -relative path, it is relative to the directory containing the -@tech{collection links file}. If @racket[_regexp] is specified in a -link, then the link is used only if @racket[(regexp-match? _regexp -(version))] produces a true result. - -A single top-level collection can have multiple links in a -@tech{collection links file}, and any number of @racket['root] entries -can appear. The corresponding paths are effectively spliced together, -since the paths are tried in order to locate a file or sub-collection. - -The @exec{raco link} command-link tool can display, install, and -remove links in the @tech{collection links file}. See @secref[#:doc -raco-doc "link"] in @other-manual[raco-doc] for more information. diff --git a/pkgs/racket-pkgs/racket-doc/scribblings/reference/module-reflect.scrbl b/pkgs/racket-pkgs/racket-doc/scribblings/reference/module-reflect.scrbl index 9c9e4051ff..542552b5e7 100644 --- a/pkgs/racket-pkgs/racket-doc/scribblings/reference/module-reflect.scrbl +++ b/pkgs/racket-pkgs/racket-doc/scribblings/reference/module-reflect.scrbl @@ -80,7 +80,14 @@ when the expander encounters @racket[(require _module-path)] where or resolved module path. When such a @racket[require] appears within a module, the @deftech{module path resolver} is also given the name of the enclosing module, so that a relative reference can be converted to -an absolute symbol or @tech{resolved module path}. +an absolute symbol or @tech{resolved module path}. + +The default @tech{module name resolver} uses +@racket[collection-file-path] to convert @racket[lib] and +symbolic-shorthand module paths to filesystem paths. The +@racket[collection-file-path] function, in turn, uses the +@racket[current-library-collection-links] +and @racket[current-library-collection-paths] parameters. A @tech{module name resolver} takes two and four arguments: @itemize[ diff --git a/pkgs/racket-pkgs/racket-test/tests/racket/collects.rktl b/pkgs/racket-pkgs/racket-test/tests/racket/collects.rktl new file mode 100644 index 0000000000..4e073bfea1 --- /dev/null +++ b/pkgs/racket-pkgs/racket-test/tests/racket/collects.rktl @@ -0,0 +1,73 @@ + +(load-relative "loadtest.rktl") + +(Section 'collects) + +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(require racket/file) + +(let () + (define tmp-dir (make-temporary-file "collects~a" 'directory)) + + (make-directory* (build-path tmp-dir "zjhyq-1")) + (with-output-to-file (build-path tmp-dir "zjhyq-1" "m.rkt") + (lambda () + (displayln "#lang racket/base") + (displayln "(provide v)") + (displayln "(define v 1)"))) + + (test #f collection-path "zjhyq-1" #:fail (lambda (s) #f)) + (define (test-found) + (test (build-path (build-path tmp-dir "zjhyq-1")) + collection-path "zjhyq-1") + (test (build-path (build-path tmp-dir "zjhyq-1" "m.rkt")) + collection-file-path "m.rkt" "zjhyq-1")) + + ;; Add to paths + (parameterize ([current-library-collection-paths + (append (current-library-collection-paths) + (list tmp-dir))]) + (test-found)) + + ;; Add to link as hash table from #f: + (parameterize ([current-library-collection-links + (append (current-library-collection-links) + (list (hash #f (list tmp-dir))))]) + (test-found)) + + ;; Add to link as hash table from 'zjhyq-1: + (parameterize ([current-library-collection-links + (append (current-library-collection-links) + (list (hash 'zjhyq-1 (list (build-path tmp-dir "zjhyq-1")))))]) + (test-found)) + + (delete-directory/files tmp-dir)) + +;; ---------------------------------------- + +(err/rt-test (current-library-collection-paths 5)) +(err/rt-test (current-library-collection-paths (list 5))) +(err/rt-test (current-library-collection-paths (list "relative"))) +;; strings coreced to paths: +(test #t andmap path? (parameterize ([current-library-collection-paths (list (path->string + (current-directory)))]) + (current-library-collection-paths))) + +(err/rt-test (current-library-collection-links 5)) +(err/rt-test (current-library-collection-links (list 5))) +(err/rt-test (current-library-collection-links (list #t))) +(err/rt-test (current-library-collection-links (list "relative"))) +(err/rt-test (current-library-collection-links (list (hash 'bad! null)))) +(err/rt-test (current-library-collection-links (list (hash 'ok 5)))) +(err/rt-test (current-library-collection-links (list (hash 'ok (list 5))))) +(err/rt-test (current-library-collection-links (list (hash 'ok (list "relative"))))) +;; strings coreced to paths: +(test #t andmap path? (parameterize ([current-library-collection-links (list (path->string + (build-path (current-directory) + "links.rktd")))]) + (current-library-collection-links))) + +;; ---------------------------------------- + +(report-errs) diff --git a/pkgs/racket-pkgs/racket-test/tests/racket/mz-tests.rktl b/pkgs/racket-pkgs/racket-test/tests/racket/mz-tests.rktl index 528beb6601..d1f8b2213a 100644 --- a/pkgs/racket-pkgs/racket-test/tests/racket/mz-tests.rktl +++ b/pkgs/racket-pkgs/racket-test/tests/racket/mz-tests.rktl @@ -27,6 +27,7 @@ (load-relative "prompt.rktl") (load-relative "will.rktl") (load-relative "namespac.rktl") +(load-relative "collects.rktl") (load-relative "modprot.rktl") (load-relative "chaperone.rktl") (unless (or building-flat-tests? in-drscheme?) diff --git a/pkgs/sandbox-lib/racket/sandbox.rkt b/pkgs/sandbox-lib/racket/sandbox.rkt index bd26e361a1..a926460aa3 100644 --- a/pkgs/sandbox-lib/racket/sandbox.rkt +++ b/pkgs/sandbox-lib/racket/sandbox.rkt @@ -923,24 +923,25 @@ (current-library-collection-paths)))] [sandbox-path-permissions `(,@(map (lambda (p) `(read-bytecode ,p)) - (append - (current-library-collection-paths) - (apply append - (for/list ([f (get-links-search-files)] - #:when (file-exists? f)) - (links #:root? #t #:file f))) - (links #:root? #t #:user? #t) - (apply append - (for/list ([f (get-links-search-files)] - #:when (file-exists? f)) - (map cdr (links #:file f #:with-path? #t)))) - (map cdr (links #:user? #t #:with-path? #t)))) + (apply + append + (for/list ([l (current-library-collection-links)]) + (cond + [(not l) + (current-library-collection-paths)] + [(hash? l) + (hash-values l)] + [else + (if (file-exists? l) + (append + (links #:root? #t #:file l) + (map cdr (links #:file l #:with-path? #t))) + null)])))) + ,@(for/list ([l (current-library-collection-links)] + #:when (path? l)) + `(read ,l)) (read-bytecode ,(PLANET-BASE-DIR)) (exists ,(find-system-path 'addon-dir)) - (read ,(build-path (find-system-path 'addon-dir) "links.rktd")) - (read ,(build-path (find-system-path 'addon-dir) (version) "links.rktd")) - ,@(for/list ([f (get-links-search-files)]) - `(read ,f)) (read ,(find-lib-dir)) ,@(compute-permissions allow-for-require allow-for-load) ,@(sandbox-path-permissions))] diff --git a/pkgs/shell-completion/list-collects.rkt b/pkgs/shell-completion/list-collects.rkt index b3a57a80a9..8e51612d3e 100644 --- a/pkgs/shell-completion/list-collects.rkt +++ b/pkgs/shell-completion/list-collects.rkt @@ -9,24 +9,22 @@ (hash-set s (path-element->string p) #t)) s)) -(define (links* m root?) - (case m - [(user) (links #:user? #t #:root? root?)] - [else (links #:file m #:root? root?)])) - (define (get-all-top-level-collections) - (define link-modes (list* 'user (get-links-search-files))) - - (let* ([s (hash)] - [s (for/fold ([s s]) ([c (in-list - (current-library-collection-paths))]) - (add-directory-collections c s))] - [s (for*/fold ([s s]) ([m (in-list link-modes)] - [l (in-list (links* m #f))]) - (hash-set s l #t))] - [s (for*/fold ([s s]) ([m (in-list link-modes)] - [c (in-list (links* m #t))]) - (add-directory-collections c s))]) - (hash-keys s))) + (hash-keys + (for/fold ([s (hash)]) ([l (in-list + (current-library-collection-links))]) + (cond + [(not l) + (for/fold ([s s]) ([c (in-list + (current-library-collection-paths))]) + (add-directory-collections c s))] + [(path? l) + (let ([s (for*/fold ([s s]) ([c (in-list (links #:file l #:root? #f))]) + (hash-set s c #t))]) + (for*/fold ([s s]) ([c (in-list (links #:file l #:root? #t))]) + (add-directory-collections c s)))] + [else (error 'get-all-top-level-collections + "unexpected value in `current-library-collection-links': ~e" + l)])))) (for-each displayln (get-all-top-level-collections)) diff --git a/racket/collects/racket/HISTORY.txt b/racket/collects/racket/HISTORY.txt index 70ab57e49c..968196f352 100644 --- a/racket/collects/racket/HISTORY.txt +++ b/racket/collects/racket/HISTORY.txt @@ -1,3 +1,11 @@ +Version 5.90.0.4 +Add current-library-collection-links, find-library-collection-links +Changed module search to use current-library-collection-paths + before collection link files by default +Changed use-user-specific-search-paths and use-collection-link-paths + to affect only find-library-collection-paths and + find-library-collection-links + Version 5.90.0.3 Base user directoy paths on an installation name instead of the Racket version string diff --git a/racket/collects/racket/private/misc.rkt b/racket/collects/racket/private/misc.rkt index b7ef5c35b6..ae421ca9b8 100644 --- a/racket/collects/racket/private/misc.rkt +++ b/racket/collects/racket/private/misc.rkt @@ -234,6 +234,7 @@ guard-evt channel-get channel-try-get channel-put port? displayln find-library-collection-paths + find-library-collection-links bytes-environment-variable-name? string-environment-variable-name? getenv putenv diff --git a/racket/collects/setup/setup-unit.rkt b/racket/collects/setup/setup-unit.rkt index b426a32880..88d2c8cfce 100644 --- a/racket/collects/setup/setup-unit.rkt +++ b/racket/collects/setup/setup-unit.rkt @@ -64,6 +64,8 @@ (define main-collects-dir (simple-form-path (find-collects-dir))) (define main-collects-dirs (for/hash ([p (in-list (get-main-collects-search-dirs))]) (values (simple-form-path p) #t))) + (define main-links-files (for/hash ([p (in-list (get-links-search-files))]) + (values (simple-form-path p) #t))) (define mode-dir (if (compile-mode) (build-path "compiled" (compile-mode)) @@ -76,7 +78,12 @@ p))) (current-library-collection-paths - (map simple-form-path (current-library-collection-paths))) + (if (member #f (current-library-collection-links)) + ;; Normal case, include current library collection paths: + (map simple-form-path (current-library-collection-paths)) + ;; No `#f' in links list means that we don't look at + ;; the current library collection paths: + null)) (define (setup-fprintf p task s . args) (let ([task (if task (string-append task ": ") "")]) @@ -345,7 +352,8 @@ ;; checkout as a collection directory (regexp-match? #rx"[.](git|svn)$" (path->bytes collection))) - ;; Add in all non-planet collections: + ;; Add in all non-planet collections, first from + ;; `current-library-collection-paths': (for ([cp (current-library-collection-paths)] #:when (directory-exists? cp) [collection (directory-list cp)] @@ -355,6 +363,8 @@ #:info-root cp #:path (build-path cp collection) #:main? (hash-ref main-collects-dirs cp #f))) + ;; Now from `current-library-collection-links' for installation-wide + ;; links: (let () (define info-root (find-share-dir)) (define info-path (build-path info-root "info-cache.rktd")) @@ -366,7 +376,9 @@ #:info-path-mode 'abs-in-relative #:omit-root 'dir #:main? #t)) - (for ([inst-links (in-list (get-links-search-files))]) + (for ([inst-links (in-list (current-library-collection-links))] + #:when (and (path? inst-links) + (hash-ref main-links-files (simple-form-path inst-links) #f))) (for ([c+p (in-list (links #:file inst-links #:with-path? #t))]) (cc! (list (string->path (car c+p))) #:path (cdr c+p))) @@ -377,6 +389,8 @@ #:when (directory-exists? (build-path cp collection))) (cc! (list collection) #:path (build-path cp collection))))) + ;; Now from `current-library-collection-links' for user-specific + ;; links: (when (make-user) (define info-root (find-user-share-dir)) (define info-path (build-path info-root "info-cache.rktd")) @@ -387,15 +401,36 @@ #:info-path info-path #:info-path-mode 'abs-in-relative #:omit-root 'dir)) - (for ([c+p (in-list (links #:with-path? #t))]) - (cc! (list (string->path (car c+p))) - #:path (cdr c+p))) - (for ([cp (in-list (links #:root? #t))] - #:when (directory-exists? cp) - [collection (directory-list cp)] - #:unless (skip-collection-directory? collection) - #:when (directory-exists? (build-path cp collection))) - (cc! (list collection) #:path (build-path cp collection)))) + ;; A links spec in `current-library-collection-links' counts as + ;; user-specific when it's not in `make-links-files': + (for ([inst-links (in-list (current-library-collection-links))] + #:unless (and (path? inst-links) + (hash-ref main-links-files (simple-form-path inst-links) #f))) + (cond + [(not inst-links) ; covered by `current-library-collection-paths' + (void)] + [(path? inst-links) + (for ([c+p (in-list (links #:file inst-links #:with-path? #t))]) + (cc! (list (string->path (car c+p))) + #:path (cdr c+p))) + (for ([cp (in-list (links #:file inst-links #:root? #t))] + #:when (directory-exists? cp) + [collection (directory-list cp)] + #:unless (skip-collection-directory? collection) + #:when (directory-exists? (build-path cp collection))) + (cc! (list collection) #:path (build-path cp collection)))] + [else ; must be a hash table that simulates a links file: + (for ([(coll-sym dir) (in-hash inst-links)]) + (cond + [coll-sym + ;; A single collection + (cc! (string-split "/" (symbol->string coll-sym)) #:path dir)] + [(directory-exists? dir) + ;; A directory that holds collections: + (for ([collection (directory-list dir)] + #:unless (skip-collection-directory? collection) + #:when (directory-exists? (build-path dir collection))) + (cc! (list collection) #:path (build-path dir collection)))]))]))) ;; `all-collections' lists all top-level collections (not from Planet): (define all-collections diff --git a/racket/src/racket/include/scheme.h b/racket/src/racket/include/scheme.h index c19ae77ac2..fd7f94d08b 100644 --- a/racket/src/racket/include/scheme.h +++ b/racket/src/racket/include/scheme.h @@ -1360,6 +1360,7 @@ enum { MZCONFIG_WRITE_DIRECTORY, MZCONFIG_COLLECTION_PATHS, + MZCONFIG_COLLECTION_LINKS, MZCONFIG_PORT_PRINT_HANDLER, diff --git a/racket/src/racket/include/schthread.h b/racket/src/racket/include/schthread.h index 6b834357c5..d9d1459693 100644 --- a/racket/src/racket/include/schthread.h +++ b/racket/src/racket/include/schthread.h @@ -284,7 +284,6 @@ typedef struct Thread_Local_Variables { int env_uid_counter_; int scheme_overflow_count_; struct Scheme_Object *original_pwd_; - struct Scheme_Object *inst_links_path_; void *file_path_wc_buffer_; intptr_t scheme_hash_request_count_; intptr_t scheme_hash_iteration_count_; @@ -665,7 +664,6 @@ XFORM_GC_VARIABLE_STACK_THROUGH_THREAD_LOCAL; #define env_uid_counter XOA (scheme_get_thread_local_variables()->env_uid_counter_) #define scheme_overflow_count XOA (scheme_get_thread_local_variables()->scheme_overflow_count_) #define original_pwd XOA (scheme_get_thread_local_variables()->original_pwd_) -#define inst_links_path XOA (scheme_get_thread_local_variables()->inst_links_path_) #define file_path_wc_buffer XOA (scheme_get_thread_local_variables()->file_path_wc_buffer_) #define scheme_hash_request_count XOA (scheme_get_thread_local_variables()->scheme_hash_request_count_) #define scheme_hash_iteration_count XOA (scheme_get_thread_local_variables()->scheme_hash_iteration_count_) diff --git a/racket/src/racket/src/cstartup.inc b/racket/src/racket/src/cstartup.inc index b73665a59c..baf8bf20e0 100644 --- a/racket/src/racket/src/cstartup.inc +++ b/racket/src/racket/src/cstartup.inc @@ -1,5 +1,5 @@ { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,53,46,57,48,46,48,46,51,84,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,53,46,57,48,46,48,46,52,84,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,51,0,0,0,1,0,0,10,0,14, 0,27,0,31,0,38,0,42,0,49,0,54,0,61,0,66,0,69,0,74,0, 83,0,87,0,93,0,107,0,121,0,124,0,130,0,134,0,136,0,147,0,149, @@ -16,43 +16,43 @@ 73,108,101,116,114,101,99,45,118,97,108,117,101,115,66,108,97,109,98,100,97, 1,20,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,45,107,101, 121,61,118,73,100,101,102,105,110,101,45,118,97,108,117,101,115,97,36,11,8, -240,216,90,0,0,95,159,2,17,36,36,159,2,16,36,36,159,2,16,36,36, +240,213,90,0,0,95,159,2,17,36,36,159,2,16,36,36,159,2,16,36,36, 16,20,2,8,2,2,2,4,2,2,2,5,2,2,2,6,2,2,2,7,2, 2,2,10,2,2,2,3,2,2,2,9,2,2,2,11,2,2,2,12,2,2, -97,37,11,8,240,216,90,0,0,93,159,2,16,36,37,16,2,2,13,161,2, -2,37,2,13,2,2,2,13,96,38,11,8,240,216,90,0,0,16,0,96,11, -11,8,240,216,90,0,0,16,0,18,98,64,104,101,114,101,13,16,6,36,2, +97,37,11,8,240,213,90,0,0,93,159,2,16,36,37,16,2,2,13,161,2, +2,37,2,13,2,2,2,13,96,38,11,8,240,213,90,0,0,16,0,96,11, +11,8,240,213,90,0,0,16,0,18,98,64,104,101,114,101,13,16,6,36,2, 14,2,2,11,11,11,8,32,8,31,8,30,8,29,27,248,22,161,4,195,249, 22,154,4,80,158,39,36,251,22,89,2,18,248,22,101,199,12,249,22,79,2, 19,248,22,103,201,27,248,22,161,4,195,249,22,154,4,80,158,39,36,251,22, 89,2,18,248,22,101,199,249,22,79,2,19,248,22,103,201,12,27,248,22,81, 248,22,161,4,196,28,248,22,87,193,20,14,159,37,36,37,28,248,22,87,248, -22,81,194,248,22,136,18,193,249,22,154,4,80,158,39,36,251,22,89,2,18, -248,22,136,18,199,249,22,79,2,4,248,22,137,18,201,11,18,100,10,13,16, +22,81,194,248,22,137,18,193,249,22,154,4,80,158,39,36,251,22,89,2,18, +248,22,137,18,199,249,22,79,2,4,248,22,138,18,201,11,18,100,10,13,16, 6,36,2,14,2,2,11,11,11,8,32,8,31,8,30,8,29,16,4,11,11, -2,20,3,1,8,101,110,118,49,55,54,51,49,16,4,11,11,2,21,3,1, -8,101,110,118,49,55,54,51,50,27,248,22,81,248,22,161,4,196,28,248,22, -87,193,20,14,159,37,36,37,28,248,22,87,248,22,81,194,248,22,136,18,193, +2,20,3,1,8,101,110,118,49,55,54,54,52,16,4,11,11,2,21,3,1, +8,101,110,118,49,55,54,54,53,27,248,22,81,248,22,161,4,196,28,248,22, +87,193,20,14,159,37,36,37,28,248,22,87,248,22,81,194,248,22,137,18,193, 249,22,154,4,80,158,39,36,250,22,89,2,22,248,22,89,249,22,89,248,22, -89,2,23,248,22,136,18,201,251,22,89,2,18,2,23,2,23,249,22,79,2, -11,248,22,137,18,204,18,100,11,13,16,6,36,2,14,2,2,11,11,11,8, +89,2,23,248,22,137,18,201,251,22,89,2,18,2,23,2,23,249,22,79,2, +11,248,22,138,18,204,18,100,11,13,16,6,36,2,14,2,2,11,11,11,8, 32,8,31,8,30,8,29,16,4,11,11,2,20,3,1,8,101,110,118,49,55, -54,51,52,16,4,11,11,2,21,3,1,8,101,110,118,49,55,54,51,53,248, +54,54,55,16,4,11,11,2,21,3,1,8,101,110,118,49,55,54,54,56,248, 22,161,4,193,27,248,22,161,4,194,249,22,79,248,22,89,248,22,80,196,248, -22,137,18,195,27,248,22,81,248,22,161,4,23,197,1,249,22,154,4,80,158, +22,138,18,195,27,248,22,81,248,22,161,4,23,197,1,249,22,154,4,80,158, 39,36,28,248,22,64,248,22,155,4,248,22,80,23,198,2,27,249,22,2,32, 0,88,163,8,36,37,43,11,9,222,33,40,248,22,161,4,248,22,101,23,200, -2,250,22,89,2,24,248,22,89,249,22,89,248,22,89,248,22,136,18,23,204, +2,250,22,89,2,24,248,22,89,249,22,89,248,22,89,248,22,137,18,23,204, 2,250,22,90,2,25,249,22,2,22,80,23,204,2,248,22,103,23,206,2,249, -22,79,248,22,136,18,23,202,1,249,22,2,22,101,23,200,1,250,22,90,2, +22,79,248,22,137,18,23,202,1,249,22,2,22,101,23,200,1,250,22,90,2, 22,249,22,2,32,0,88,163,8,36,37,47,11,9,222,33,41,248,22,161,4, -248,22,136,18,201,248,22,137,18,198,27,248,22,161,4,194,249,22,79,248,22, -89,248,22,80,196,248,22,137,18,195,27,248,22,81,248,22,161,4,23,197,1, +248,22,137,18,201,248,22,138,18,198,27,248,22,161,4,194,249,22,79,248,22, +89,248,22,80,196,248,22,138,18,195,27,248,22,81,248,22,161,4,23,197,1, 249,22,154,4,80,158,39,36,250,22,90,2,24,249,22,2,32,0,88,163,8, -36,37,47,11,9,222,33,43,248,22,161,4,248,22,80,201,248,22,137,18,198, +36,37,47,11,9,222,33,43,248,22,161,4,248,22,80,201,248,22,138,18,198, 27,248,22,81,248,22,161,4,196,27,248,22,161,4,248,22,80,195,249,22,154, 4,80,158,40,36,28,248,22,87,195,250,22,90,2,22,9,248,22,81,199,250, -22,89,2,6,248,22,89,248,22,80,199,250,22,90,2,10,248,22,137,18,201, +22,89,2,6,248,22,89,248,22,80,199,250,22,90,2,10,248,22,138,18,201, 248,22,81,202,27,248,22,81,248,22,161,4,23,197,1,27,249,22,1,22,93, 249,22,2,22,161,4,248,22,161,4,248,22,80,199,248,22,182,4,249,22,154, 4,80,158,41,36,251,22,89,1,22,119,105,116,104,45,99,111,110,116,105,110, @@ -65,15 +65,15 @@ 163,9,62,61,62,248,22,155,4,248,22,101,196,250,22,89,2,22,248,22,89, 249,22,89,21,93,2,27,248,22,80,199,250,22,90,2,8,249,22,89,2,27, 249,22,89,248,22,110,203,2,27,248,22,81,202,251,22,89,2,18,28,249,22, -163,9,248,22,155,4,248,22,80,200,64,101,108,115,101,10,248,22,136,18,197, -250,22,90,2,22,9,248,22,137,18,200,249,22,79,2,8,248,22,81,202,99, +163,9,248,22,155,4,248,22,80,200,64,101,108,115,101,10,248,22,137,18,197, +250,22,90,2,22,9,248,22,138,18,200,249,22,79,2,8,248,22,81,202,99, 13,16,6,36,2,14,2,2,11,11,11,8,32,8,31,8,30,8,29,16,4, -11,11,2,20,3,1,8,101,110,118,49,55,54,53,55,16,4,11,11,2,21, -3,1,8,101,110,118,49,55,54,53,56,18,158,94,10,64,118,111,105,100,8, +11,11,2,20,3,1,8,101,110,118,49,55,54,57,48,16,4,11,11,2,21, +3,1,8,101,110,118,49,55,54,57,49,18,158,94,10,64,118,111,105,100,8, 48,27,248,22,81,248,22,161,4,196,249,22,154,4,80,158,39,36,28,248,22, -64,248,22,155,4,248,22,80,197,250,22,89,2,28,248,22,89,248,22,136,18, -199,248,22,101,198,27,248,22,155,4,248,22,136,18,197,250,22,89,2,28,248, -22,89,248,22,80,197,250,22,90,2,25,248,22,137,18,199,248,22,137,18,202, +64,248,22,155,4,248,22,80,197,250,22,89,2,28,248,22,89,248,22,137,18, +199,248,22,101,198,27,248,22,155,4,248,22,137,18,197,250,22,89,2,28,248, +22,89,248,22,80,197,250,22,90,2,25,248,22,138,18,199,248,22,138,18,202, 159,36,20,114,159,36,16,1,11,16,0,20,26,150,9,2,1,2,1,2,2, 11,9,9,11,11,11,10,36,80,158,36,36,20,114,159,36,16,0,16,0,38, 39,36,16,0,36,16,0,36,11,11,11,16,10,2,3,2,4,2,5,2,6, @@ -100,354 +100,346 @@ EVAL_ONE_SIZED_STR((char *)expr, 2050); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,53,46,57,48,46,48,46,51,84,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,181,0,0,0,1,0,0,8,0,21, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,53,46,57,48,46,48,46,52,84,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,175,0,0,0,1,0,0,8,0,21, 0,26,0,43,0,55,0,77,0,106,0,150,0,156,0,165,0,172,0,187,0, 205,0,217,0,233,0,247,0,13,1,29,1,46,1,69,1,84,1,123,1,157, -1,175,1,191,1,198,1,210,1,226,1,243,1,4,2,17,2,30,2,47,2, -59,2,74,2,98,2,130,2,148,2,167,2,187,2,203,2,221,2,252,2,10, -3,27,3,71,3,79,3,84,3,128,3,135,3,145,3,160,3,169,3,174,3, -176,3,209,3,233,3,254,3,9,4,18,4,28,4,46,4,59,4,72,4,82, -4,92,4,98,4,143,4,148,4,160,4,163,4,167,4,191,4,230,4,233,4, -246,4,12,5,23,5,75,5,98,5,106,5,130,5,151,5,108,6,138,6,19, -10,42,10,59,10,7,12,110,12,124,12,28,13,216,14,225,14,234,14,248,14, -2,15,43,16,146,16,3,17,76,17,149,17,253,17,26,18,97,18,234,18,49, -19,3,20,154,20,249,20,45,21,58,21,69,21,166,22,14,23,76,23,7,25, -31,25,102,26,109,26,161,26,174,26,164,27,178,27,32,28,190,28,197,28,71, -30,148,30,165,30,11,31,189,31,249,31,0,32,136,32,190,32,209,32,159,33, -175,33,173,34,238,35,21,36,30,36,107,37,46,38,66,38,82,38,105,38,121, -38,172,38,193,38,213,38,233,38,34,39,13,42,46,43,205,43,221,43,117,46, -246,48,5,49,151,50,89,51,91,51,117,51,132,51,56,53,250,53,9,54,18, -54,25,54,38,55,51,56,198,58,71,59,202,59,231,61,181,62,213,62,87,63, -0,0,119,70,0,0,67,35,37,117,116,105,108,115,72,112,97,116,104,45,115, -116,114,105,110,103,63,64,98,115,98,115,76,110,111,114,109,97,108,45,99,97, -115,101,45,112,97,116,104,71,114,101,114,111,111,116,45,112,97,116,104,1,20, -102,105,110,100,45,101,120,101,99,117,116,97,98,108,101,45,112,97,116,104,1, -27,112,97,116,104,45,108,105,115,116,45,115,116,114,105,110,103,45,62,112,97, -116,104,45,108,105,115,116,1,42,99,97,108,108,45,119,105,116,104,45,100,101, -102,97,117,108,116,45,114,101,97,100,105,110,103,45,112,97,114,97,109,101,116, -101,114,105,122,97,116,105,111,110,65,113,117,111,116,101,68,35,37,112,97,114, -97,109,122,29,94,2,9,2,10,11,74,45,99,104,101,99,107,45,114,101,108, -112,97,116,104,77,45,99,104,101,99,107,45,99,111,108,108,101,99,116,105,111, -110,71,45,99,104,101,99,107,45,102,97,105,108,75,99,111,108,108,101,99,116, -105,111,110,45,112,97,116,104,73,102,105,110,100,45,99,111,108,45,102,105,108, -101,1,20,99,111,108,108,101,99,116,105,111,110,45,102,105,108,101,45,112,97, -116,104,75,102,105,110,100,45,99,111,110,102,105,103,45,100,105,114,76,103,101, -116,45,99,111,110,102,105,103,45,116,97,98,108,101,1,21,103,101,116,45,105, -110,115,116,97,108,108,97,116,105,111,110,45,110,97,109,101,74,99,111,101,114, -99,101,45,116,111,45,112,97,116,104,1,37,99,111,108,108,101,99,116,115,45, -114,101,108,97,116,105,118,101,45,112,97,116,104,45,62,99,111,109,112,108,101, -116,101,45,112,97,116,104,1,32,101,120,101,45,114,101,108,97,116,105,118,101, -45,112,97,116,104,45,62,99,111,109,112,108,101,116,101,45,112,97,116,104,77, -97,100,100,45,99,111,110,102,105,103,45,115,101,97,114,99,104,75,97,108,108, -45,108,105,110,107,115,45,112,97,116,104,115,29,94,2,9,2,10,11,71,108, -105,110,107,115,45,112,97,116,104,115,75,117,115,101,114,45,108,105,110,107,115, -45,112,97,116,104,76,117,115,101,114,45,108,105,110,107,115,45,99,97,99,104, -101,76,117,115,101,114,45,108,105,110,107,115,45,115,116,97,109,112,72,108,105, -110,107,115,45,99,97,99,104,101,115,72,108,105,110,107,115,45,115,116,97,109, -112,115,76,115,116,97,109,112,45,112,114,111,109,112,116,45,116,97,103,71,102, -105,108,101,45,62,115,116,97,109,112,74,110,111,45,102,105,108,101,45,115,116, -97,109,112,63,1,22,103,101,116,45,108,105,110,107,101,100,45,99,111,108,108, -101,99,116,105,111,110,115,1,30,110,111,114,109,97,108,105,122,101,45,99,111, -108,108,101,99,116,105,111,110,45,114,101,102,101,114,101,110,99,101,77,99,104, -101,99,107,45,115,117,102,102,105,120,45,99,97,108,108,78,112,97,116,104,45, -97,100,106,117,115,116,45,115,117,102,102,105,120,79,112,97,116,104,45,114,101, -112,108,97,99,101,45,115,117,102,102,105,120,75,112,97,116,104,45,97,100,100, -45,115,117,102,102,105,120,77,108,111,97,100,47,117,115,101,45,99,111,109,112, -105,108,101,100,1,29,102,105,110,100,45,108,105,98,114,97,114,121,45,99,111, -108,108,101,99,116,105,111,110,45,112,97,116,104,115,73,101,109,98,101,100,100, -101,100,45,108,111,97,100,76,110,111,114,109,97,108,45,112,97,116,104,45,99, -97,115,101,6,41,41,40,111,114,47,99,32,112,97,116,104,45,102,111,114,45, -115,111,109,101,45,115,121,115,116,101,109,63,32,112,97,116,104,45,115,116,114, -105,110,103,63,41,67,119,105,110,100,111,119,115,6,2,2,92,49,6,41,41, -40,111,114,47,99,32,112,97,116,104,45,115,116,114,105,110,103,63,32,112,97, -116,104,45,102,111,114,45,115,111,109,101,45,115,121,115,116,101,109,63,41,6, -4,4,112,97,116,104,5,8,92,92,63,92,82,69,76,92,6,12,12,112,97, -116,104,45,115,116,114,105,110,103,63,68,114,101,108,97,116,105,118,101,64,108, -111,111,112,5,0,6,30,30,40,112,114,111,99,101,100,117,114,101,45,97,114, -105,116,121,45,105,110,99,108,117,100,101,115,47,99,32,48,41,6,21,21,105, -110,118,97,108,105,100,32,114,101,108,97,116,105,118,101,32,112,97,116,104,6, -18,18,40,97,110,121,47,99,32,46,32,45,62,32,46,32,97,110,121,41,70, -99,111,110,102,105,103,45,100,105,114,68,111,114,105,103,45,100,105,114,69,101, -120,101,99,45,102,105,108,101,77,105,110,115,116,97,108,108,97,116,105,111,110, -45,110,97,109,101,72,99,111,108,108,101,99,116,115,45,100,105,114,6,10,10, -108,105,110,107,115,46,114,107,116,100,69,97,100,100,111,110,45,100,105,114,69, -102,115,45,99,104,97,110,103,101,65,101,114,114,111,114,6,42,42,101,114,114, -111,114,32,114,101,97,100,105,110,103,32,99,111,108,108,101,99,116,105,111,110, -32,108,105,110,107,115,32,102,105,108,101,32,126,115,58,32,126,97,64,114,111, -111,116,71,115,116,97,116,105,99,45,114,111,111,116,6,0,0,6,1,1,47, -6,21,21,40,111,114,47,99,32,115,116,114,105,110,103,63,32,98,121,116,101, -115,63,41,6,36,36,99,97,110,110,111,116,32,97,100,100,32,97,32,115,117, -102,102,105,120,32,116,111,32,97,32,114,111,111,116,32,112,97,116,104,58,32, -5,1,95,5,11,80,76,84,67,79,76,76,69,67,84,83,1,20,99,111,108, -108,101,99,116,115,45,115,101,97,114,99,104,45,100,105,114,115,6,8,8,99, -111,108,108,101,99,116,115,27,248,22,154,15,23,195,2,28,23,193,2,192,86, -94,23,193,1,28,248,22,148,7,23,195,2,27,248,22,177,15,23,196,2,28, -23,193,2,192,86,94,23,193,1,248,22,178,15,23,196,1,11,0,21,35,114, -120,34,94,91,92,92,93,91,92,92,93,91,63,93,91,92,92,93,34,0,6, -35,114,120,34,47,34,0,22,35,114,120,34,91,47,92,92,93,91,46,32,93, -43,91,47,92,92,93,42,36,34,0,19,35,114,120,34,91,32,46,93,43,40, -91,47,92,92,93,42,41,36,34,86,94,28,28,248,22,155,15,23,195,2,10, -28,248,22,154,15,23,195,2,10,28,248,22,148,7,23,195,2,28,248,22,177, -15,23,195,2,10,248,22,178,15,23,195,2,11,12,250,22,172,11,2,45,2, -46,23,197,2,28,28,248,22,155,15,23,195,2,249,22,163,9,248,22,156,15, -23,197,2,2,47,249,22,163,9,247,22,175,8,2,47,27,28,248,22,148,7, -23,196,2,23,195,2,248,22,160,8,248,22,159,15,23,197,2,28,249,22,149, -16,2,80,23,195,2,86,94,23,193,1,28,248,22,148,7,23,196,2,248,22, -162,15,23,196,1,194,27,248,22,187,7,23,195,1,249,22,163,15,248,22,163, -8,250,22,157,16,2,81,28,249,22,149,16,2,82,23,201,2,23,199,1,250, -22,157,16,2,83,23,202,1,2,48,80,159,44,37,38,2,47,28,248,22,148, -7,23,195,2,248,22,162,15,23,195,1,193,0,28,35,114,120,34,94,92,92, -92,92,92,92,92,92,91,63,93,92,92,92,92,85,78,67,92,92,92,92,34, -86,95,28,28,28,248,22,154,15,23,195,2,10,28,248,22,148,7,23,195,2, -28,248,22,177,15,23,195,2,10,248,22,178,15,23,195,2,11,10,248,22,155, -15,23,195,2,12,252,22,172,11,2,5,2,49,36,23,199,2,23,200,2,28, -28,28,248,22,154,15,23,196,2,10,28,248,22,148,7,23,196,2,28,248,22, -177,15,23,196,2,10,248,22,178,15,23,196,2,11,10,248,22,155,15,23,196, -2,12,252,22,172,11,2,5,2,49,37,23,199,2,23,200,2,27,28,248,22, -155,15,23,196,2,248,22,156,15,23,196,2,247,22,157,15,86,95,28,28,248, -22,179,15,23,196,2,10,249,22,163,9,247,22,157,15,23,195,2,12,253,22, -174,11,2,5,6,54,54,112,97,116,104,32,105,115,32,110,111,116,32,99,111, -109,112,108,101,116,101,32,97,110,100,32,110,111,116,32,116,104,101,32,112,108, -97,116,102,111,114,109,39,115,32,99,111,110,118,101,110,116,105,111,110,2,50, -23,201,2,6,24,24,112,108,97,116,102,111,114,109,32,99,111,110,118,101,110, -116,105,111,110,32,116,121,112,101,247,22,157,15,28,249,22,163,9,28,248,22, -155,15,23,199,2,248,22,156,15,23,199,2,247,22,157,15,23,195,2,12,253, -22,174,11,2,5,6,37,37,103,105,118,101,110,32,112,97,116,104,115,32,117, -115,101,32,100,105,102,102,101,114,101,110,116,32,99,111,110,118,101,110,116,105, -111,110,115,2,50,23,201,2,6,9,9,114,111,111,116,32,112,97,116,104,23, -202,2,27,27,248,22,183,15,28,248,22,179,15,23,199,2,23,198,1,248,22, -180,15,23,199,1,86,94,28,28,248,22,155,15,23,194,2,10,28,248,22,154, -15,23,194,2,10,28,248,22,148,7,23,194,2,28,248,22,177,15,23,194,2, -10,248,22,178,15,23,194,2,11,12,250,22,172,11,2,45,2,46,23,196,2, -28,28,248,22,155,15,23,194,2,249,22,163,9,248,22,156,15,23,196,2,2, -47,249,22,163,9,247,22,175,8,2,47,27,28,248,22,148,7,23,195,2,23, -194,2,248,22,160,8,248,22,159,15,23,196,2,28,249,22,149,16,2,80,23, -195,2,86,94,23,193,1,28,248,22,148,7,23,195,2,248,22,162,15,23,195, -1,193,27,248,22,187,7,23,195,1,249,22,163,15,248,22,163,8,250,22,157, -16,2,81,28,249,22,149,16,2,82,23,201,2,23,199,1,250,22,157,16,2, -83,23,202,1,2,48,80,159,47,37,38,2,47,28,248,22,148,7,23,194,2, -248,22,162,15,23,194,1,192,27,248,22,159,15,23,195,2,28,249,22,163,9, -23,197,2,64,117,110,105,120,28,249,22,145,8,23,195,1,5,1,47,86,95, -23,195,1,23,194,1,28,248,22,155,15,23,199,2,197,248,22,162,15,23,199, -1,249,22,172,15,23,200,1,249,22,163,15,249,22,148,8,248,22,159,15,23, -201,1,37,23,199,1,28,249,22,163,9,23,197,2,2,47,249,22,172,15,23, -200,1,249,22,163,15,28,249,22,149,16,0,27,35,114,120,34,94,92,92,92, -92,92,92,92,92,91,63,93,92,92,92,92,91,97,45,122,93,58,34,23,199, -2,251,22,149,8,2,51,250,22,148,8,23,204,2,40,41,5,1,92,249,22, -148,8,23,203,1,42,28,249,22,149,16,2,85,23,199,2,249,22,149,8,2, -51,249,22,148,8,23,201,1,40,28,249,22,149,16,2,85,23,199,2,249,22, -149,8,2,51,249,22,148,8,23,201,1,40,28,249,22,149,16,0,14,35,114, -120,34,94,92,92,92,92,92,92,92,92,34,23,199,2,249,22,149,8,5,4, -85,78,67,92,249,22,148,8,23,201,1,38,28,249,22,149,16,0,12,35,114, -120,34,94,91,97,45,122,93,58,34,23,199,2,249,22,149,8,250,22,148,8, -23,202,2,36,37,249,22,148,8,23,201,1,38,86,94,23,197,1,12,23,199, -1,12,32,87,88,163,8,36,39,53,11,70,102,111,117,110,100,45,101,120,101, -99,222,33,90,32,88,88,163,8,36,40,58,11,64,110,101,120,116,222,33,89, -27,248,22,181,15,23,196,2,28,249,22,165,9,23,195,2,23,197,1,11,28, -248,22,177,15,23,194,2,27,249,22,172,15,23,197,1,23,196,1,28,23,197, -2,90,159,39,11,89,161,39,36,11,248,22,175,15,23,197,2,86,95,23,195, -1,23,194,1,27,28,23,202,2,27,248,22,181,15,23,199,2,28,249,22,165, -9,23,195,2,23,200,2,11,28,248,22,177,15,23,194,2,250,2,87,23,205, -2,23,206,2,249,22,172,15,23,200,2,23,198,1,250,2,87,23,205,2,23, -206,2,23,196,1,11,28,23,193,2,192,86,94,23,193,1,27,28,248,22,154, -15,23,196,2,27,249,22,172,15,23,198,2,23,205,2,28,28,248,22,167,15, -193,10,248,22,166,15,193,192,11,11,28,23,193,2,192,86,94,23,193,1,28, -23,203,2,11,27,248,22,181,15,23,200,2,28,249,22,165,9,23,195,2,23, -201,1,11,28,248,22,177,15,23,194,2,250,2,87,23,206,1,23,207,1,249, -22,172,15,23,201,1,23,198,1,250,2,87,205,206,195,192,86,94,23,194,1, -28,23,196,2,90,159,39,11,89,161,39,36,11,248,22,175,15,23,197,2,86, -95,23,195,1,23,194,1,27,28,23,201,2,27,248,22,181,15,23,199,2,28, -249,22,165,9,23,195,2,23,200,2,11,28,248,22,177,15,23,194,2,250,2, -87,23,204,2,23,205,2,249,22,172,15,23,200,2,23,198,1,250,2,87,23, -204,2,23,205,2,23,196,1,11,28,23,193,2,192,86,94,23,193,1,27,28, -248,22,154,15,23,196,2,27,249,22,172,15,23,198,2,23,204,2,28,28,248, -22,167,15,193,10,248,22,166,15,193,192,11,11,28,23,193,2,192,86,94,23, -193,1,28,23,202,2,11,27,248,22,181,15,23,200,2,28,249,22,165,9,23, -195,2,23,201,1,11,28,248,22,177,15,23,194,2,250,2,87,23,205,1,23, -206,1,249,22,172,15,23,201,1,23,198,1,250,2,87,204,205,195,192,28,23, -193,2,90,159,39,11,89,161,39,36,11,248,22,175,15,23,199,2,86,95,23, -195,1,23,194,1,27,28,23,198,2,251,2,88,23,198,2,23,203,2,23,201, -2,23,202,2,11,28,23,193,2,192,86,94,23,193,1,27,28,248,22,154,15, -195,27,249,22,172,15,197,200,28,28,248,22,167,15,193,10,248,22,166,15,193, -192,11,11,28,192,192,28,198,11,251,2,88,198,203,201,202,194,32,91,88,163, -8,36,40,58,11,2,54,222,33,92,28,248,22,87,23,197,2,11,27,248,22, -180,15,248,22,80,23,199,2,27,249,22,172,15,23,196,1,23,197,2,28,248, -22,166,15,23,194,2,250,2,87,198,199,195,86,94,23,193,1,27,248,22,81, -23,200,1,28,248,22,87,23,194,2,11,27,248,22,180,15,248,22,80,23,196, -2,27,249,22,172,15,23,196,1,23,200,2,28,248,22,166,15,23,194,2,250, -2,87,201,202,195,86,94,23,193,1,27,248,22,81,23,197,1,28,248,22,87, -23,194,2,11,27,248,22,180,15,248,22,80,195,27,249,22,172,15,23,196,1, -202,28,248,22,166,15,193,250,2,87,204,205,195,251,2,91,204,205,206,248,22, -81,199,86,95,28,28,248,22,154,15,23,195,2,10,28,248,22,148,7,23,195, +1,175,1,206,1,218,1,235,1,247,1,254,1,13,2,37,2,69,2,87,2, +106,2,126,2,142,2,160,2,191,2,205,2,222,2,10,3,18,3,23,3,67, +3,74,3,84,3,99,3,108,3,113,3,115,3,148,3,172,3,193,3,204,3, +213,3,223,3,241,3,254,3,11,4,21,4,31,4,37,4,42,4,54,4,57, +4,61,4,85,4,124,4,127,4,140,4,162,4,173,4,225,4,248,4,0,5, +24,5,45,5,2,6,32,6,169,9,192,9,209,9,157,11,4,12,18,12,178, +12,110,14,119,14,128,14,142,14,152,14,193,15,40,16,153,16,226,16,43,17, +147,17,176,17,247,17,128,18,199,18,153,19,48,20,143,20,195,20,208,20,219, +20,60,22,164,22,226,22,157,24,181,24,5,26,12,26,64,26,77,26,67,27, +81,27,191,27,93,28,100,28,230,29,47,30,64,30,219,30,238,30,42,31,49, +31,185,31,239,31,2,32,208,32,224,32,182,33,177,34,211,34,220,34,41,36, +142,38,162,38,178,38,201,38,217,38,12,39,33,39,53,39,73,39,130,39,109, +42,69,43,228,43,244,43,140,46,13,49,28,49,174,50,112,51,114,51,140,51, +155,51,79,53,17,54,32,54,41,54,48,54,61,55,74,56,221,58,94,59,225, +59,254,61,204,62,236,62,110,63,0,0,28,70,0,0,67,35,37,117,116,105, +108,115,72,112,97,116,104,45,115,116,114,105,110,103,63,64,98,115,98,115,76, +110,111,114,109,97,108,45,99,97,115,101,45,112,97,116,104,71,114,101,114,111, +111,116,45,112,97,116,104,1,20,102,105,110,100,45,101,120,101,99,117,116,97, +98,108,101,45,112,97,116,104,1,27,112,97,116,104,45,108,105,115,116,45,115, +116,114,105,110,103,45,62,112,97,116,104,45,108,105,115,116,1,42,99,97,108, +108,45,119,105,116,104,45,100,101,102,97,117,108,116,45,114,101,97,100,105,110, +103,45,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,65,113,117, +111,116,101,68,35,37,112,97,114,97,109,122,29,94,2,9,2,10,11,74,45, +99,104,101,99,107,45,114,101,108,112,97,116,104,77,45,99,104,101,99,107,45, +99,111,108,108,101,99,116,105,111,110,71,45,99,104,101,99,107,45,102,97,105, +108,75,99,111,108,108,101,99,116,105,111,110,45,112,97,116,104,73,102,105,110, +100,45,99,111,108,45,102,105,108,101,1,20,99,111,108,108,101,99,116,105,111, +110,45,102,105,108,101,45,112,97,116,104,75,102,105,110,100,45,99,111,110,102, +105,103,45,100,105,114,76,103,101,116,45,99,111,110,102,105,103,45,116,97,98, +108,101,1,21,103,101,116,45,105,110,115,116,97,108,108,97,116,105,111,110,45, +110,97,109,101,74,99,111,101,114,99,101,45,116,111,45,112,97,116,104,1,37, +99,111,108,108,101,99,116,115,45,114,101,108,97,116,105,118,101,45,112,97,116, +104,45,62,99,111,109,112,108,101,116,101,45,112,97,116,104,1,32,101,120,101, +45,114,101,108,97,116,105,118,101,45,112,97,116,104,45,62,99,111,109,112,108, +101,116,101,45,112,97,116,104,77,97,100,100,45,99,111,110,102,105,103,45,115, +101,97,114,99,104,1,29,102,105,110,100,45,108,105,98,114,97,114,121,45,99, +111,108,108,101,99,116,105,111,110,45,108,105,110,107,115,71,108,105,110,107,115, +45,99,97,99,104,101,76,115,116,97,109,112,45,112,114,111,109,112,116,45,116, +97,103,71,102,105,108,101,45,62,115,116,97,109,112,29,94,2,9,2,10,11, +74,110,111,45,102,105,108,101,45,115,116,97,109,112,63,1,22,103,101,116,45, +108,105,110,107,101,100,45,99,111,108,108,101,99,116,105,111,110,115,1,30,110, +111,114,109,97,108,105,122,101,45,99,111,108,108,101,99,116,105,111,110,45,114, +101,102,101,114,101,110,99,101,77,99,104,101,99,107,45,115,117,102,102,105,120, +45,99,97,108,108,78,112,97,116,104,45,97,100,106,117,115,116,45,115,117,102, +102,105,120,79,112,97,116,104,45,114,101,112,108,97,99,101,45,115,117,102,102, +105,120,75,112,97,116,104,45,97,100,100,45,115,117,102,102,105,120,77,108,111, +97,100,47,117,115,101,45,99,111,109,112,105,108,101,100,1,29,102,105,110,100, +45,108,105,98,114,97,114,121,45,99,111,108,108,101,99,116,105,111,110,45,112, +97,116,104,115,73,101,109,98,101,100,100,101,100,45,108,111,97,100,76,110,111, +114,109,97,108,45,112,97,116,104,45,99,97,115,101,6,41,41,40,111,114,47, +99,32,112,97,116,104,45,102,111,114,45,115,111,109,101,45,115,121,115,116,101, +109,63,32,112,97,116,104,45,115,116,114,105,110,103,63,41,67,119,105,110,100, +111,119,115,6,2,2,92,49,6,41,41,40,111,114,47,99,32,112,97,116,104, +45,115,116,114,105,110,103,63,32,112,97,116,104,45,102,111,114,45,115,111,109, +101,45,115,121,115,116,101,109,63,41,6,4,4,112,97,116,104,5,8,92,92, +63,92,82,69,76,92,6,12,12,112,97,116,104,45,115,116,114,105,110,103,63, +68,114,101,108,97,116,105,118,101,64,108,111,111,112,5,0,6,30,30,40,112, +114,111,99,101,100,117,114,101,45,97,114,105,116,121,45,105,110,99,108,117,100, +101,115,47,99,32,48,41,6,21,21,105,110,118,97,108,105,100,32,114,101,108, +97,116,105,118,101,32,112,97,116,104,6,18,18,40,97,110,121,47,99,32,46, +32,45,62,32,46,32,97,110,121,41,70,99,111,110,102,105,103,45,100,105,114, +68,111,114,105,103,45,100,105,114,69,101,120,101,99,45,102,105,108,101,77,105, +110,115,116,97,108,108,97,116,105,111,110,45,110,97,109,101,72,99,111,108,108, +101,99,116,115,45,100,105,114,6,10,10,108,105,110,107,115,46,114,107,116,100, +69,97,100,100,111,110,45,100,105,114,69,102,115,45,99,104,97,110,103,101,65, +101,114,114,111,114,64,114,111,111,116,71,115,116,97,116,105,99,45,114,111,111, +116,6,0,0,6,1,1,47,6,21,21,40,111,114,47,99,32,115,116,114,105, +110,103,63,32,98,121,116,101,115,63,41,6,36,36,99,97,110,110,111,116,32, +97,100,100,32,97,32,115,117,102,102,105,120,32,116,111,32,97,32,114,111,111, +116,32,112,97,116,104,58,32,5,1,95,5,11,80,76,84,67,79,76,76,69, +67,84,83,1,20,99,111,108,108,101,99,116,115,45,115,101,97,114,99,104,45, +100,105,114,115,6,8,8,99,111,108,108,101,99,116,115,27,248,22,154,15,23, +195,2,28,23,193,2,192,86,94,23,193,1,28,248,22,148,7,23,195,2,27, +248,22,177,15,23,196,2,28,23,193,2,192,86,94,23,193,1,248,22,178,15, +23,196,1,11,0,21,35,114,120,34,94,91,92,92,93,91,92,92,93,91,63, +93,91,92,92,93,34,0,6,35,114,120,34,47,34,0,22,35,114,120,34,91, +47,92,92,93,91,46,32,93,43,91,47,92,92,93,42,36,34,0,19,35,114, +120,34,91,32,46,93,43,40,91,47,92,92,93,42,41,36,34,86,94,28,28, +248,22,155,15,23,195,2,10,28,248,22,154,15,23,195,2,10,28,248,22,148, +7,23,195,2,28,248,22,177,15,23,195,2,10,248,22,178,15,23,195,2,11, +12,250,22,172,11,2,40,2,41,23,197,2,28,28,248,22,155,15,23,195,2, +249,22,163,9,248,22,156,15,23,197,2,2,42,249,22,163,9,247,22,175,8, +2,42,27,28,248,22,148,7,23,196,2,23,195,2,248,22,160,8,248,22,159, +15,23,197,2,28,249,22,150,16,2,74,23,195,2,86,94,23,193,1,28,248, +22,148,7,23,196,2,248,22,162,15,23,196,1,194,27,248,22,187,7,23,195, +1,249,22,163,15,248,22,163,8,250,22,158,16,2,75,28,249,22,150,16,2, +76,23,201,2,23,199,1,250,22,158,16,2,77,23,202,1,2,43,80,159,44, +37,38,2,42,28,248,22,148,7,23,195,2,248,22,162,15,23,195,1,193,0, +28,35,114,120,34,94,92,92,92,92,92,92,92,92,91,63,93,92,92,92,92, +85,78,67,92,92,92,92,34,86,95,28,28,28,248,22,154,15,23,195,2,10, +28,248,22,148,7,23,195,2,28,248,22,177,15,23,195,2,10,248,22,178,15, +23,195,2,11,10,248,22,155,15,23,195,2,12,252,22,172,11,2,5,2,44, +36,23,199,2,23,200,2,28,28,28,248,22,154,15,23,196,2,10,28,248,22, +148,7,23,196,2,28,248,22,177,15,23,196,2,10,248,22,178,15,23,196,2, +11,10,248,22,155,15,23,196,2,12,252,22,172,11,2,5,2,44,37,23,199, +2,23,200,2,27,28,248,22,155,15,23,196,2,248,22,156,15,23,196,2,247, +22,157,15,86,95,28,28,248,22,179,15,23,196,2,10,249,22,163,9,247,22, +157,15,23,195,2,12,253,22,174,11,2,5,6,54,54,112,97,116,104,32,105, +115,32,110,111,116,32,99,111,109,112,108,101,116,101,32,97,110,100,32,110,111, +116,32,116,104,101,32,112,108,97,116,102,111,114,109,39,115,32,99,111,110,118, +101,110,116,105,111,110,2,45,23,201,2,6,24,24,112,108,97,116,102,111,114, +109,32,99,111,110,118,101,110,116,105,111,110,32,116,121,112,101,247,22,157,15, +28,249,22,163,9,28,248,22,155,15,23,199,2,248,22,156,15,23,199,2,247, +22,157,15,23,195,2,12,253,22,174,11,2,5,6,37,37,103,105,118,101,110, +32,112,97,116,104,115,32,117,115,101,32,100,105,102,102,101,114,101,110,116,32, +99,111,110,118,101,110,116,105,111,110,115,2,45,23,201,2,6,9,9,114,111, +111,116,32,112,97,116,104,23,202,2,27,27,248,22,183,15,28,248,22,179,15, +23,199,2,23,198,1,248,22,180,15,23,199,1,86,94,28,28,248,22,155,15, +23,194,2,10,28,248,22,154,15,23,194,2,10,28,248,22,148,7,23,194,2, +28,248,22,177,15,23,194,2,10,248,22,178,15,23,194,2,11,12,250,22,172, +11,2,40,2,41,23,196,2,28,28,248,22,155,15,23,194,2,249,22,163,9, +248,22,156,15,23,196,2,2,42,249,22,163,9,247,22,175,8,2,42,27,28, +248,22,148,7,23,195,2,23,194,2,248,22,160,8,248,22,159,15,23,196,2, +28,249,22,150,16,2,74,23,195,2,86,94,23,193,1,28,248,22,148,7,23, +195,2,248,22,162,15,23,195,1,193,27,248,22,187,7,23,195,1,249,22,163, +15,248,22,163,8,250,22,158,16,2,75,28,249,22,150,16,2,76,23,201,2, +23,199,1,250,22,158,16,2,77,23,202,1,2,43,80,159,47,37,38,2,42, +28,248,22,148,7,23,194,2,248,22,162,15,23,194,1,192,27,248,22,159,15, +23,195,2,28,249,22,163,9,23,197,2,64,117,110,105,120,28,249,22,145,8, +23,195,1,5,1,47,86,95,23,195,1,23,194,1,28,248,22,155,15,23,199, +2,197,248,22,162,15,23,199,1,249,22,172,15,23,200,1,249,22,163,15,249, +22,148,8,248,22,159,15,23,201,1,37,23,199,1,28,249,22,163,9,23,197, +2,2,42,249,22,172,15,23,200,1,249,22,163,15,28,249,22,150,16,0,27, +35,114,120,34,94,92,92,92,92,92,92,92,92,91,63,93,92,92,92,92,91, +97,45,122,93,58,34,23,199,2,251,22,149,8,2,46,250,22,148,8,23,204, +2,40,41,5,1,92,249,22,148,8,23,203,1,42,28,249,22,150,16,2,79, +23,199,2,249,22,149,8,2,46,249,22,148,8,23,201,1,40,28,249,22,150, +16,2,79,23,199,2,249,22,149,8,2,46,249,22,148,8,23,201,1,40,28, +249,22,150,16,0,14,35,114,120,34,94,92,92,92,92,92,92,92,92,34,23, +199,2,249,22,149,8,5,4,85,78,67,92,249,22,148,8,23,201,1,38,28, +249,22,150,16,0,12,35,114,120,34,94,91,97,45,122,93,58,34,23,199,2, +249,22,149,8,250,22,148,8,23,202,2,36,37,249,22,148,8,23,201,1,38, +86,94,23,197,1,12,23,199,1,12,32,81,88,163,8,36,39,53,11,70,102, +111,117,110,100,45,101,120,101,99,222,33,84,32,82,88,163,8,36,40,58,11, +64,110,101,120,116,222,33,83,27,248,22,181,15,23,196,2,28,249,22,165,9, +23,195,2,23,197,1,11,28,248,22,177,15,23,194,2,27,249,22,172,15,23, +197,1,23,196,1,28,23,197,2,90,159,39,11,89,161,39,36,11,248,22,175, +15,23,197,2,86,95,23,195,1,23,194,1,27,28,23,202,2,27,248,22,181, +15,23,199,2,28,249,22,165,9,23,195,2,23,200,2,11,28,248,22,177,15, +23,194,2,250,2,81,23,205,2,23,206,2,249,22,172,15,23,200,2,23,198, +1,250,2,81,23,205,2,23,206,2,23,196,1,11,28,23,193,2,192,86,94, +23,193,1,27,28,248,22,154,15,23,196,2,27,249,22,172,15,23,198,2,23, +205,2,28,28,248,22,167,15,193,10,248,22,166,15,193,192,11,11,28,23,193, +2,192,86,94,23,193,1,28,23,203,2,11,27,248,22,181,15,23,200,2,28, +249,22,165,9,23,195,2,23,201,1,11,28,248,22,177,15,23,194,2,250,2, +81,23,206,1,23,207,1,249,22,172,15,23,201,1,23,198,1,250,2,81,205, +206,195,192,86,94,23,194,1,28,23,196,2,90,159,39,11,89,161,39,36,11, +248,22,175,15,23,197,2,86,95,23,195,1,23,194,1,27,28,23,201,2,27, +248,22,181,15,23,199,2,28,249,22,165,9,23,195,2,23,200,2,11,28,248, +22,177,15,23,194,2,250,2,81,23,204,2,23,205,2,249,22,172,15,23,200, +2,23,198,1,250,2,81,23,204,2,23,205,2,23,196,1,11,28,23,193,2, +192,86,94,23,193,1,27,28,248,22,154,15,23,196,2,27,249,22,172,15,23, +198,2,23,204,2,28,28,248,22,167,15,193,10,248,22,166,15,193,192,11,11, +28,23,193,2,192,86,94,23,193,1,28,23,202,2,11,27,248,22,181,15,23, +200,2,28,249,22,165,9,23,195,2,23,201,1,11,28,248,22,177,15,23,194, +2,250,2,81,23,205,1,23,206,1,249,22,172,15,23,201,1,23,198,1,250, +2,81,204,205,195,192,28,23,193,2,90,159,39,11,89,161,39,36,11,248,22, +175,15,23,199,2,86,95,23,195,1,23,194,1,27,28,23,198,2,251,2,82, +23,198,2,23,203,2,23,201,2,23,202,2,11,28,23,193,2,192,86,94,23, +193,1,27,28,248,22,154,15,195,27,249,22,172,15,197,200,28,28,248,22,167, +15,193,10,248,22,166,15,193,192,11,11,28,192,192,28,198,11,251,2,82,198, +203,201,202,194,32,85,88,163,8,36,40,58,11,2,49,222,33,86,28,248,22, +87,23,197,2,11,27,248,22,180,15,248,22,80,23,199,2,27,249,22,172,15, +23,196,1,23,197,2,28,248,22,166,15,23,194,2,250,2,81,198,199,195,86, +94,23,193,1,27,248,22,81,23,200,1,28,248,22,87,23,194,2,11,27,248, +22,180,15,248,22,80,23,196,2,27,249,22,172,15,23,196,1,23,200,2,28, +248,22,166,15,23,194,2,250,2,81,201,202,195,86,94,23,193,1,27,248,22, +81,23,197,1,28,248,22,87,23,194,2,11,27,248,22,180,15,248,22,80,195, +27,249,22,172,15,23,196,1,202,28,248,22,166,15,193,250,2,81,204,205,195, +251,2,85,204,205,206,248,22,81,199,86,95,28,28,248,22,154,15,23,195,2, +10,28,248,22,148,7,23,195,2,28,248,22,177,15,23,195,2,10,248,22,178, +15,23,195,2,11,12,250,22,172,11,2,6,2,47,23,197,2,28,28,23,195, +2,28,28,248,22,154,15,23,196,2,10,28,248,22,148,7,23,196,2,28,248, +22,177,15,23,196,2,10,248,22,178,15,23,196,2,11,248,22,177,15,23,196, +2,11,10,12,250,22,172,11,2,6,6,45,45,40,111,114,47,99,32,35,102, +32,40,97,110,100,47,99,32,112,97,116,104,45,115,116,114,105,110,103,63,32, +114,101,108,97,116,105,118,101,45,112,97,116,104,63,41,41,23,198,2,28,28, +248,22,177,15,23,195,2,90,159,39,11,89,161,39,36,11,248,22,175,15,23, +198,2,249,22,163,9,194,2,48,11,27,249,22,170,8,247,22,169,8,5,4, +80,65,84,72,27,28,23,194,2,249,80,158,40,41,249,22,160,8,23,198,1, +7,63,9,86,94,23,194,1,9,27,28,249,22,163,9,247,22,175,8,2,42, +249,22,79,248,22,163,15,5,1,46,23,196,1,23,194,1,28,248,22,87,23, +194,2,11,27,248,22,180,15,248,22,80,23,196,2,27,249,22,172,15,23,196, +1,23,201,2,28,248,22,166,15,23,194,2,250,2,81,202,203,195,86,94,23, +193,1,27,248,22,81,23,197,1,28,248,22,87,23,194,2,11,27,248,22,180, +15,248,22,80,23,196,2,27,249,22,172,15,23,196,1,23,204,2,28,248,22, +166,15,23,194,2,250,2,81,205,206,195,86,94,23,193,1,27,248,22,81,23, +197,1,28,248,22,87,23,194,2,11,27,248,22,180,15,248,22,80,195,27,249, +22,172,15,23,196,1,206,28,248,22,166,15,193,250,2,81,23,16,23,17,195, +251,2,85,23,16,23,17,23,18,248,22,81,199,27,248,22,180,15,23,196,1, +28,248,22,166,15,193,250,2,81,198,199,195,11,250,80,159,39,40,39,196,197, +11,250,80,159,39,40,39,196,11,11,32,90,88,163,8,36,39,57,11,2,49, +222,33,92,0,8,35,114,120,35,34,92,34,34,27,249,22,146,16,23,197,2, +23,198,2,28,23,193,2,86,94,23,196,1,27,248,22,101,23,195,2,27,27, +248,22,110,23,197,1,27,249,22,146,16,23,201,2,23,196,2,28,23,193,2, +86,94,23,194,1,27,248,22,101,23,195,2,27,250,2,90,23,203,2,23,204, +1,248,22,110,23,199,1,28,249,22,145,8,23,196,2,2,50,249,22,93,23, +202,2,194,249,22,79,248,22,163,15,28,249,22,163,9,247,22,175,8,2,42, +250,22,158,16,2,91,23,200,1,2,50,23,197,1,194,86,95,23,199,1,23, +193,1,28,249,22,145,8,23,196,2,2,50,249,22,93,23,200,2,9,249,22, +79,248,22,163,15,28,249,22,163,9,247,22,175,8,2,42,250,22,158,16,2, +91,23,200,1,2,50,23,197,1,9,28,249,22,145,8,23,196,2,2,50,249, +22,93,197,194,86,94,23,196,1,249,22,79,248,22,163,15,28,249,22,163,9, +247,22,175,8,2,42,250,22,158,16,2,91,23,200,1,2,50,23,197,1,194, +86,94,23,193,1,28,249,22,145,8,23,198,2,2,50,249,22,93,195,9,86, +94,23,194,1,249,22,79,248,22,163,15,28,249,22,163,9,247,22,175,8,2, +42,250,22,158,16,2,91,23,202,1,2,50,23,199,1,9,86,95,28,28,248, +22,137,8,194,10,248,22,148,7,194,12,250,22,172,11,2,7,6,21,21,40, +111,114,47,99,32,98,121,116,101,115,63,32,115,116,114,105,110,103,63,41,196, +28,28,248,22,88,195,249,22,4,22,154,15,196,11,12,250,22,172,11,2,7, +6,14,14,40,108,105,115,116,111,102,32,112,97,116,104,63,41,197,250,2,90, +197,195,28,248,22,148,7,197,248,22,162,8,197,196,28,28,248,22,0,23,195, +2,249,22,50,23,196,2,36,11,20,13,159,80,159,36,43,37,26,29,80,159, +8,29,44,37,249,22,33,11,80,159,8,31,43,37,22,188,14,10,22,189,14, +10,22,190,14,10,22,129,15,10,22,128,15,11,22,130,15,10,22,191,14,10, +22,131,15,10,22,132,15,10,22,133,15,10,22,134,15,10,22,135,15,11,22, +136,15,10,22,186,14,11,247,23,194,1,250,22,172,11,2,8,2,51,23,197, +1,86,94,28,28,248,22,154,15,23,195,2,10,28,248,22,148,7,23,195,2, +28,248,22,177,15,23,195,2,10,248,22,178,15,23,195,2,11,12,250,22,172, +11,23,196,2,2,47,23,197,2,28,248,22,177,15,23,195,2,12,251,22,174, +11,23,197,1,2,52,2,45,23,198,1,86,94,28,28,248,22,154,15,23,195, +2,10,28,248,22,148,7,23,195,2,28,248,22,177,15,23,195,2,10,248,22, +178,15,23,195,2,11,12,250,22,172,11,23,196,2,2,47,23,197,2,28,248, +22,177,15,23,195,2,12,251,22,174,11,23,197,1,2,52,2,45,23,198,1, +86,94,86,94,28,28,248,22,154,15,23,195,2,10,28,248,22,148,7,23,195, 2,28,248,22,177,15,23,195,2,10,248,22,178,15,23,195,2,11,12,250,22, -172,11,2,6,2,52,23,197,2,28,28,23,195,2,28,28,248,22,154,15,23, -196,2,10,28,248,22,148,7,23,196,2,28,248,22,177,15,23,196,2,10,248, -22,178,15,23,196,2,11,248,22,177,15,23,196,2,11,10,12,250,22,172,11, -2,6,6,45,45,40,111,114,47,99,32,35,102,32,40,97,110,100,47,99,32, -112,97,116,104,45,115,116,114,105,110,103,63,32,114,101,108,97,116,105,118,101, -45,112,97,116,104,63,41,41,23,198,2,28,28,248,22,177,15,23,195,2,90, -159,39,11,89,161,39,36,11,248,22,175,15,23,198,2,249,22,163,9,194,2, -53,11,27,249,22,170,8,247,22,169,8,5,4,80,65,84,72,27,28,23,194, -2,249,80,158,40,41,249,22,160,8,23,198,1,7,63,9,86,94,23,194,1, -9,27,28,249,22,163,9,247,22,175,8,2,47,249,22,79,248,22,163,15,5, -1,46,23,196,1,23,194,1,28,248,22,87,23,194,2,11,27,248,22,180,15, -248,22,80,23,196,2,27,249,22,172,15,23,196,1,23,201,2,28,248,22,166, -15,23,194,2,250,2,87,202,203,195,86,94,23,193,1,27,248,22,81,23,197, -1,28,248,22,87,23,194,2,11,27,248,22,180,15,248,22,80,23,196,2,27, -249,22,172,15,23,196,1,23,204,2,28,248,22,166,15,23,194,2,250,2,87, -205,206,195,86,94,23,193,1,27,248,22,81,23,197,1,28,248,22,87,23,194, -2,11,27,248,22,180,15,248,22,80,195,27,249,22,172,15,23,196,1,206,28, -248,22,166,15,193,250,2,87,23,16,23,17,195,251,2,91,23,16,23,17,23, -18,248,22,81,199,27,248,22,180,15,23,196,1,28,248,22,166,15,193,250,2, -87,198,199,195,11,250,80,159,39,40,39,196,197,11,250,80,159,39,40,39,196, -11,11,32,96,88,163,8,36,39,57,11,2,54,222,33,98,0,8,35,114,120, -35,34,92,34,34,27,249,22,145,16,23,197,2,23,198,2,28,23,193,2,86, -94,23,196,1,27,248,22,101,23,195,2,27,27,248,22,110,23,197,1,27,249, -22,145,16,23,201,2,23,196,2,28,23,193,2,86,94,23,194,1,27,248,22, -101,23,195,2,27,250,2,96,23,203,2,23,204,1,248,22,110,23,199,1,28, -249,22,145,8,23,196,2,2,55,249,22,93,23,202,2,194,249,22,79,248,22, -163,15,28,249,22,163,9,247,22,175,8,2,47,250,22,157,16,2,97,23,200, -1,2,55,23,197,1,194,86,95,23,199,1,23,193,1,28,249,22,145,8,23, -196,2,2,55,249,22,93,23,200,2,9,249,22,79,248,22,163,15,28,249,22, -163,9,247,22,175,8,2,47,250,22,157,16,2,97,23,200,1,2,55,23,197, -1,9,28,249,22,145,8,23,196,2,2,55,249,22,93,197,194,86,94,23,196, -1,249,22,79,248,22,163,15,28,249,22,163,9,247,22,175,8,2,47,250,22, -157,16,2,97,23,200,1,2,55,23,197,1,194,86,94,23,193,1,28,249,22, -145,8,23,198,2,2,55,249,22,93,195,9,86,94,23,194,1,249,22,79,248, -22,163,15,28,249,22,163,9,247,22,175,8,2,47,250,22,157,16,2,97,23, -202,1,2,55,23,199,1,9,86,95,28,28,248,22,137,8,194,10,248,22,148, -7,194,12,250,22,172,11,2,7,6,21,21,40,111,114,47,99,32,98,121,116, -101,115,63,32,115,116,114,105,110,103,63,41,196,28,28,248,22,88,195,249,22, -4,22,154,15,196,11,12,250,22,172,11,2,7,6,14,14,40,108,105,115,116, -111,102,32,112,97,116,104,63,41,197,250,2,96,197,195,28,248,22,148,7,197, -248,22,162,8,197,196,28,28,248,22,0,23,195,2,249,22,50,23,196,2,36, -11,20,13,159,80,159,36,43,37,26,29,80,159,8,29,44,37,249,22,33,11, -80,159,8,31,43,37,22,188,14,10,22,189,14,10,22,190,14,10,22,129,15, -10,22,128,15,11,22,130,15,10,22,191,14,10,22,131,15,10,22,132,15,10, -22,133,15,10,22,134,15,10,22,135,15,11,22,136,15,10,22,186,14,11,247, -23,194,1,250,22,172,11,2,8,2,56,23,197,1,86,94,28,28,248,22,154, -15,23,195,2,10,28,248,22,148,7,23,195,2,28,248,22,177,15,23,195,2, -10,248,22,178,15,23,195,2,11,12,250,22,172,11,23,196,2,2,52,23,197, -2,28,248,22,177,15,23,195,2,12,251,22,174,11,23,197,1,2,57,2,50, -23,198,1,86,94,28,28,248,22,154,15,23,195,2,10,28,248,22,148,7,23, -195,2,28,248,22,177,15,23,195,2,10,248,22,178,15,23,195,2,11,12,250, -22,172,11,23,196,2,2,52,23,197,2,28,248,22,177,15,23,195,2,12,251, -22,174,11,23,197,1,2,57,2,50,23,198,1,86,94,86,94,28,28,248,22, -154,15,23,195,2,10,28,248,22,148,7,23,195,2,28,248,22,177,15,23,195, -2,10,248,22,178,15,23,195,2,11,12,250,22,172,11,23,196,2,2,52,23, -197,2,28,248,22,177,15,23,195,2,86,94,23,194,1,12,251,22,174,11,23, -197,2,2,57,2,50,23,198,1,249,22,3,20,20,94,88,163,8,36,37,47, -11,9,223,2,33,102,23,195,1,23,197,1,28,28,248,22,0,23,195,2,249, -22,50,23,196,2,37,11,12,250,22,172,11,23,196,1,2,58,23,197,1,86, -94,28,28,248,22,154,15,23,194,2,10,28,248,22,148,7,23,194,2,28,248, -22,177,15,23,194,2,10,248,22,178,15,23,194,2,11,12,250,22,172,11,2, -15,2,52,23,196,2,28,248,22,177,15,23,194,2,12,251,22,174,11,2,15, -2,57,2,50,23,197,1,86,95,86,94,86,94,28,28,248,22,154,15,23,196, -2,10,28,248,22,148,7,23,196,2,28,248,22,177,15,23,196,2,10,248,22, -178,15,23,196,2,11,12,250,22,172,11,2,15,2,52,23,198,2,28,248,22, -177,15,23,196,2,12,251,22,174,11,2,15,2,57,2,50,23,199,2,249,22, -3,32,0,88,163,8,36,37,46,11,9,222,33,105,23,198,2,28,28,248,22, -0,23,195,2,249,22,50,23,196,2,37,11,12,250,22,172,11,2,15,2,58, -23,197,2,251,80,158,40,49,23,198,1,23,199,1,23,200,1,11,86,94,28, -28,248,22,154,15,23,194,2,10,28,248,22,148,7,23,194,2,28,248,22,177, -15,23,194,2,10,248,22,178,15,23,194,2,11,12,250,22,172,11,2,17,2, -52,23,196,2,28,248,22,177,15,23,194,2,12,251,22,174,11,2,17,2,57, -2,50,23,197,1,86,96,86,94,28,28,248,22,154,15,23,196,2,10,28,248, -22,148,7,23,196,2,28,248,22,177,15,23,196,2,10,248,22,178,15,23,196, -2,11,12,250,22,172,11,2,17,2,52,23,198,2,28,248,22,177,15,23,196, -2,12,251,22,174,11,2,17,2,57,2,50,23,199,2,86,94,86,94,28,28, -248,22,154,15,23,197,2,10,28,248,22,148,7,23,197,2,28,248,22,177,15, -23,197,2,10,248,22,178,15,23,197,2,11,12,250,22,172,11,2,17,2,52, -23,199,2,28,248,22,177,15,23,197,2,12,251,22,174,11,2,17,2,57,2, -50,23,200,2,249,22,3,32,0,88,163,8,36,37,46,11,9,222,33,107,23, -199,2,28,28,248,22,0,23,195,2,249,22,50,23,196,2,37,11,12,250,22, -172,11,2,17,2,58,23,197,2,251,80,158,40,49,23,198,1,23,200,1,23, -201,1,23,199,1,27,248,22,131,16,2,59,28,248,22,179,15,23,194,2,192, -27,28,248,22,177,15,23,195,2,20,13,159,80,159,38,43,37,250,80,159,41, -44,37,249,22,33,11,80,159,43,43,37,22,132,16,248,22,131,16,2,60,27, -248,22,131,16,2,61,250,80,159,42,40,39,23,196,1,23,198,2,11,11,28, -23,193,2,192,86,94,23,193,1,27,249,22,180,15,27,248,22,131,16,2,61, -250,80,159,45,40,39,23,196,1,11,11,248,22,131,16,2,60,90,159,39,11, -89,161,39,36,11,248,22,175,15,23,197,1,86,95,23,195,1,23,194,1,249, -22,180,15,23,200,1,23,195,1,27,20,13,159,80,159,37,43,37,26,29,80, -159,8,30,44,37,249,22,33,11,80,159,8,32,43,37,22,188,14,10,22,189, -14,10,22,190,14,10,22,129,15,10,22,128,15,11,22,130,15,10,22,191,14, -10,22,131,15,10,22,132,15,10,22,133,15,10,22,134,15,10,22,135,15,11, -22,136,15,10,22,186,14,11,247,22,143,6,28,248,22,148,2,193,192,11,27, -249,22,172,15,23,197,1,6,11,11,99,111,110,102,105,103,46,114,107,116,100, -27,28,248,22,166,15,23,195,2,249,22,135,6,23,196,1,80,159,40,8,43, -39,11,28,192,192,21,17,1,0,250,22,157,2,23,196,1,2,62,247,22,166, -8,250,22,157,2,195,2,62,247,22,166,8,28,248,22,148,7,23,195,2,27, -248,22,162,15,23,196,1,28,248,22,179,15,23,194,2,192,249,22,180,15,23, -195,1,27,27,248,22,131,16,2,63,28,248,22,179,15,23,194,2,192,28,248, -22,178,15,23,194,2,249,22,180,15,23,195,1,249,22,180,15,250,80,159,48, -40,39,248,22,131,16,2,61,11,10,248,22,131,16,2,60,250,80,159,44,40, -39,248,22,131,16,2,61,23,196,1,10,28,23,193,2,192,86,94,23,193,1, -248,22,131,16,2,60,28,248,22,137,8,23,195,2,27,248,22,163,15,23,196, -1,28,248,22,179,15,23,194,2,192,249,22,180,15,23,195,1,27,27,248,22, -131,16,2,63,28,248,22,179,15,23,194,2,192,28,248,22,178,15,23,194,2, -249,22,180,15,23,195,1,249,22,180,15,250,80,159,48,40,39,248,22,131,16, -2,61,11,10,248,22,131,16,2,60,250,80,159,44,40,39,248,22,131,16,2, -61,23,196,1,10,28,23,193,2,192,86,94,23,193,1,248,22,131,16,2,60, -28,248,22,154,15,23,195,2,28,248,22,179,15,23,195,2,193,249,22,180,15, -23,196,1,27,27,248,22,131,16,2,63,28,248,22,179,15,23,194,2,192,28, -248,22,178,15,23,194,2,249,22,180,15,23,195,1,249,22,180,15,250,80,159, -47,40,39,248,22,131,16,2,61,11,10,248,22,131,16,2,60,250,80,159,43, -40,39,248,22,131,16,2,61,23,196,1,10,28,23,193,2,192,86,94,23,193, -1,248,22,131,16,2,60,193,28,248,22,179,15,23,195,2,193,249,22,180,15, -23,196,1,27,27,248,22,131,16,2,63,28,248,22,179,15,23,194,2,192,28, -248,22,178,15,23,194,2,249,22,180,15,23,195,1,249,22,180,15,250,80,159, -47,40,39,248,22,131,16,2,61,11,10,248,22,131,16,2,60,250,80,159,43, -40,39,248,22,131,16,2,61,23,196,1,10,28,23,193,2,192,86,94,23,193, -1,248,22,131,16,2,60,28,248,22,179,15,23,195,2,193,28,248,22,178,15, -23,195,2,249,22,180,15,23,196,1,249,22,180,15,250,80,159,43,40,39,248, -22,131,16,2,61,11,10,248,22,131,16,2,60,250,80,159,39,40,39,248,22, -131,16,2,61,196,10,28,248,22,87,23,196,2,9,28,248,22,80,23,196,2, -249,22,79,248,80,159,39,54,39,248,22,136,18,23,199,2,27,248,22,137,18, -23,199,1,28,248,22,87,23,194,2,9,28,248,22,80,23,194,2,249,22,79, -248,80,159,42,54,39,248,22,136,18,23,197,2,27,248,22,137,18,23,197,1, -28,248,22,87,23,194,2,9,28,248,22,80,23,194,2,249,22,79,248,80,159, -45,54,39,248,22,136,18,23,197,2,249,80,159,46,8,44,39,23,204,1,248, -22,137,18,23,198,1,249,22,93,23,202,2,249,80,159,46,8,44,39,23,204, -1,248,22,137,18,23,198,1,249,22,93,23,199,2,27,248,22,137,18,23,197, -1,28,248,22,87,23,194,2,9,28,248,22,80,23,194,2,249,22,79,248,80, -159,45,54,39,248,22,136,18,23,197,2,249,80,159,46,8,44,39,23,204,1, -248,22,137,18,23,198,1,249,22,93,23,202,2,249,80,159,46,8,44,39,23, -204,1,248,22,137,18,23,198,1,249,22,93,23,196,2,27,248,22,137,18,23, -199,1,28,248,22,87,23,194,2,9,28,248,22,80,23,194,2,249,22,79,248, -80,159,42,54,39,248,22,136,18,23,197,2,27,248,22,137,18,23,197,1,28, -248,22,87,23,194,2,9,28,248,22,80,23,194,2,249,22,79,248,80,159,45, -54,39,248,22,136,18,23,197,2,249,80,159,46,8,44,39,23,204,1,248,22, -137,18,23,198,1,249,22,93,23,202,2,249,80,159,46,8,44,39,23,204,1, -248,22,137,18,23,198,1,249,22,93,23,199,2,27,248,22,137,18,23,197,1, -28,248,22,87,23,194,2,9,28,248,22,80,23,194,2,249,22,79,248,80,159, -45,54,39,248,22,136,18,23,197,2,249,80,159,46,8,44,39,23,204,1,248, -22,137,18,23,198,1,249,22,93,23,202,2,249,80,159,46,8,44,39,23,204, -1,248,22,137,18,23,198,1,27,250,22,157,2,23,198,1,23,199,1,11,28, -192,249,80,159,39,8,44,39,198,194,196,28,247,22,138,16,27,27,248,22,131, -16,2,59,28,248,22,179,15,23,194,2,192,27,28,248,22,177,15,23,195,2, -20,13,159,80,159,39,43,37,250,80,159,42,44,37,249,22,33,11,80,159,44, -43,37,22,132,16,248,22,131,16,2,60,27,248,22,131,16,2,61,250,80,159, -43,40,39,23,196,1,23,198,2,11,11,28,23,193,2,192,86,94,23,193,1, -27,249,22,180,15,27,248,22,131,16,2,61,250,80,159,46,40,39,23,196,1, -11,11,248,22,131,16,2,60,90,159,39,11,89,161,39,36,11,248,22,175,15, -23,197,1,86,95,23,195,1,23,194,1,249,22,180,15,23,200,1,23,195,1, -27,248,80,159,39,52,39,23,195,1,27,248,80,159,40,54,39,27,250,22,157, -2,23,199,2,70,108,105,110,107,115,45,102,105,108,101,11,28,23,193,2,192, -86,94,23,193,1,249,22,172,15,27,250,22,157,2,23,202,2,69,115,104,97, -114,101,45,100,105,114,11,28,23,193,2,192,86,94,23,193,1,249,22,172,15, -62,117,112,6,5,5,115,104,97,114,101,2,64,249,22,79,248,22,186,8,250, -80,159,45,57,39,23,200,2,78,108,105,110,107,115,45,115,101,97,114,99,104, -45,102,105,108,101,115,248,22,89,23,200,1,250,22,172,15,248,22,131,16,2, -65,250,22,157,2,23,202,1,2,62,247,22,166,8,2,64,249,22,79,21,16, -0,11,248,22,162,13,23,194,1,249,22,16,80,159,38,8,30,38,28,248,22, -182,12,23,197,2,86,94,23,196,1,32,0,88,163,8,36,36,41,11,9,222, -11,20,20,94,88,163,8,36,36,43,11,9,223,3,33,120,23,196,1,32,122, -88,163,36,37,56,11,2,54,222,33,123,90,159,39,11,89,161,39,36,11,248, -22,175,15,23,197,1,86,95,23,195,1,23,194,1,28,248,22,154,15,23,194, -2,28,248,22,167,15,23,194,2,249,22,140,6,23,195,1,32,0,88,163,8, -36,36,41,11,9,222,11,90,159,39,11,89,161,39,36,11,248,22,175,15,23, +172,11,23,196,2,2,47,23,197,2,28,248,22,177,15,23,195,2,86,94,23, +194,1,12,251,22,174,11,23,197,2,2,52,2,45,23,198,1,249,22,3,20, +20,94,88,163,8,36,37,47,11,9,223,2,33,96,23,195,1,23,197,1,28, +28,248,22,0,23,195,2,249,22,50,23,196,2,37,11,12,250,22,172,11,23, +196,1,2,53,23,197,1,86,94,28,28,248,22,154,15,23,194,2,10,28,248, +22,148,7,23,194,2,28,248,22,177,15,23,194,2,10,248,22,178,15,23,194, +2,11,12,250,22,172,11,2,15,2,47,23,196,2,28,248,22,177,15,23,194, +2,12,251,22,174,11,2,15,2,52,2,45,23,197,1,86,95,86,94,86,94, +28,28,248,22,154,15,23,196,2,10,28,248,22,148,7,23,196,2,28,248,22, +177,15,23,196,2,10,248,22,178,15,23,196,2,11,12,250,22,172,11,2,15, +2,47,23,198,2,28,248,22,177,15,23,196,2,12,251,22,174,11,2,15,2, +52,2,45,23,199,2,249,22,3,32,0,88,163,8,36,37,46,11,9,222,33, +99,23,198,2,28,28,248,22,0,23,195,2,249,22,50,23,196,2,37,11,12, +250,22,172,11,2,15,2,53,23,197,2,251,80,158,40,49,23,198,1,23,199, +1,23,200,1,11,86,94,28,28,248,22,154,15,23,194,2,10,28,248,22,148, +7,23,194,2,28,248,22,177,15,23,194,2,10,248,22,178,15,23,194,2,11, +12,250,22,172,11,2,17,2,47,23,196,2,28,248,22,177,15,23,194,2,12, +251,22,174,11,2,17,2,52,2,45,23,197,1,86,96,86,94,28,28,248,22, +154,15,23,196,2,10,28,248,22,148,7,23,196,2,28,248,22,177,15,23,196, +2,10,248,22,178,15,23,196,2,11,12,250,22,172,11,2,17,2,47,23,198, +2,28,248,22,177,15,23,196,2,12,251,22,174,11,2,17,2,52,2,45,23, +199,2,86,94,86,94,28,28,248,22,154,15,23,197,2,10,28,248,22,148,7, +23,197,2,28,248,22,177,15,23,197,2,10,248,22,178,15,23,197,2,11,12, +250,22,172,11,2,17,2,47,23,199,2,28,248,22,177,15,23,197,2,12,251, +22,174,11,2,17,2,52,2,45,23,200,2,249,22,3,32,0,88,163,8,36, +37,46,11,9,222,33,101,23,199,2,28,28,248,22,0,23,195,2,249,22,50, +23,196,2,37,11,12,250,22,172,11,2,17,2,53,23,197,2,251,80,158,40, +49,23,198,1,23,200,1,23,201,1,23,199,1,27,248,22,131,16,2,54,28, +248,22,179,15,23,194,2,192,27,28,248,22,177,15,23,195,2,20,13,159,80, +159,38,43,37,250,80,159,41,44,37,249,22,33,11,80,159,43,43,37,22,132, +16,248,22,131,16,2,55,27,248,22,131,16,2,56,250,80,159,42,40,39,23, +196,1,23,198,2,11,11,28,23,193,2,192,86,94,23,193,1,27,249,22,180, +15,27,248,22,131,16,2,56,250,80,159,45,40,39,23,196,1,11,11,248,22, +131,16,2,55,90,159,39,11,89,161,39,36,11,248,22,175,15,23,197,1,86, +95,23,195,1,23,194,1,249,22,180,15,23,200,1,23,195,1,27,20,13,159, +80,159,37,43,37,26,29,80,159,8,30,44,37,249,22,33,11,80,159,8,32, +43,37,22,188,14,10,22,189,14,10,22,190,14,10,22,129,15,10,22,128,15, +11,22,130,15,10,22,191,14,10,22,131,15,10,22,132,15,10,22,133,15,10, +22,134,15,10,22,135,15,11,22,136,15,10,22,186,14,11,247,22,143,6,28, +248,22,148,2,193,192,11,27,249,22,172,15,23,197,1,6,11,11,99,111,110, +102,105,103,46,114,107,116,100,27,28,248,22,166,15,23,195,2,249,22,135,6, +23,196,1,80,159,40,8,37,39,11,28,192,192,21,17,1,0,250,22,157,2, +23,196,1,2,57,247,22,166,8,250,22,157,2,195,2,57,247,22,166,8,28, +248,22,148,7,23,195,2,27,248,22,162,15,23,196,1,28,248,22,179,15,23, +194,2,192,249,22,180,15,23,195,1,27,27,248,22,131,16,2,58,28,248,22, +179,15,23,194,2,192,28,248,22,178,15,23,194,2,249,22,180,15,23,195,1, +249,22,180,15,250,80,159,48,40,39,248,22,131,16,2,56,11,10,248,22,131, +16,2,55,250,80,159,44,40,39,248,22,131,16,2,56,23,196,1,10,28,23, +193,2,192,86,94,23,193,1,248,22,131,16,2,55,28,248,22,137,8,23,195, +2,27,248,22,163,15,23,196,1,28,248,22,179,15,23,194,2,192,249,22,180, +15,23,195,1,27,27,248,22,131,16,2,58,28,248,22,179,15,23,194,2,192, +28,248,22,178,15,23,194,2,249,22,180,15,23,195,1,249,22,180,15,250,80, +159,48,40,39,248,22,131,16,2,56,11,10,248,22,131,16,2,55,250,80,159, +44,40,39,248,22,131,16,2,56,23,196,1,10,28,23,193,2,192,86,94,23, +193,1,248,22,131,16,2,55,28,248,22,154,15,23,195,2,28,248,22,179,15, +23,195,2,193,249,22,180,15,23,196,1,27,27,248,22,131,16,2,58,28,248, +22,179,15,23,194,2,192,28,248,22,178,15,23,194,2,249,22,180,15,23,195, +1,249,22,180,15,250,80,159,47,40,39,248,22,131,16,2,56,11,10,248,22, +131,16,2,55,250,80,159,43,40,39,248,22,131,16,2,56,23,196,1,10,28, +23,193,2,192,86,94,23,193,1,248,22,131,16,2,55,193,28,248,22,179,15, +23,195,2,193,249,22,180,15,23,196,1,27,27,248,22,131,16,2,58,28,248, +22,179,15,23,194,2,192,28,248,22,178,15,23,194,2,249,22,180,15,23,195, +1,249,22,180,15,250,80,159,47,40,39,248,22,131,16,2,56,11,10,248,22, +131,16,2,55,250,80,159,43,40,39,248,22,131,16,2,56,23,196,1,10,28, +23,193,2,192,86,94,23,193,1,248,22,131,16,2,55,28,248,22,179,15,23, +195,2,193,28,248,22,178,15,23,195,2,249,22,180,15,23,196,1,249,22,180, +15,250,80,159,43,40,39,248,22,131,16,2,56,11,10,248,22,131,16,2,55, +250,80,159,39,40,39,248,22,131,16,2,56,196,10,28,248,22,87,23,196,2, +9,28,248,22,80,23,196,2,249,22,79,248,80,159,39,54,39,248,22,137,18, +23,199,2,27,248,22,138,18,23,199,1,28,248,22,87,23,194,2,9,28,248, +22,80,23,194,2,249,22,79,248,80,159,42,54,39,248,22,137,18,23,197,2, +27,248,22,138,18,23,197,1,28,248,22,87,23,194,2,9,28,248,22,80,23, +194,2,249,22,79,248,80,159,45,54,39,248,22,137,18,23,197,2,249,80,159, +46,8,38,39,23,204,1,248,22,138,18,23,198,1,249,22,93,23,202,2,249, +80,159,46,8,38,39,23,204,1,248,22,138,18,23,198,1,249,22,93,23,199, +2,27,248,22,138,18,23,197,1,28,248,22,87,23,194,2,9,28,248,22,80, +23,194,2,249,22,79,248,80,159,45,54,39,248,22,137,18,23,197,2,249,80, +159,46,8,38,39,23,204,1,248,22,138,18,23,198,1,249,22,93,23,202,2, +249,80,159,46,8,38,39,23,204,1,248,22,138,18,23,198,1,249,22,93,23, +196,2,27,248,22,138,18,23,199,1,28,248,22,87,23,194,2,9,28,248,22, +80,23,194,2,249,22,79,248,80,159,42,54,39,248,22,137,18,23,197,2,27, +248,22,138,18,23,197,1,28,248,22,87,23,194,2,9,28,248,22,80,23,194, +2,249,22,79,248,80,159,45,54,39,248,22,137,18,23,197,2,249,80,159,46, +8,38,39,23,204,1,248,22,138,18,23,198,1,249,22,93,23,202,2,249,80, +159,46,8,38,39,23,204,1,248,22,138,18,23,198,1,249,22,93,23,199,2, +27,248,22,138,18,23,197,1,28,248,22,87,23,194,2,9,28,248,22,80,23, +194,2,249,22,79,248,80,159,45,54,39,248,22,137,18,23,197,2,249,80,159, +46,8,38,39,23,204,1,248,22,138,18,23,198,1,249,22,93,23,202,2,249, +80,159,46,8,38,39,23,204,1,248,22,138,18,23,198,1,27,250,22,157,2, +23,198,1,23,199,1,11,28,192,249,80,159,39,8,38,39,198,194,196,27,27, +248,22,131,16,2,54,28,248,22,179,15,23,194,2,192,27,28,248,22,177,15, +23,195,2,20,13,159,80,159,39,43,37,250,80,159,42,44,37,249,22,33,11, +80,159,44,43,37,22,132,16,248,22,131,16,2,55,27,248,22,131,16,2,56, +250,80,159,43,40,39,23,196,1,23,198,2,11,11,28,23,193,2,192,86,94, +23,193,1,27,249,22,180,15,27,248,22,131,16,2,56,250,80,159,46,40,39, +23,196,1,11,11,248,22,131,16,2,55,90,159,39,11,89,161,39,36,11,248, +22,175,15,23,197,1,86,95,23,195,1,23,194,1,249,22,180,15,23,200,1, +23,195,1,27,248,80,159,39,52,39,23,195,1,27,248,80,159,40,54,39,27, +250,22,157,2,23,199,2,70,108,105,110,107,115,45,102,105,108,101,11,28,23, +193,2,192,86,94,23,193,1,249,22,172,15,27,250,22,157,2,23,202,2,69, +115,104,97,114,101,45,100,105,114,11,28,23,193,2,192,86,94,23,193,1,249, +22,172,15,62,117,112,6,5,5,115,104,97,114,101,2,59,250,22,93,248,22, +89,11,28,247,22,138,16,28,247,22,139,16,248,22,89,250,22,172,15,248,22, +131,16,2,60,250,22,157,2,23,204,2,2,57,247,22,166,8,2,59,9,9, +28,247,22,139,16,250,80,159,45,57,39,23,200,1,78,108,105,110,107,115,45, +115,101,97,114,99,104,45,102,105,108,101,115,248,22,89,23,200,1,9,248,22, +162,13,23,194,1,249,22,16,80,159,38,8,24,38,28,248,22,182,12,23,197, +2,86,94,23,196,1,32,0,88,163,8,36,36,41,11,9,222,11,20,20,94, +88,163,8,36,36,43,11,9,223,3,33,114,23,196,1,32,116,88,163,36,37, +56,11,2,49,222,33,117,90,159,39,11,89,161,39,36,11,248,22,175,15,23, 197,1,86,95,23,195,1,23,194,1,28,248,22,154,15,23,194,2,28,248,22, 167,15,23,194,2,249,22,140,6,23,195,1,32,0,88,163,8,36,36,41,11, 9,222,11,90,159,39,11,89,161,39,36,11,248,22,175,15,23,197,1,86,95, @@ -455,157 +447,169 @@ 2,249,22,140,6,23,195,1,32,0,88,163,8,36,36,41,11,9,222,11,90, 159,39,11,89,161,39,36,11,248,22,175,15,23,197,1,86,95,23,195,1,23, 194,1,28,248,22,154,15,23,194,2,28,248,22,167,15,23,194,2,249,22,140, -6,23,195,1,32,0,88,163,8,36,36,41,11,9,222,11,248,2,122,23,194, -1,11,11,11,11,32,124,88,163,8,36,37,55,11,2,54,222,33,125,27,249, -22,158,6,8,128,128,23,196,2,28,248,22,143,7,23,194,2,9,249,22,79, -23,195,1,27,249,22,158,6,8,128,128,23,199,2,28,248,22,143,7,23,194, -2,9,249,22,79,23,195,1,27,249,22,158,6,8,128,128,23,202,2,28,248, -22,143,7,23,194,2,9,249,22,79,23,195,1,27,249,22,158,6,8,128,128, -23,205,2,28,248,22,143,7,23,194,2,9,249,22,79,23,195,1,248,2,124, -23,206,1,27,249,22,158,6,8,128,128,23,196,2,28,248,22,137,8,23,194, -2,28,249,22,129,4,248,22,142,8,23,196,2,8,128,128,249,22,1,22,149, -8,249,22,79,23,197,1,27,249,22,158,6,8,128,128,23,201,2,28,248,22, -143,7,23,194,2,9,249,22,79,23,195,1,27,249,22,158,6,8,128,128,23, -204,2,28,248,22,143,7,23,194,2,9,249,22,79,23,195,1,27,249,22,158, -6,8,128,128,23,207,2,28,248,22,143,7,23,194,2,9,249,22,79,23,195, -1,27,249,22,158,6,8,128,128,23,210,2,28,248,22,143,7,23,194,2,9, -249,22,79,23,195,1,248,2,124,23,211,1,192,192,248,22,128,6,23,194,1, -20,13,159,80,159,37,8,32,37,80,159,37,8,45,39,27,28,249,22,183,8, -248,22,175,8,2,66,38,90,159,39,11,89,161,39,36,11,248,22,175,15,23, -198,2,86,95,23,195,1,23,194,1,28,248,22,154,15,23,194,2,28,248,22, -167,15,23,194,2,249,22,140,6,23,195,1,32,0,88,163,8,36,36,41,11, -9,222,11,90,159,39,11,89,161,39,36,11,248,22,175,15,23,197,1,86,95, -23,195,1,23,194,1,28,248,22,154,15,23,194,2,28,248,22,167,15,23,194, -2,249,22,140,6,23,195,1,32,0,88,163,8,36,36,41,11,9,222,11,90, -159,39,11,89,161,39,36,11,248,22,175,15,23,197,1,86,95,23,195,1,23, -194,1,28,248,22,154,15,23,194,2,28,248,22,167,15,23,194,2,249,22,140, 6,23,195,1,32,0,88,163,8,36,36,41,11,9,222,11,90,159,39,11,89, 161,39,36,11,248,22,175,15,23,197,1,86,95,23,195,1,23,194,1,28,248, 22,154,15,23,194,2,28,248,22,167,15,23,194,2,249,22,140,6,23,195,1, -32,0,88,163,8,36,36,41,11,9,222,11,248,2,122,23,194,1,11,11,11, -11,11,28,248,22,166,15,23,195,2,27,28,249,22,183,8,248,22,175,8,2, -66,38,249,22,140,6,23,197,2,32,0,88,163,8,36,36,41,11,9,222,11, -11,86,94,28,23,194,2,248,22,142,6,23,195,1,86,94,23,194,1,12,249, -22,79,27,248,22,183,5,23,199,1,250,22,46,22,37,88,163,36,36,8,24, -11,9,223,3,33,126,20,20,94,88,163,36,36,43,11,9,223,3,33,127,23, -196,1,194,249,22,79,11,194,28,28,23,195,2,28,248,22,81,23,196,2,248, -22,161,9,249,22,157,14,36,248,22,137,18,23,199,2,11,11,194,86,94,23, -195,1,249,22,14,20,20,94,88,163,8,32,36,58,16,4,36,8,240,0,64, -0,0,8,129,128,36,9,224,2,3,33,128,2,23,196,1,80,159,38,8,30, -38,27,248,22,161,9,194,28,192,192,248,22,161,9,248,22,80,195,86,94,28, -248,22,139,12,23,198,2,27,247,22,131,12,28,249,22,187,11,23,195,2,2, -67,251,22,191,11,23,197,1,2,67,250,22,132,8,2,68,28,23,202,1,86, -94,23,203,1,80,159,47,8,25,38,249,22,183,8,80,159,49,8,24,38,23, -205,1,248,22,135,12,23,206,2,247,22,29,12,12,28,248,22,139,12,23,198, -2,86,94,23,197,1,248,23,194,1,247,22,137,2,196,86,95,28,248,22,139, -12,23,199,2,27,247,22,131,12,28,249,22,187,11,23,195,2,2,67,251,22, -191,11,23,197,1,2,67,250,22,132,8,2,68,28,23,203,2,80,159,48,8, -25,38,249,22,183,8,80,159,50,8,24,38,23,206,2,248,22,135,12,23,207, -2,247,22,29,12,12,28,23,193,2,28,23,195,1,86,94,23,196,1,86,94, -20,18,159,11,80,158,40,8,26,247,22,137,2,20,18,159,11,80,158,40,8, -27,23,193,1,86,94,250,22,184,8,80,159,43,8,28,38,23,199,2,247,22, -137,2,250,22,184,8,80,159,43,8,29,38,23,199,1,23,196,1,86,94,23, -195,1,12,28,248,22,139,12,23,199,2,86,94,23,198,1,248,23,195,1,247, -22,137,2,197,20,20,94,248,22,143,6,23,194,2,28,248,22,143,7,248,22, -143,6,23,195,1,12,248,22,168,11,6,30,30,101,120,112,101,99,116,101,100, -32,97,32,115,105,110,103,108,101,32,83,45,101,120,112,114,101,115,115,105,111, -110,248,22,128,6,23,194,1,28,248,22,88,23,194,2,28,28,249,22,189,3, -38,248,22,92,23,196,2,10,249,22,189,3,39,248,22,92,23,196,2,28,28, -248,22,148,7,248,22,80,23,195,2,10,28,249,22,163,9,2,69,248,22,136, -18,23,196,2,10,249,22,163,9,2,70,248,22,136,18,23,196,2,28,27,248, -22,101,194,28,248,22,154,15,23,194,2,10,28,248,22,148,7,23,194,2,28, -248,22,177,15,23,194,2,10,248,22,178,15,23,194,1,11,27,248,22,87,248, -22,103,195,28,192,192,248,22,158,16,248,22,110,195,11,11,11,11,28,248,22, -167,15,249,22,172,15,23,196,2,23,198,2,27,248,22,67,248,22,158,15,23, -198,1,250,22,155,2,23,198,2,23,196,2,249,22,79,23,199,1,250,22,157, -2,23,203,1,23,201,1,9,12,250,22,155,2,23,197,1,23,198,1,249,22, -79,23,198,1,23,201,1,28,28,248,22,87,248,22,103,23,197,2,10,249,22, -149,16,248,22,110,23,198,2,247,22,166,8,27,248,22,182,15,249,22,180,15, -248,22,101,23,200,2,23,198,1,28,249,22,163,9,248,22,80,23,199,2,2, -70,86,94,23,196,1,249,22,3,20,20,94,88,163,8,36,37,53,11,9,224, -3,2,33,136,2,23,196,1,248,22,185,15,23,196,1,28,249,22,163,9,248, -22,136,18,23,199,2,2,69,86,94,23,196,1,86,94,28,250,22,157,2,23, -197,2,11,11,12,250,22,155,2,23,197,2,11,9,249,22,161,2,23,196,2, -20,20,95,88,163,8,36,38,50,11,9,224,3,2,33,137,2,23,195,1,23, -196,1,27,248,22,67,248,22,136,18,23,199,1,250,22,155,2,23,198,2,23, -196,2,249,22,79,248,22,128,2,23,200,1,250,22,157,2,23,203,1,23,201, -1,9,12,250,22,155,2,23,196,1,23,197,1,248,22,94,23,199,1,27,28, -28,23,194,2,248,22,161,9,248,22,80,23,196,2,10,9,27,249,22,183,5, -23,198,2,66,98,105,110,97,114,121,250,22,46,22,37,88,163,8,36,36,44, -11,9,223,3,33,133,2,20,20,94,88,163,36,36,43,11,9,223,3,33,134, -2,23,196,1,86,94,28,28,248,22,88,23,194,2,249,22,4,32,0,88,163, -8,36,37,45,11,9,222,33,135,2,23,195,2,11,12,248,22,168,11,6,18, -18,105,108,108,45,102,111,114,109,101,100,32,99,111,110,116,101,110,116,27,247, -22,137,2,27,90,159,39,11,89,161,39,36,11,248,22,175,15,23,201,1,192, -86,96,249,22,3,20,20,94,88,163,8,36,37,54,11,9,224,2,3,33,138, -2,23,195,1,23,197,1,249,22,161,2,195,88,163,8,36,38,48,11,9,223, -3,33,139,2,28,23,198,1,86,94,20,18,159,11,80,158,43,8,26,193,20, -18,159,11,80,158,43,8,27,195,86,94,250,22,184,8,80,159,46,8,28,38, -23,202,2,196,250,22,184,8,80,159,46,8,29,38,23,202,1,23,199,1,193, -20,13,159,80,159,38,8,32,37,88,163,36,37,56,8,240,0,0,0,3,9, -226,2,1,0,3,33,131,2,27,28,23,194,2,80,159,39,8,25,38,249,22, -183,8,80,159,41,8,24,38,23,197,2,27,28,23,195,2,80,158,40,8,27, -249,22,183,8,80,159,42,8,29,38,23,198,2,27,249,80,159,43,8,31,39, -23,197,2,23,196,2,28,249,22,165,9,23,195,2,23,196,1,86,96,23,199, -1,23,195,1,23,193,1,28,23,196,1,80,158,41,8,26,249,22,183,8,80, -159,43,8,28,38,23,199,1,20,13,159,80,159,41,8,32,37,20,20,94,88, -163,36,37,57,16,2,36,8,128,252,9,227,5,4,3,6,0,33,132,2,23, -199,1,27,20,20,97,88,163,8,36,36,53,16,2,36,8,128,240,9,227,6, -5,4,3,1,33,140,2,23,194,1,23,196,1,23,197,1,23,198,1,28,28, -248,22,0,23,194,2,249,22,50,23,195,2,36,11,20,13,159,80,159,42,43, -37,26,29,80,159,8,35,44,37,249,22,33,11,80,159,8,37,43,37,22,188, -14,10,22,189,14,10,22,190,14,10,22,129,15,10,22,128,15,11,22,130,15, -10,22,191,14,10,22,131,15,10,22,132,15,10,22,133,15,10,22,134,15,10, -22,135,15,11,22,136,15,10,22,186,14,11,247,23,193,1,250,22,172,11,2, -8,2,56,23,196,1,248,22,9,20,20,95,88,163,36,37,8,44,16,4,8, -128,6,8,240,0,191,0,0,37,36,9,225,1,3,2,33,141,2,23,195,1, -23,196,1,0,7,35,114,120,34,47,43,34,28,248,22,148,7,23,195,2,27, -249,22,147,16,2,143,2,23,197,2,28,23,193,2,28,249,22,189,3,248,22, -100,23,196,2,248,22,179,3,248,22,151,7,23,199,2,249,22,7,250,22,170, -7,23,200,1,36,248,22,100,23,199,1,23,198,1,249,22,7,250,22,170,7, -23,200,2,36,248,22,100,23,199,2,249,22,79,249,22,170,7,23,201,1,248, -22,102,23,200,1,23,200,1,249,22,7,23,197,1,23,198,1,90,159,39,11, -89,161,39,36,11,248,22,175,15,23,198,1,86,94,23,195,1,28,249,22,163, -9,23,195,2,2,53,86,94,23,193,1,249,22,7,23,196,1,23,200,1,27, -249,22,79,23,197,1,23,201,1,28,248,22,148,7,23,195,2,27,249,22,147, -16,2,143,2,23,197,2,28,23,193,2,28,249,22,189,3,248,22,100,23,196, -2,248,22,179,3,248,22,151,7,23,199,2,249,22,7,250,22,170,7,23,200, -1,36,248,22,100,23,199,1,23,196,1,249,22,7,250,22,170,7,23,200,2, -36,248,22,100,23,199,2,249,22,79,249,22,170,7,23,201,1,248,22,102,23, -200,1,23,198,1,249,22,7,23,197,1,23,196,1,90,159,39,11,89,161,39, -36,11,248,22,175,15,23,198,1,86,94,23,195,1,28,249,22,163,9,23,195, -2,2,53,86,94,23,193,1,249,22,7,23,196,1,23,198,1,249,80,159,45, -8,35,39,194,249,22,79,197,199,28,249,22,129,4,23,197,2,248,22,182,8, -80,159,39,8,24,38,9,27,249,80,159,39,8,34,39,11,23,198,2,250,22, -93,250,22,157,2,23,199,2,23,201,2,9,250,22,157,2,23,199,1,11,9, -27,248,22,178,3,23,201,1,28,249,22,129,4,23,195,2,248,22,182,8,80, -159,44,8,24,38,9,27,249,80,159,44,8,34,39,11,23,196,2,250,22,93, -250,22,157,2,23,199,2,23,206,2,9,250,22,157,2,23,199,1,11,9,27, -248,22,178,3,23,199,1,28,249,22,129,4,23,195,2,248,22,182,8,80,159, -49,8,24,38,9,27,249,80,159,49,8,34,39,11,23,196,2,250,22,93,250, -22,157,2,23,199,2,23,211,2,9,250,22,157,2,23,199,1,11,9,249,80, -159,52,8,46,39,23,210,1,248,22,178,3,23,200,1,32,146,2,88,163,36, -43,8,31,11,65,99,108,111,111,112,222,33,155,2,32,147,2,88,163,8,36, -37,47,11,2,54,222,33,150,2,32,148,2,88,163,36,37,43,11,69,116,111, -45,115,116,114,105,110,103,222,33,149,2,28,248,22,154,15,23,194,2,248,22, +32,0,88,163,8,36,36,41,11,9,222,11,248,2,116,23,194,1,11,11,11, +11,32,118,88,163,8,36,37,55,11,2,49,222,33,119,27,249,22,158,6,8, +128,128,23,196,2,28,248,22,143,7,23,194,2,9,249,22,79,23,195,1,27, +249,22,158,6,8,128,128,23,199,2,28,248,22,143,7,23,194,2,9,249,22, +79,23,195,1,27,249,22,158,6,8,128,128,23,202,2,28,248,22,143,7,23, +194,2,9,249,22,79,23,195,1,27,249,22,158,6,8,128,128,23,205,2,28, +248,22,143,7,23,194,2,9,249,22,79,23,195,1,248,2,118,23,206,1,27, +249,22,158,6,8,128,128,23,196,2,28,248,22,137,8,23,194,2,28,249,22, +129,4,248,22,142,8,23,196,2,8,128,128,249,22,1,22,149,8,249,22,79, +23,197,1,27,249,22,158,6,8,128,128,23,201,2,28,248,22,143,7,23,194, +2,9,249,22,79,23,195,1,27,249,22,158,6,8,128,128,23,204,2,28,248, +22,143,7,23,194,2,9,249,22,79,23,195,1,27,249,22,158,6,8,128,128, +23,207,2,28,248,22,143,7,23,194,2,9,249,22,79,23,195,1,27,249,22, +158,6,8,128,128,23,210,2,28,248,22,143,7,23,194,2,9,249,22,79,23, +195,1,248,2,118,23,211,1,192,192,248,22,128,6,23,194,1,20,13,159,80, +159,37,8,26,37,80,159,37,8,39,39,27,28,249,22,183,8,248,22,175,8, +2,61,38,90,159,39,11,89,161,39,36,11,248,22,175,15,23,198,2,86,95, +23,195,1,23,194,1,28,248,22,154,15,23,194,2,28,248,22,167,15,23,194, +2,249,22,140,6,23,195,1,32,0,88,163,8,36,36,41,11,9,222,11,90, +159,39,11,89,161,39,36,11,248,22,175,15,23,197,1,86,95,23,195,1,23, +194,1,28,248,22,154,15,23,194,2,28,248,22,167,15,23,194,2,249,22,140, +6,23,195,1,32,0,88,163,8,36,36,41,11,9,222,11,90,159,39,11,89, +161,39,36,11,248,22,175,15,23,197,1,86,95,23,195,1,23,194,1,28,248, +22,154,15,23,194,2,28,248,22,167,15,23,194,2,249,22,140,6,23,195,1, +32,0,88,163,8,36,36,41,11,9,222,11,90,159,39,11,89,161,39,36,11, +248,22,175,15,23,197,1,86,95,23,195,1,23,194,1,28,248,22,154,15,23, +194,2,28,248,22,167,15,23,194,2,249,22,140,6,23,195,1,32,0,88,163, +8,36,36,41,11,9,222,11,248,2,116,23,194,1,11,11,11,11,11,28,248, +22,166,15,23,195,2,27,28,249,22,183,8,248,22,175,8,2,61,38,249,22, +140,6,23,197,2,32,0,88,163,8,36,36,41,11,9,222,11,11,86,94,28, +23,194,2,248,22,142,6,23,195,1,86,94,23,194,1,12,249,22,79,27,248, +22,183,5,23,199,1,250,22,46,22,37,88,163,36,36,8,24,11,9,223,3, +33,120,20,20,94,88,163,36,36,43,11,9,223,3,33,121,23,196,1,194,249, +22,79,11,194,28,28,23,195,2,28,248,22,81,23,196,2,248,22,161,9,249, +22,157,14,36,248,22,138,18,23,199,2,11,11,194,86,94,23,195,1,249,22, +14,20,20,94,88,163,8,32,36,58,16,4,36,8,128,20,8,128,2,36,9, +224,2,3,33,122,23,196,1,80,159,38,8,24,38,27,248,22,161,9,194,28, +192,192,248,22,161,9,248,22,80,195,86,95,28,248,22,139,12,23,198,2,27, +247,22,131,12,28,249,22,187,11,23,195,2,2,62,251,22,191,11,23,197,1, +2,62,250,22,132,8,6,42,42,101,114,114,111,114,32,114,101,97,100,105,110, +103,32,99,111,108,108,101,99,116,105,111,110,32,108,105,110,107,115,32,102,105, +108,101,32,126,115,58,32,126,97,23,203,2,248,22,135,12,23,206,2,247,22, +29,12,12,28,23,193,2,250,22,155,2,80,159,42,59,38,23,198,1,249,22, +79,21,17,0,0,23,198,1,86,95,23,195,1,23,193,1,12,28,248,22,139, +12,23,198,2,86,94,23,197,1,248,23,195,1,247,22,137,2,196,88,163,36, +37,55,8,240,0,0,128,0,9,226,0,2,1,3,33,125,20,20,94,248,22, +143,6,23,194,2,28,248,22,143,7,248,22,143,6,23,195,1,12,248,22,168, +11,6,30,30,101,120,112,101,99,116,101,100,32,97,32,115,105,110,103,108,101, +32,83,45,101,120,112,114,101,115,115,105,111,110,248,22,128,6,23,194,1,28, +248,22,88,23,194,2,28,28,249,22,189,3,38,248,22,92,23,196,2,10,249, +22,189,3,39,248,22,92,23,196,2,28,28,248,22,148,7,248,22,80,23,195, +2,10,28,249,22,163,9,2,63,248,22,137,18,23,196,2,10,249,22,163,9, +2,64,248,22,137,18,23,196,2,28,27,248,22,101,194,28,248,22,154,15,23, +194,2,10,28,248,22,148,7,23,194,2,28,248,22,177,15,23,194,2,10,248, +22,178,15,23,194,1,11,27,248,22,87,248,22,103,195,28,192,192,248,22,159, +16,248,22,110,195,11,11,11,11,28,248,22,167,15,249,22,172,15,23,196,2, +23,198,2,27,248,22,67,248,22,158,15,23,198,1,250,22,155,2,23,198,2, +23,196,2,249,22,79,23,199,1,250,22,157,2,23,203,1,23,201,1,9,12, +250,22,155,2,23,197,1,23,198,1,249,22,79,23,198,1,23,201,1,28,28, +248,22,87,248,22,103,23,197,2,10,249,22,150,16,248,22,110,23,198,2,247, +22,166,8,27,248,22,182,15,249,22,180,15,248,22,101,23,200,2,23,198,1, +28,249,22,163,9,248,22,80,23,199,2,2,64,86,94,23,196,1,249,22,3, +20,20,94,88,163,8,36,37,53,11,9,224,3,2,33,130,2,23,196,1,248, +22,185,15,23,196,1,28,249,22,163,9,248,22,137,18,23,199,2,2,63,86, +94,23,196,1,86,94,28,250,22,157,2,23,197,2,11,11,12,250,22,155,2, +23,197,2,11,9,249,22,161,2,23,196,2,20,20,95,88,163,8,36,38,50, +11,9,224,3,2,33,131,2,23,195,1,23,196,1,27,248,22,67,248,22,137, +18,23,199,1,250,22,155,2,23,198,2,23,196,2,249,22,79,248,22,128,2, +23,200,1,250,22,157,2,23,203,1,23,201,1,9,12,250,22,155,2,23,196, +1,23,197,1,248,22,94,23,199,1,27,28,28,23,194,2,248,22,161,9,248, +22,80,23,196,2,10,9,27,249,22,183,5,23,198,2,66,98,105,110,97,114, +121,250,22,46,22,37,88,163,8,36,36,44,11,9,223,3,33,127,20,20,94, +88,163,36,36,43,11,9,223,3,33,128,2,23,196,1,86,94,28,28,248,22, +88,23,194,2,249,22,4,32,0,88,163,8,36,37,45,11,9,222,33,129,2, +23,195,2,11,12,248,22,168,11,6,18,18,105,108,108,45,102,111,114,109,101, +100,32,99,111,110,116,101,110,116,27,247,22,137,2,27,90,159,39,11,89,161, +39,36,11,248,22,175,15,23,201,2,192,86,96,249,22,3,20,20,94,88,163, +8,36,37,54,11,9,224,2,3,33,132,2,23,195,1,23,197,1,249,22,161, +2,195,88,163,8,36,38,48,11,9,223,3,33,133,2,250,22,155,2,80,159, +44,59,38,23,200,1,249,22,79,23,201,1,198,193,20,13,159,80,159,37,8, +26,37,250,80,159,40,8,40,39,23,198,2,23,196,2,11,27,250,22,157,2, +80,159,41,59,38,23,197,2,21,158,11,17,0,0,27,248,22,80,23,195,2, +27,249,80,159,42,8,25,39,23,198,2,23,196,2,28,249,22,165,9,23,195, +2,23,196,1,248,22,81,195,86,94,23,195,1,20,13,159,80,159,40,8,26, +37,250,80,159,43,8,40,39,23,201,1,23,199,2,23,196,2,27,20,20,95, +88,163,8,36,36,52,8,240,0,0,128,0,9,225,5,4,1,33,134,2,23, +194,1,23,197,1,28,28,248,22,0,23,194,2,249,22,50,23,195,2,36,11, +20,13,159,80,159,41,43,37,26,29,80,159,8,34,44,37,249,22,33,11,80, +159,8,36,43,37,22,188,14,10,22,189,14,10,22,190,14,10,22,129,15,10, +22,128,15,11,22,130,15,10,22,191,14,10,22,131,15,10,22,132,15,10,22, +133,15,10,22,134,15,10,22,135,15,11,22,136,15,10,22,186,14,11,247,23, +193,1,250,22,172,11,2,8,2,51,23,196,1,248,22,8,20,20,94,88,163, +36,37,8,43,16,4,8,128,6,8,128,26,8,128,4,36,9,224,1,2,33, +135,2,23,195,1,0,7,35,114,120,34,47,43,34,28,248,22,148,7,23,195, +2,27,249,22,148,16,2,137,2,23,197,2,28,23,193,2,28,249,22,189,3, +248,22,100,23,196,2,248,22,179,3,248,22,151,7,23,199,2,249,22,7,250, +22,170,7,23,200,1,36,248,22,100,23,199,1,23,198,1,249,22,7,250,22, +170,7,23,200,2,36,248,22,100,23,199,2,249,22,79,249,22,170,7,23,201, +1,248,22,102,23,200,1,23,200,1,249,22,7,23,197,1,23,198,1,90,159, +39,11,89,161,39,36,11,248,22,175,15,23,198,1,86,94,23,195,1,28,249, +22,163,9,23,195,2,2,48,86,94,23,193,1,249,22,7,23,196,1,23,200, +1,27,249,22,79,23,197,1,23,201,1,28,248,22,148,7,23,195,2,27,249, +22,148,16,2,137,2,23,197,2,28,23,193,2,28,249,22,189,3,248,22,100, +23,196,2,248,22,179,3,248,22,151,7,23,199,2,249,22,7,250,22,170,7, +23,200,1,36,248,22,100,23,199,1,23,196,1,249,22,7,250,22,170,7,23, +200,2,36,248,22,100,23,199,2,249,22,79,249,22,170,7,23,201,1,248,22, +102,23,200,1,23,198,1,249,22,7,23,197,1,23,196,1,90,159,39,11,89, +161,39,36,11,248,22,175,15,23,198,1,86,94,23,195,1,28,249,22,163,9, +23,195,2,2,48,86,94,23,193,1,249,22,7,23,196,1,23,198,1,249,80, +159,45,8,29,39,194,249,22,79,197,199,28,248,22,87,23,196,2,9,28,248, +22,80,23,196,2,28,248,22,148,2,248,22,137,18,23,197,2,250,22,93,249, +22,2,22,128,2,250,22,157,2,248,22,137,18,23,204,2,23,202,2,9,250, +22,157,2,248,22,137,18,23,202,2,11,9,27,248,22,138,18,23,200,1,28, +248,22,87,23,194,2,9,28,248,22,80,23,194,2,28,248,22,148,2,248,22, +137,18,23,195,2,250,22,93,249,22,2,22,128,2,250,22,157,2,248,22,137, +18,23,202,2,23,206,2,9,250,22,157,2,248,22,137,18,23,200,2,11,9, +249,80,159,45,8,41,39,23,203,1,248,22,138,18,23,199,1,27,248,80,159, +42,8,28,39,248,22,137,18,23,196,2,250,22,93,250,22,157,2,23,199,2, +23,205,2,9,250,22,157,2,23,199,1,11,9,249,80,159,46,8,41,39,23, +204,1,248,22,138,18,23,200,1,249,22,93,247,22,134,16,249,80,159,44,8, +41,39,23,202,1,248,22,138,18,23,198,1,27,248,80,159,38,8,28,39,248, +22,137,18,23,198,2,250,22,93,250,22,157,2,23,199,2,23,201,2,9,250, +22,157,2,23,199,1,11,9,27,248,22,138,18,23,201,1,28,248,22,87,23, +194,2,9,28,248,22,80,23,194,2,28,248,22,148,2,248,22,137,18,23,195, +2,250,22,93,249,22,2,22,128,2,250,22,157,2,248,22,137,18,23,202,2, +23,207,2,9,250,22,157,2,248,22,137,18,23,200,2,11,9,249,80,159,46, +8,41,39,23,204,1,248,22,138,18,23,199,1,27,248,80,159,43,8,28,39, +248,22,137,18,23,196,2,250,22,93,250,22,157,2,23,199,2,23,206,2,9, +250,22,157,2,23,199,1,11,9,249,80,159,47,8,41,39,23,205,1,248,22, +138,18,23,200,1,249,22,93,247,22,134,16,249,80,159,45,8,41,39,23,203, +1,248,22,138,18,23,198,1,249,22,93,247,22,134,16,27,248,22,138,18,23, +199,1,28,248,22,87,23,194,2,9,28,248,22,80,23,194,2,28,248,22,148, +2,248,22,137,18,23,195,2,250,22,93,249,22,2,22,128,2,250,22,157,2, +248,22,137,18,23,202,2,23,205,2,9,250,22,157,2,248,22,137,18,23,200, +2,11,9,249,80,159,44,8,41,39,23,202,1,248,22,138,18,23,199,1,27, +248,80,159,41,8,28,39,248,22,137,18,23,196,2,250,22,93,250,22,157,2, +23,199,2,23,204,2,9,250,22,157,2,23,199,1,11,9,249,80,159,45,8, +41,39,23,203,1,248,22,138,18,23,200,1,249,22,93,247,22,134,16,249,80, +159,43,8,41,39,23,201,1,248,22,138,18,23,198,1,32,140,2,88,163,36, +43,8,31,11,65,99,108,111,111,112,222,33,149,2,32,141,2,88,163,8,36, +37,47,11,2,49,222,33,144,2,32,142,2,88,163,36,37,43,11,69,116,111, +45,115,116,114,105,110,103,222,33,143,2,28,248,22,154,15,23,194,2,248,22, 158,15,23,194,1,192,28,248,22,87,248,22,81,23,195,2,248,22,89,248,2, -148,2,248,22,136,18,23,196,1,250,22,90,248,2,148,2,248,22,136,18,23, -198,2,2,72,248,2,147,2,248,22,137,18,23,198,1,250,22,132,8,6,7, +142,2,248,22,137,18,23,196,1,250,22,90,248,2,142,2,248,22,137,18,23, +198,2,2,66,248,2,141,2,248,22,138,18,23,198,1,250,22,132,8,6,7, 7,10,32,126,97,32,126,97,6,1,1,32,23,196,1,249,22,132,8,6,6, -6,10,32,32,32,126,97,248,22,131,2,23,196,1,32,153,2,88,163,36,38, -48,11,66,102,105,108,116,101,114,222,33,154,2,28,248,22,87,23,195,2,9, -28,248,23,194,2,248,22,80,23,196,2,249,22,79,248,22,136,18,23,197,2, -249,2,153,2,23,197,1,248,22,137,18,23,199,1,249,2,153,2,23,195,1, -248,22,137,18,23,197,1,28,248,22,87,23,199,2,86,94,23,198,1,28,23, +6,10,32,32,32,126,97,248,22,131,2,23,196,1,32,147,2,88,163,36,38, +48,11,66,102,105,108,116,101,114,222,33,148,2,28,248,22,87,23,195,2,9, +28,248,23,194,2,248,22,80,23,196,2,249,22,79,248,22,137,18,23,197,2, +249,2,147,2,23,197,1,248,22,138,18,23,199,1,249,2,147,2,23,195,1, +248,22,138,18,23,197,1,28,248,22,87,23,199,2,86,94,23,198,1,28,23, 199,2,86,97,23,196,1,23,195,1,23,194,1,23,193,1,28,23,197,2,249, -22,172,15,23,201,1,23,199,1,198,27,28,248,22,87,23,197,2,2,71,249, -22,1,22,171,7,248,2,147,2,23,199,2,248,23,198,1,251,22,132,8,6, +22,172,15,23,201,1,23,199,1,198,27,28,248,22,87,23,197,2,2,65,249, +22,1,22,171,7,248,2,141,2,23,199,2,248,23,198,1,251,22,132,8,6, 70,70,99,111,108,108,101,99,116,105,111,110,32,110,111,116,32,102,111,117,110, 100,10,32,32,99,111,108,108,101,99,116,105,111,110,58,32,126,115,10,32,32, 105,110,32,99,111,108,108,101,99,116,105,111,110,32,100,105,114,101,99,116,111, -114,105,101,115,58,126,97,126,97,28,248,22,87,23,202,1,248,2,148,2,23, -201,1,250,22,171,7,248,2,148,2,23,204,1,2,72,23,201,2,249,22,1, -22,171,7,249,22,2,32,0,88,163,8,36,37,45,11,9,222,33,151,2,27, +114,105,101,115,58,126,97,126,97,28,248,22,87,23,202,1,248,2,142,2,23, +201,1,250,22,171,7,248,2,142,2,23,204,1,2,66,23,201,2,249,22,1, +22,171,7,249,22,2,32,0,88,163,8,36,37,45,11,9,222,33,145,2,27, 248,22,92,23,205,2,27,248,22,92,247,22,134,16,28,249,22,190,3,249,22, 181,3,23,198,2,23,197,2,41,23,205,2,249,22,93,247,22,134,16,248,22, 89,249,22,132,8,6,50,50,46,46,46,32,91,126,97,32,97,100,100,105,116, @@ -615,8 +619,8 @@ 49,10,32,32,32,115,117,98,45,99,111,108,108,101,99,116,105,111,110,58,32, 126,115,10,32,32,105,110,32,112,97,114,101,110,116,32,100,105,114,101,99,116, 111,114,105,101,115,58,126,97,23,201,1,249,22,1,22,171,7,249,22,2,32, -0,88,163,8,36,37,45,11,9,222,33,152,2,249,2,153,2,22,130,2,23, -208,1,86,95,23,199,1,23,198,1,2,71,27,248,22,80,23,200,2,27,28, +0,88,163,8,36,37,45,11,9,222,33,146,2,249,2,147,2,22,130,2,23, +208,1,86,95,23,199,1,23,198,1,2,65,27,248,22,80,23,200,2,27,28, 248,22,154,15,23,195,2,249,22,172,15,23,196,1,23,198,2,248,22,131,2, 23,195,1,28,28,248,22,154,15,248,22,80,23,202,2,248,22,167,15,23,194, 2,10,27,250,22,1,22,172,15,23,197,1,23,201,2,28,28,248,22,87,23, @@ -628,361 +632,352 @@ 1,36,249,22,181,3,23,201,4,40,6,3,3,46,115,115,86,94,23,195,1, 11,11,28,23,193,2,248,22,166,15,249,22,172,15,23,199,2,23,196,1,11, 2,86,99,23,202,1,23,201,1,23,199,1,23,198,1,23,197,1,23,196,1, -28,23,200,2,249,22,172,15,23,195,1,23,202,1,192,254,2,146,2,202,203, +28,23,200,2,249,22,172,15,23,195,1,23,202,1,192,254,2,140,2,202,203, 204,205,206,248,22,81,23,16,28,23,16,23,16,199,28,23,200,2,249,22,172, -15,23,195,1,23,202,1,192,254,2,146,2,202,203,204,205,206,248,22,81,23, -16,23,16,254,2,146,2,201,202,203,204,205,248,22,81,23,15,23,15,90,159, -38,11,89,161,38,36,11,249,80,159,40,8,35,39,23,199,1,23,200,1,27, -248,22,67,28,248,22,154,15,195,248,22,158,15,195,194,27,247,22,138,16,27, -250,22,93,28,23,197,2,28,247,22,137,16,28,80,159,44,8,25,38,248,22, -93,27,249,80,159,48,8,34,39,10,36,249,22,93,250,22,157,2,23,198,2, -23,205,2,9,250,22,157,2,23,198,1,11,9,9,9,9,28,23,197,1,28, -249,22,129,4,36,248,22,182,8,80,159,47,8,24,38,86,94,23,198,1,9, -27,249,80,159,47,8,34,39,11,36,250,22,93,250,22,157,2,23,199,2,23, -205,2,9,250,22,157,2,23,199,1,11,9,28,249,22,129,4,37,248,22,182, -8,80,159,51,8,24,38,9,27,249,80,159,51,8,34,39,11,37,250,22,93, -250,22,157,2,23,199,2,23,209,2,9,250,22,157,2,23,199,1,11,9,28, -249,22,129,4,38,248,22,182,8,80,159,55,8,24,38,9,27,249,80,159,55, -8,34,39,11,38,250,22,93,250,22,157,2,23,199,2,23,213,2,9,250,22, -157,2,23,199,1,11,9,249,80,159,58,8,46,39,23,212,1,39,9,247,22, -134,16,254,2,146,2,199,202,203,205,23,16,199,11,86,95,28,28,248,22,155, -15,23,194,2,10,28,248,22,154,15,23,194,2,10,28,248,22,148,7,23,194, -2,28,248,22,177,15,23,194,2,10,248,22,178,15,23,194,2,11,12,252,22, -172,11,23,200,2,2,46,36,23,198,2,23,199,2,28,28,248,22,148,7,23, -195,2,10,248,22,137,8,23,195,2,86,94,23,194,1,12,252,22,172,11,23, -200,2,2,73,37,23,198,2,23,199,1,90,159,39,11,89,161,39,36,11,248, -22,175,15,23,197,2,86,94,23,195,1,86,94,28,23,193,2,86,95,23,198, -1,23,196,1,12,250,22,175,11,23,201,1,2,74,23,199,1,249,22,7,23, -195,1,23,196,1,32,158,2,88,163,36,42,8,24,11,2,54,222,33,159,2, -28,248,22,130,4,23,199,2,86,95,23,198,1,23,194,1,19,248,22,142,8, -23,195,2,19,248,22,142,8,23,196,2,249,22,164,15,251,22,149,8,250,22, -148,8,23,204,2,36,23,203,4,2,55,249,23,205,1,23,203,1,23,201,4, -28,248,22,148,7,23,206,2,249,22,163,8,23,207,1,8,63,23,205,1,28, -248,22,155,15,23,201,2,248,22,156,15,23,201,1,86,94,23,200,1,247,22, -157,15,2,2,27,248,22,179,3,23,200,1,28,249,22,163,9,8,46,249,22, -143,8,23,198,2,23,197,2,27,248,22,178,3,23,195,2,249,22,164,15,251, -22,149,8,250,22,148,8,23,204,2,36,23,203,1,23,202,1,249,23,205,1, -23,203,1,23,201,1,28,248,22,148,7,23,206,2,249,22,163,8,23,207,1, -8,63,23,205,1,28,248,22,155,15,23,201,2,248,22,156,15,23,201,1,86, -94,23,200,1,247,22,157,15,28,248,22,130,4,23,194,2,86,95,23,195,1, -23,193,1,19,248,22,142,8,23,196,2,19,248,22,142,8,23,197,2,249,22, -164,15,251,22,149,8,250,22,148,8,23,205,2,36,23,203,4,2,55,249,23, -206,1,23,204,1,23,201,4,28,248,22,148,7,23,207,2,249,22,163,8,23, -208,1,8,63,23,206,1,28,248,22,155,15,23,202,2,248,22,156,15,23,202, -1,86,94,23,201,1,247,22,157,15,2,2,27,248,22,179,3,23,195,1,28, -249,22,163,9,8,46,249,22,143,8,23,199,2,23,197,2,27,248,22,178,3, -23,195,2,249,22,164,15,251,22,149,8,250,22,148,8,23,205,2,36,23,203, -1,23,203,1,249,23,206,1,23,204,1,23,201,1,28,248,22,148,7,23,207, -2,249,22,163,8,23,208,1,8,63,23,206,1,28,248,22,155,15,23,202,2, -248,22,156,15,23,202,1,86,94,23,201,1,247,22,157,15,28,248,22,130,4, -23,194,2,86,95,23,196,1,23,193,1,19,248,22,142,8,23,197,2,19,248, -22,142,8,23,198,2,249,22,164,15,251,22,149,8,250,22,148,8,23,206,2, -36,23,203,4,2,55,249,23,207,1,23,205,1,23,201,4,28,248,22,148,7, -23,208,2,249,22,163,8,23,209,1,8,63,23,207,1,28,248,22,155,15,23, -203,2,248,22,156,15,23,203,1,86,94,23,202,1,247,22,157,15,2,2,27, -248,22,179,3,23,195,1,28,249,22,163,9,8,46,249,22,143,8,23,200,2, -23,197,2,27,248,22,178,3,23,195,2,249,22,164,15,251,22,149,8,250,22, -148,8,23,206,2,36,23,203,1,23,204,1,249,23,207,1,23,205,1,23,201, -1,28,248,22,148,7,23,208,2,249,22,163,8,23,209,1,8,63,23,207,1, -28,248,22,155,15,23,203,2,248,22,156,15,23,203,1,86,94,23,202,1,247, -22,157,15,253,2,158,2,201,202,203,204,205,198,90,159,38,11,89,161,38,36, -11,86,95,28,28,248,22,155,15,23,199,2,10,28,248,22,154,15,23,199,2, -10,28,248,22,148,7,23,199,2,28,248,22,177,15,23,199,2,10,248,22,178, -15,23,199,2,11,12,252,22,172,11,23,200,2,2,46,36,23,203,2,23,204, -2,28,28,248,22,148,7,23,200,2,10,248,22,137,8,23,200,2,12,252,22, -172,11,23,200,2,2,73,37,23,203,2,23,204,2,90,159,39,11,89,161,39, -36,11,248,22,175,15,23,202,2,86,94,23,195,1,86,94,28,192,12,250,22, -175,11,23,201,1,2,74,23,204,2,249,22,7,194,195,27,248,22,160,15,23, -196,1,27,19,248,22,142,8,23,196,2,28,248,22,130,4,23,194,4,86,94, -23,199,1,19,248,22,142,8,23,197,2,19,248,22,142,8,23,198,2,249,22, -164,15,251,22,149,8,250,22,148,8,23,206,2,36,23,203,4,2,55,249,23, -210,1,23,205,1,23,201,4,28,248,22,148,7,23,211,2,249,22,163,8,23, -212,1,8,63,23,210,1,28,248,22,155,15,23,206,2,248,22,156,15,23,206, -1,86,94,23,205,1,247,22,157,15,2,2,27,248,22,179,3,23,195,4,28, -249,22,163,9,8,46,249,22,143,8,23,200,2,23,197,2,27,248,22,178,3, -23,195,2,249,22,164,15,251,22,149,8,250,22,148,8,23,206,2,36,23,203, -1,23,207,1,249,23,210,1,23,205,1,23,201,1,28,248,22,148,7,23,211, -2,249,22,163,8,23,212,1,8,63,23,210,1,28,248,22,155,15,23,206,2, -248,22,156,15,23,206,1,86,94,23,205,1,247,22,157,15,28,248,22,130,4, -23,194,2,86,95,23,200,1,23,193,1,19,248,22,142,8,23,198,2,19,248, -22,142,8,23,199,2,249,22,164,15,251,22,149,8,250,22,148,8,23,207,2, -36,23,203,4,2,55,249,23,211,1,23,206,1,23,201,4,28,248,22,148,7, -23,212,2,249,22,163,8,23,213,1,8,63,23,211,1,28,248,22,155,15,23, -207,2,248,22,156,15,23,207,1,86,94,23,206,1,247,22,157,15,2,2,27, -248,22,179,3,23,195,1,28,249,22,163,9,8,46,249,22,143,8,23,201,2, -23,197,2,27,248,22,178,3,23,195,2,249,22,164,15,251,22,149,8,250,22, -148,8,23,207,2,36,23,203,1,23,208,1,249,23,211,1,23,206,1,23,201, -1,28,248,22,148,7,23,212,2,249,22,163,8,23,213,1,8,63,23,211,1, -28,248,22,155,15,23,207,2,248,22,156,15,23,207,1,86,94,23,206,1,247, -22,157,15,253,2,158,2,23,203,1,23,207,1,23,208,1,23,209,1,23,210, -1,23,199,1,2,28,248,22,154,15,23,196,2,249,22,172,15,23,197,1,23, -195,1,192,32,161,2,88,163,36,40,57,11,2,54,222,33,162,2,28,248,22, -130,4,23,197,2,86,94,23,196,1,19,248,22,142,8,23,195,2,35,248,22, -142,8,23,196,2,249,22,164,15,251,22,149,8,250,22,148,8,23,204,1,36, -23,203,4,2,55,2,55,28,248,22,148,7,23,204,2,249,22,163,8,23,205, -1,8,63,23,203,1,28,248,22,155,15,23,199,2,248,22,156,15,23,199,1, -86,94,23,198,1,247,22,157,15,2,27,248,22,179,3,23,198,1,28,249,22, -163,9,8,46,249,22,143,8,23,198,2,23,197,2,35,248,22,178,3,23,195, -2,249,22,164,15,251,22,149,8,250,22,148,8,23,204,1,36,23,203,1,2, -55,2,55,28,248,22,148,7,23,204,2,249,22,163,8,23,205,1,8,63,23, -203,1,28,248,22,155,15,23,199,2,248,22,156,15,23,199,1,86,94,23,198, -1,247,22,157,15,28,248,22,130,4,23,194,2,86,94,23,193,1,19,248,22, -142,8,23,196,2,35,248,22,142,8,23,197,2,249,22,164,15,251,22,149,8, -250,22,148,8,23,205,1,36,23,203,4,2,55,2,55,28,248,22,148,7,23, -205,2,249,22,163,8,23,206,1,8,63,23,204,1,28,248,22,155,15,23,200, -2,248,22,156,15,23,200,1,86,94,23,199,1,247,22,157,15,2,27,248,22, -179,3,23,195,1,28,249,22,163,9,8,46,249,22,143,8,23,199,2,23,197, -2,35,248,22,178,3,23,195,2,249,22,164,15,251,22,149,8,250,22,148,8, -23,205,1,36,23,203,1,2,55,2,55,28,248,22,148,7,23,205,2,249,22, -163,8,23,206,1,8,63,23,204,1,28,248,22,155,15,23,200,2,248,22,156, -15,23,200,1,86,94,23,199,1,247,22,157,15,251,2,161,2,198,199,200,196, -90,159,38,11,89,161,38,36,11,86,95,28,28,248,22,155,15,23,196,2,10, -28,248,22,154,15,23,196,2,10,28,248,22,148,7,23,196,2,28,248,22,177, -15,23,196,2,10,248,22,178,15,23,196,2,11,12,252,22,172,11,2,40,2, -46,36,23,200,2,23,201,2,28,28,248,22,148,7,23,197,2,10,248,22,137, -8,23,197,2,12,252,22,172,11,2,40,2,73,37,23,200,2,23,201,2,90, -159,39,11,89,161,39,36,11,248,22,175,15,23,199,2,86,94,23,195,1,86, -94,28,192,12,250,22,175,11,2,40,2,74,23,201,2,249,22,7,194,195,27, -248,22,160,15,23,196,1,27,251,2,161,2,23,198,2,23,201,1,23,202,1, -248,22,142,8,23,199,1,28,248,22,154,15,23,196,2,249,22,172,15,23,197, -1,23,195,1,192,2,55,252,80,158,41,8,37,2,40,2,55,32,0,88,163, -8,36,38,43,11,9,222,33,164,2,198,199,32,166,2,88,163,36,40,57,11, -2,54,222,33,167,2,28,248,22,130,4,23,197,2,86,94,23,196,1,19,248, -22,142,8,23,195,2,19,248,22,142,8,23,196,2,249,22,164,15,251,22,149, -8,250,22,148,8,23,204,2,36,23,203,4,2,55,249,22,148,8,23,203,1, -23,201,4,28,248,22,148,7,23,204,2,249,22,163,8,23,205,1,8,63,23, -203,1,28,248,22,155,15,23,199,2,248,22,156,15,23,199,1,86,94,23,198, -1,247,22,157,15,2,2,27,248,22,179,3,23,198,1,28,249,22,163,9,8, -46,249,22,143,8,23,198,2,23,197,2,27,248,22,178,3,23,195,2,249,22, -164,15,251,22,149,8,250,22,148,8,23,204,2,36,23,203,1,2,75,249,22, -148,8,23,203,1,23,201,1,28,248,22,148,7,23,204,2,249,22,163,8,23, -205,1,8,63,23,203,1,28,248,22,155,15,23,199,2,248,22,156,15,23,199, -1,86,94,23,198,1,247,22,157,15,28,248,22,130,4,23,194,2,86,94,23, -193,1,19,248,22,142,8,23,196,2,19,248,22,142,8,23,197,2,249,22,164, -15,251,22,149,8,250,22,148,8,23,205,2,36,23,203,4,2,55,249,22,148, -8,23,204,1,23,201,4,28,248,22,148,7,23,205,2,249,22,163,8,23,206, -1,8,63,23,204,1,28,248,22,155,15,23,200,2,248,22,156,15,23,200,1, -86,94,23,199,1,247,22,157,15,2,2,27,248,22,179,3,23,195,1,28,249, -22,163,9,8,46,249,22,143,8,23,199,2,23,197,2,27,248,22,178,3,23, -195,2,249,22,164,15,251,22,149,8,250,22,148,8,23,205,2,36,23,203,1, -2,75,249,22,148,8,23,204,1,23,201,1,28,248,22,148,7,23,205,2,249, -22,163,8,23,206,1,8,63,23,204,1,28,248,22,155,15,23,200,2,248,22, -156,15,23,200,1,86,94,23,199,1,247,22,157,15,251,2,166,2,198,199,200, -196,90,159,38,11,89,161,38,36,11,86,95,28,28,248,22,155,15,23,196,2, -10,28,248,22,154,15,23,196,2,10,28,248,22,148,7,23,196,2,28,248,22, -177,15,23,196,2,10,248,22,178,15,23,196,2,11,12,252,22,172,11,2,40, -2,46,36,23,200,2,23,201,2,28,28,248,22,148,7,23,197,2,10,248,22, -137,8,23,197,2,12,252,22,172,11,2,40,2,73,37,23,200,2,23,201,2, -90,159,39,11,89,161,39,36,11,248,22,175,15,23,199,2,86,94,23,195,1, -86,94,28,192,12,250,22,175,11,2,40,2,74,23,201,2,249,22,7,194,195, -27,248,22,160,15,23,196,1,27,251,2,166,2,23,198,2,23,201,1,23,202, -1,248,22,142,8,23,199,1,28,248,22,154,15,23,196,2,249,22,172,15,23, -197,1,23,195,1,192,252,80,158,41,8,37,2,40,2,75,22,148,8,198,199, -249,247,22,172,5,23,195,1,11,249,247,22,172,5,194,11,28,248,22,87,23, -195,2,9,27,27,248,22,80,23,197,2,28,248,22,179,15,23,194,2,192,28, -248,22,178,15,23,194,2,249,22,180,15,23,195,1,249,22,180,15,250,80,159, -45,40,39,248,22,131,16,2,61,11,10,248,22,131,16,2,60,250,80,159,41, -40,39,248,22,131,16,2,61,23,196,1,10,28,23,193,2,249,22,79,248,22, -182,15,249,22,180,15,23,198,1,247,22,132,16,27,248,22,81,23,199,1,28, -248,22,87,23,194,2,9,27,248,80,159,42,56,39,248,22,80,23,196,2,28, -23,193,2,249,22,79,248,22,182,15,249,22,180,15,23,198,1,247,22,132,16, -248,80,159,44,8,47,39,248,22,81,23,198,1,86,94,23,193,1,248,80,159, -42,8,47,39,248,22,81,23,196,1,86,94,23,193,1,27,248,22,81,23,197, -1,28,248,22,87,23,194,2,9,27,248,80,159,40,56,39,248,22,80,23,196, -2,28,23,193,2,249,22,79,248,22,182,15,249,22,180,15,23,198,1,247,22, -132,16,248,80,159,42,8,47,39,248,22,81,23,198,1,86,94,23,193,1,248, -80,159,40,8,47,39,248,22,81,23,196,1,28,248,22,87,23,195,2,9,27, -27,248,22,80,23,197,2,28,248,22,179,15,23,194,2,192,28,248,22,178,15, -23,194,2,249,22,180,15,23,195,1,249,22,180,15,250,80,159,45,40,39,248, -22,131,16,2,61,11,10,248,22,131,16,2,60,250,80,159,41,40,39,248,22, -131,16,2,61,23,196,1,10,28,23,193,2,249,22,79,248,22,182,15,249,22, -180,15,23,198,1,247,22,132,16,27,248,22,81,23,199,1,28,248,22,87,23, +15,23,195,1,23,202,1,192,254,2,140,2,202,203,204,205,206,248,22,81,23, +16,23,16,254,2,140,2,201,202,203,204,205,248,22,81,23,15,23,15,90,159, +38,11,89,161,38,36,11,249,80,159,40,8,29,39,23,199,1,23,200,1,27, +248,22,67,28,248,22,154,15,195,248,22,158,15,195,194,27,27,247,22,135,16, +28,248,22,87,23,194,2,9,28,248,22,80,23,194,2,28,248,22,148,2,248, +22,137,18,23,195,2,250,22,93,249,22,2,22,128,2,250,22,157,2,248,22, +137,18,23,202,2,23,203,2,9,250,22,157,2,248,22,137,18,23,200,2,11, +9,249,80,159,46,8,41,39,23,200,1,248,22,138,18,23,199,1,27,248,80, +159,43,8,28,39,248,22,137,18,23,196,2,250,22,93,250,22,157,2,23,199, +2,23,202,2,9,250,22,157,2,23,199,1,11,9,249,80,159,47,8,41,39, +23,201,1,248,22,138,18,23,200,1,249,22,93,247,22,134,16,249,80,159,45, +8,41,39,23,199,1,248,22,138,18,23,198,1,254,2,140,2,199,201,202,204, +23,15,199,11,86,95,28,28,248,22,155,15,23,194,2,10,28,248,22,154,15, +23,194,2,10,28,248,22,148,7,23,194,2,28,248,22,177,15,23,194,2,10, +248,22,178,15,23,194,2,11,12,252,22,172,11,23,200,2,2,41,36,23,198, +2,23,199,2,28,28,248,22,148,7,23,195,2,10,248,22,137,8,23,195,2, +86,94,23,194,1,12,252,22,172,11,23,200,2,2,67,37,23,198,2,23,199, +1,90,159,39,11,89,161,39,36,11,248,22,175,15,23,197,2,86,94,23,195, +1,86,94,28,23,193,2,86,95,23,198,1,23,196,1,12,250,22,175,11,23, +201,1,2,68,23,199,1,249,22,7,23,195,1,23,196,1,32,152,2,88,163, +36,42,8,24,11,2,49,222,33,153,2,28,248,22,130,4,23,199,2,86,95, +23,198,1,23,194,1,19,248,22,142,8,23,195,2,19,248,22,142,8,23,196, +2,249,22,164,15,251,22,149,8,250,22,148,8,23,204,2,36,23,203,4,2, +50,249,23,205,1,23,203,1,23,201,4,28,248,22,148,7,23,206,2,249,22, +163,8,23,207,1,8,63,23,205,1,28,248,22,155,15,23,201,2,248,22,156, +15,23,201,1,86,94,23,200,1,247,22,157,15,2,2,27,248,22,179,3,23, +200,1,28,249,22,163,9,8,46,249,22,143,8,23,198,2,23,197,2,27,248, +22,178,3,23,195,2,249,22,164,15,251,22,149,8,250,22,148,8,23,204,2, +36,23,203,1,23,202,1,249,23,205,1,23,203,1,23,201,1,28,248,22,148, +7,23,206,2,249,22,163,8,23,207,1,8,63,23,205,1,28,248,22,155,15, +23,201,2,248,22,156,15,23,201,1,86,94,23,200,1,247,22,157,15,28,248, +22,130,4,23,194,2,86,95,23,195,1,23,193,1,19,248,22,142,8,23,196, +2,19,248,22,142,8,23,197,2,249,22,164,15,251,22,149,8,250,22,148,8, +23,205,2,36,23,203,4,2,50,249,23,206,1,23,204,1,23,201,4,28,248, +22,148,7,23,207,2,249,22,163,8,23,208,1,8,63,23,206,1,28,248,22, +155,15,23,202,2,248,22,156,15,23,202,1,86,94,23,201,1,247,22,157,15, +2,2,27,248,22,179,3,23,195,1,28,249,22,163,9,8,46,249,22,143,8, +23,199,2,23,197,2,27,248,22,178,3,23,195,2,249,22,164,15,251,22,149, +8,250,22,148,8,23,205,2,36,23,203,1,23,203,1,249,23,206,1,23,204, +1,23,201,1,28,248,22,148,7,23,207,2,249,22,163,8,23,208,1,8,63, +23,206,1,28,248,22,155,15,23,202,2,248,22,156,15,23,202,1,86,94,23, +201,1,247,22,157,15,28,248,22,130,4,23,194,2,86,95,23,196,1,23,193, +1,19,248,22,142,8,23,197,2,19,248,22,142,8,23,198,2,249,22,164,15, +251,22,149,8,250,22,148,8,23,206,2,36,23,203,4,2,50,249,23,207,1, +23,205,1,23,201,4,28,248,22,148,7,23,208,2,249,22,163,8,23,209,1, +8,63,23,207,1,28,248,22,155,15,23,203,2,248,22,156,15,23,203,1,86, +94,23,202,1,247,22,157,15,2,2,27,248,22,179,3,23,195,1,28,249,22, +163,9,8,46,249,22,143,8,23,200,2,23,197,2,27,248,22,178,3,23,195, +2,249,22,164,15,251,22,149,8,250,22,148,8,23,206,2,36,23,203,1,23, +204,1,249,23,207,1,23,205,1,23,201,1,28,248,22,148,7,23,208,2,249, +22,163,8,23,209,1,8,63,23,207,1,28,248,22,155,15,23,203,2,248,22, +156,15,23,203,1,86,94,23,202,1,247,22,157,15,253,2,152,2,201,202,203, +204,205,198,90,159,38,11,89,161,38,36,11,86,95,28,28,248,22,155,15,23, +199,2,10,28,248,22,154,15,23,199,2,10,28,248,22,148,7,23,199,2,28, +248,22,177,15,23,199,2,10,248,22,178,15,23,199,2,11,12,252,22,172,11, +23,200,2,2,41,36,23,203,2,23,204,2,28,28,248,22,148,7,23,200,2, +10,248,22,137,8,23,200,2,12,252,22,172,11,23,200,2,2,67,37,23,203, +2,23,204,2,90,159,39,11,89,161,39,36,11,248,22,175,15,23,202,2,86, +94,23,195,1,86,94,28,192,12,250,22,175,11,23,201,1,2,68,23,204,2, +249,22,7,194,195,27,248,22,160,15,23,196,1,27,19,248,22,142,8,23,196, +2,28,248,22,130,4,23,194,4,86,94,23,199,1,19,248,22,142,8,23,197, +2,19,248,22,142,8,23,198,2,249,22,164,15,251,22,149,8,250,22,148,8, +23,206,2,36,23,203,4,2,50,249,23,210,1,23,205,1,23,201,4,28,248, +22,148,7,23,211,2,249,22,163,8,23,212,1,8,63,23,210,1,28,248,22, +155,15,23,206,2,248,22,156,15,23,206,1,86,94,23,205,1,247,22,157,15, +2,2,27,248,22,179,3,23,195,4,28,249,22,163,9,8,46,249,22,143,8, +23,200,2,23,197,2,27,248,22,178,3,23,195,2,249,22,164,15,251,22,149, +8,250,22,148,8,23,206,2,36,23,203,1,23,207,1,249,23,210,1,23,205, +1,23,201,1,28,248,22,148,7,23,211,2,249,22,163,8,23,212,1,8,63, +23,210,1,28,248,22,155,15,23,206,2,248,22,156,15,23,206,1,86,94,23, +205,1,247,22,157,15,28,248,22,130,4,23,194,2,86,95,23,200,1,23,193, +1,19,248,22,142,8,23,198,2,19,248,22,142,8,23,199,2,249,22,164,15, +251,22,149,8,250,22,148,8,23,207,2,36,23,203,4,2,50,249,23,211,1, +23,206,1,23,201,4,28,248,22,148,7,23,212,2,249,22,163,8,23,213,1, +8,63,23,211,1,28,248,22,155,15,23,207,2,248,22,156,15,23,207,1,86, +94,23,206,1,247,22,157,15,2,2,27,248,22,179,3,23,195,1,28,249,22, +163,9,8,46,249,22,143,8,23,201,2,23,197,2,27,248,22,178,3,23,195, +2,249,22,164,15,251,22,149,8,250,22,148,8,23,207,2,36,23,203,1,23, +208,1,249,23,211,1,23,206,1,23,201,1,28,248,22,148,7,23,212,2,249, +22,163,8,23,213,1,8,63,23,211,1,28,248,22,155,15,23,207,2,248,22, +156,15,23,207,1,86,94,23,206,1,247,22,157,15,253,2,152,2,23,203,1, +23,207,1,23,208,1,23,209,1,23,210,1,23,199,1,2,28,248,22,154,15, +23,196,2,249,22,172,15,23,197,1,23,195,1,192,32,155,2,88,163,36,40, +57,11,2,49,222,33,156,2,28,248,22,130,4,23,197,2,86,94,23,196,1, +19,248,22,142,8,23,195,2,35,248,22,142,8,23,196,2,249,22,164,15,251, +22,149,8,250,22,148,8,23,204,1,36,23,203,4,2,50,2,50,28,248,22, +148,7,23,204,2,249,22,163,8,23,205,1,8,63,23,203,1,28,248,22,155, +15,23,199,2,248,22,156,15,23,199,1,86,94,23,198,1,247,22,157,15,2, +27,248,22,179,3,23,198,1,28,249,22,163,9,8,46,249,22,143,8,23,198, +2,23,197,2,35,248,22,178,3,23,195,2,249,22,164,15,251,22,149,8,250, +22,148,8,23,204,1,36,23,203,1,2,50,2,50,28,248,22,148,7,23,204, +2,249,22,163,8,23,205,1,8,63,23,203,1,28,248,22,155,15,23,199,2, +248,22,156,15,23,199,1,86,94,23,198,1,247,22,157,15,28,248,22,130,4, +23,194,2,86,94,23,193,1,19,248,22,142,8,23,196,2,35,248,22,142,8, +23,197,2,249,22,164,15,251,22,149,8,250,22,148,8,23,205,1,36,23,203, +4,2,50,2,50,28,248,22,148,7,23,205,2,249,22,163,8,23,206,1,8, +63,23,204,1,28,248,22,155,15,23,200,2,248,22,156,15,23,200,1,86,94, +23,199,1,247,22,157,15,2,27,248,22,179,3,23,195,1,28,249,22,163,9, +8,46,249,22,143,8,23,199,2,23,197,2,35,248,22,178,3,23,195,2,249, +22,164,15,251,22,149,8,250,22,148,8,23,205,1,36,23,203,1,2,50,2, +50,28,248,22,148,7,23,205,2,249,22,163,8,23,206,1,8,63,23,204,1, +28,248,22,155,15,23,200,2,248,22,156,15,23,200,1,86,94,23,199,1,247, +22,157,15,251,2,155,2,198,199,200,196,90,159,38,11,89,161,38,36,11,86, +95,28,28,248,22,155,15,23,196,2,10,28,248,22,154,15,23,196,2,10,28, +248,22,148,7,23,196,2,28,248,22,177,15,23,196,2,10,248,22,178,15,23, +196,2,11,12,252,22,172,11,2,35,2,41,36,23,200,2,23,201,2,28,28, +248,22,148,7,23,197,2,10,248,22,137,8,23,197,2,12,252,22,172,11,2, +35,2,67,37,23,200,2,23,201,2,90,159,39,11,89,161,39,36,11,248,22, +175,15,23,199,2,86,94,23,195,1,86,94,28,192,12,250,22,175,11,2,35, +2,68,23,201,2,249,22,7,194,195,27,248,22,160,15,23,196,1,27,251,2, +155,2,23,198,2,23,201,1,23,202,1,248,22,142,8,23,199,1,28,248,22, +154,15,23,196,2,249,22,172,15,23,197,1,23,195,1,192,2,50,252,80,158, +41,8,31,2,35,2,50,32,0,88,163,8,36,38,43,11,9,222,33,158,2, +198,199,32,160,2,88,163,36,40,57,11,2,49,222,33,161,2,28,248,22,130, +4,23,197,2,86,94,23,196,1,19,248,22,142,8,23,195,2,19,248,22,142, +8,23,196,2,249,22,164,15,251,22,149,8,250,22,148,8,23,204,2,36,23, +203,4,2,50,249,22,148,8,23,203,1,23,201,4,28,248,22,148,7,23,204, +2,249,22,163,8,23,205,1,8,63,23,203,1,28,248,22,155,15,23,199,2, +248,22,156,15,23,199,1,86,94,23,198,1,247,22,157,15,2,2,27,248,22, +179,3,23,198,1,28,249,22,163,9,8,46,249,22,143,8,23,198,2,23,197, +2,27,248,22,178,3,23,195,2,249,22,164,15,251,22,149,8,250,22,148,8, +23,204,2,36,23,203,1,2,69,249,22,148,8,23,203,1,23,201,1,28,248, +22,148,7,23,204,2,249,22,163,8,23,205,1,8,63,23,203,1,28,248,22, +155,15,23,199,2,248,22,156,15,23,199,1,86,94,23,198,1,247,22,157,15, +28,248,22,130,4,23,194,2,86,94,23,193,1,19,248,22,142,8,23,196,2, +19,248,22,142,8,23,197,2,249,22,164,15,251,22,149,8,250,22,148,8,23, +205,2,36,23,203,4,2,50,249,22,148,8,23,204,1,23,201,4,28,248,22, +148,7,23,205,2,249,22,163,8,23,206,1,8,63,23,204,1,28,248,22,155, +15,23,200,2,248,22,156,15,23,200,1,86,94,23,199,1,247,22,157,15,2, +2,27,248,22,179,3,23,195,1,28,249,22,163,9,8,46,249,22,143,8,23, +199,2,23,197,2,27,248,22,178,3,23,195,2,249,22,164,15,251,22,149,8, +250,22,148,8,23,205,2,36,23,203,1,2,69,249,22,148,8,23,204,1,23, +201,1,28,248,22,148,7,23,205,2,249,22,163,8,23,206,1,8,63,23,204, +1,28,248,22,155,15,23,200,2,248,22,156,15,23,200,1,86,94,23,199,1, +247,22,157,15,251,2,160,2,198,199,200,196,90,159,38,11,89,161,38,36,11, +86,95,28,28,248,22,155,15,23,196,2,10,28,248,22,154,15,23,196,2,10, +28,248,22,148,7,23,196,2,28,248,22,177,15,23,196,2,10,248,22,178,15, +23,196,2,11,12,252,22,172,11,2,35,2,41,36,23,200,2,23,201,2,28, +28,248,22,148,7,23,197,2,10,248,22,137,8,23,197,2,12,252,22,172,11, +2,35,2,67,37,23,200,2,23,201,2,90,159,39,11,89,161,39,36,11,248, +22,175,15,23,199,2,86,94,23,195,1,86,94,28,192,12,250,22,175,11,2, +35,2,68,23,201,2,249,22,7,194,195,27,248,22,160,15,23,196,1,27,251, +2,160,2,23,198,2,23,201,1,23,202,1,248,22,142,8,23,199,1,28,248, +22,154,15,23,196,2,249,22,172,15,23,197,1,23,195,1,192,252,80,158,41, +8,31,2,35,2,69,22,148,8,198,199,249,247,22,172,5,23,195,1,11,249, +247,22,172,5,194,11,28,248,22,87,23,195,2,9,27,27,248,22,80,23,197, +2,28,248,22,179,15,23,194,2,192,28,248,22,178,15,23,194,2,249,22,180, +15,23,195,1,249,22,180,15,250,80,159,45,40,39,248,22,131,16,2,56,11, +10,248,22,131,16,2,55,250,80,159,41,40,39,248,22,131,16,2,56,23,196, +1,10,28,23,193,2,249,22,79,248,22,182,15,249,22,180,15,23,198,1,247, +22,132,16,27,248,22,81,23,199,1,28,248,22,87,23,194,2,9,27,248,80, +159,42,56,39,248,22,80,23,196,2,28,23,193,2,249,22,79,248,22,182,15, +249,22,180,15,23,198,1,247,22,132,16,248,80,159,44,8,42,39,248,22,81, +23,198,1,86,94,23,193,1,248,80,159,42,8,42,39,248,22,81,23,196,1, +86,94,23,193,1,27,248,22,81,23,197,1,28,248,22,87,23,194,2,9,27, +248,80,159,40,56,39,248,22,80,23,196,2,28,23,193,2,249,22,79,248,22, +182,15,249,22,180,15,23,198,1,247,22,132,16,248,80,159,42,8,42,39,248, +22,81,23,198,1,86,94,23,193,1,248,80,159,40,8,42,39,248,22,81,23, +196,1,28,248,22,87,23,195,2,9,27,27,248,22,80,23,197,2,28,248,22, +179,15,23,194,2,192,28,248,22,178,15,23,194,2,249,22,180,15,23,195,1, +249,22,180,15,250,80,159,45,40,39,248,22,131,16,2,56,11,10,248,22,131, +16,2,55,250,80,159,41,40,39,248,22,131,16,2,56,23,196,1,10,28,23, +193,2,249,22,79,248,22,182,15,249,22,180,15,23,198,1,247,22,132,16,27, +248,22,81,23,199,1,28,248,22,87,23,194,2,9,27,248,80,159,42,56,39, +248,22,80,23,196,2,28,23,193,2,249,22,79,248,22,182,15,249,22,180,15, +23,198,1,247,22,132,16,248,80,159,44,8,43,39,248,22,81,23,198,1,86, +94,23,193,1,248,80,159,42,8,43,39,248,22,81,23,196,1,86,94,23,193, +1,27,248,22,81,23,197,1,28,248,22,87,23,194,2,9,27,248,80,159,40, +56,39,248,22,80,23,196,2,28,23,193,2,249,22,79,248,22,182,15,249,22, +180,15,23,198,1,247,22,132,16,248,80,159,42,8,43,39,248,22,81,23,198, +1,86,94,23,193,1,248,80,159,40,8,43,39,248,22,81,23,196,1,28,248, +22,87,23,195,2,9,27,27,248,22,80,23,197,2,28,248,22,179,15,23,194, +2,192,28,248,22,178,15,23,194,2,249,22,180,15,23,195,1,249,22,180,15, +250,80,159,45,40,39,248,22,131,16,2,56,11,10,248,22,131,16,2,55,250, +80,159,41,40,39,248,22,131,16,2,56,23,196,1,10,28,23,193,2,249,22, +79,248,22,182,15,249,22,180,15,23,198,1,247,22,132,16,27,248,22,81,23, +199,1,28,248,22,87,23,194,2,9,27,27,248,22,80,23,196,2,28,248,22, +179,15,23,194,2,192,28,248,22,178,15,23,194,2,249,22,180,15,23,195,1, +249,22,180,15,250,80,159,49,40,39,248,22,131,16,2,56,11,10,248,22,131, +16,2,55,250,80,159,45,40,39,248,22,131,16,2,56,23,196,1,10,28,23, +193,2,249,22,79,248,22,182,15,249,22,180,15,23,198,1,247,22,132,16,27, +248,22,81,23,198,1,28,248,22,87,23,194,2,9,27,248,80,159,46,56,39, +248,22,80,23,196,2,28,23,193,2,249,22,79,248,22,182,15,249,22,180,15, +23,198,1,247,22,132,16,248,80,159,48,8,44,39,248,22,81,23,198,1,86, +94,23,193,1,248,80,159,46,8,44,39,248,22,81,23,196,1,86,94,23,193, +1,27,248,22,81,23,196,1,28,248,22,87,23,194,2,9,27,248,80,159,44, +56,39,248,22,80,23,196,2,28,23,193,2,249,22,79,248,22,182,15,249,22, +180,15,23,198,1,247,22,132,16,248,80,159,46,8,44,39,248,22,81,23,198, +1,86,94,23,193,1,248,80,159,44,8,44,39,248,22,81,23,196,1,86,94, +23,193,1,27,248,22,81,23,197,1,28,248,22,87,23,194,2,9,27,27,248, +22,80,23,196,2,28,248,22,179,15,23,194,2,192,28,248,22,178,15,23,194, +2,249,22,180,15,23,195,1,249,22,180,15,250,80,159,47,40,39,248,22,131, +16,2,56,11,10,248,22,131,16,2,55,250,80,159,43,40,39,248,22,131,16, +2,56,23,196,1,10,28,23,193,2,249,22,79,248,22,182,15,249,22,180,15, +23,198,1,247,22,132,16,27,248,22,81,23,198,1,28,248,22,87,23,194,2, +9,27,248,80,159,44,56,39,248,22,80,23,196,2,28,23,193,2,249,22,79, +248,22,182,15,249,22,180,15,23,198,1,247,22,132,16,248,80,159,46,8,44, +39,248,22,81,23,198,1,86,94,23,193,1,248,80,159,44,8,44,39,248,22, +81,23,196,1,86,94,23,193,1,27,248,22,81,23,196,1,28,248,22,87,23, 194,2,9,27,248,80,159,42,56,39,248,22,80,23,196,2,28,23,193,2,249, 22,79,248,22,182,15,249,22,180,15,23,198,1,247,22,132,16,248,80,159,44, -8,48,39,248,22,81,23,198,1,86,94,23,193,1,248,80,159,42,8,48,39, -248,22,81,23,196,1,86,94,23,193,1,27,248,22,81,23,197,1,28,248,22, -87,23,194,2,9,27,248,80,159,40,56,39,248,22,80,23,196,2,28,23,193, -2,249,22,79,248,22,182,15,249,22,180,15,23,198,1,247,22,132,16,248,80, -159,42,8,48,39,248,22,81,23,198,1,86,94,23,193,1,248,80,159,40,8, -48,39,248,22,81,23,196,1,28,248,22,87,23,195,2,9,27,27,248,22,80, -23,197,2,28,248,22,179,15,23,194,2,192,28,248,22,178,15,23,194,2,249, -22,180,15,23,195,1,249,22,180,15,250,80,159,45,40,39,248,22,131,16,2, -61,11,10,248,22,131,16,2,60,250,80,159,41,40,39,248,22,131,16,2,61, -23,196,1,10,28,23,193,2,249,22,79,248,22,182,15,249,22,180,15,23,198, -1,247,22,132,16,27,248,22,81,23,199,1,28,248,22,87,23,194,2,9,27, -27,248,22,80,23,196,2,28,248,22,179,15,23,194,2,192,28,248,22,178,15, -23,194,2,249,22,180,15,23,195,1,249,22,180,15,250,80,159,49,40,39,248, -22,131,16,2,61,11,10,248,22,131,16,2,60,250,80,159,45,40,39,248,22, -131,16,2,61,23,196,1,10,28,23,193,2,249,22,79,248,22,182,15,249,22, -180,15,23,198,1,247,22,132,16,27,248,22,81,23,198,1,28,248,22,87,23, -194,2,9,27,248,80,159,46,56,39,248,22,80,23,196,2,28,23,193,2,249, -22,79,248,22,182,15,249,22,180,15,23,198,1,247,22,132,16,248,80,159,48, -8,49,39,248,22,81,23,198,1,86,94,23,193,1,248,80,159,46,8,49,39, -248,22,81,23,196,1,86,94,23,193,1,27,248,22,81,23,196,1,28,248,22, -87,23,194,2,9,27,248,80,159,44,56,39,248,22,80,23,196,2,28,23,193, -2,249,22,79,248,22,182,15,249,22,180,15,23,198,1,247,22,132,16,248,80, -159,46,8,49,39,248,22,81,23,198,1,86,94,23,193,1,248,80,159,44,8, -49,39,248,22,81,23,196,1,86,94,23,193,1,27,248,22,81,23,197,1,28, -248,22,87,23,194,2,9,27,27,248,22,80,23,196,2,28,248,22,179,15,23, -194,2,192,28,248,22,178,15,23,194,2,249,22,180,15,23,195,1,249,22,180, -15,250,80,159,47,40,39,248,22,131,16,2,61,11,10,248,22,131,16,2,60, -250,80,159,43,40,39,248,22,131,16,2,61,23,196,1,10,28,23,193,2,249, -22,79,248,22,182,15,249,22,180,15,23,198,1,247,22,132,16,27,248,22,81, -23,198,1,28,248,22,87,23,194,2,9,27,248,80,159,44,56,39,248,22,80, -23,196,2,28,23,193,2,249,22,79,248,22,182,15,249,22,180,15,23,198,1, -247,22,132,16,248,80,159,46,8,49,39,248,22,81,23,198,1,86,94,23,193, -1,248,80,159,44,8,49,39,248,22,81,23,196,1,86,94,23,193,1,27,248, -22,81,23,196,1,28,248,22,87,23,194,2,9,27,248,80,159,42,56,39,248, -22,80,23,196,2,28,23,193,2,249,22,79,248,22,182,15,249,22,180,15,23, -198,1,247,22,132,16,248,80,159,44,8,49,39,248,22,81,23,198,1,86,94, -23,193,1,248,80,159,42,8,49,39,248,22,81,23,196,1,27,247,22,137,16, -27,248,80,159,39,52,39,247,80,159,39,51,39,249,80,159,40,41,38,28,23, -196,2,27,249,22,170,8,247,22,169,8,2,76,28,192,249,22,160,8,194,7, -63,2,71,2,71,250,80,159,43,57,39,23,198,2,2,77,27,28,23,200,1, -250,22,172,15,248,22,131,16,2,65,250,22,157,2,23,205,1,2,62,247,22, -166,8,2,78,86,94,23,199,1,11,27,248,80,159,46,8,47,39,250,22,93, -9,248,22,89,248,22,131,16,2,63,9,28,193,249,22,79,195,194,192,27,247, -22,137,16,27,248,80,159,39,52,39,247,80,159,39,51,39,249,80,159,40,41, -38,28,23,196,2,27,249,22,170,8,247,22,169,8,2,76,28,192,249,22,160, -8,194,7,63,2,71,2,71,250,80,159,43,57,39,23,198,2,2,77,27,28, -23,200,1,250,22,172,15,248,22,131,16,2,65,250,22,157,2,23,205,1,2, -62,247,22,166,8,2,78,86,94,23,199,1,11,27,248,80,159,46,8,48,39, -250,22,93,23,207,1,248,22,89,248,22,131,16,2,63,9,28,193,249,22,79, -195,194,192,27,247,22,137,16,27,248,80,159,39,52,39,27,248,22,131,16,2, -59,28,248,22,179,15,23,194,2,192,27,28,248,22,177,15,23,195,2,20,13, -159,80,159,41,43,37,250,80,159,44,44,37,249,22,33,11,80,159,46,43,37, -22,132,16,248,22,131,16,2,60,27,248,22,131,16,2,61,250,80,159,45,40, -39,23,196,1,23,198,2,11,11,28,23,193,2,192,86,94,23,193,1,27,249, -22,180,15,27,248,22,131,16,2,61,250,80,159,48,40,39,23,196,1,11,11, -248,22,131,16,2,60,90,159,39,11,89,161,39,36,11,248,22,175,15,23,197, -1,86,95,23,195,1,23,194,1,249,22,180,15,23,200,1,23,195,1,249,80, -159,40,41,38,28,23,196,2,27,249,22,170,8,247,22,169,8,2,76,28,192, -249,22,160,8,194,7,63,2,71,2,71,250,80,159,43,57,39,23,198,2,2, -77,27,28,23,200,1,250,22,172,15,248,22,131,16,2,65,250,22,157,2,23, -205,1,2,62,247,22,166,8,2,78,86,94,23,199,1,11,27,27,250,22,93, -23,207,1,248,22,89,248,22,131,16,2,63,23,208,1,28,248,22,87,23,194, -2,9,27,27,248,22,80,23,196,2,28,248,22,179,15,23,194,2,192,28,248, -22,178,15,23,194,2,249,22,180,15,23,195,1,249,22,180,15,250,80,159,55, -40,39,248,22,131,16,2,61,11,10,248,22,131,16,2,60,250,80,159,51,40, -39,248,22,131,16,2,61,23,196,1,10,28,23,193,2,249,22,79,248,22,182, -15,249,22,180,15,23,198,1,247,22,132,16,27,248,22,81,23,198,1,28,248, -22,87,23,194,2,9,27,248,80,159,52,56,39,248,22,80,23,196,2,28,23, -193,2,249,22,79,248,22,182,15,249,22,180,15,23,198,1,247,22,132,16,248, -80,159,54,8,49,39,248,22,81,23,198,1,86,94,23,193,1,248,80,159,52, -8,49,39,248,22,81,23,196,1,86,94,23,193,1,27,248,22,81,23,196,1, -28,248,22,87,23,194,2,9,27,248,80,159,50,56,39,248,22,80,23,196,2, -28,23,193,2,249,22,79,248,22,182,15,249,22,180,15,23,198,1,247,22,132, -16,248,80,159,52,8,49,39,248,22,81,23,198,1,86,94,23,193,1,248,80, -159,50,8,49,39,248,22,81,23,196,1,28,193,249,22,79,195,194,192,27,20, -13,159,80,159,37,43,37,26,9,80,159,46,44,37,249,22,33,11,80,159,48, -43,37,22,128,15,10,22,135,15,10,22,136,15,10,22,137,15,10,248,22,143, -6,23,196,2,28,248,22,143,7,23,194,2,12,86,94,248,22,171,9,23,194, -1,27,20,13,159,80,159,38,43,37,26,9,80,159,47,44,37,249,22,33,11, -80,159,49,43,37,22,128,15,10,22,135,15,10,22,136,15,10,22,137,15,10, -248,22,143,6,23,197,2,28,248,22,143,7,23,194,2,12,86,94,248,22,171, -9,23,194,1,27,20,13,159,80,159,39,43,37,26,9,80,159,48,44,37,249, -22,33,11,80,159,50,43,37,22,128,15,10,22,135,15,10,22,136,15,10,22, -137,15,10,248,22,143,6,23,198,2,28,248,22,143,7,23,194,2,12,86,94, -248,22,171,9,23,194,1,248,80,159,40,8,50,39,197,86,94,249,22,134,7, -247,22,168,5,23,196,2,248,22,158,6,249,22,133,4,36,249,22,181,3,23, -198,1,23,199,1,27,28,23,197,2,86,95,23,196,1,23,195,1,23,197,1, -86,94,23,197,1,27,248,22,131,16,2,61,27,250,80,159,42,40,39,23,197, -1,11,11,27,248,22,136,4,23,199,1,27,28,23,194,2,23,194,1,86,94, -23,194,1,36,27,248,22,136,4,23,202,1,27,28,23,194,2,23,194,1,86, -94,23,194,1,36,249,22,135,6,23,199,1,20,20,95,88,163,8,36,36,48, -11,9,224,4,2,33,179,2,23,195,1,23,197,1,27,248,22,184,5,23,195, -1,248,80,159,39,8,50,39,193,159,36,20,114,159,36,16,1,11,16,0,20, -26,145,9,2,1,2,1,29,11,11,11,11,9,9,11,11,11,10,43,80,158, -36,36,20,114,159,44,16,43,2,2,2,3,2,4,2,5,2,6,2,7,2, -8,30,2,11,1,20,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111, -110,45,107,101,121,11,6,30,2,11,1,23,101,120,116,101,110,100,45,112,97, -114,97,109,101,116,101,114,105,122,97,116,105,111,110,11,3,2,12,2,13,2, -14,2,15,2,16,2,17,2,18,2,19,2,20,2,21,2,22,2,23,2,24, -2,25,30,2,26,76,102,105,110,100,45,108,105,110,107,115,45,112,97,116,104, -33,11,4,2,27,2,28,2,29,2,30,2,31,2,32,2,33,2,34,30,2, -26,1,21,101,120,99,101,112,116,105,111,110,45,104,97,110,100,108,101,114,45, -107,101,121,11,2,2,35,2,36,2,37,2,38,2,39,2,40,2,41,2,42, -2,43,2,44,16,0,37,39,36,16,0,36,16,25,2,13,2,14,2,12,2, -24,2,25,2,3,2,38,2,21,2,22,2,23,2,34,2,18,2,19,2,20, -2,36,2,31,2,27,2,32,2,35,2,37,2,39,2,33,2,29,2,28,2, -30,8,25,11,11,11,16,14,2,8,2,17,2,15,2,44,2,16,2,6,2, -43,2,42,2,4,2,41,2,7,2,40,2,2,2,5,16,14,11,11,11,11, -11,11,11,11,11,11,11,11,11,11,16,14,2,8,2,17,2,15,2,44,2, -16,2,6,2,43,2,42,2,4,2,41,2,7,2,40,2,2,2,5,50,50, -37,12,11,11,16,0,16,0,16,0,36,36,11,12,11,11,16,0,16,0,16, -0,36,36,16,47,20,15,16,2,32,0,88,163,36,37,45,11,2,2,222,33, -79,80,159,36,36,37,20,15,16,2,249,22,150,7,7,92,7,92,80,159,36, -37,37,20,15,16,2,88,163,36,37,54,38,2,4,223,0,33,84,80,159,36, -38,37,20,15,16,2,88,163,36,38,58,38,2,5,223,0,33,86,80,159,36, -39,37,20,15,16,2,20,25,96,2,6,88,163,8,36,39,8,25,8,32,9, -223,0,33,93,88,163,36,38,47,52,9,223,0,33,94,88,163,36,37,46,52, -9,223,0,33,95,80,159,36,40,37,20,15,16,2,27,248,22,141,16,248,22, -162,8,27,28,249,22,163,9,247,22,175,8,2,47,6,1,1,59,6,1,1, -58,250,22,132,8,6,14,14,40,91,94,126,97,93,42,41,126,97,40,46,42, -41,23,196,2,23,196,1,88,163,8,36,38,48,11,2,7,223,0,33,99,80, -159,36,41,37,20,15,16,2,88,163,36,37,8,38,8,128,6,2,8,223,0, -33,100,80,159,36,42,37,20,15,16,2,32,0,88,163,8,36,38,47,11,2, -12,222,33,101,80,159,36,45,37,20,15,16,2,32,0,88,163,8,36,39,48, -11,2,13,222,33,103,80,159,36,46,37,20,15,16,2,32,0,88,163,8,36, -38,46,11,2,14,222,33,104,80,159,36,47,37,20,15,16,2,88,163,45,39, -49,8,128,128,2,15,223,0,33,106,80,159,36,48,37,20,15,16,2,88,163, -45,40,50,8,128,128,2,17,223,0,33,108,80,159,36,50,37,20,15,16,2, -88,163,36,36,51,8,144,6,2,18,223,0,33,109,80,159,36,51,37,20,15, -16,2,88,163,8,36,36,8,38,8,128,6,9,223,0,33,110,80,159,36,8, -43,39,20,15,16,2,88,163,8,36,37,47,16,4,36,36,8,128,32,36,2, -19,223,0,33,111,80,159,36,52,37,20,15,16,2,20,27,158,32,0,88,163, -36,37,45,11,2,20,222,33,112,32,0,88,163,36,37,45,11,2,20,222,33, -113,80,159,36,53,37,20,15,16,2,88,163,36,37,56,52,2,21,223,0,33, -114,80,159,36,54,37,20,15,16,2,88,163,36,37,55,52,2,22,223,0,33, -115,80,159,36,55,37,20,15,16,2,88,163,36,37,51,52,2,23,223,0,33, -116,80,159,36,56,37,20,15,16,2,88,163,8,36,38,55,16,4,36,40,8, -128,64,36,2,54,223,0,33,117,80,159,36,8,44,39,20,15,16,2,88,163, -8,36,39,49,16,4,36,36,8,128,64,36,2,24,223,0,33,118,80,159,36, -57,37,20,15,16,2,248,80,159,37,59,37,88,163,8,36,36,53,8,240,144, -1,37,0,9,223,1,33,119,80,159,36,58,37,20,15,16,2,248,22,80,80, -159,37,58,38,80,159,36,8,24,37,20,15,16,2,248,22,81,80,159,37,58, -38,80,159,36,8,25,37,20,15,16,2,247,22,137,2,80,158,36,8,26,20, -15,16,2,11,80,158,36,8,27,20,15,16,2,249,22,179,8,248,22,182,8, -80,159,39,8,24,38,247,22,137,2,80,159,36,8,28,37,20,15,16,2,249, -22,179,8,248,22,182,8,80,159,39,8,24,38,11,80,159,36,8,29,37,20, -15,16,2,248,22,18,65,115,116,97,109,112,80,159,36,8,30,37,20,15,16, -2,88,163,36,37,46,16,2,36,8,240,0,64,0,0,9,223,0,33,121,80, -159,36,8,45,39,20,15,16,2,88,163,36,38,48,16,4,36,8,240,0,64, -0,0,8,129,128,36,2,34,223,0,33,129,2,80,159,36,8,31,37,20,15, -16,2,32,0,88,163,8,36,37,45,11,2,35,222,33,130,2,80,159,36,8, -33,37,20,15,16,2,88,163,36,38,45,16,4,8,128,6,8,240,0,191,0, -0,37,36,2,36,223,0,33,142,2,80,159,36,8,34,37,20,15,16,2,88, -163,36,38,56,16,4,36,36,44,36,2,37,223,0,33,144,2,80,159,36,8, -35,37,20,15,16,2,88,163,8,36,38,8,25,16,4,36,8,128,4,8,240, -4,64,0,0,36,2,54,223,0,33,145,2,80,159,36,8,46,39,20,15,16, -2,88,163,36,40,8,33,16,4,36,8,128,12,8,240,12,64,0,0,36,2, -16,223,0,33,156,2,80,159,36,49,37,20,15,16,2,32,0,88,163,36,39, -50,11,2,38,222,33,157,2,80,159,36,8,36,37,20,15,16,2,32,0,88, -163,36,41,8,27,11,2,39,222,33,160,2,80,159,36,8,37,37,20,15,16, -2,20,27,158,32,0,88,163,36,38,52,11,2,40,222,33,163,2,88,163,36, -38,49,16,4,36,36,8,32,36,2,40,223,0,33,165,2,80,159,36,8,38, -37,20,15,16,2,20,27,158,32,0,88,163,36,38,52,11,2,41,222,33,168, -2,88,163,36,38,49,16,4,36,36,8,32,36,2,41,223,0,33,169,2,80, -159,36,8,39,37,20,15,16,2,20,27,158,32,0,88,163,36,37,44,11,2, -42,222,33,170,2,32,0,88,163,36,37,44,11,2,42,222,33,171,2,80,159, -36,8,40,37,20,15,16,2,88,163,8,36,37,53,16,4,52,52,8,240,0, -128,0,0,36,2,54,223,0,33,172,2,80,159,36,8,47,39,20,15,16,2, -88,163,8,36,37,53,16,4,52,52,36,37,2,54,223,0,33,173,2,80,159, -36,8,48,39,20,15,16,2,88,163,8,36,37,57,16,4,52,52,36,38,2, -54,223,0,33,174,2,80,159,36,8,49,39,20,15,16,2,20,25,96,2,43, -88,163,36,36,57,16,4,8,240,32,128,0,0,8,33,8,240,0,128,0,0, -36,9,223,0,33,175,2,88,163,36,37,58,16,4,8,240,32,128,0,0,8, -33,36,37,9,223,0,33,176,2,88,163,36,38,8,28,16,4,8,176,6,8, -49,36,38,9,223,0,33,177,2,80,159,36,8,41,37,20,15,16,2,88,163, -8,36,37,57,16,4,8,128,6,36,36,40,2,54,223,0,33,178,2,80,159, -36,8,50,39,20,15,16,2,88,163,8,36,39,54,16,4,52,36,36,40,2, -44,223,0,33,180,2,80,159,36,8,42,37,95,29,94,2,9,68,35,37,107, -101,114,110,101,108,11,29,94,2,9,69,35,37,109,105,110,45,115,116,120,11, -2,26,9,9,9,36,0}; - EVAL_ONE_SIZED_STR((char *)expr, 18444); +8,44,39,248,22,81,23,198,1,86,94,23,193,1,248,80,159,42,8,44,39, +248,22,81,23,196,1,27,247,22,138,16,27,248,80,159,39,52,39,247,80,159, +39,51,39,249,80,159,40,41,38,28,23,196,2,27,249,22,170,8,247,22,169, +8,2,70,28,192,249,22,160,8,194,7,63,2,65,2,65,250,80,159,43,57, +39,23,198,2,2,71,27,28,23,200,1,250,22,172,15,248,22,131,16,2,60, +250,22,157,2,23,205,1,2,57,247,22,166,8,2,72,86,94,23,199,1,11, +27,248,80,159,46,8,42,39,250,22,93,9,248,22,89,248,22,131,16,2,58, +9,28,193,249,22,79,195,194,192,27,247,22,138,16,27,248,80,159,39,52,39, +247,80,159,39,51,39,249,80,159,40,41,38,28,23,196,2,27,249,22,170,8, +247,22,169,8,2,70,28,192,249,22,160,8,194,7,63,2,65,2,65,250,80, +159,43,57,39,23,198,2,2,71,27,28,23,200,1,250,22,172,15,248,22,131, +16,2,60,250,22,157,2,23,205,1,2,57,247,22,166,8,2,72,86,94,23, +199,1,11,27,248,80,159,46,8,43,39,250,22,93,23,207,1,248,22,89,248, +22,131,16,2,58,9,28,193,249,22,79,195,194,192,27,247,22,138,16,27,248, +80,159,39,52,39,27,248,22,131,16,2,54,28,248,22,179,15,23,194,2,192, +27,28,248,22,177,15,23,195,2,20,13,159,80,159,41,43,37,250,80,159,44, +44,37,249,22,33,11,80,159,46,43,37,22,132,16,248,22,131,16,2,55,27, +248,22,131,16,2,56,250,80,159,45,40,39,23,196,1,23,198,2,11,11,28, +23,193,2,192,86,94,23,193,1,27,249,22,180,15,27,248,22,131,16,2,56, +250,80,159,48,40,39,23,196,1,11,11,248,22,131,16,2,55,90,159,39,11, +89,161,39,36,11,248,22,175,15,23,197,1,86,95,23,195,1,23,194,1,249, +22,180,15,23,200,1,23,195,1,249,80,159,40,41,38,28,23,196,2,27,249, +22,170,8,247,22,169,8,2,70,28,192,249,22,160,8,194,7,63,2,65,2, +65,250,80,159,43,57,39,23,198,2,2,71,27,28,23,200,1,250,22,172,15, +248,22,131,16,2,60,250,22,157,2,23,205,1,2,57,247,22,166,8,2,72, +86,94,23,199,1,11,27,27,250,22,93,23,207,1,248,22,89,248,22,131,16, +2,58,23,208,1,28,248,22,87,23,194,2,9,27,27,248,22,80,23,196,2, +28,248,22,179,15,23,194,2,192,28,248,22,178,15,23,194,2,249,22,180,15, +23,195,1,249,22,180,15,250,80,159,55,40,39,248,22,131,16,2,56,11,10, +248,22,131,16,2,55,250,80,159,51,40,39,248,22,131,16,2,56,23,196,1, +10,28,23,193,2,249,22,79,248,22,182,15,249,22,180,15,23,198,1,247,22, +132,16,27,248,22,81,23,198,1,28,248,22,87,23,194,2,9,27,248,80,159, +52,56,39,248,22,80,23,196,2,28,23,193,2,249,22,79,248,22,182,15,249, +22,180,15,23,198,1,247,22,132,16,248,80,159,54,8,44,39,248,22,81,23, +198,1,86,94,23,193,1,248,80,159,52,8,44,39,248,22,81,23,196,1,86, +94,23,193,1,27,248,22,81,23,196,1,28,248,22,87,23,194,2,9,27,248, +80,159,50,56,39,248,22,80,23,196,2,28,23,193,2,249,22,79,248,22,182, +15,249,22,180,15,23,198,1,247,22,132,16,248,80,159,52,8,44,39,248,22, +81,23,198,1,86,94,23,193,1,248,80,159,50,8,44,39,248,22,81,23,196, +1,28,193,249,22,79,195,194,192,27,20,13,159,80,159,37,43,37,26,9,80, +159,46,44,37,249,22,33,11,80,159,48,43,37,22,128,15,10,22,135,15,10, +22,136,15,10,22,137,15,10,248,22,143,6,23,196,2,28,248,22,143,7,23, +194,2,12,86,94,248,22,171,9,23,194,1,27,20,13,159,80,159,38,43,37, +26,9,80,159,47,44,37,249,22,33,11,80,159,49,43,37,22,128,15,10,22, +135,15,10,22,136,15,10,22,137,15,10,248,22,143,6,23,197,2,28,248,22, +143,7,23,194,2,12,86,94,248,22,171,9,23,194,1,27,20,13,159,80,159, +39,43,37,26,9,80,159,48,44,37,249,22,33,11,80,159,50,43,37,22,128, +15,10,22,135,15,10,22,136,15,10,22,137,15,10,248,22,143,6,23,198,2, +28,248,22,143,7,23,194,2,12,86,94,248,22,171,9,23,194,1,248,80,159, +40,8,45,39,197,86,94,249,22,134,7,247,22,168,5,23,196,2,248,22,158, +6,249,22,133,4,36,249,22,181,3,23,198,1,23,199,1,27,28,23,197,2, +86,95,23,196,1,23,195,1,23,197,1,86,94,23,197,1,27,248,22,131,16, +2,56,27,250,80,159,42,40,39,23,197,1,11,11,27,248,22,136,4,23,199, +1,27,28,23,194,2,23,194,1,86,94,23,194,1,36,27,248,22,136,4,23, +202,1,27,28,23,194,2,23,194,1,86,94,23,194,1,36,249,22,135,6,23, +199,1,20,20,95,88,163,8,36,36,48,11,9,224,4,2,33,173,2,23,195, +1,23,197,1,27,248,22,184,5,23,195,1,248,80,159,39,8,45,39,193,159, +36,20,114,159,36,16,1,11,16,0,20,26,145,9,2,1,2,1,29,11,11, +11,11,9,9,11,11,11,10,43,80,158,36,36,20,114,159,45,16,37,2,2, +2,3,2,4,2,5,2,6,2,7,2,8,30,2,11,1,20,112,97,114,97, +109,101,116,101,114,105,122,97,116,105,111,110,45,107,101,121,11,5,30,2,11, +1,23,101,120,116,101,110,100,45,112,97,114,97,109,101,116,101,114,105,122,97, +116,105,111,110,11,3,2,12,2,13,2,14,2,15,2,16,2,17,2,18,2, +19,2,20,2,21,2,22,2,23,2,24,2,25,2,26,2,27,2,28,30,2, +29,1,21,101,120,99,101,112,116,105,111,110,45,104,97,110,100,108,101,114,45, +107,101,121,11,2,2,30,2,31,2,32,2,33,2,34,2,35,2,36,2,37, +2,38,2,39,16,0,37,39,36,16,0,36,16,19,2,13,2,14,2,12,2, +24,2,3,2,33,2,21,2,22,2,23,2,28,2,18,2,19,2,20,2,31, +2,26,2,30,2,32,2,34,2,27,55,11,11,11,16,15,2,8,2,17,2, +15,2,39,2,16,2,6,2,25,2,38,2,37,2,4,2,36,2,7,2,35, +2,2,2,5,16,15,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, +16,15,2,8,2,17,2,15,2,39,2,16,2,6,2,25,2,38,2,37,2, +4,2,36,2,7,2,35,2,2,2,5,51,51,37,12,11,11,16,0,16,0, +16,0,36,36,11,12,11,11,16,0,16,0,16,0,36,36,16,43,20,15,16, +2,32,0,88,163,36,37,45,11,2,2,222,33,73,80,159,36,36,37,20,15, +16,2,249,22,150,7,7,92,7,92,80,159,36,37,37,20,15,16,2,88,163, +36,37,54,38,2,4,223,0,33,78,80,159,36,38,37,20,15,16,2,88,163, +36,38,58,38,2,5,223,0,33,80,80,159,36,39,37,20,15,16,2,20,25, +96,2,6,88,163,8,36,39,8,25,8,32,9,223,0,33,87,88,163,36,38, +47,52,9,223,0,33,88,88,163,36,37,46,52,9,223,0,33,89,80,159,36, +40,37,20,15,16,2,27,248,22,142,16,248,22,162,8,27,28,249,22,163,9, +247,22,175,8,2,42,6,1,1,59,6,1,1,58,250,22,132,8,6,14,14, +40,91,94,126,97,93,42,41,126,97,40,46,42,41,23,196,2,23,196,1,88, +163,8,36,38,48,11,2,7,223,0,33,93,80,159,36,41,37,20,15,16,2, +88,163,36,37,8,38,8,128,6,2,8,223,0,33,94,80,159,36,42,37,20, +15,16,2,32,0,88,163,8,36,38,47,11,2,12,222,33,95,80,159,36,45, +37,20,15,16,2,32,0,88,163,8,36,39,48,11,2,13,222,33,97,80,159, +36,46,37,20,15,16,2,32,0,88,163,8,36,38,46,11,2,14,222,33,98, +80,159,36,47,37,20,15,16,2,88,163,45,39,49,8,128,128,2,15,223,0, +33,100,80,159,36,48,37,20,15,16,2,88,163,45,40,50,8,128,128,2,17, +223,0,33,102,80,159,36,50,37,20,15,16,2,88,163,36,36,51,8,144,6, +2,18,223,0,33,103,80,159,36,51,37,20,15,16,2,88,163,8,36,36,8, +38,8,128,6,9,223,0,33,104,80,159,36,8,37,39,20,15,16,2,88,163, +8,36,37,47,16,4,36,36,8,32,36,2,19,223,0,33,105,80,159,36,52, +37,20,15,16,2,20,27,158,32,0,88,163,36,37,45,11,2,20,222,33,106, +32,0,88,163,36,37,45,11,2,20,222,33,107,80,159,36,53,37,20,15,16, +2,88,163,36,37,56,52,2,21,223,0,33,108,80,159,36,54,37,20,15,16, +2,88,163,36,37,55,52,2,22,223,0,33,109,80,159,36,55,37,20,15,16, +2,88,163,36,37,51,52,2,23,223,0,33,110,80,159,36,56,37,20,15,16, +2,88,163,8,36,38,55,16,4,36,40,8,64,36,2,49,223,0,33,111,80, +159,36,8,38,39,20,15,16,2,88,163,8,36,39,49,16,4,36,36,8,64, +36,2,24,223,0,33,112,80,159,36,57,37,20,15,16,2,88,163,8,36,36, +55,8,240,144,1,37,0,2,25,223,0,33,113,80,159,36,58,37,20,15,16, +2,247,22,139,2,80,159,36,59,37,20,15,16,2,248,22,18,65,115,116,97, +109,112,80,159,36,8,24,37,20,15,16,2,88,163,36,37,46,8,240,0,0, +0,1,9,223,0,33,115,80,159,36,8,39,39,20,15,16,2,88,163,36,38, +48,16,4,36,8,128,20,8,128,2,36,2,28,223,0,33,123,80,159,36,8, +25,37,20,15,16,2,32,0,88,163,8,36,37,45,11,2,30,222,33,124,80, +159,36,8,27,37,20,15,16,2,88,163,8,36,39,45,8,240,0,0,128,0, +72,109,97,107,101,45,104,97,110,100,108,101,114,223,0,33,126,80,159,36,8, +40,39,20,15,16,2,88,163,36,37,44,16,4,8,128,6,8,128,26,8,128, +4,36,2,31,223,0,33,136,2,80,159,36,8,28,37,20,15,16,2,88,163, +36,38,56,16,2,36,8,128,128,2,32,223,0,33,138,2,80,159,36,8,29, +37,20,15,16,2,88,163,8,36,38,58,16,4,36,8,128,64,8,128,8,36, +2,49,223,0,33,139,2,80,159,36,8,41,39,20,15,16,2,88,163,36,40, +8,24,16,4,36,8,128,192,8,128,8,36,2,16,223,0,33,150,2,80,159, +36,49,37,20,15,16,2,32,0,88,163,36,39,50,11,2,33,222,33,151,2, +80,159,36,8,30,37,20,15,16,2,32,0,88,163,36,41,8,27,11,2,34, +222,33,154,2,80,159,36,8,31,37,20,15,16,2,20,27,158,32,0,88,163, +36,38,52,11,2,35,222,33,157,2,88,163,36,38,49,16,2,36,8,240,0, +128,0,0,2,35,223,0,33,159,2,80,159,36,8,32,37,20,15,16,2,20, +27,158,32,0,88,163,36,38,52,11,2,36,222,33,162,2,88,163,36,38,49, +16,2,36,8,240,0,128,0,0,2,36,223,0,33,163,2,80,159,36,8,33, +37,20,15,16,2,20,27,158,32,0,88,163,36,37,44,11,2,37,222,33,164, +2,32,0,88,163,36,37,44,11,2,37,222,33,165,2,80,159,36,8,34,37, +20,15,16,2,88,163,8,36,37,53,16,4,52,52,8,128,16,36,2,49,223, +0,33,166,2,80,159,36,8,42,39,20,15,16,2,88,163,8,36,37,53,16, +4,52,52,8,128,32,36,2,49,223,0,33,167,2,80,159,36,8,43,39,20, +15,16,2,88,163,8,36,37,57,16,4,52,52,8,128,64,36,2,49,223,0, +33,168,2,80,159,36,8,44,39,20,15,16,2,20,25,96,2,38,88,163,36, +36,57,16,4,8,240,32,128,0,0,8,33,8,128,16,36,9,223,0,33,169, +2,88,163,36,37,58,16,4,8,240,32,128,0,0,8,33,8,128,32,36,9, +223,0,33,170,2,88,163,36,38,8,28,16,4,8,176,6,8,49,8,128,64, +36,9,223,0,33,171,2,80,159,36,8,35,37,20,15,16,2,88,163,8,36, +37,57,16,4,8,128,6,36,8,128,128,36,2,49,223,0,33,172,2,80,159, +36,8,45,39,20,15,16,2,88,163,8,36,39,54,16,4,52,36,8,128,128, +36,2,39,223,0,33,174,2,80,159,36,8,36,37,95,29,94,2,9,68,35, +37,107,101,114,110,101,108,11,29,94,2,9,69,35,37,109,105,110,45,115,116, +120,11,2,29,9,9,9,36,0}; + EVAL_ONE_SIZED_STR((char *)expr, 18341); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,53,46,57,48,46,48,46,51,84,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,53,46,57,48,46,48,46,52,84,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,1,0,0,15,0,40, 0,57,0,75,0,97,0,120,0,140,0,162,0,171,0,180,0,187,0,196,0, 203,0,0,0,229,1,0,0,74,35,37,112,108,97,99,101,45,115,116,114,117, @@ -1012,7 +1007,7 @@ EVAL_ONE_SIZED_STR((char *)expr, 556); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,53,46,57,48,46,48,46,51,84,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,53,46,57,48,46,48,46,52,84,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,106,0,0,0,1,0,0,7,0,18, 0,45,0,51,0,60,0,67,0,89,0,102,0,128,0,145,0,167,0,175,0, 187,0,202,0,218,0,236,0,0,1,12,1,28,1,51,1,75,1,87,1,118, @@ -1091,14 +1086,14 @@ 40,39,23,195,2,12,250,22,172,11,2,27,6,12,12,112,97,116,104,45,115, 116,114,105,110,103,63,23,197,2,28,28,23,195,2,28,248,22,64,23,196,2, 10,28,248,22,88,23,196,2,28,249,22,191,3,248,22,92,23,198,2,37,28, -28,248,22,64,248,22,80,23,197,2,10,248,22,161,9,248,22,136,18,23,197, -2,249,22,4,22,64,248,22,137,18,23,198,2,11,11,11,10,12,250,22,172, +28,248,22,64,248,22,80,23,197,2,10,248,22,161,9,248,22,137,18,23,197, +2,249,22,4,22,64,248,22,138,18,23,198,2,11,11,11,10,12,250,22,172, 11,2,27,6,71,71,40,111,114,47,99,32,35,102,32,115,121,109,98,111,108, 63,32,40,99,111,110,115,47,99,32,40,111,114,47,99,32,35,102,32,115,121, 109,98,111,108,63,41,32,40,110,111,110,45,101,109,112,116,121,45,108,105,115, 116,111,102,32,115,121,109,98,111,108,63,41,41,41,23,197,2,27,28,23,196, 2,247,22,187,4,11,27,28,23,194,2,250,22,157,2,80,158,41,41,248,22, -170,16,247,22,190,13,11,11,27,28,23,194,2,250,22,157,2,248,22,81,23, +171,16,247,22,190,13,11,11,27,28,23,194,2,250,22,157,2,248,22,81,23, 198,2,23,198,2,11,11,28,23,193,2,86,96,23,197,1,23,195,1,23,194, 1,20,13,159,80,159,39,38,37,250,80,159,42,39,37,249,22,33,11,80,159, 44,38,37,22,188,4,248,22,101,23,197,2,27,248,22,110,23,195,2,20,13, @@ -1118,7 +1113,7 @@ 200,2,23,197,1,23,193,1,86,94,23,193,1,249,22,172,15,23,196,2,23, 200,2,86,94,23,195,1,11,89,161,37,44,11,28,249,22,163,9,23,196,2, 68,114,101,108,97,116,105,118,101,86,94,23,194,1,2,29,23,194,1,89,161, -37,45,11,247,22,135,16,89,161,37,46,11,247,22,136,16,27,250,22,190,15, +37,45,11,247,22,136,16,89,161,37,46,11,247,22,137,16,27,250,22,190,15, 23,203,2,11,32,0,88,163,8,36,36,41,11,9,222,11,27,28,23,194,2, 249,22,79,23,203,2,23,196,1,86,94,23,194,1,11,27,28,23,203,2,28, 23,194,2,11,27,250,22,190,15,23,207,2,11,32,0,88,163,8,36,36,41, @@ -1138,7 +1133,7 @@ 80,159,8,28,39,37,249,22,33,11,80,159,8,30,38,37,22,188,4,11,20, 13,159,80,159,8,25,38,37,250,80,159,8,28,39,37,249,22,33,11,80,159, 8,30,38,37,22,173,5,28,248,22,154,15,23,216,2,23,215,1,86,94,23, -215,1,247,22,132,16,249,247,22,140,16,248,22,80,23,196,1,23,222,1,86, +215,1,247,22,132,16,249,247,22,141,16,248,22,80,23,196,1,23,222,1,86, 94,23,193,1,27,28,23,195,2,28,23,197,1,27,249,22,5,88,163,36,37, 48,8,129,3,9,226,29,24,23,20,33,51,23,218,2,27,28,23,204,2,11, 193,28,192,192,28,193,28,203,28,249,22,129,4,248,22,81,196,248,22,81,206, @@ -1148,7 +1143,7 @@ 80,159,8,29,39,37,249,22,33,11,80,159,8,31,38,37,22,188,4,23,215, 1,20,13,159,80,159,8,26,38,37,250,80,159,8,29,39,37,249,22,33,11, 80,159,8,31,38,37,22,173,5,28,248,22,154,15,23,217,2,23,216,1,86, -94,23,216,1,247,22,132,16,249,247,22,140,16,248,22,80,23,196,1,23,223, +94,23,216,1,247,22,132,16,249,247,22,141,16,248,22,80,23,196,1,23,223, 1,86,94,23,193,1,27,28,23,197,2,28,23,201,1,27,249,22,5,20,20, 94,88,163,36,37,48,8,128,3,9,226,30,25,24,20,33,53,23,213,1,23, 219,2,27,28,23,204,2,11,193,28,192,192,28,193,28,23,204,2,28,249,22, @@ -1160,7 +1155,7 @@ 38,37,250,80,159,8,30,39,37,249,22,33,11,80,159,8,32,38,37,22,188, 4,11,20,13,159,80,159,8,27,38,37,250,80,159,8,30,39,37,249,22,33, 11,80,159,8,32,38,37,22,173,5,28,248,22,154,15,23,218,2,23,217,1, -86,94,23,217,1,247,22,132,16,249,247,22,171,5,248,22,136,18,23,196,1, +86,94,23,217,1,247,22,132,16,249,247,22,171,5,248,22,137,18,23,196,1, 23,224,32,0,0,0,1,86,94,23,193,1,27,28,23,197,1,28,23,201,1, 27,249,22,5,20,20,95,88,163,36,37,48,8,128,3,9,226,31,26,25,22, 33,55,23,215,1,23,219,1,23,220,1,27,28,23,205,2,11,193,28,192,192, @@ -1172,9 +1167,9 @@ 28,38,37,250,80,159,8,31,39,37,249,22,33,11,80,159,8,33,38,37,22, 188,4,23,217,1,20,13,159,80,159,8,28,38,37,250,80,159,8,31,39,37, 249,22,33,11,80,159,8,33,38,37,22,173,5,28,248,22,154,15,23,219,2, -23,218,1,86,94,23,218,1,247,22,132,16,249,247,22,171,5,248,22,136,18, +23,218,1,86,94,23,218,1,247,22,132,16,249,247,22,171,5,248,22,137,18, 23,196,1,23,224,33,0,0,0,1,86,94,23,193,1,28,28,248,22,77,23, -224,32,0,0,0,2,248,22,136,18,23,224,32,0,0,0,2,10,27,28,23, +224,32,0,0,0,2,248,22,137,18,23,224,32,0,0,0,2,10,27,28,23, 199,2,86,94,23,215,1,23,214,1,86,94,23,214,1,23,215,1,28,28,248, 22,77,23,224,33,0,0,0,2,248,22,161,9,248,22,166,15,23,195,2,11, 12,20,13,159,80,159,8,29,38,37,250,80,159,8,32,39,37,249,22,33,11, @@ -1246,22 +1241,22 @@ 22,79,250,22,170,7,23,200,2,36,23,198,2,248,2,62,249,22,170,7,23, 200,1,248,22,178,3,23,199,1,250,2,60,23,197,4,197,248,22,178,3,196, 32,76,88,163,36,37,55,11,2,33,222,33,77,28,248,22,87,248,22,81,23, -195,2,249,22,7,9,248,22,136,18,23,196,1,90,159,38,11,89,161,38,36, -11,27,248,22,137,18,23,197,2,28,248,22,87,248,22,81,23,195,2,249,22, -7,9,248,22,136,18,195,90,159,38,11,89,161,38,36,11,27,248,22,137,18, -196,28,248,22,87,248,22,81,23,195,2,249,22,7,9,248,22,136,18,195,90, -159,38,11,89,161,38,36,11,248,2,76,248,22,137,18,196,249,22,7,249,22, -79,248,22,136,18,199,196,195,249,22,7,249,22,79,248,22,136,18,199,196,195, -249,22,7,249,22,79,248,22,136,18,23,200,1,23,197,1,23,196,1,27,19, +195,2,249,22,7,9,248,22,137,18,23,196,1,90,159,38,11,89,161,38,36, +11,27,248,22,138,18,23,197,2,28,248,22,87,248,22,81,23,195,2,249,22, +7,9,248,22,137,18,195,90,159,38,11,89,161,38,36,11,27,248,22,138,18, +196,28,248,22,87,248,22,81,23,195,2,249,22,7,9,248,22,137,18,195,90, +159,38,11,89,161,38,36,11,248,2,76,248,22,138,18,196,249,22,7,249,22, +79,248,22,137,18,199,196,195,249,22,7,249,22,79,248,22,137,18,199,196,195, +249,22,7,249,22,79,248,22,137,18,23,200,1,23,197,1,23,196,1,27,19, 248,22,151,7,23,196,2,250,2,60,23,196,4,23,198,1,36,2,28,23,195, -1,192,28,248,22,87,248,22,81,23,195,2,249,22,7,9,248,22,136,18,23, -196,1,27,248,22,137,18,23,195,2,90,159,38,11,89,161,38,36,11,28,248, -22,87,248,22,81,23,197,2,249,22,7,9,248,22,136,18,23,198,1,27,248, -22,137,18,23,197,2,90,159,38,11,89,161,38,36,11,28,248,22,87,248,22, -81,23,197,2,249,22,7,9,248,22,136,18,197,90,159,38,11,89,161,38,36, -11,248,2,76,248,22,137,18,198,249,22,7,249,22,79,248,22,136,18,201,196, -195,249,22,7,249,22,79,248,22,136,18,23,203,1,196,195,249,22,7,249,22, -79,248,22,136,18,23,201,1,23,197,1,23,196,1,248,22,132,12,252,22,155, +1,192,28,248,22,87,248,22,81,23,195,2,249,22,7,9,248,22,137,18,23, +196,1,27,248,22,138,18,23,195,2,90,159,38,11,89,161,38,36,11,28,248, +22,87,248,22,81,23,197,2,249,22,7,9,248,22,137,18,23,198,1,27,248, +22,138,18,23,197,2,90,159,38,11,89,161,38,36,11,28,248,22,87,248,22, +81,23,197,2,249,22,7,9,248,22,137,18,197,90,159,38,11,89,161,38,36, +11,248,2,76,248,22,138,18,198,249,22,7,249,22,79,248,22,137,18,201,196, +195,249,22,7,249,22,79,248,22,137,18,23,203,1,196,195,249,22,7,249,22, +79,248,22,137,18,23,201,1,23,197,1,23,196,1,248,22,132,12,252,22,155, 10,248,22,160,4,23,200,2,248,22,156,4,23,200,2,248,22,157,4,23,200, 2,248,22,158,4,23,200,2,248,22,159,4,23,200,1,28,24,194,2,12,20, 13,159,80,159,36,58,37,80,158,36,56,89,161,37,37,10,249,22,190,4,21, @@ -1269,13 +1264,13 @@ 46,114,107,116,1,27,112,108,97,110,101,116,45,109,111,100,117,108,101,45,110, 97,109,101,45,114,101,115,111,108,118,101,114,12,27,28,23,195,2,28,249,22, 163,9,23,197,2,80,158,39,52,86,94,23,195,1,80,158,37,53,27,248,22, -149,5,23,197,2,27,28,248,22,77,23,195,2,248,22,136,18,23,195,1,23, +149,5,23,197,2,27,28,248,22,77,23,195,2,248,22,137,18,23,195,1,23, 194,1,28,248,22,154,15,23,194,2,90,159,39,11,89,161,39,36,11,248,22, 175,15,23,197,1,86,95,20,18,159,11,80,158,42,52,199,20,18,159,11,80, 158,42,53,192,192,11,11,28,23,193,2,192,86,94,23,193,1,27,247,22,173, 5,28,23,193,2,192,86,94,23,193,1,247,22,132,16,90,159,39,11,89,161, 39,36,11,248,22,175,15,23,198,2,86,95,23,195,1,23,193,1,28,249,22, -145,16,0,11,35,114,120,34,91,46,93,115,115,36,34,248,22,159,15,23,197, +146,16,0,11,35,114,120,34,91,46,93,115,115,36,34,248,22,159,15,23,197, 1,249,80,159,41,59,39,23,199,1,2,28,196,249,80,159,38,54,39,195,10, 249,22,14,23,196,1,80,159,38,51,38,86,96,28,248,22,147,5,23,196,2, 12,250,22,172,11,2,23,6,21,21,114,101,115,111,108,118,101,100,45,109,111, @@ -1283,14 +1278,14 @@ 13,23,197,2,10,12,250,22,172,11,2,23,6,20,20,40,111,114,47,99,32, 35,102,32,110,97,109,101,115,112,97,99,101,63,41,23,199,2,28,24,193,2, 248,24,194,1,23,196,2,86,94,23,193,1,12,27,250,22,157,2,80,159,41, -41,38,248,22,170,16,247,22,190,13,11,27,28,23,194,2,23,194,1,86,94, +41,38,248,22,171,16,247,22,190,13,11,27,28,23,194,2,23,194,1,86,94, 23,194,1,27,249,22,79,247,22,137,2,247,22,137,2,86,94,250,22,155,2, -80,159,43,41,38,248,22,170,16,247,22,190,13,195,192,86,94,250,22,155,2, +80,159,43,41,38,248,22,171,16,247,22,190,13,195,192,86,94,250,22,155,2, 248,22,80,23,197,2,23,200,2,68,100,101,99,108,97,114,101,100,28,23,198, 2,27,28,248,22,77,248,22,149,5,23,200,2,248,22,148,5,248,22,80,248, 22,149,5,23,201,1,23,198,1,27,250,22,157,2,80,159,44,41,38,248,22, -170,16,23,204,1,11,28,23,193,2,27,250,22,157,2,248,22,81,23,198,1, -23,198,2,11,28,23,193,2,250,22,155,2,248,22,137,18,23,200,1,23,198, +171,16,23,204,1,11,28,23,193,2,27,250,22,157,2,248,22,81,23,198,1, +23,198,2,11,28,23,193,2,250,22,155,2,248,22,138,18,23,200,1,23,198, 1,23,196,1,12,12,12,251,24,197,1,23,198,1,23,199,1,23,200,1,10, 32,87,88,163,36,38,47,11,76,102,108,97,116,116,101,110,45,115,117,98,45, 112,97,116,104,222,33,90,32,88,88,163,36,40,54,11,2,33,222,33,89,28, @@ -1301,11 +1296,11 @@ 32,112,97,116,104,58,32,126,46,115,250,22,90,2,36,28,249,22,165,9,23, 201,2,2,38,23,199,1,28,248,22,154,15,23,200,2,23,199,1,249,22,89, 28,248,22,64,23,202,2,2,4,2,39,23,201,1,23,200,1,251,2,88,196, -197,248,22,81,199,248,22,137,18,200,251,2,88,196,197,249,22,79,248,22,136, -18,202,200,248,22,137,18,200,251,2,88,196,197,9,197,27,250,22,171,7,27, +197,248,22,81,199,248,22,138,18,200,251,2,88,196,197,249,22,79,248,22,137, +18,202,200,248,22,138,18,200,251,2,88,196,197,9,197,27,250,22,171,7,27, 28,23,199,2,28,247,22,185,11,248,80,159,44,55,39,23,200,2,11,11,28, 192,192,6,29,29,115,116,97,110,100,97,114,100,45,109,111,100,117,108,101,45, -110,97,109,101,45,114,101,115,111,108,118,101,114,6,2,2,58,32,250,22,156, +110,97,109,101,45,114,101,115,111,108,118,101,114,6,2,2,58,32,250,22,157, 16,0,7,35,114,120,34,92,110,34,23,203,1,249,22,132,8,6,23,23,10, 32,32,102,111,114,32,109,111,100,117,108,101,32,112,97,116,104,58,32,126,115, 10,23,202,2,248,22,162,13,28,23,196,2,251,22,170,12,23,198,1,247,22, @@ -1319,16 +1314,16 @@ 36,37,47,11,2,33,222,33,97,28,248,22,87,23,194,2,9,250,22,90,6, 4,4,10,32,32,32,248,22,158,15,248,22,102,23,198,2,248,2,96,248,22, 81,23,198,1,28,249,22,165,9,248,22,81,23,200,2,23,197,1,28,249,22, -163,9,248,22,136,18,23,200,1,23,196,1,251,22,168,11,2,23,6,41,41, +163,9,248,22,137,18,23,200,1,23,196,1,251,22,168,11,2,23,6,41,41, 99,121,99,108,101,32,105,110,32,108,111,97,100,105,110,103,10,32,32,97,116, 32,112,97,116,104,58,32,126,97,10,32,32,112,97,116,104,115,58,126,97,23, 200,1,249,22,1,22,171,7,248,2,96,248,22,94,23,201,1,12,12,247,23, 193,1,250,22,154,4,11,196,195,20,13,159,80,159,45,50,38,249,22,79,249, -22,79,248,22,170,16,247,22,190,13,23,201,1,23,195,1,20,13,159,80,159, +22,79,248,22,171,16,247,22,190,13,23,201,1,23,195,1,20,13,159,80,159, 45,38,37,252,80,159,50,39,37,249,22,33,11,80,159,52,38,37,22,187,4, 23,200,2,22,189,4,248,28,23,207,2,20,20,94,88,163,8,36,37,46,11, 9,223,14,33,100,23,207,1,86,94,23,207,1,22,7,28,248,22,64,23,206, -2,23,205,1,28,28,248,22,77,23,206,2,249,22,163,9,248,22,136,18,23, +2,23,205,1,28,28,248,22,77,23,206,2,249,22,163,9,248,22,137,18,23, 208,2,2,34,11,23,205,1,86,94,23,205,1,28,248,22,147,5,23,202,2, 27,248,22,149,5,23,203,2,28,248,22,64,193,249,22,89,2,4,194,192,23, 201,2,249,247,22,172,5,23,200,1,27,248,22,67,248,22,158,15,23,201,1, @@ -1341,50 +1336,50 @@ 45,109,111,100,117,108,101,45,112,97,116,104,63,41,23,199,2,28,28,23,197, 2,248,22,152,4,23,198,2,10,12,250,22,172,11,2,23,6,17,17,40,111, 114,47,99,32,35,102,32,115,121,110,116,97,120,63,41,23,200,2,28,28,248, -22,77,23,196,2,249,22,163,9,248,22,136,18,23,198,2,2,4,11,86,97, +22,77,23,196,2,249,22,163,9,248,22,137,18,23,198,2,2,4,11,86,97, 23,198,1,23,197,1,23,196,1,23,193,1,248,22,148,5,248,22,101,23,197, -1,28,28,248,22,77,23,196,2,28,249,22,163,9,248,22,136,18,23,198,2, +1,28,28,248,22,77,23,196,2,28,249,22,163,9,248,22,137,18,23,198,2, 2,36,28,248,22,77,248,22,101,23,197,2,249,22,163,9,248,22,105,23,198, 2,2,4,11,11,11,86,97,23,198,1,23,197,1,23,196,1,23,193,1,248, 22,148,5,249,2,87,248,22,118,23,199,2,248,22,103,23,199,1,28,28,248, -22,77,23,196,2,28,249,22,163,9,248,22,136,18,23,198,2,2,36,28,28, +22,77,23,196,2,28,249,22,163,9,248,22,137,18,23,198,2,2,36,28,28, 249,22,165,9,248,22,101,23,198,2,2,38,10,249,22,165,9,248,22,101,23, 198,2,2,37,28,23,196,2,27,248,22,149,5,23,198,2,28,248,22,64,193, -10,28,248,22,77,193,248,22,64,248,22,136,18,194,11,11,11,11,11,86,96, +10,28,248,22,77,193,248,22,64,248,22,137,18,194,11,11,11,11,11,86,96, 23,198,1,23,197,1,23,193,1,27,248,22,149,5,23,198,1,248,22,148,5, -249,2,87,28,248,22,77,23,197,2,248,22,136,18,23,197,2,23,196,2,27, -28,249,22,165,9,248,22,101,23,203,2,2,37,248,22,137,18,200,248,22,103, -200,28,248,22,77,23,198,2,249,22,93,248,22,137,18,199,194,192,28,28,248, -22,77,23,196,2,249,22,163,9,248,22,136,18,23,198,2,2,40,11,86,94, +249,2,87,28,248,22,77,23,197,2,248,22,137,18,23,197,2,23,196,2,27, +28,249,22,165,9,248,22,101,23,203,2,2,37,248,22,138,18,200,248,22,103, +200,28,248,22,77,23,198,2,249,22,93,248,22,138,18,199,194,192,28,28,248, +22,77,23,196,2,249,22,163,9,248,22,137,18,23,198,2,2,40,11,86,94, 248,80,159,38,8,29,39,23,194,2,253,24,199,1,23,201,1,23,202,1,23, 203,1,23,204,1,11,80,158,43,56,28,28,248,22,77,23,196,2,28,249,22, -163,9,248,22,136,18,23,198,2,2,36,28,248,22,77,248,22,101,23,197,2, +163,9,248,22,137,18,23,198,2,2,36,28,248,22,77,248,22,101,23,197,2, 249,22,163,9,248,22,105,23,198,2,2,40,11,11,11,86,94,248,80,159,38, 8,29,39,23,194,2,253,24,199,1,248,22,101,23,202,2,23,202,1,23,203, 1,23,204,1,248,22,103,23,202,1,80,158,43,56,86,94,23,193,1,27,88, 163,8,36,37,54,8,240,0,0,8,0,79,115,104,111,119,45,99,111,108,108, 101,99,116,105,111,110,45,101,114,114,225,2,5,3,33,91,27,28,248,22,77, -23,198,2,28,249,22,163,9,2,36,248,22,136,18,23,200,2,27,248,22,101, +23,198,2,28,249,22,163,9,2,36,248,22,137,18,23,200,2,27,248,22,101, 23,199,2,28,28,249,22,165,9,23,195,2,2,38,10,249,22,165,9,23,195, 2,2,37,86,94,23,193,1,28,23,199,2,27,248,22,149,5,23,201,2,28, -248,22,77,193,248,22,136,18,193,192,250,22,168,11,2,23,6,45,45,110,111, +248,22,77,193,248,22,137,18,193,192,250,22,168,11,2,23,6,45,45,110,111, 32,98,97,115,101,32,112,97,116,104,32,102,111,114,32,114,101,108,97,116,105, 118,101,32,115,117,98,109,111,100,117,108,101,32,112,97,116,104,58,32,126,46, 115,23,201,2,192,23,197,2,23,197,2,27,28,248,22,77,23,199,2,28,249, -22,163,9,2,36,248,22,136,18,23,201,2,27,28,28,28,249,22,165,9,248, +22,163,9,2,36,248,22,137,18,23,201,2,27,28,28,28,249,22,165,9,248, 22,101,23,202,2,2,38,10,249,22,165,9,248,22,101,23,202,2,2,37,23, 200,2,11,27,248,22,149,5,23,202,2,27,28,249,22,165,9,248,22,101,23, -204,2,2,37,248,22,137,18,23,202,1,248,22,103,23,202,1,28,248,22,77, -23,195,2,249,2,87,248,22,136,18,23,197,2,249,22,93,248,22,137,18,23, +204,2,2,37,248,22,138,18,23,202,1,248,22,103,23,202,1,28,248,22,77, +23,195,2,249,2,87,248,22,137,18,23,197,2,249,22,93,248,22,138,18,23, 199,1,23,197,1,249,2,87,23,196,1,23,195,1,249,2,87,2,38,28,249, -22,165,9,248,22,101,23,204,2,2,37,248,22,137,18,23,202,1,248,22,103, -23,202,1,28,248,22,77,193,248,22,137,18,193,11,11,11,27,28,248,22,64, +22,165,9,248,22,101,23,204,2,2,37,248,22,138,18,23,202,1,248,22,103, +23,202,1,28,248,22,77,193,248,22,138,18,193,11,11,11,27,28,248,22,64, 23,196,2,27,248,80,159,43,48,39,249,22,79,23,199,2,247,22,134,16,28, 23,193,2,192,86,94,23,193,1,90,159,38,11,89,161,38,36,11,249,80,159, 46,54,39,248,22,70,23,201,2,11,27,28,248,22,87,23,195,2,2,41,249, 22,171,7,23,197,2,2,42,251,80,159,49,8,24,39,23,204,1,28,248,22, 87,23,199,2,23,199,1,86,94,23,199,1,248,22,80,23,199,2,28,248,22, -87,23,199,2,86,94,23,198,1,9,248,22,137,18,23,199,1,23,197,1,28, +87,23,199,2,86,94,23,198,1,9,248,22,138,18,23,199,1,23,197,1,28, 248,22,148,7,23,196,2,86,94,23,196,1,27,248,80,159,43,8,30,39,23, 202,2,27,248,80,159,44,48,39,249,22,79,23,200,2,23,197,2,28,23,193, 2,192,86,94,23,193,1,90,159,38,11,89,161,38,36,11,249,80,159,47,54, @@ -1396,15 +1391,15 @@ 23,198,2,2,34,27,248,80,159,43,48,39,249,22,79,23,199,2,247,22,134, 16,28,23,193,2,192,86,94,23,193,1,90,159,39,11,89,161,38,36,11,249, 80,159,47,54,39,248,22,101,23,202,2,11,89,161,37,38,11,28,248,22,87, -248,22,103,23,201,2,28,248,22,87,23,194,2,249,22,149,16,2,95,23,196, +248,22,103,23,201,2,28,248,22,87,23,194,2,249,22,150,16,2,95,23,196, 2,11,10,27,28,23,196,2,248,2,93,23,196,2,28,248,22,87,23,195,2, -2,41,28,249,22,149,16,2,95,23,197,2,248,2,93,23,196,2,249,22,171, +2,41,28,249,22,150,16,2,95,23,197,2,248,2,93,23,196,2,249,22,171, 7,23,197,2,2,42,27,28,23,197,1,86,94,23,196,1,249,22,93,28,248, 22,87,248,22,103,23,205,2,21,93,6,5,5,109,122,108,105,98,249,22,1, 22,93,249,22,2,80,159,53,8,32,39,248,22,103,23,208,2,23,197,1,28, 248,22,87,23,196,2,86,94,23,195,1,248,22,89,23,197,1,86,94,23,196, 1,23,195,1,251,80,159,51,8,24,39,23,206,1,248,22,80,23,198,2,248, -22,137,18,23,198,1,23,198,1,28,249,22,163,9,248,22,136,18,23,198,2, +22,138,18,23,198,1,23,198,1,28,249,22,163,9,248,22,137,18,23,198,2, 2,39,248,80,159,42,8,31,39,248,22,182,15,249,22,180,15,248,22,184,15, 248,22,101,23,201,2,248,80,159,46,8,30,39,23,205,2,12,86,94,28,28, 248,22,154,15,23,194,2,10,248,22,178,8,23,194,2,12,28,23,201,2,250, @@ -1418,21 +1413,21 @@ 38,2,43,248,22,175,15,23,198,2,86,95,23,195,1,23,193,1,27,28,248, 22,178,8,23,200,2,249,22,183,8,23,201,2,39,249,80,159,49,59,39,23, 197,2,5,0,27,28,248,22,178,8,23,201,2,249,22,183,8,23,202,2,40, -248,22,148,5,23,200,2,27,250,22,157,2,80,159,52,41,38,248,22,170,16, +248,22,148,5,23,200,2,27,250,22,157,2,80,159,52,41,38,248,22,171,16, 247,22,190,13,11,27,28,23,194,2,23,194,1,86,94,23,194,1,27,249,22, 79,247,22,137,2,247,22,137,2,86,94,250,22,155,2,80,159,54,41,38,248, -22,170,16,247,22,190,13,195,192,27,28,23,204,2,248,22,148,5,249,22,79, +22,171,16,247,22,190,13,195,192,27,28,23,204,2,248,22,148,5,249,22,79, 248,22,149,5,23,200,2,23,207,2,23,196,2,86,95,28,23,212,1,27,250, 22,157,2,248,22,80,23,199,2,196,11,28,23,193,1,12,27,27,28,248,22, 17,80,159,55,51,38,80,159,54,51,38,247,22,19,251,22,33,11,80,159,58, -50,38,9,23,197,1,27,248,22,170,16,247,22,190,13,86,94,249,22,3,20, +50,38,9,23,197,1,27,248,22,171,16,247,22,190,13,86,94,249,22,3,20, 20,94,88,163,8,36,37,54,11,9,226,14,13,2,3,33,98,23,195,1,23, 196,2,248,28,248,22,17,80,159,56,51,38,32,0,88,163,36,37,42,11,9, 222,33,99,80,159,55,8,33,39,20,20,97,88,163,36,36,8,24,8,240,12, 64,0,0,9,232,19,22,15,16,13,12,8,7,5,2,33,101,23,195,1,23, 198,1,23,208,1,23,215,1,12,28,28,248,22,178,8,23,204,1,11,28,248, 22,148,7,23,206,2,10,28,248,22,64,23,206,2,10,28,248,22,77,23,206, -2,249,22,163,9,248,22,136,18,23,208,2,2,34,11,249,80,159,53,49,39, +2,249,22,163,9,248,22,137,18,23,208,2,2,34,11,249,80,159,53,49,39, 28,248,22,148,7,23,208,2,249,22,79,23,209,1,248,80,159,56,8,30,39, 23,215,1,86,94,23,212,1,249,22,79,23,209,1,247,22,134,16,252,22,180, 8,23,209,1,23,208,1,23,206,1,23,204,1,23,203,1,12,192,86,96,20, @@ -1443,17 +1438,17 @@ 159,37,8,28,37,249,22,33,11,80,159,39,58,37,159,36,20,114,159,36,16, 1,11,16,0,20,26,145,9,2,1,2,1,29,11,11,11,11,9,9,11,11, 11,10,38,80,158,36,36,20,114,159,41,16,29,2,2,2,3,30,2,6,2, -7,11,6,30,2,6,1,23,101,120,116,101,110,100,45,112,97,114,97,109,101, +7,11,5,30,2,6,1,23,101,120,116,101,110,100,45,112,97,114,97,109,101, 116,101,114,105,122,97,116,105,111,110,11,3,30,2,8,72,112,97,116,104,45, -115,116,114,105,110,103,63,38,196,12,2,9,30,2,8,71,114,101,114,111,111, -116,45,112,97,116,104,40,196,13,30,2,8,75,112,97,116,104,45,97,100,100, -45,115,117,102,102,105,120,40,196,9,2,10,2,11,2,12,2,13,2,14,2, +115,116,114,105,110,103,63,38,196,13,2,9,30,2,8,71,114,101,114,111,111, +116,45,112,97,116,104,40,196,14,30,2,8,75,112,97,116,104,45,97,100,100, +45,115,117,102,102,105,120,40,196,10,2,10,2,11,2,12,2,13,2,14,2, 15,2,16,2,17,2,18,2,19,2,20,2,21,2,22,2,23,30,2,24,2, -7,11,6,30,2,8,79,112,97,116,104,45,114,101,112,108,97,99,101,45,115, -117,102,102,105,120,40,196,11,30,2,8,73,102,105,110,100,45,99,111,108,45, +7,11,5,30,2,8,79,112,97,116,104,45,114,101,112,108,97,99,101,45,115, +117,102,102,105,120,40,196,12,30,2,8,73,102,105,110,100,45,99,111,108,45, 102,105,108,101,44,196,4,30,2,8,76,110,111,114,109,97,108,45,99,97,115, -101,45,112,97,116,104,38,196,8,2,25,2,26,30,2,24,74,114,101,112,97, -114,97,109,101,116,101,114,105,122,101,11,7,16,0,37,39,36,16,0,36,16, +101,45,112,97,116,104,38,196,9,2,25,2,26,30,2,24,74,114,101,112,97, +114,97,109,101,116,101,114,105,122,101,11,6,16,0,37,39,36,16,0,36,16, 16,2,16,2,17,2,9,2,13,2,18,2,19,2,12,2,3,2,11,2,2, 2,21,2,14,2,15,2,10,2,20,2,23,52,11,11,11,16,3,2,25,2, 22,2,26,16,3,11,11,11,16,3,2,25,2,22,2,26,39,39,37,12,11, @@ -1494,7 +1489,7 @@ EVAL_ONE_SIZED_STR((char *)expr, 10051); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,53,46,57,48,46,48,46,51,84,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,53,46,57,48,46,48,46,52,84,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,1,0,0,10,0,16, 0,29,0,44,0,58,0,78,0,90,0,104,0,118,0,170,0,0,0,99,1, 0,0,69,35,37,98,117,105,108,116,105,110,65,113,117,111,116,101,29,94,2, @@ -1502,7 +1497,7 @@ 111,114,107,11,29,94,2,2,68,35,37,112,97,114,97,109,122,11,29,94,2, 2,74,35,37,112,108,97,99,101,45,115,116,114,117,99,116,11,29,94,2,2, 66,35,37,98,111,111,116,11,29,94,2,2,68,35,37,101,120,112,111,98,115, -11,29,94,2,2,68,35,37,107,101,114,110,101,108,11,97,36,11,8,240,103, +11,29,94,2,2,68,35,37,107,101,114,110,101,108,11,97,36,11,8,240,85, 93,0,0,100,159,2,3,36,36,159,2,4,36,36,159,2,5,36,36,159,2, 6,36,36,159,2,7,36,36,159,2,8,36,36,159,2,9,36,36,159,2,9, 36,36,16,0,159,36,20,114,159,36,16,1,11,16,0,20,26,145,9,2,1, diff --git a/racket/src/racket/src/eval.c b/racket/src/racket/src/eval.c index 7aea71dcec..02719e9705 100644 --- a/racket/src/racket/src/eval.c +++ b/racket/src/racket/src/eval.c @@ -5325,6 +5325,14 @@ void scheme_init_collection_paths_post(Scheme_Env *global_env, Scheme_Object *ex if (!scheme_setjmp(newbuf)) { Scheme_Object *clcp, *flcp, *a[2]; + clcp = scheme_builtin_value("current-library-collection-links"); + flcp = scheme_builtin_value("find-library-collection-links"); + + if (clcp && flcp) { + a[0] = _scheme_apply(flcp, 0, NULL); + _scheme_apply(clcp, 1, a); + } + clcp = scheme_builtin_value("current-library-collection-paths"); flcp = scheme_builtin_value("find-library-collection-paths"); diff --git a/racket/src/racket/src/file.c b/racket/src/racket/src/file.c index ed5b8dd81d..d6720a139a 100644 --- a/racket/src/racket/src/file.c +++ b/racket/src/racket/src/file.c @@ -201,6 +201,7 @@ static Scheme_Object *file_or_dir_permissions(int argc, Scheme_Object *argv[]); static Scheme_Object *file_identity(int argc, Scheme_Object *argv[]); static Scheme_Object *file_size(int argc, Scheme_Object *argv[]); static Scheme_Object *current_library_collection_paths(int argc, Scheme_Object *argv[]); +static Scheme_Object *current_library_collection_links(int argc, Scheme_Object *argv[]); static Scheme_Object *use_compiled_kind(int, Scheme_Object *[]); static Scheme_Object *compiled_file_roots(int, Scheme_Object *[]); static Scheme_Object *use_user_paths(int, Scheme_Object *[]); @@ -240,7 +241,6 @@ SHARED_OK static Scheme_Object *run_cmd; SHARED_OK static Scheme_Object *collects_path, *config_path; THREAD_LOCAL_DECL(static Scheme_Object *original_pwd); SHARED_OK static Scheme_Object *addon_dir; -THREAD_LOCAL_DECL(static Scheme_Object *inst_links_path); #endif READ_ONLY static Scheme_Object *windows_symbol, *unix_symbol; @@ -554,6 +554,11 @@ void scheme_init_file(Scheme_Env *env) "current-library-collection-paths", MZCONFIG_COLLECTION_PATHS), env); + scheme_add_global_constant("current-library-collection-links", + scheme_register_parameter(current_library_collection_links, + "current-library-collection-links", + MZCONFIG_COLLECTION_LINKS), + env); #endif scheme_add_global_constant("use-compiled-file-paths", scheme_register_parameter(use_compiled_kind, @@ -5930,9 +5935,38 @@ static Scheme_Object *current_user_directory(int argc, Scheme_Object **argv) #endif -static Scheme_Object *collpaths_gen_p(int argc, Scheme_Object **argv, int rel_ok, int abs_ok, int sym_ok) +static Scheme_Object *check_link_key_val(Scheme_Object *key, Scheme_Object *val) +{ + Scheme_Object *new_val = scheme_null, *a; + + if (!SCHEME_FALSEP(key) + && (!SCHEME_SYMBOLP(key) + || !scheme_is_module_path(key))) + return NULL; + + while (SCHEME_PAIRP(val)) { + a = SCHEME_CAR(val); + if (!SCHEME_PATH_STRINGP(a)) + return NULL; + a = TO_PATH(a); + if (!scheme_is_complete_path(SCHEME_PATH_VAL(a), + SCHEME_PATH_LEN(a), + SCHEME_PLATFORM_PATH_KIND)) + return NULL; + new_val = scheme_make_pair(a, new_val); + val = SCHEME_CDR(val); + } + + if (!SCHEME_NULLP(val)) + return NULL; + + return scheme_reverse(new_val); +} + +static Scheme_Object *collpaths_gen_p(int argc, Scheme_Object **argv, int rel_ok, int abs_ok, int sym_ok, int links_ok) { Scheme_Object *v = argv[0]; + Scheme_Object *new_hts = scheme_null; if (scheme_proper_list_length(v) < 0) return NULL; @@ -5945,6 +5979,36 @@ static Scheme_Object *collpaths_gen_p(int argc, Scheme_Object **argv, int rel_ok s = SCHEME_CAR(v); if (sym_ok && SAME_OBJ(s, same_symbol)) { /* ok */ + } else if (links_ok && SCHEME_FALSEP(s)) { + /* ok */ + } else if (links_ok && (SCHEME_CHAPERONE_HASHTP(s) + || SCHEME_CHAPERONE_HASHTRP(s) + || SCHEME_CHAPERONE_BUCKTP(s))) { + Scheme_Hash_Tree *new_ht; + Scheme_Object *key, *val, *idx, *a[2]; + + new_ht = scheme_make_hash_tree(0); + + a[0] = s; + idx = scheme_hash_table_iterate_start(1, a); + while (SCHEME_TRUEP(idx)) { + a[0] = s; + a[1] = idx; + key = scheme_hash_table_iterate_key(2, a); + + val = scheme_chaperone_hash_get(s, key); + if (val) { + val = check_link_key_val(key, val); + if (!val) return NULL; + new_ht = scheme_hash_tree_set(new_ht, key, val); + } + + a[0] = s; + a[1] = idx; + idx = scheme_hash_table_iterate_next(2, a); + } + + new_hts = scheme_make_pair((Scheme_Object *)new_ht, new_hts); } else { if (!SCHEME_PATH_STRINGP(s)) return NULL; @@ -5964,14 +6028,24 @@ static Scheme_Object *collpaths_gen_p(int argc, Scheme_Object **argv, int rel_ok if (!SCHEME_NULLP(v)) return NULL; + new_hts = scheme_reverse(new_hts); + /* Convert to list of paths: */ { Scheme_Object *last = NULL, *first = NULL, *p, *s; v = argv[0]; while (SCHEME_PAIRP(v)) { s = SCHEME_CAR(v); - if (!SCHEME_SYMBOLP(s)) + if (SCHEME_SYMBOLP(s)) { + /* ok */ + } else if (SCHEME_FALSEP(s)) { + /* ok */ + } else if (SCHEME_PATH_STRINGP(s)) { s = TO_PATH(s); + } else { + s = SCHEME_CAR(new_hts); + new_hts = SCHEME_CDR(new_hts); + } p = scheme_make_pair(s, scheme_null); if (!first) @@ -5991,7 +6065,7 @@ static Scheme_Object *collpaths_gen_p(int argc, Scheme_Object **argv, int rel_ok static Scheme_Object *collpaths_p(int argc, Scheme_Object **argv) { - return collpaths_gen_p(argc, argv, 0, 1, 0); + return collpaths_gen_p(argc, argv, 0, 1, 0, 0); } Scheme_Object *scheme_current_library_collection_paths(int argc, Scheme_Object *argv[]) { @@ -6006,11 +6080,32 @@ static Scheme_Object *current_library_collection_paths(int argc, Scheme_Object * -1, collpaths_p, "(listof (and/c path-string? complete-path?))", 1); } +static Scheme_Object *colllinks_p(int argc, Scheme_Object **argv) +{ + return collpaths_gen_p(argc, argv, 0, 1, 0, 1); +} + +Scheme_Object *scheme_current_library_collection_links(int argc, Scheme_Object *argv[]) { + return current_library_collection_links(argc, argv); +} + +static Scheme_Object *current_library_collection_links(int argc, Scheme_Object *argv[]) +{ + return scheme_param_config2("current-library-collection-links", + scheme_make_integer(MZCONFIG_COLLECTION_LINKS), + argc, argv, + -1, colllinks_p, + "(listof (or/c #f (and/c path-string? complete-path?)" + /**/ " (hash/c (or/c (and/c symbol? module-path?) #f)" + /**/ " (listof (and/c path-string? complete-path?)))))", + 1); +} + #endif static Scheme_Object *compiled_kind_p(int argc, Scheme_Object **argv) { - return collpaths_gen_p(argc, argv, 1, 0, 0); + return collpaths_gen_p(argc, argv, 1, 0, 0, 0); } static Scheme_Object *use_compiled_kind(int argc, Scheme_Object *argv[]) @@ -6023,7 +6118,7 @@ static Scheme_Object *use_compiled_kind(int argc, Scheme_Object *argv[]) static Scheme_Object *compiled_roots_p(int argc, Scheme_Object **argv) { - return collpaths_gen_p(argc, argv, 1, 1, 1); + return collpaths_gen_p(argc, argv, 1, 1, 1, 0); } Scheme_Object *scheme_compiled_file_roots(int argc, Scheme_Object *argv[]) @@ -6438,17 +6533,6 @@ void scheme_set_addon_dir(Scheme_Object *p) addon_dir = p; } -Scheme_Object *scheme_find_links_path(int argc, Scheme_Object *argv[]) -{ - if (inst_links_path) - return inst_links_path; - - REGISTER_SO(inst_links_path); - inst_links_path = scheme_apply(argv[0], 0, NULL); - - return inst_links_path; -} - /********************************************************************************/ #ifdef DOS_FILE_SYSTEM diff --git a/racket/src/racket/src/place.c b/racket/src/racket/src/place.c index fea37c4dd3..fa8e20b7f2 100644 --- a/racket/src/racket/src/place.c +++ b/racket/src/racket/src/place.c @@ -208,6 +208,7 @@ typedef struct Place_Start_Data { Scheme_Object *function; Scheme_Object *channel; Scheme_Object *current_library_collection_paths; + Scheme_Object *current_library_collection_links; Scheme_Object *compiled_roots; mzrt_sema *ready; /* malloc'ed item */ struct Scheme_Place_Object *place_obj; /* malloc'ed item */ @@ -274,6 +275,7 @@ Scheme_Object *scheme_place(int argc, Scheme_Object *args[]) { Place_Start_Data *place_data; mz_proc_thread *proc_thread; Scheme_Object *collection_paths; + Scheme_Object *collection_links; Scheme_Place_Object *place_obj; mzrt_sema *ready; struct NewGC *parent_gc; @@ -364,6 +366,9 @@ Scheme_Object *scheme_place(int argc, Scheme_Object *args[]) { collection_paths = scheme_current_library_collection_paths(0, NULL); place_data->current_library_collection_paths = collection_paths; + collection_links = scheme_current_library_collection_links(0, NULL); + place_data->current_library_collection_links = collection_links; + collection_paths = scheme_compiled_file_roots(0, NULL); place_data->compiled_roots = collection_paths; @@ -451,6 +456,7 @@ Scheme_Object *scheme_place(int argc, Scheme_Object *args[]) { } places_prepare_direct(place_data->current_library_collection_paths); + places_prepare_direct(place_data->current_library_collection_links); places_prepare_direct(place_data->compiled_roots); places_prepare_direct(place_data->channel); places_prepare_direct(place_data->module); @@ -2633,6 +2639,8 @@ static void *place_start_proc_after_stack(void *data_arg, void *stack_base) { a[0] = places_deep_direct_uncopy(place_data->current_library_collection_paths); scheme_current_library_collection_paths(1, a); + a[0] = places_deep_direct_uncopy(place_data->current_library_collection_links); + scheme_current_library_collection_links(1, a); a[0] = places_deep_direct_uncopy(place_data->compiled_roots); scheme_compiled_file_roots(1, a); scheme_seal_parameters(); diff --git a/racket/src/racket/src/schminc.h b/racket/src/racket/src/schminc.h index 7accf5b466..219e44d5a5 100644 --- a/racket/src/racket/src/schminc.h +++ b/racket/src/racket/src/schminc.h @@ -14,7 +14,7 @@ #define USE_COMPILED_STARTUP 1 -#define EXPECTED_PRIM_COUNT 1109 +#define EXPECTED_PRIM_COUNT 1110 #define EXPECTED_UNSAFE_COUNT 100 #define EXPECTED_FLFXNUM_COUNT 69 #define EXPECTED_EXTFL_COUNT 45 diff --git a/racket/src/racket/src/schpriv.h b/racket/src/racket/src/schpriv.h index 28937647ca..46f50265e8 100644 --- a/racket/src/racket/src/schpriv.h +++ b/racket/src/racket/src/schpriv.h @@ -4007,6 +4007,7 @@ Scheme_Object *scheme_symbol_to_string(Scheme_Object *sym); #define SCHEME_SYM_WEIRDP(o) (MZ_OPT_HASH_KEY(&((Scheme_Symbol *)(o))->iso) & 0x3) Scheme_Object *scheme_current_library_collection_paths(int argc, Scheme_Object *argv[]); +Scheme_Object *scheme_current_library_collection_links(int argc, Scheme_Object *argv[]); Scheme_Object *scheme_compiled_file_roots(int argc, Scheme_Object *argv[]); #ifdef MZ_USE_JIT diff --git a/racket/src/racket/src/schvers.h b/racket/src/racket/src/schvers.h index ad7f312299..0daa8b1d2a 100644 --- a/racket/src/racket/src/schvers.h +++ b/racket/src/racket/src/schvers.h @@ -13,12 +13,12 @@ consistently.) */ -#define MZSCHEME_VERSION "5.90.0.3" +#define MZSCHEME_VERSION "5.90.0.4" #define MZSCHEME_VERSION_X 5 #define MZSCHEME_VERSION_Y 90 #define MZSCHEME_VERSION_Z 0 -#define MZSCHEME_VERSION_W 3 +#define MZSCHEME_VERSION_W 4 #define MZSCHEME_VERSION_MAJOR ((MZSCHEME_VERSION_X * 100) + MZSCHEME_VERSION_Y) #define MZSCHEME_VERSION_MINOR ((MZSCHEME_VERSION_Z * 1000) + MZSCHEME_VERSION_W) diff --git a/racket/src/racket/src/startup.inc b/racket/src/racket/src/startup.inc index d235d26e8b..fea7f1730c 100644 --- a/racket/src/racket/src/startup.inc +++ b/racket/src/racket/src/startup.inc @@ -143,6 +143,7 @@ " collection-path" " collection-file-path" " find-library-collection-paths" +" find-library-collection-links" " path-list-string->path-list" " find-executable-path" " load/use-compiled" @@ -428,9 +429,8 @@ "((not(car l))(append orig-l(loop(cdr l))))" "(else(cons(coerce-to-path(car l))(loop(cdr l))))))" " orig-l))))" -"(define-values(all-links-paths)(find-links-path!" +"(define-values(find-library-collection-links)" "(lambda()" -"(if(use-collection-link-paths)" "(let*((d(find-config-dir))" "(ht(get-config-table d))" "(lf(coerce-to-path" @@ -438,21 +438,21 @@ "(build-path(or(hash-ref ht 'share-dir #f)" " (build-path 'up \"share\"))" " \"links.rktd\")))))" -"(cons(list->vector" +"(append" +"(list #f)" +"(if(and(use-user-specific-search-paths)" +"(use-collection-link-paths))" +"(list(build-path(find-system-path 'addon-dir)" +"(get-installation-name ht)" +" \"links.rktd\"))" +" null)" +"(if(use-collection-link-paths)" "(add-config-search" " ht" " 'links-search-files" -"(list lf)))" -"(build-path(find-system-path 'addon-dir)" -"(get-installation-name ht)" -" \"links.rktd\")))" -"(cons #() #f)))))" -"(define-values(links-paths)(car all-links-paths))" -"(define-values(user-links-path)(cdr all-links-paths))" -"(define-values(user-links-cache)(make-hasheq))" -"(define-values(user-links-stamp) #f)" -"(define-values(links-caches)(make-vector(vector-length links-paths)(make-hasheq)))" -"(define-values(links-stamps)(make-vector(vector-length links-paths) #f))" +"(list lf))" +" null)))))" +"(define-values(links-cache)(make-weak-hash))" "(define-values(stamp-prompt-tag)(make-continuation-prompt-tag 'stamp))" "(define-values(file->stamp)" "(lambda(path old-stamp)" @@ -511,7 +511,7 @@ "(or(not a)" "(not(car a)))))" "(define-values(get-linked-collections)" -"(lambda(user? ii)" +"(lambda(links-path)" "(call/ec(lambda(esc)" "(define-values(make-handler)" "(lambda(ts)" @@ -522,33 +522,21 @@ "(log-message l 'error" "(format" " \"error reading collection links file ~s: ~a\"" -"(cond" -"(user? user-links-path)" -"(else(vector-ref links-paths ii)))" +" links-path" "(exn-message exn))" "(current-continuation-marks))))" "(void))" "(when ts" -"(cond" -"(user?" -"(set! user-links-cache(make-hasheq))" -"(set! user-links-stamp ts))" -"(else" -"(vector-set! links-caches ii(make-hasheq))" -"(vector-set! links-stamps ii ts))))" +"(hash-set! links-cache links-path(cons #hasheq() ts)))" "(if(exn:fail? exn)" "(esc(make-hasheq))" " exn))))" "(with-continuation-mark" " exception-handler-key" "(make-handler #f)" -"(let*((a-links-path(cond" -"(user? user-links-path)" -"(else(vector-ref links-paths ii))))" -"(a-links-stamp(cond" -"(user? user-links-stamp)" -"(else(vector-ref links-stamps ii))))" -"(ts(file->stamp a-links-path a-links-stamp)))" +"(let*((links-stamp+cache(hash-ref links-cache links-path '(#f . #hasheq())))" +"(a-links-stamp(car links-stamp+cache))" +"(ts(file->stamp links-path a-links-stamp)))" "(if(not(equal? ts a-links-stamp))" "(with-continuation-mark" " exception-handler-key" @@ -557,7 +545,7 @@ "(lambda()" "(let((v(if(no-file-stamp? ts)" " null" -"(let((p(open-input-file a-links-path 'binary)))" +"(let((p(open-input-file links-path 'binary)))" "(dynamic-wind" " void" "(lambda() " @@ -580,7 +568,7 @@ " v))" " (error \"ill-formed content\"))" "(let((ht(make-hasheq))" -"(dir(let-values(((base name dir?)(split-path a-links-path)))" +"(dir(let-values(((base name dir?)(split-path links-path)))" " base)))" "(for-each" "(lambda(p)" @@ -611,17 +599,9 @@ "(hash-for-each" " ht" "(lambda(k v)(hash-set! ht k(reverse v))))" -"(cond" -"(user?" -"(set! user-links-cache ht)" -"(set! user-links-stamp ts))" -"(else" -"(vector-set! links-caches ii ht)" -"(vector-set! links-stamps ii ts)))" +"(hash-set! links-cache links-path(cons ts ht))" " ht)))))" -"(cond" -"(user? user-links-cache)" -"(else(vector-ref links-caches ii))))))))))" +"(cdr links-stamp+cache))))))))" "(define-values(normalize-collection-reference)" "(lambda(collection collection-path)" "(cond" @@ -645,29 +625,28 @@ "(lambda(fail collection collection-path file-name)" "(let-values(((collection collection-path)" "(normalize-collection-reference collection collection-path)))" -"(let((all-paths(let((sym(string->symbol(if(path? collection)" +"(let((all-paths(let((sym(string->symbol " +"(if(path? collection)" "(path->string collection)" -" collection)))" -"(links?(use-collection-link-paths)))" +" collection))))" +"(let loop((l(current-library-collection-links)))" +"(cond" +"((null? l) null)" +"((not(car l))" +"(append " +"(current-library-collection-paths)" +"(loop(cdr l))))" +"((hash?(car l))" "(append" -"(if(and links? " -"(use-user-specific-search-paths)" -" user-links-path)" -"(append" -"(let((ht(get-linked-collections #t 0)))" -"(append(hash-ref ht sym null)" -"(hash-ref ht #f null))))" -" null)" -"(if links?" -"(let loop((ii 0))" -"(if(ii . >= .(vector-length links-paths))" -" null" -"(let((ht(get-linked-collections #f ii)))" -"(append(hash-ref ht sym null)" +"(map box(hash-ref(car l) sym null))" +"(hash-ref(car l) #f null)" +"(loop(cdr l))))" +"(else" +"(let((ht(get-linked-collections(car l))))" +"(append " +"(hash-ref ht sym null)" "(hash-ref ht #f null)" -"(loop(add1 ii))))))" -" null)" -"(current-library-collection-paths)))))" +"(loop(cdr l))))))))))" "(define-values(done)" "(lambda(p)" "(if file-name(build-path p file-name) p)))" diff --git a/racket/src/racket/src/startup.rktl b/racket/src/racket/src/startup.rktl index 823815ca5e..ed190b28df 100644 --- a/racket/src/racket/src/startup.rktl +++ b/racket/src/racket/src/startup.rktl @@ -190,6 +190,7 @@ collection-path collection-file-path find-library-collection-paths + find-library-collection-links path-list-string->path-list find-executable-path load/use-compiled @@ -504,42 +505,37 @@ [else (cons (coerce-to-path (car l)) (loop (cdr l)))])) orig-l)))) - (define-values (all-links-paths) (find-links-path! - ;; This thunk is called once per place, and the result - ;; is remembered for later invocations. Otherwise, the - ;; search for the config file can trip over filesystem - ;; restrictions imposed by security guards. - (lambda () - ;; If `use-collection-link-paths' is disabled on - ;; startup, then don't try to read the configuration - ;; file, either. - (if (use-collection-link-paths) - (let* ([d (find-config-dir)] - [ht (get-config-table d)] - [lf (coerce-to-path - (or (hash-ref ht 'links-file #f) - (build-path (or (hash-ref ht 'share-dir #f) - (build-path 'up "share")) - "links.rktd")))]) - (cons (list->vector - (add-config-search - ht - 'links-search-files - (list lf))) - (build-path (find-system-path 'addon-dir) - (get-installation-name ht) - "links.rktd"))) - (cons #() #f))))) + (define-values (find-library-collection-links) + (lambda () + (let* ([d (find-config-dir)] + [ht (get-config-table d)] + [lf (coerce-to-path + (or (hash-ref ht 'links-file #f) + (build-path (or (hash-ref ht 'share-dir #f) + (build-path 'up "share")) + "links.rktd")))]) + (append + ;; `#f' means `current-library-collection-paths': + (list #f) + ;; user-specific + (if (and (use-user-specific-search-paths) + (use-collection-link-paths)) + (list (build-path (find-system-path 'addon-dir) + (get-installation-name ht) + "links.rktd")) + null) + ;; installation-wide: + (if (use-collection-link-paths) + (add-config-search + ht + 'links-search-files + (list lf)) + null))))) - (define-values (links-paths) (car all-links-paths)) - (define-values (user-links-path) (cdr all-links-paths)) - - (define-values (user-links-cache) (make-hasheq)) - (define-values (user-links-stamp) #f) - - (define-values (links-caches) (make-vector (vector-length links-paths) (make-hasheq))) - (define-values (links-stamps) (make-vector (vector-length links-paths) #f)) + ;; map from link-file names to cached information: + (define-values (links-cache) (make-weak-hash)) + ;; used for low-level except abort below: (define-values (stamp-prompt-tag) (make-continuation-prompt-tag 'stamp)) (define-values (file->stamp) @@ -606,7 +602,9 @@ (not (car a))))) (define-values (get-linked-collections) - (lambda (user? ii) + (lambda (links-path) + ;; Use/save information in `links-cache', relying on filesystem-change events + ;; or a copy of the file to detect when the cache is stale. (call/ec (lambda (esc) (define-values (make-handler) (lambda (ts) @@ -617,20 +615,12 @@ (log-message l 'error (format "error reading collection links file ~s: ~a" - (cond - [user? user-links-path] - [else (vector-ref links-paths ii)]) + links-path (exn-message exn)) (current-continuation-marks)))) (void)) (when ts - (cond - [user? - (set! user-links-cache (make-hasheq)) - (set! user-links-stamp ts)] - [else - (vector-set! links-caches ii (make-hasheq)) - (vector-set! links-stamps ii ts)])) + (hash-set! links-cache links-path (cons #hasheq() ts))) (if (exn:fail? exn) (esc (make-hasheq)) ;; re-raise the exception (which is probably a break) @@ -638,13 +628,9 @@ (with-continuation-mark exception-handler-key (make-handler #f) - (let* ([a-links-path (cond - [user? user-links-path] - [else (vector-ref links-paths ii)])] - [a-links-stamp (cond - [user? user-links-stamp] - [else (vector-ref links-stamps ii)])] - [ts (file->stamp a-links-path a-links-stamp)]) + (let* ([links-stamp+cache (hash-ref links-cache links-path '(#f . #hasheq()))] + [a-links-stamp (car links-stamp+cache)] + [ts (file->stamp links-path a-links-stamp)]) (if (not (equal? ts a-links-stamp)) (with-continuation-mark exception-handler-key @@ -653,7 +639,7 @@ (lambda () (let ([v (if (no-file-stamp? ts) null - (let ([p (open-input-file a-links-path 'binary)]) + (let ([p (open-input-file links-path 'binary)]) (dynamic-wind void (lambda () @@ -676,7 +662,7 @@ v)) (error "ill-formed content")) (let ([ht (make-hasheq)] - [dir (let-values ([(base name dir?) (split-path a-links-path)]) + [dir (let-values ([(base name dir?) (split-path links-path)]) base)]) (for-each (lambda (p) @@ -715,17 +701,9 @@ ht (lambda (k v) (hash-set! ht k (reverse v)))) ;; save table & file content: - (cond - [user? - (set! user-links-cache ht) - (set! user-links-stamp ts)] - [else - (vector-set! links-caches ii ht) - (vector-set! links-stamps ii ts)]) + (hash-set! links-cache links-path (cons ts ht)) ht))))) - (cond - [user? user-links-cache] - [else (vector-ref links-caches ii)])))))))) + (cdr links-stamp+cache)))))))) (define-values (normalize-collection-reference) (lambda (collection collection-path) @@ -752,32 +730,38 @@ (lambda (fail collection collection-path file-name) (let-values ([(collection collection-path) (normalize-collection-reference collection collection-path)]) - (let ([all-paths (let ([sym (string->symbol (if (path? collection) - (path->string collection) - collection))] - [links? (use-collection-link-paths)]) - (append - ;; list of paths and (box path)s: - (if (and links? - (use-user-specific-search-paths) - user-links-path) - (append - (let ([ht (get-linked-collections #t 0)]) - (append (hash-ref ht sym null) - (hash-ref ht #f null)))) - null) - ;; list of paths and (box path)s: - (if links? - (let loop ([ii 0]) - (if (ii . >= . (vector-length links-paths)) - null - (let ([ht (get-linked-collections #f ii)]) - (append (hash-ref ht sym null) - (hash-ref ht #f null) - (loop (add1 ii)))))) - null) - ;; list of paths: - (current-library-collection-paths)))]) + (let ([all-paths (let ([sym (string->symbol + (if (path? collection) + (path->string collection) + collection))]) + (let loop ([l (current-library-collection-links)]) + (cond + [(null? l) null] + [(not (car l)) + ;; #f is the point where we try the old parameter: + (append + (current-library-collection-paths) + (loop (cdr l)))] + [(hash? (car l)) + ;; A hash table maps a collection-name symbol + ;; to a list of paths. We need to wrap each path + ;; in a box, because that's how the code below + ;; knows that it's a single collection's directory. + ;; A hash table can also map #f to a list of paths + ;; for directories that hold collections. + (append + (map box (hash-ref (car l) sym null)) + (hash-ref (car l) #f null) + (loop (cdr l)))] + [else + (let ([ht (get-linked-collections (car l))]) + (append + ;; Table values are lists of paths and (box path)s, + ;; where a (box path) is a collection directory + ;; (instead of a directory containing collections). + (hash-ref ht sym null) + (hash-ref ht #f null) + (loop (cdr l))))])))]) (define-values (done) (lambda (p) (if file-name (build-path p file-name) p))) diff --git a/racket/src/racket/src/thread.c b/racket/src/racket/src/thread.c index c6e5adad9b..1bf1c914e6 100644 --- a/racket/src/racket/src/thread.c +++ b/racket/src/racket/src/thread.c @@ -669,7 +669,6 @@ void scheme_init_paramz(Scheme_Env *env) GLOBAL_PRIM_W_ARITY("check-for-break" , check_break_now , 0, 0, newenv); GLOBAL_PRIM_W_ARITY("reparameterize" , reparameterize , 1, 1, newenv); GLOBAL_PRIM_W_ARITY("make-custodian-from-main", make_custodian_from_main, 0, 0, newenv); - GLOBAL_PRIM_W_ARITY("find-links-path!" , scheme_find_links_path , 1, 1, newenv); scheme_finish_primitive_module(newenv); scheme_protect_primitive_provide(newenv, NULL); @@ -7454,6 +7453,7 @@ static void make_initial_config(Scheme_Thread *p) : scheme_false)); init_param(cells, paramz, MZCONFIG_COLLECTION_PATHS, scheme_null); + init_param(cells, paramz, MZCONFIG_COLLECTION_LINKS, scheme_null); { Scheme_Security_Guard *sg;