submodules: make .zo path stick for consistent independent loading

When a module is loaded from bytecode and then the value of
`use-compiled-file-paths' changes, an attempt to load a submodule
would fail, because source isn't used if the main module is
already declared, and the bytecode code is not used according to
`use-compiled-file-paths'. Make the bytecode path stick when it
is used once, so that submodule loads succeed, and make it work
even with `namespace-module-attach'.

The module-attach part of this protocol requires a change to the
API of a module name resolver: the notification mode gets two
arguments, instead of one, where the second argument is an
environment.
This commit is contained in:
Matthew Flatt 2012-07-17 08:49:53 -06:00
parent cc2c701a7d
commit c8f4ac6ae4
13 changed files with 686 additions and 540 deletions

View File

@ -660,35 +660,38 @@
(vector mapping-table library-table))
(letrec-values ([(embedded-resolver)
(case-lambda
[(name)
;; a notification; if the name matches one of our special names,
;; assume that it's from a namespace that has the declaration
;; [it would be better if the notifier told us the source]
(let-values ([(name) (if name (resolved-module-path-name name) #f)])
(let-values ([(a) (assq name mapping-table)])
(if a
(let-values ([(vec) (hash-ref regs (namespace-module-registry (current-namespace))
(lambda ()
(let-values ([(vec) (vector null null)])
(hash-set! regs (namespace-module-registry (current-namespace)) vec)
vec)))])
;; add mapping:
(vector-set! vec 0 (cons a (vector-ref vec 0)))
;; add library mappings:
(vector-set! vec 1 (append
(letrec-values ([(loop)
(lambda (l)
(if (null? l)
null
(if (eq? (cdar l) name)
(cons (car l) (loop (cdr l)))
(loop (cdr l)))))])
(loop library-table))
(vector-ref vec 1))))
(void))))
(orig name)]
[(name rel-to stx)
(embedded-resolver name rel-to stx #t)]
[(name from-namespace)
;; A notification
(if from-namespace
;; If the source namespace has a mapping for `name',
;; then copy it to the current namespace.
(let-values ([(name) (if name (resolved-module-path-name name) #f)])
(let-values ([(src-vec) (hash-ref regs (namespace-module-registry from-namespace) #f)])
(let-values ([(a) (if src-vec
(assq name (vector-ref src-vec 0))
#f)])
(if a
(let-values ([(vec) (hash-ref regs (namespace-module-registry (current-namespace))
(lambda ()
(let-values ([(vec) (vector null null)])
(hash-set! regs (namespace-module-registry (current-namespace)) vec)
vec)))])
;; add mapping:
(vector-set! vec 0 (cons a (vector-ref vec 0)))
;; add library mappings:
(vector-set! vec 1 (append
(letrec-values ([(loop)
(lambda (l)
(if (null? l)
null
(if (eq? (cdar l) name)
(cons (car l) (loop (cdr l)))
(loop (cdr l)))))])
(loop library-table))
(vector-ref vec 1))))
(void)))))
(void))
(orig name from-namespace)]
[(name rel-to stx load?)
(if (not (module-path? name))
;; Bad input

View File

@ -288,7 +288,21 @@ path of the loaded file, otherwise the
If the original @racket[_file] is loaded or a @filepath{.zo} variant is
loaded, the @tech{load handler} is called to load the file. If any
other kind of file is loaded, the @tech{extension-load handler} is
called.}
called.
When the default @tech{compiled-load handler} loads a module from a
bytecode (i.e., @filepath{.zo}) file, the handler records the bytecode
file path in the current namespace's @tech{module registry}. More
specifically, the handler records the path for the top-level module of
the loaded module, which is an enclosing module if the loaded module
is a submodule. Thereafter, loads via the default @tech{compiled-load
handler} for modules within the same top-level module use the recorded
file, independent of the file that otherwise would be selected by the
@tech{compiled-load handler} (e.g., even if the
@racket[use-compiled-file-paths] parameter value changes). The default
@tech{module name resolver} transfers bytecode-file information when a
module declaration is attached to a new namespace. This protocol supports
independent but consistent loading of submodules from bytecode files.}
@defproc[(load/use-compiled [file path-string?]) any]{

View File

@ -63,7 +63,7 @@ the grammar for @racket[_module-path] for @racket[require],
@defparam[current-module-name-resolver proc
(case->
(resolved-module-path? . -> . any)
(resolved-module-path? (or/c #f namespace?) . -> . any)
(module-path?
(or/c #f resolved-module-path?)
(or/c #f syntax?)
@ -85,12 +85,22 @@ an absolute symbol or @tech{resolved module path}.
A @tech{module name resolver} takes one and four arguments:
@itemize[
@item{When given one argument, it is a name for a module declaration
that is already loaded. Such a call to the module name resolver is a
notification that the corresponding module does not need to be
loaded (for the current namespace, or any other namespace that
shares the same module registry). The module name resolver's result
is ignored.}
@item{When given two arguments, the first is a name for a module that
is now declared in the current namespace, and the second is optionally
a namespace from which the declaration was copied.
The module name resolver's result in this case is ignored.
The current module name resolver is called with two arguments by
@racket[namespace-attach-module] or
@racket[namespace-attach-module-declaration] to notify the resolver
that a module declaration was attached to the current namespace (and
should not be loaded in the future for the namespace's @tech{module registry}).
Evaluation of a module declaration also calls the current module
name resolver with two arguments, where the first is the declared
module and the second is @racket[#f]. No other Racket operation
invokes the module name resolver with two arguments, but other tools
(such as DrRacket) might call this resolver in this mode to avoid
redundant module loads.}
@item{When given four arguments, the first is a module path,
equivalent to a quoted @racket[_module-path] for @racket[require].
@ -107,7 +117,7 @@ A @tech{module name resolver} takes one and four arguments:
]
For the second case, the standard module name resolver keeps a
per-registry table of loaded module name. If a resolved module path is
table per @tech{module registry} containing loaded module name. If a resolved module path is
not in the table, and @racket[#f] is not provided as the fourth
argument to the @tech{module name resolver}, then the name is put into
the table and the corresponding file is loaded with a variant of
@ -124,20 +134,18 @@ already exists; if such a continuation mark does exist in the current
continuation, then the @exnraise[exn:fail] with a message about a
dependency cycle.
The default module name resolver cooperates with the default
@tech{compiled-load handler}: on a module-attach notification,
bytecode-file information recorded by the @tech{compiled-load handler}
for the source namespace's @tech{module registry} is transferred to
the target namespace's @tech{module registry}.
Module loading is suppressed (i.e., @racket[#f] is supplied as a fourth
argument to the module name resolver) when resolving module paths in
@tech{syntax objects} (see @secref["stxobj-model"]). When a
@tech{syntax object} is manipulated, the current namespace might not
match the original namespace for the syntax object, and the module
should not necessarily be loaded in the current namespace.
The current module name resolver is called with a single argument by
@racket[namespace-attach-module] to notify the resolver that a module
was attached to the current namespace (and should not be loaded in the
future for the namespace's registry). No other Racket operation
invokes the module name resolver with a single argument, but other
tools (such as DrRacket) might call this resolver in this mode to
avoid redundant module loads.}
should not necessarily be loaded in the current namespace.}
@defparam[current-module-declare-name name (or/c resolved-module-path? #f)]{

View File

@ -528,7 +528,7 @@
(read-syntax path
(open-input-string "#lang tests/racket (provide x) (define x 1)"
path)))
((current-module-name-resolver) (current-module-declare-name))))
((current-module-name-resolver) (current-module-declare-name) #f)))
(test '#(tests/racket/lang/getinfo get-info closure-data)
module->language-info 'tests/racket/langm))))

View File

@ -1234,10 +1234,10 @@
(parameterize ([current-namespace (make-base-namespace)]
[current-module-name-resolver
(case-lambda
[(name)
[(name ns)
(if (equal? name "a")
(void)
(old name))]
(old name ns))]
[(name _ __) (make-resolved-module-path 'huh?)]
[(name base stx load?)
(if (equal? name "a")

View File

@ -635,6 +635,33 @@
(try-submods '(xa xb))
(try-submods '(test main)))
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Check stickiness of submodule-from-bytecode loading:
(let ()
(define e `(module e racket/base
(module sub1 racket/base (provide x) (define x 'sub1))
(module sub2 racket/base (provide x) (define x 'sub2))
(module sub3 racket/base (provide x) (define x 'sub3))))
(define fn (build-path temp-dir "has-submod2.rkt"))
(define dir (build-path temp-dir "compiled"))
(define fn-zo (build-path dir "has-submod2_rkt.zo"))
(unless (directory-exists? dir) (make-directory dir))
(with-output-to-file fn
#:exists 'truncate
(lambda () (write e)))
(with-output-to-file fn-zo
#:exists 'truncate
(lambda () (write (compile e))))
(test 'sub1 dynamic-require `(submod ,fn sub1) 'x)
(parameterize ([use-compiled-file-paths null])
(test 'sub2 dynamic-require `(submod ,fn sub2) 'x))
(let ([ns (current-namespace)])
(parameterize ([current-namespace (make-base-namespace)]
[use-compiled-file-paths null])
(namespace-attach-module ns `(submod ,fn sub1))
(test 'sub3 dynamic-require `(submod ,fn sub3) 'x))))
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Delete the temp-dir

View File

@ -1828,13 +1828,13 @@
[resolved-module-path-name (-> -Resolved-Module-Path (Un -Path -Symbol))]
[module-path? (asym-pred Univ B (-FS (-filter -Module-Path 0) -top))]
[current-module-name-resolver (-Param (cl->* (-Resolved-Module-Path . -> . Univ)
[current-module-name-resolver (-Param (cl->* (-Resolved-Module-Path Univ . -> . Univ)
((Un -Module-Path -Path)
(-opt -Resolved-Module-Path)
(-opt (-Syntax Univ))
-Boolean
. -> . -Resolved-Module-Path))
(cl->* (-Resolved-Module-Path . -> . Univ)
(cl->* (-Resolved-Module-Path Univ . -> . Univ)
((Un -Module-Path -Path)
(-opt -Resolved-Module-Path)
(-opt (-Syntax Univ))

View File

@ -1,3 +1,7 @@
Version 5.3.0.15
Changed module name resolver notification mode to supply
a source namespace for attaches
Version 5.3.0.12
racket/base: added impersonate-continuation-mark-key,
chaperone-continuation-mark-key, make-continuation-mark-key,

View File

@ -1,5 +1,5 @@
{
SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,53,46,51,46,48,46,49,52,84,0,0,0,0,0,0,0,0,0,
SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,53,46,51,46,48,46,49,53,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,19,0,26,0,29,0,36,0,43,0,47,0,60,0,65,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,12 +16,12 @@
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,228,83,0,0,95,159,2,17,36,36,159,2,16,36,36,159,2,16,36,36,
240,250,83,0,0,95,159,2,17,36,36,159,2,16,36,36,159,2,16,36,36,
16,20,2,10,2,2,2,3,2,2,2,5,2,2,2,6,2,2,2,7,2,
2,2,8,2,2,2,9,2,2,2,4,2,2,2,11,2,2,2,12,2,2,
97,37,11,8,240,228,83,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,228,83,0,0,16,0,96,11,
11,8,240,228,83,0,0,16,0,18,98,64,104,101,114,101,13,16,6,36,2,
97,37,11,8,240,250,83,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,250,83,0,0,16,0,96,11,
11,8,240,250,83,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,163,4,195,249,
22,156,4,80,158,39,36,251,22,89,2,18,248,22,104,199,12,249,22,79,2,
19,248,22,106,201,27,248,22,163,4,195,249,22,156,4,80,158,39,36,251,22,
@ -30,14 +30,14 @@
22,81,194,248,22,80,193,249,22,156,4,80,158,39,36,251,22,89,2,18,248,
22,80,199,249,22,79,2,8,248,22,81,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,53,56,49,57,16,4,11,11,2,21,3,1,8,101,110,
118,49,53,56,50,48,27,248,22,81,248,22,163,4,196,28,248,22,87,193,20,
1,8,101,110,118,49,53,56,51,56,16,4,11,11,2,21,3,1,8,101,110,
118,49,53,56,51,57,27,248,22,81,248,22,163,4,196,28,248,22,87,193,20,
14,159,37,36,37,28,248,22,87,248,22,81,194,248,22,80,193,249,22,156,4,
80,158,39,36,250,22,89,2,22,248,22,89,249,22,89,248,22,89,2,23,248,
22,80,201,251,22,89,2,18,2,23,2,23,249,22,79,2,5,248,22,81,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,53,56,50,50,16,4,11,
11,2,21,3,1,8,101,110,118,49,53,56,50,51,248,22,163,4,193,27,248,
29,16,4,11,11,2,20,3,1,8,101,110,118,49,53,56,52,49,16,4,11,
11,2,21,3,1,8,101,110,118,49,53,56,52,50,248,22,163,4,193,27,248,
22,163,4,194,249,22,79,248,22,89,248,22,80,196,248,22,81,195,27,248,22,
81,248,22,163,4,23,197,1,249,22,156,4,80,158,39,36,28,248,22,64,248,
22,157,4,248,22,80,23,198,2,27,249,22,2,32,0,88,163,8,36,37,43,
@ -67,8 +67,8 @@
22,89,2,18,28,249,22,151,9,248,22,157,4,248,22,80,200,64,101,108,115,
101,10,248,22,80,197,250,22,90,2,22,9,248,22,81,200,249,22,79,2,3,
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,53,56,52,53,16,
4,11,11,2,21,3,1,8,101,110,118,49,53,56,52,54,18,158,94,10,64,
30,8,29,16,4,11,11,2,20,3,1,8,101,110,118,49,53,56,54,52,16,
4,11,11,2,21,3,1,8,101,110,118,49,53,56,54,53,18,158,94,10,64,
118,111,105,100,8,48,27,248,22,81,248,22,163,4,196,249,22,156,4,80,158,
39,36,28,248,22,64,248,22,157,4,248,22,80,197,250,22,89,2,28,248,22,
89,248,22,80,199,248,22,104,198,27,248,22,157,4,248,22,80,197,250,22,89,
@ -99,7 +99,7 @@
EVAL_ONE_SIZED_STR((char *)expr, 2029);
}
{
SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,53,46,51,46,48,46,49,52,84,0,0,0,0,0,0,0,0,0,
SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,53,46,51,46,48,46,49,53,84,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,115,0,0,0,1,0,0,8,0,21,
0,26,0,43,0,65,0,94,0,109,0,127,0,139,0,155,0,169,0,191,0,
207,0,224,0,246,0,1,1,7,1,16,1,23,1,30,1,42,1,58,1,82,
@ -362,7 +362,7 @@
22,164,2,195,88,163,8,36,38,48,11,9,223,3,33,89,28,197,86,94,20,
18,159,11,80,158,42,48,193,20,18,159,11,80,158,42,49,196,86,94,20,18,
159,11,80,158,42,54,193,20,18,159,11,80,158,42,55,196,193,28,193,80,158,
38,48,80,158,38,54,248,22,9,88,163,8,32,37,8,40,8,240,0,120,47,
38,48,80,158,38,54,248,22,8,88,163,8,32,37,8,40,8,240,0,120,47,
0,9,224,1,2,33,90,0,7,35,114,120,34,47,43,34,28,248,22,141,7,
23,195,2,27,249,22,166,15,2,92,196,28,192,28,249,22,191,3,248,22,103,
195,248,22,181,3,248,22,144,7,198,249,22,7,250,22,163,7,199,36,248,22,
@ -529,7 +529,7 @@
EVAL_ONE_SIZED_STR((char *)expr, 8952);
}
{
SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,53,46,51,46,48,46,49,52,84,0,0,0,0,0,0,0,0,0,
SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,53,46,51,46,48,46,49,53,84,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,1,0,0,15,0,40,
0,57,0,75,0,97,0,120,0,140,0,162,0,169,0,176,0,183,0,0,0,
179,1,0,0,74,35,37,112,108,97,99,101,45,115,116,114,117,99,116,1,23,
@ -556,24 +556,25 @@
EVAL_ONE_SIZED_STR((char *)expr, 502);
}
{
SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,53,46,51,46,48,46,49,52,84,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,83,0,0,0,1,0,0,7,0,18,
0,45,0,51,0,64,0,73,0,80,0,102,0,124,0,150,0,158,0,170,0,
185,0,201,0,219,0,239,0,251,0,11,1,34,1,46,1,77,1,84,1,89,
1,94,1,100,1,104,1,122,1,127,1,132,1,141,1,146,1,161,1,168,1,
173,1,177,1,182,1,189,1,200,1,207,1,215,1,224,1,232,1,33,2,153,
2,235,2,0,3,21,3,51,3,81,3,139,3,197,3,246,3,39,4,130,10,
181,10,244,10,7,11,21,11,179,11,192,11,70,12,112,13,236,13,242,13,14,
14,27,14,189,14,196,14,250,14,16,15,36,15,91,15,101,15,115,15,152,15,
250,15,252,15,99,16,24,24,77,24,101,24,125,24,0,0,53,28,0,0,66,
35,37,98,111,111,116,70,100,108,108,45,115,117,102,102,105,120,1,25,100,101,
102,97,117,108,116,45,108,111,97,100,47,117,115,101,45,99,111,109,112,105,108,
101,100,65,113,117,111,116,101,29,94,2,4,67,35,37,117,116,105,108,115,11,
68,35,37,112,97,114,97,109,122,29,94,2,4,2,6,11,1,20,112,97,114,
97,109,101,116,101,114,105,122,97,116,105,111,110,45,107,101,121,1,20,100,101,
102,97,117,108,116,45,114,101,97,100,101,114,45,103,117,97,114,100,1,24,45,
109,111,100,117,108,101,45,104,97,115,104,45,116,97,98,108,101,45,116,97,98,
108,101,67,67,65,67,72,69,45,78,71,45,112,97,116,104,45,99,97,99,104,
SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,53,46,51,46,48,46,49,53,84,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,85,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,63,1,94,1,101,
1,106,1,111,1,117,1,121,1,139,1,144,1,149,1,158,1,163,1,178,1,
185,1,190,1,194,1,199,1,206,1,217,1,224,1,232,1,241,1,249,1,50,
2,170,2,252,2,17,3,38,3,68,3,98,3,156,3,214,3,7,4,56,4,
157,11,175,11,226,11,33,12,52,12,66,12,224,12,237,12,115,13,157,14,180,
15,186,15,214,15,227,15,133,16,140,16,194,16,216,16,236,16,35,17,45,17,
59,17,96,17,194,17,196,17,46,18,229,25,26,26,50,26,74,26,0,0,35,
30,0,0,66,35,37,98,111,111,116,70,100,108,108,45,115,117,102,102,105,120,
1,25,100,101,102,97,117,108,116,45,108,111,97,100,47,117,115,101,45,99,111,
109,112,105,108,101,100,65,113,117,111,116,101,68,35,37,112,97,114,97,109,122,
29,94,2,4,2,5,11,1,20,112,97,114,97,109,101,116,101,114,105,122,97,
116,105,111,110,45,107,101,121,29,94,2,4,67,35,37,117,116,105,108,115,11,
1,24,45,109,111,100,117,108,101,45,104,97,115,104,45,116,97,98,108,101,45,
116,97,98,108,101,76,114,101,103,105,115,116,101,114,45,122,111,45,112,97,116,
104,1,20,100,101,102,97,117,108,116,45,114,101,97,100,101,114,45,103,117,97,
114,100,67,67,65,67,72,69,45,78,71,45,112,97,116,104,45,99,97,99,104,
101,74,112,97,116,104,45,99,97,99,104,101,45,103,101,116,75,112,97,116,104,
45,99,97,99,104,101,45,115,101,116,33,77,45,108,111,97,100,105,110,103,45,
102,105,108,101,110,97,109,101,79,45,108,111,97,100,105,110,103,45,112,114,111,
@ -582,338 +583,361 @@
45,114,101,108,97,116,105,118,101,45,115,116,114,105,110,103,71,111,114,105,103,
45,112,97,114,97,109,122,1,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,29,94,2,4,
2,6,11,64,98,111,111,116,64,115,101,97,108,5,4,46,114,107,116,63,108,
2,5,11,64,98,111,111,116,64,115,101,97,108,5,4,46,114,107,116,63,108,
105,98,77,108,111,97,100,47,117,115,101,45,99,111,109,112,105,108,101,100,64,
115,97,109,101,5,3,46,122,111,6,6,6,110,97,116,105,118,101,64,108,111,
111,112,6,12,12,109,111,100,117,108,101,45,112,97,116,104,63,66,115,117,98,
109,111,100,6,2,2,46,46,6,1,1,46,64,102,105,108,101,66,112,108,97,
110,101,116,6,8,8,109,97,105,110,46,114,107,116,6,4,4,46,114,107,116,
67,105,103,110,111,114,101,100,249,22,14,195,80,159,38,49,38,249,80,159,38,
52,39,195,10,90,159,39,11,89,161,39,36,11,248,22,133,15,197,86,95,23,
67,105,103,110,111,114,101,100,249,22,14,195,80,159,38,50,38,249,80,159,38,
53,39,195,10,90,159,39,11,89,161,39,36,11,248,22,133,15,197,86,95,23,
195,1,23,193,1,28,249,22,164,15,0,11,35,114,120,34,91,46,93,115,115,
36,34,248,22,181,14,23,197,1,249,80,159,41,56,39,198,2,25,196,27,28,
23,195,2,28,249,22,151,9,23,197,2,80,158,39,50,86,94,23,195,1,80,
158,37,51,27,248,22,148,5,23,197,2,27,28,248,22,77,23,195,2,248,22,
36,34,248,22,181,14,23,197,1,249,80,159,41,57,39,198,2,26,196,27,28,
23,195,2,28,249,22,151,9,23,197,2,80,158,39,51,86,94,23,195,1,80,
158,37,52,27,248,22,148,5,23,197,2,27,28,248,22,77,23,195,2,248,22,
80,23,195,1,23,194,1,28,248,22,176,14,23,194,2,90,159,39,11,89,161,
39,36,11,248,22,133,15,23,197,1,86,95,20,18,159,11,80,158,42,50,199,
20,18,159,11,80,158,42,51,192,192,11,11,28,23,193,2,192,86,94,23,193,
39,36,11,248,22,133,15,23,197,1,86,95,20,18,159,11,80,158,42,51,199,
20,18,159,11,80,158,42,52,192,192,11,11,28,23,193,2,192,86,94,23,193,
1,27,247,22,172,5,28,192,192,247,22,153,15,28,24,194,2,12,20,13,159,
80,159,36,55,37,80,158,36,53,89,161,37,37,10,249,22,190,4,21,94,2,
26,6,19,19,112,108,97,110,101,116,47,114,101,115,111,108,118,101,114,46,114,
80,159,36,56,37,80,158,36,54,89,161,37,37,10,249,22,190,4,21,94,2,
27,6,19,19,112,108,97,110,101,116,47,114,101,115,111,108,118,101,114,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,250,22,130,15,23,197,1,23,199,1,
249,80,159,43,39,39,23,198,1,2,29,250,22,130,15,23,197,1,23,199,1,
249,80,159,43,39,39,23,198,1,2,29,252,22,130,15,23,199,1,23,201,1,
2,30,247,22,164,8,249,80,159,45,39,39,23,200,1,80,159,45,36,38,252,
22,130,15,23,199,1,23,201,1,2,30,247,22,164,8,249,80,159,45,39,39,
23,200,1,80,159,45,36,38,27,252,22,130,15,23,200,1,23,202,1,2,30,
247,22,164,8,249,80,159,46,39,39,23,201,1,80,159,46,36,38,27,250,22,
249,80,159,43,42,39,23,198,1,2,30,250,22,130,15,23,197,1,23,199,1,
249,80,159,43,42,39,23,198,1,2,30,252,22,130,15,23,199,1,23,201,1,
2,31,247,22,164,8,249,80,159,45,42,39,23,200,1,80,159,45,36,38,252,
22,130,15,23,199,1,23,201,1,2,31,247,22,164,8,249,80,159,45,42,39,
23,200,1,80,159,45,36,38,27,252,22,130,15,23,200,1,23,202,1,2,31,
247,22,164,8,249,80,159,46,42,39,23,201,1,80,159,46,36,38,27,250,22,
147,15,196,11,32,0,88,163,8,36,36,41,11,9,222,11,28,192,249,22,79,
195,194,11,27,252,22,130,15,23,200,1,23,202,1,2,30,247,22,164,8,249,
80,159,46,39,39,23,201,1,80,159,46,36,38,27,250,22,147,15,196,11,32,
195,194,11,27,252,22,130,15,23,200,1,23,202,1,2,31,247,22,164,8,249,
80,159,46,42,39,23,201,1,80,159,46,36,38,27,250,22,147,15,196,11,32,
0,88,163,8,36,36,41,11,9,222,11,28,192,249,22,79,195,194,11,27,250,
22,130,15,23,198,1,23,200,1,249,80,159,44,39,39,23,199,1,2,29,27,
22,130,15,23,198,1,23,200,1,249,80,159,44,42,39,23,199,1,2,30,27,
250,22,147,15,196,11,32,0,88,163,8,36,36,41,11,9,222,11,28,192,249,
22,79,195,194,11,27,250,22,130,15,23,198,1,23,200,1,249,80,159,44,39,
39,23,199,1,2,29,27,250,22,147,15,196,11,32,0,88,163,8,36,36,41,
11,9,222,11,28,192,249,22,79,195,194,11,86,95,28,248,80,159,37,38,39,
23,195,2,12,250,22,188,9,2,27,6,12,12,112,97,116,104,45,115,116,114,
22,79,195,194,11,27,250,22,130,15,23,198,1,23,200,1,249,80,159,44,42,
39,23,199,1,2,30,27,250,22,147,15,196,11,32,0,88,163,8,36,36,41,
11,9,222,11,28,192,249,22,79,195,194,11,86,95,28,248,80,159,37,40,39,
23,195,2,12,250,22,188,9,2,28,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,129,4,248,22,92,23,198,2,37,28,28,248,
22,64,248,22,80,23,197,2,10,248,22,149,9,248,22,80,23,197,2,249,22,
4,22,64,248,22,81,23,198,2,11,11,11,10,12,250,22,188,9,2,27,6,
4,22,64,248,22,81,23,198,2,11,11,11,10,12,250,22,188,9,2,28,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,90,159,46,11,89,161,37,36,
11,28,248,22,136,15,23,205,2,23,204,2,27,247,22,172,5,28,23,193,2,
249,22,137,15,23,207,2,23,195,1,23,205,2,89,161,39,37,11,248,22,133,
15,23,205,1,86,94,23,196,1,89,161,38,40,11,28,23,205,2,27,248,22,
181,14,23,197,2,27,248,22,135,8,23,195,2,28,28,249,22,131,4,23,195,
2,40,249,22,138,8,2,25,249,22,141,8,23,198,2,249,22,183,3,23,199,
2,40,11,249,22,7,23,199,2,248,22,185,14,249,22,142,8,250,22,141,8,
23,202,1,36,249,22,183,3,23,203,1,40,5,3,46,115,115,249,22,7,23,
199,2,11,249,22,7,23,197,2,11,89,161,37,42,11,28,249,22,151,9,23,
199,2,23,197,2,23,193,2,249,22,130,15,23,196,2,23,199,2,89,161,37,
43,11,28,23,198,2,28,249,22,151,9,23,200,2,23,197,1,23,193,1,86,
94,23,193,1,249,22,130,15,23,196,2,23,200,2,86,94,23,195,1,11,89,
161,37,44,11,28,249,22,151,9,23,196,2,68,114,101,108,97,116,105,118,101,
86,94,23,194,1,2,28,23,194,1,89,161,37,45,11,247,22,155,15,27,250,
22,147,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,147,15,23,207,2,11,32,0,88,163,8,
36,36,41,11,9,222,11,28,192,249,22,79,23,206,2,194,11,11,27,28,23,
195,2,23,195,2,23,194,2,27,88,163,36,37,50,44,62,122,111,225,15,13,
9,33,46,27,88,163,36,37,50,44,66,97,108,116,45,122,111,225,16,14,11,
33,47,27,88,163,36,37,52,45,9,225,17,15,11,33,48,27,88,163,36,37,
52,45,9,225,18,16,13,33,49,27,28,23,200,2,23,200,2,248,22,149,9,
115,121,109,98,111,108,63,41,41,41,23,197,2,27,28,23,196,2,247,22,188,
4,11,27,28,23,194,2,250,22,160,2,80,158,41,41,248,22,189,15,247,22,
151,13,11,11,27,28,23,194,2,250,22,160,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,
189,4,248,22,104,196,27,248,22,113,194,20,13,159,80,159,40,38,37,250,80,
159,43,39,37,249,22,33,11,80,159,45,38,37,22,172,5,28,248,22,176,14,
23,197,2,23,196,1,86,94,23,196,1,247,22,153,15,249,247,22,170,5,248,
22,80,196,200,86,94,23,193,1,90,159,46,11,89,161,37,36,11,28,248,22,
136,15,23,208,2,23,207,2,27,247,22,172,5,28,23,193,2,249,22,137,15,
23,210,2,23,195,1,23,208,2,89,161,39,37,11,248,22,133,15,23,208,1,
86,94,23,196,1,89,161,38,40,11,28,23,208,2,27,248,22,181,14,23,197,
2,27,248,22,135,8,23,195,2,28,28,249,22,131,4,23,195,2,40,249,22,
138,8,2,26,249,22,141,8,23,198,2,249,22,183,3,23,199,2,40,11,249,
22,7,23,199,2,248,22,185,14,249,22,142,8,250,22,141,8,23,202,1,36,
249,22,183,3,23,203,1,40,5,3,46,115,115,249,22,7,23,199,2,11,249,
22,7,23,197,2,11,89,161,37,42,11,28,249,22,151,9,23,199,2,23,197,
2,23,193,2,249,22,130,15,23,196,2,23,199,2,89,161,37,43,11,28,23,
198,2,28,249,22,151,9,23,200,2,23,197,1,23,193,1,86,94,23,193,1,
249,22,130,15,23,196,2,23,200,2,86,94,23,195,1,11,89,161,37,44,11,
28,249,22,151,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,155,15,27,250,22,147,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,147,15,23,207,2,11,32,0,88,163,8,36,36,41,11,
9,222,11,28,192,249,22,79,23,206,2,194,11,11,27,28,23,195,2,23,195,
2,23,194,2,27,88,163,36,37,50,8,64,62,122,111,225,18,13,9,33,47,
27,88,163,36,37,50,8,64,66,97,108,116,45,122,111,225,19,14,11,33,48,
27,88,163,36,37,52,8,65,9,225,20,15,11,33,49,27,88,163,36,37,52,
8,65,9,225,21,16,13,33,50,27,28,23,200,2,23,200,2,248,22,149,9,
23,200,2,27,28,23,208,2,28,23,200,2,86,94,23,201,1,23,200,2,248,
22,149,9,23,202,1,11,27,28,23,195,2,28,23,197,1,27,249,22,5,88,
163,8,36,37,53,45,9,225,24,22,18,33,50,23,216,2,27,28,23,202,2,
11,193,28,192,192,28,193,28,23,202,2,28,249,22,131,4,248,22,81,196,248,
22,81,23,205,2,193,11,11,11,11,86,94,23,197,1,11,28,23,193,2,86,
105,23,213,1,23,211,1,23,210,1,23,209,1,23,208,1,23,201,1,23,200,
1,23,199,1,23,198,1,23,196,1,23,195,1,23,194,1,20,13,159,80,159,
57,40,37,250,80,159,8,24,41,37,249,22,33,11,80,159,8,26,40,37,22,
189,4,11,20,13,159,80,159,57,40,37,250,80,159,8,24,41,37,249,22,33,
11,80,159,8,26,40,37,22,172,5,28,248,22,176,14,23,216,2,23,215,1,
86,94,23,215,1,247,22,153,15,249,247,22,159,15,248,22,80,195,23,25,86,
94,23,193,1,27,28,23,195,2,28,23,197,1,27,249,22,5,88,163,8,36,
37,53,45,9,225,25,23,20,33,51,23,217,2,27,28,23,204,2,11,193,28,
192,192,28,193,28,203,28,249,22,131,4,248,22,81,196,248,22,81,206,193,11,
11,11,11,86,94,23,197,1,11,28,23,193,2,86,102,23,214,1,23,211,1,
23,210,1,23,209,1,23,201,1,23,200,1,23,199,1,23,196,1,23,195,1,
20,13,159,80,159,58,40,37,250,80,159,8,25,41,37,249,22,33,11,80,159,
8,27,40,37,22,189,4,23,215,1,20,13,159,80,159,58,40,37,250,80,159,
8,25,41,37,249,22,33,11,80,159,8,27,40,37,22,172,5,28,248,22,176,
14,23,217,2,23,216,1,86,94,23,216,1,247,22,153,15,249,247,22,159,15,
248,22,80,195,23,26,86,94,23,193,1,27,28,23,197,2,28,23,201,1,27,
249,22,5,20,20,94,88,163,8,36,37,51,44,9,225,26,24,20,33,52,23,
213,1,23,218,2,27,28,23,204,2,11,193,28,192,192,28,193,28,23,204,2,
28,249,22,131,4,248,22,81,196,248,22,81,23,207,2,193,11,11,11,86,94,
23,210,1,11,86,94,23,201,1,11,28,23,193,2,86,101,23,215,1,23,213,
1,23,212,1,23,211,1,23,202,1,23,200,1,23,197,1,23,196,1,20,13,
159,80,159,59,40,37,250,80,159,8,26,41,37,249,22,33,11,80,159,8,28,
40,37,22,189,4,11,20,13,159,80,159,59,40,37,250,80,159,8,26,41,37,
249,22,33,11,80,159,8,28,40,37,22,172,5,28,248,22,176,14,23,218,2,
23,217,1,86,94,23,217,1,247,22,153,15,249,247,22,170,5,248,22,80,195,
23,27,86,94,23,193,1,27,28,23,197,1,28,23,201,1,27,249,22,5,20,
20,94,88,163,8,36,37,51,44,9,225,27,25,22,33,53,23,215,1,23,219,
1,27,28,23,205,2,11,193,28,192,192,28,193,28,204,28,249,22,131,4,248,
22,81,196,248,22,81,23,15,193,11,11,11,86,95,23,216,1,23,212,1,11,
86,94,23,201,1,11,28,23,193,2,86,95,23,213,1,23,198,1,20,13,159,
80,159,8,24,40,37,250,80,159,8,27,41,37,249,22,33,11,80,159,8,29,
40,37,22,189,4,23,217,1,20,13,159,80,159,8,24,40,37,250,80,159,8,
27,41,37,249,22,33,11,80,159,8,29,40,37,22,172,5,28,248,22,176,14,
23,219,2,23,218,1,86,94,23,218,1,247,22,153,15,249,247,22,170,5,248,
22,80,195,23,28,86,94,23,193,1,28,28,248,22,77,23,220,2,248,22,80,
23,220,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,221,2,248,22,149,9,248,22,188,14,23,
195,2,11,12,20,13,159,80,159,8,25,40,37,250,80,159,8,28,41,37,249,
22,33,11,80,159,8,30,40,37,22,189,4,28,23,30,28,23,202,1,11,195,
86,94,23,202,1,11,20,13,159,80,159,8,25,40,37,250,80,159,8,28,41,
37,249,22,33,11,80,159,8,30,40,37,22,172,5,28,248,22,176,14,23,220,
2,23,219,1,86,94,23,219,1,247,22,153,15,249,247,22,170,5,194,23,29,
12,27,249,22,171,8,80,159,39,45,38,249,22,190,3,248,22,186,3,248,22,
173,2,200,8,128,8,27,28,193,248,22,176,2,194,11,28,192,27,249,22,102,
198,195,28,192,248,22,81,193,11,11,27,249,22,190,3,248,22,186,3,248,22,
173,2,198,8,128,8,27,249,22,171,8,80,159,40,45,38,195,27,28,193,248,
22,176,2,194,11,250,22,172,8,80,159,42,45,38,197,248,22,175,2,249,22,
79,249,22,79,204,205,28,198,198,9,0,17,35,114,120,34,94,40,46,42,63,
41,47,40,46,42,41,36,34,32,58,88,163,8,36,37,59,11,2,31,222,33,
59,27,249,22,164,15,2,57,23,196,2,28,23,193,2,86,94,23,194,1,249,
22,79,248,22,104,23,196,2,27,248,22,113,23,197,1,27,249,22,164,15,2,
57,23,196,2,28,23,193,2,86,94,23,194,1,249,22,79,248,22,104,23,196,
2,27,248,22,113,23,197,1,27,249,22,164,15,2,57,23,196,2,28,23,193,
2,86,94,23,194,1,249,22,79,248,22,104,23,196,2,27,248,22,113,23,197,
1,27,249,22,164,15,2,57,23,196,2,28,23,193,2,86,94,23,194,1,249,
22,79,248,22,104,23,196,2,248,2,58,248,22,113,23,197,1,248,22,89,194,
248,22,89,194,248,22,89,194,248,22,89,194,32,60,88,163,36,37,55,11,2,
31,222,33,61,28,248,22,87,248,22,81,23,195,2,249,22,7,9,248,22,80,
195,90,159,38,11,89,161,38,36,11,27,248,22,81,196,28,248,22,87,248,22,
163,8,36,37,53,8,65,9,225,27,22,18,33,51,23,216,2,27,28,23,202,
2,11,193,28,192,192,28,193,28,23,202,2,28,249,22,131,4,248,22,81,196,
248,22,81,23,205,2,193,11,11,11,11,86,94,23,197,1,11,28,23,193,2,
86,107,23,216,1,23,215,1,23,213,1,23,211,1,23,210,1,23,209,1,23,
208,1,23,201,1,23,200,1,23,199,1,23,198,1,23,196,1,23,195,1,23,
194,1,20,13,159,80,159,8,24,38,37,250,80,159,8,27,39,37,249,22,33,
11,80,159,8,29,38,37,22,189,4,11,20,13,159,80,159,8,24,38,37,250,
80,159,8,27,39,37,249,22,33,11,80,159,8,29,38,37,22,172,5,28,248,
22,176,14,23,216,2,23,215,1,86,94,23,215,1,247,22,153,15,249,247,22,
159,15,248,22,80,195,23,28,86,94,23,193,1,27,28,23,195,2,28,23,197,
1,27,249,22,5,88,163,8,36,37,53,8,65,9,225,28,23,20,33,52,23,
217,2,27,28,23,204,2,11,193,28,192,192,28,193,28,203,28,249,22,131,4,
248,22,81,196,248,22,81,206,193,11,11,11,11,86,94,23,197,1,11,28,23,
193,2,86,104,23,217,1,23,216,1,23,214,1,23,211,1,23,210,1,23,209,
1,23,201,1,23,200,1,23,199,1,23,196,1,23,195,1,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,189,4,23,215,1,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,172,5,28,248,22,176,14,23,217,
2,23,216,1,86,94,23,216,1,247,22,153,15,249,247,22,159,15,248,22,80,
195,23,29,86,94,23,193,1,27,28,23,197,2,28,23,201,1,27,249,22,5,
20,20,94,88,163,8,36,37,51,8,64,9,225,29,24,20,33,53,23,213,1,
23,218,2,27,28,23,204,2,11,193,28,192,192,28,193,28,23,204,2,28,249,
22,131,4,248,22,81,196,248,22,81,23,207,2,193,11,11,11,86,94,23,210,
1,11,86,94,23,201,1,11,28,23,193,2,86,101,23,215,1,23,213,1,23,
212,1,23,211,1,23,202,1,23,200,1,23,197,1,23,196,1,86,94,27,248,
22,80,194,28,23,218,2,250,22,158,2,248,22,81,23,222,1,23,222,1,250,
22,89,23,199,1,11,23,221,2,12,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,189,4,11,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,172,5,28,248,22,176,14,23,218,2,23,217,1,86,94,23,217,
1,247,22,153,15,249,247,22,170,5,248,22,80,195,23,30,86,94,23,193,1,
27,28,23,197,1,28,23,201,1,27,249,22,5,20,20,94,88,163,8,36,37,
51,8,64,9,225,30,25,22,33,54,23,215,1,23,219,1,27,28,23,205,2,
11,193,28,192,192,28,193,28,204,28,249,22,131,4,248,22,81,196,248,22,81,
23,15,193,11,11,11,86,95,23,216,1,23,212,1,11,86,94,23,201,1,11,
28,23,193,2,86,95,23,213,1,23,198,1,86,94,27,248,22,80,194,28,23,
219,2,250,22,158,2,248,22,81,23,223,1,23,223,1,250,22,89,23,199,1,
23,221,2,23,222,2,12,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,189,4,23,217,1,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,172,5,28,248,22,176,14,23,219,2,23,218,1,86,94,23,218,1,
247,22,153,15,249,247,22,170,5,248,22,80,195,23,31,86,94,23,193,1,28,
28,248,22,77,23,223,2,248,22,80,23,223,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,
32,0,0,0,2,248,22,149,9,248,22,188,14,23,195,2,11,12,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,189,4,28,23,33,28,23,202,1,11,195,86,94,23,202,1,11,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,172,5,28,248,22,176,14,23,220,2,23,219,1,86,94,23,
219,1,247,22,153,15,249,247,22,170,5,194,23,32,12,28,193,250,22,158,2,
248,22,81,197,195,250,22,89,200,201,202,12,27,249,22,171,8,80,159,39,46,
38,249,22,190,3,248,22,186,3,248,22,173,2,200,8,128,8,27,28,193,248,
22,176,2,194,11,28,192,27,249,22,102,198,195,28,192,248,22,81,193,11,11,
27,249,22,190,3,248,22,186,3,248,22,173,2,198,8,128,8,27,249,22,171,
8,80,159,40,46,38,195,27,28,193,248,22,176,2,194,11,250,22,172,8,80,
159,42,46,38,197,248,22,175,2,249,22,79,249,22,79,204,205,28,198,198,9,
0,17,35,114,120,34,94,40,46,42,63,41,47,40,46,42,41,36,34,32,60,
88,163,8,36,37,59,11,2,32,222,33,61,27,249,22,164,15,2,59,23,196,
2,28,23,193,2,86,94,23,194,1,249,22,79,248,22,104,23,196,2,27,248,
22,113,23,197,1,27,249,22,164,15,2,59,23,196,2,28,23,193,2,86,94,
23,194,1,249,22,79,248,22,104,23,196,2,27,248,22,113,23,197,1,27,249,
22,164,15,2,59,23,196,2,28,23,193,2,86,94,23,194,1,249,22,79,248,
22,104,23,196,2,27,248,22,113,23,197,1,27,249,22,164,15,2,59,23,196,
2,28,23,193,2,86,94,23,194,1,249,22,79,248,22,104,23,196,2,248,2,
60,248,22,113,23,197,1,248,22,89,194,248,22,89,194,248,22,89,194,248,22,
89,194,32,62,88,163,36,37,55,11,2,32,222,33,63,28,248,22,87,248,22,
81,23,195,2,249,22,7,9,248,22,80,195,90,159,38,11,89,161,38,36,11,
27,248,22,81,196,28,248,22,87,248,22,81,23,195,2,249,22,7,9,248,22,
80,195,90,159,38,11,89,161,38,36,11,248,2,60,248,22,81,196,249,22,7,
249,22,79,248,22,80,199,196,195,249,22,7,249,22,79,248,22,80,199,196,195,
249,22,7,249,22,79,248,22,80,199,196,195,27,27,249,22,164,15,2,57,23,
197,2,28,23,193,2,86,94,23,195,1,249,22,79,248,22,104,23,196,2,27,
248,22,113,23,197,1,27,249,22,164,15,2,57,23,196,2,28,23,193,2,86,
94,23,194,1,249,22,79,248,22,104,23,196,2,27,248,22,113,23,197,1,27,
249,22,164,15,2,57,23,196,2,28,23,193,2,86,94,23,194,1,249,22,79,
248,22,104,23,196,2,27,248,22,113,23,197,1,27,249,22,164,15,2,57,23,
196,2,28,23,193,2,86,94,23,194,1,249,22,79,248,22,104,23,196,2,248,
2,58,248,22,113,23,197,1,248,22,89,194,248,22,89,194,248,22,89,194,248,
22,89,195,28,23,195,1,192,28,248,22,87,248,22,81,23,195,2,249,22,7,
9,248,22,80,195,27,248,22,81,194,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,80,197,27,248,22,81,196,
80,195,90,159,38,11,89,161,38,36,11,27,248,22,81,196,28,248,22,87,248,
22,81,23,195,2,249,22,7,9,248,22,80,195,90,159,38,11,89,161,38,36,
11,248,2,62,248,22,81,196,249,22,7,249,22,79,248,22,80,199,196,195,249,
22,7,249,22,79,248,22,80,199,196,195,249,22,7,249,22,79,248,22,80,199,
196,195,27,27,249,22,164,15,2,59,23,197,2,28,23,193,2,86,94,23,195,
1,249,22,79,248,22,104,23,196,2,27,248,22,113,23,197,1,27,249,22,164,
15,2,59,23,196,2,28,23,193,2,86,94,23,194,1,249,22,79,248,22,104,
23,196,2,27,248,22,113,23,197,1,27,249,22,164,15,2,59,23,196,2,28,
23,193,2,86,94,23,194,1,249,22,79,248,22,104,23,196,2,27,248,22,113,
23,197,1,27,249,22,164,15,2,59,23,196,2,28,23,193,2,86,94,23,194,
1,249,22,79,248,22,104,23,196,2,248,2,60,248,22,113,23,197,1,248,22,
89,194,248,22,89,194,248,22,89,194,248,22,89,195,28,23,195,1,192,28,248,
22,87,248,22,81,23,195,2,249,22,7,9,248,22,80,195,27,248,22,81,194,
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,80,197,90,159,38,11,89,161,38,36,11,248,2,60,248,22,81,
198,249,22,7,249,22,79,248,22,80,201,196,195,249,22,7,249,22,79,248,22,
80,202,196,195,249,22,7,249,22,79,248,22,80,200,196,195,86,95,28,248,22,
146,5,195,12,250,22,188,9,2,21,6,21,21,114,101,115,111,108,118,101,100,
45,109,111,100,117,108,101,45,112,97,116,104,63,197,28,24,193,2,248,24,194,
1,195,86,94,23,193,1,12,27,250,22,160,2,80,159,41,43,38,248,22,189,
15,247,22,151,13,11,27,28,23,194,2,193,86,94,23,194,1,27,247,22,140,
2,86,94,250,22,158,2,80,159,43,43,38,248,22,189,15,247,22,151,13,195,
192,250,22,158,2,195,199,66,97,116,116,97,99,104,251,211,197,198,199,10,32,
65,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,68,32,66,88,163,36,40,54,11,2,31,222,33,67,28,248,
22,87,23,197,2,28,248,22,87,195,192,249,22,79,194,248,22,94,197,28,249,
22,153,9,248,22,80,23,199,2,2,34,28,248,22,87,23,196,2,86,95,23,
196,1,23,195,1,250,22,184,9,2,21,6,37,37,116,111,111,32,109,97,110,
121,32,34,46,46,34,115,32,105,110,32,115,117,98,109,111,100,117,108,101,32,
112,97,116,104,58,32,126,46,115,250,22,90,2,33,28,249,22,153,9,23,201,
2,2,35,198,28,248,22,176,14,199,198,249,22,89,28,248,22,64,201,2,4,
2,36,200,199,251,2,66,196,197,248,22,81,199,248,22,81,200,251,2,66,196,
197,249,22,79,248,22,80,202,200,248,22,81,200,251,2,66,196,197,9,197,27,
249,22,164,7,6,31,31,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,58,32,196,28,193,250,
22,186,9,11,195,196,248,22,184,9,193,28,249,22,147,7,194,2,35,2,28,
28,249,22,147,7,194,2,34,62,117,112,192,32,71,88,163,8,36,37,50,11,
67,115,115,45,62,114,107,116,222,33,72,27,248,22,144,7,194,28,249,22,131,
4,194,39,28,249,22,147,7,6,3,3,46,115,115,249,22,163,7,197,249,22,
183,3,198,39,249,22,164,7,250,22,163,7,198,36,249,22,183,3,199,39,2,
39,193,193,0,8,35,114,120,34,91,46,93,34,32,74,88,163,8,36,37,47,
11,2,31,222,33,75,28,248,22,87,23,194,2,9,250,22,90,6,4,4,10,
32,32,32,248,22,180,14,248,22,105,23,198,2,248,2,74,248,22,81,23,198,
1,28,249,22,153,9,248,22,81,23,200,2,23,197,1,28,249,22,151,9,248,
22,80,23,200,1,23,196,1,251,22,184,9,2,21,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,164,7,248,2,74,248,22,94,23,201,1,12,12,247,192,20,13,159,80,
159,43,48,38,249,22,79,249,22,79,248,22,189,15,247,22,151,13,23,201,1,
23,195,1,20,13,159,80,159,43,40,37,250,80,159,46,41,37,249,22,33,11,
80,159,48,40,37,22,188,4,23,198,2,249,247,22,171,5,23,200,1,27,248,
22,67,248,22,180,14,23,201,1,28,23,202,2,28,250,22,160,2,23,200,1,
23,201,1,11,249,22,79,11,203,249,22,79,194,203,192,86,94,28,248,22,156,
5,23,196,2,12,28,23,197,2,250,22,186,9,11,6,15,15,98,97,100,32,
109,111,100,117,108,101,32,112,97,116,104,23,200,2,250,22,188,9,2,21,2,
32,23,198,2,28,28,248,22,77,23,196,2,249,22,151,9,248,22,80,23,198,
2,2,4,11,248,22,147,5,248,22,104,196,28,28,248,22,77,23,196,2,28,
249,22,151,9,248,22,80,23,198,2,2,33,28,248,22,77,248,22,104,23,197,
2,249,22,151,9,248,22,108,23,198,2,2,4,11,11,11,86,97,23,198,1,
23,197,1,23,196,1,23,193,1,248,22,147,5,249,2,65,248,22,121,23,199,
2,248,22,106,23,199,1,28,28,248,22,77,23,196,2,28,249,22,151,9,248,
22,80,23,198,2,2,33,28,28,249,22,153,9,248,22,104,23,198,2,2,35,
10,249,22,153,9,248,22,104,23,198,2,2,34,28,23,196,2,27,248,22,148,
5,23,198,2,28,248,22,64,193,10,28,248,22,77,193,248,22,64,248,22,80,
194,11,11,11,11,11,86,96,23,198,1,23,197,1,23,193,1,27,248,22,148,
5,23,198,1,248,22,147,5,249,2,65,28,248,22,77,23,197,2,248,22,80,
23,197,2,23,196,2,27,28,249,22,153,9,248,22,104,23,203,2,2,34,248,
22,81,200,248,22,106,200,28,248,22,77,23,198,2,249,22,93,248,22,81,199,
194,192,28,28,248,22,77,23,196,2,249,22,151,9,248,22,80,23,198,2,2,
37,11,86,94,248,80,159,38,8,26,39,193,253,213,200,201,202,203,11,80,158,
43,53,28,28,248,22,77,23,196,2,28,249,22,151,9,248,22,80,23,198,2,
2,33,28,248,22,77,248,22,104,23,197,2,249,22,151,9,248,22,108,23,198,
2,2,37,11,11,11,86,94,248,80,159,38,8,26,39,193,253,213,248,22,104,
201,201,202,203,248,22,106,201,80,158,43,53,86,94,23,193,1,27,88,163,8,
36,37,47,11,79,115,104,111,119,45,99,111,108,108,101,99,116,105,111,110,45,
101,114,114,223,5,33,69,27,28,248,22,77,23,198,2,28,249,22,151,9,2,
33,248,22,80,23,200,2,27,248,22,104,23,199,2,28,28,249,22,153,9,23,
195,2,2,35,10,249,22,153,9,23,195,2,2,34,86,94,23,193,1,28,23,
199,2,27,248,22,148,5,23,201,2,28,248,22,77,193,248,22,80,193,192,250,
22,184,9,2,21,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,151,9,2,33,248,22,80,23,201,2,
27,28,28,28,249,22,153,9,248,22,104,23,202,2,2,35,10,249,22,153,9,
248,22,104,23,202,2,2,34,23,200,2,11,27,248,22,148,5,23,202,2,27,
28,249,22,153,9,248,22,104,23,204,2,2,34,248,22,81,23,202,1,248,22,
106,23,202,1,28,248,22,77,23,195,2,249,2,65,248,22,80,23,197,2,249,
22,93,248,22,81,23,199,1,23,197,1,249,2,65,23,196,1,23,195,1,249,
2,65,2,35,28,249,22,153,9,248,22,104,23,204,2,2,34,248,22,81,23,
202,1,248,22,106,23,202,1,28,248,22,77,193,248,22,81,193,11,11,11,27,
28,248,22,64,23,196,2,27,248,80,159,43,46,39,249,22,79,23,199,2,247,
22,154,15,28,23,193,2,192,86,94,23,193,1,90,159,38,11,89,161,38,36,
11,249,80,159,46,52,39,248,22,70,23,201,2,11,27,28,248,22,87,23,195,
2,2,38,249,22,164,7,23,197,2,2,39,251,80,159,49,57,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,81,23,199,1,23,197,
1,28,248,22,141,7,23,196,2,86,94,23,196,1,27,248,80,159,43,8,27,
39,23,202,2,27,248,80,159,44,46,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,52,39,23,201,2,11,250,22,1,22,130,15,23,199,1,249,22,93,249,22,
2,32,0,88,163,8,36,37,44,11,9,222,33,70,23,200,1,248,22,89,248,
2,71,23,201,1,28,248,22,176,14,23,196,2,86,94,23,196,1,248,80,159,
42,8,28,39,248,22,139,15,28,248,22,136,15,23,198,2,23,197,2,249,22,
137,15,23,199,2,248,80,159,46,8,27,39,23,205,2,28,249,22,151,9,248,
22,80,23,198,2,2,26,27,248,80,159,43,46,39,249,22,79,23,199,2,247,
22,154,15,28,23,193,2,192,86,94,23,193,1,90,159,39,11,89,161,38,36,
11,249,80,159,47,52,39,248,22,104,23,202,2,11,89,161,37,38,11,28,248,
22,87,248,22,106,23,201,2,28,248,22,87,23,194,2,249,22,168,15,2,73,
23,196,2,11,10,27,28,23,196,2,248,2,71,23,196,2,28,248,22,87,23,
195,2,2,38,28,249,22,168,15,2,73,23,197,2,248,2,71,23,196,2,249,
22,164,7,23,197,2,2,39,27,28,23,197,1,86,94,23,196,1,249,22,93,
28,248,22,87,248,22,106,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,29,39,248,22,106,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,57,39,23,206,1,248,22,80,23,198,2,
248,22,81,23,198,1,23,198,1,28,249,22,151,9,248,22,80,23,198,2,2,
36,248,80,159,42,8,28,39,248,22,139,15,249,22,137,15,248,22,141,15,248,
22,104,23,201,2,248,80,159,46,8,27,39,23,205,2,12,86,94,28,28,248,
22,176,14,23,194,2,10,248,22,166,8,23,194,2,86,94,23,201,1,12,28,
23,201,2,250,22,186,9,67,114,101,113,117,105,114,101,249,22,189,7,6,17,
17,98,97,100,32,109,111,100,117,108,101,32,112,97,116,104,126,97,28,23,198,
2,248,22,80,23,199,2,6,0,0,23,204,1,86,94,23,201,1,250,22,188,
9,2,21,2,32,23,198,2,27,28,248,22,166,8,23,195,2,249,22,171,8,
23,196,2,36,249,22,139,15,248,22,140,15,23,197,2,11,27,28,248,22,166,
8,23,196,2,249,22,171,8,23,197,2,37,248,80,159,44,58,39,23,195,2,
90,159,39,11,89,161,39,36,11,28,248,22,166,8,23,199,2,250,22,7,2,
40,249,22,171,8,23,203,2,38,2,40,248,22,133,15,23,198,2,86,95,23,
195,1,23,193,1,27,28,248,22,166,8,23,200,2,249,22,171,8,23,201,2,
39,249,80,159,49,56,39,23,197,2,5,0,27,28,248,22,166,8,23,201,2,
249,22,171,8,23,202,2,40,248,22,147,5,23,200,2,27,250,22,160,2,80,
159,52,43,38,248,22,189,15,247,22,151,13,11,27,28,23,194,2,23,194,1,
86,94,23,194,1,27,247,22,140,2,86,94,250,22,158,2,80,159,54,43,38,
248,22,189,15,247,22,151,13,195,192,27,28,23,204,2,248,22,147,5,249,22,
79,248,22,148,5,23,200,2,23,207,2,23,196,2,86,95,28,23,212,1,27,
250,22,160,2,23,198,2,196,11,28,23,193,1,12,86,94,27,27,28,248,22,
17,80,159,55,49,38,80,159,54,49,38,247,22,19,251,22,33,11,80,159,58,
48,38,9,23,197,1,27,248,22,189,15,247,22,151,13,86,94,249,22,3,20,
20,94,88,163,8,36,37,54,11,9,226,14,13,2,3,33,76,23,195,1,23,
196,2,248,28,248,22,17,80,159,56,49,38,32,0,88,163,36,37,42,11,9,
222,33,77,80,159,55,8,30,39,20,20,95,88,163,36,36,55,8,176,64,9,
230,19,15,13,12,8,7,5,2,33,78,23,195,1,23,208,1,250,22,158,2,
23,198,1,196,10,12,28,28,248,22,166,8,23,204,1,11,28,248,22,141,7,
23,206,2,10,28,248,22,64,23,206,2,10,28,248,22,77,23,206,2,249,22,
151,9,248,22,80,23,208,2,2,26,11,249,80,159,53,47,39,28,248,22,141,
7,23,208,2,249,22,79,23,209,1,248,80,159,56,8,27,39,23,215,1,86,
94,23,212,1,249,22,79,23,209,1,247,22,154,15,252,22,168,8,23,209,1,
23,208,1,23,206,1,23,204,1,23,203,1,12,192,86,96,20,18,159,11,80,
158,36,53,248,80,159,37,8,25,37,249,22,33,11,80,159,39,55,37,248,22,
187,4,80,159,37,54,38,248,22,171,5,80,159,37,37,39,248,22,145,14,80,
159,37,42,39,20,18,159,11,80,158,36,53,248,80,159,37,8,25,37,249,22,
33,11,80,159,39,55,37,20,18,159,11,80,158,36,53,248,80,159,37,8,25,
37,249,22,33,11,80,159,39,55,37,159,36,20,113,159,36,16,1,11,16,0,
20,26,144,9,2,1,2,1,29,11,11,11,9,9,11,11,11,10,38,80,158,
36,36,20,113,159,41,16,26,2,2,2,3,30,2,5,72,112,97,116,104,45,
115,116,114,105,110,103,63,11,30,2,5,75,112,97,116,104,45,97,100,100,45,
115,117,102,102,105,120,8,30,2,7,2,8,6,30,2,7,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,3,
2,9,2,10,2,11,2,12,2,13,2,14,2,15,2,16,2,17,2,18,2,
19,2,20,2,21,30,2,22,2,8,6,30,2,5,79,112,97,116,104,45,114,
101,112,108,97,99,101,45,115,117,102,102,105,120,10,30,2,5,73,102,105,110,
100,45,99,111,108,45,102,105,108,101,3,30,2,5,76,110,111,114,109,97,108,
45,99,97,115,101,45,112,97,116,104,7,2,23,2,24,30,2,22,74,114,101,
112,97,114,97,109,101,116,101,114,105,122,101,7,16,0,37,39,36,16,0,36,
16,14,2,15,2,16,2,10,2,12,2,17,2,18,2,11,2,3,2,9,2,
2,2,13,2,14,2,19,2,21,50,11,11,11,16,3,2,23,2,20,2,24,
16,3,11,11,11,16,3,2,23,2,20,2,24,39,39,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,22,20,
15,16,2,88,163,36,37,45,8,128,128,9,223,0,33,41,80,159,36,8,30,
39,20,15,16,2,88,163,8,36,37,45,8,240,0,0,1,0,9,223,0,33,
42,80,159,36,8,29,39,20,15,16,2,88,163,36,37,49,8,240,0,0,16,
0,72,112,97,116,104,45,115,115,45,62,114,107,116,223,0,33,43,80,159,36,
8,28,39,20,15,16,2,88,163,36,37,50,8,240,0,192,0,0,67,103,101,
116,45,100,105,114,223,0,33,44,80,159,36,8,27,39,20,15,16,2,88,164,
8,34,37,45,8,240,0,0,10,0,1,21,112,114,101,112,45,112,108,97,110,
101,116,45,114,101,115,111,108,118,101,114,33,37,224,1,0,33,45,80,159,36,
8,26,39,20,15,16,2,248,22,163,8,69,115,111,45,115,117,102,102,105,120,
80,159,36,36,37,20,15,16,2,88,163,36,38,8,38,8,61,2,3,223,0,
33,54,80,159,36,37,37,20,15,16,2,20,27,158,32,0,88,163,8,36,37,
42,11,2,9,222,192,32,0,88,163,8,36,37,42,11,2,9,222,192,80,159,
36,42,37,20,15,16,2,247,22,143,2,80,159,36,43,37,20,15,16,2,8,
128,8,80,159,36,44,37,20,15,16,2,249,22,167,8,8,128,8,11,80,159,
36,45,37,20,15,16,2,88,163,8,36,37,50,8,128,8,2,13,223,0,33,
55,80,159,36,46,37,20,15,16,2,88,163,8,36,38,55,8,128,8,2,14,
223,0,33,56,80,159,36,47,37,20,15,16,2,247,22,75,80,159,36,48,37,
20,15,16,2,248,22,18,74,109,111,100,117,108,101,45,108,111,97,100,105,110,
103,80,159,36,49,37,20,15,16,2,11,80,158,36,50,20,15,16,2,11,80,
158,36,51,20,15,16,2,32,0,88,163,36,38,8,25,11,2,19,222,33,62,
80,159,36,52,37,20,15,16,2,11,80,158,36,53,20,15,16,2,27,11,20,
19,158,36,90,159,37,10,89,161,37,36,10,20,25,96,2,21,88,163,8,36,
37,51,8,128,2,9,224,2,1,33,63,88,163,36,39,49,11,9,223,0,33,
64,88,163,36,40,8,32,16,2,8,176,242,8,240,115,124,0,0,9,224,2,
1,33,79,207,80,159,36,54,37,20,15,16,2,88,163,36,36,45,8,240,66,
0,14,2,2,23,223,0,33,80,80,159,36,59,37,20,15,16,2,20,27,158,
88,163,8,36,36,45,8,240,0,0,10,2,2,24,223,0,33,81,88,163,8,
36,36,45,8,240,0,0,10,2,2,24,223,0,33,82,80,159,36,8,24,37,
96,29,94,2,4,68,35,37,107,101,114,110,101,108,11,29,94,2,4,69,35,
37,109,105,110,45,115,116,120,11,2,5,2,22,9,9,9,36,0};
EVAL_ONE_SIZED_STR((char *)expr, 7430);
7,9,248,22,80,197,27,248,22,81,196,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,80,197,90,159,38,11,
89,161,38,36,11,248,2,62,248,22,81,198,249,22,7,249,22,79,248,22,80,
201,196,195,249,22,7,249,22,79,248,22,80,202,196,195,249,22,7,249,22,79,
248,22,80,200,196,195,86,96,28,248,22,146,5,23,196,2,12,250,22,188,9,
2,22,6,21,21,114,101,115,111,108,118,101,100,45,109,111,100,117,108,101,45,
112,97,116,104,63,23,198,2,28,28,23,196,2,248,22,152,13,23,197,2,10,
12,250,22,188,9,2,22,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,160,2,80,159,41,41,38,248,22,189,
15,247,22,151,13,11,27,28,23,194,2,23,194,1,86,94,23,194,1,27,249,
22,79,247,22,140,2,247,22,140,2,86,94,250,22,158,2,80,159,43,41,38,
248,22,189,15,247,22,151,13,195,192,86,94,250,22,158,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,148,5,23,200,2,248,22,147,5,248,22,80,248,22,148,5,23,201,
1,23,198,1,27,250,22,160,2,80,159,44,41,38,248,22,189,15,23,204,1,
11,28,23,193,2,27,250,22,160,2,248,22,81,23,198,1,197,11,28,192,250,
22,158,2,248,22,81,199,197,195,12,12,12,251,211,197,198,199,10,32,67,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,70,32,68,88,163,36,40,54,11,2,32,222,33,69,28,248,22,87,
23,197,2,28,248,22,87,195,192,249,22,79,194,248,22,94,197,28,249,22,153,
9,248,22,80,23,199,2,2,35,28,248,22,87,23,196,2,86,95,23,196,1,
23,195,1,250,22,184,9,2,22,6,37,37,116,111,111,32,109,97,110,121,32,
34,46,46,34,115,32,105,110,32,115,117,98,109,111,100,117,108,101,32,112,97,
116,104,58,32,126,46,115,250,22,90,2,34,28,249,22,153,9,23,201,2,2,
36,198,28,248,22,176,14,199,198,249,22,89,28,248,22,64,201,2,4,2,37,
200,199,251,2,68,196,197,248,22,81,199,248,22,81,200,251,2,68,196,197,249,
22,79,248,22,80,202,200,248,22,81,200,251,2,68,196,197,9,197,27,249,22,
164,7,6,31,31,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,58,32,196,28,193,250,22,186,
9,11,195,196,248,22,184,9,193,28,249,22,147,7,194,2,36,2,29,28,249,
22,147,7,194,2,35,62,117,112,192,32,73,88,163,8,36,37,50,11,67,115,
115,45,62,114,107,116,222,33,74,27,248,22,144,7,194,28,249,22,131,4,194,
39,28,249,22,147,7,6,3,3,46,115,115,249,22,163,7,197,249,22,183,3,
198,39,249,22,164,7,250,22,163,7,198,36,249,22,183,3,199,39,2,40,193,
193,0,8,35,114,120,34,91,46,93,34,32,76,88,163,8,36,37,47,11,2,
32,222,33,77,28,248,22,87,23,194,2,9,250,22,90,6,4,4,10,32,32,
32,248,22,180,14,248,22,105,23,198,2,248,2,76,248,22,81,23,198,1,28,
249,22,153,9,248,22,81,23,200,2,23,197,1,28,249,22,151,9,248,22,80,
23,200,1,23,196,1,251,22,184,9,2,22,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,
164,7,248,2,76,248,22,94,23,201,1,12,12,247,192,20,13,159,80,159,43,
49,38,249,22,79,249,22,79,248,22,189,15,247,22,151,13,23,201,1,23,195,
1,20,13,159,80,159,43,38,37,250,80,159,46,39,37,249,22,33,11,80,159,
48,38,37,22,188,4,23,198,2,249,247,22,171,5,23,200,1,27,248,22,67,
248,22,180,14,23,201,1,28,23,202,2,28,250,22,160,2,248,22,80,23,201,
1,23,201,1,11,249,22,79,11,203,249,22,79,194,203,192,86,94,28,248,22,
156,5,23,196,2,12,28,23,197,2,250,22,186,9,11,6,15,15,98,97,100,
32,109,111,100,117,108,101,32,112,97,116,104,23,200,2,250,22,188,9,2,22,
2,33,23,198,2,28,28,248,22,77,23,196,2,249,22,151,9,248,22,80,23,
198,2,2,4,11,248,22,147,5,248,22,104,196,28,28,248,22,77,23,196,2,
28,249,22,151,9,248,22,80,23,198,2,2,34,28,248,22,77,248,22,104,23,
197,2,249,22,151,9,248,22,108,23,198,2,2,4,11,11,11,86,97,23,198,
1,23,197,1,23,196,1,23,193,1,248,22,147,5,249,2,67,248,22,121,23,
199,2,248,22,106,23,199,1,28,28,248,22,77,23,196,2,28,249,22,151,9,
248,22,80,23,198,2,2,34,28,28,249,22,153,9,248,22,104,23,198,2,2,
36,10,249,22,153,9,248,22,104,23,198,2,2,35,28,23,196,2,27,248,22,
148,5,23,198,2,28,248,22,64,193,10,28,248,22,77,193,248,22,64,248,22,
80,194,11,11,11,11,11,86,96,23,198,1,23,197,1,23,193,1,27,248,22,
148,5,23,198,1,248,22,147,5,249,2,67,28,248,22,77,23,197,2,248,22,
80,23,197,2,23,196,2,27,28,249,22,153,9,248,22,104,23,203,2,2,35,
248,22,81,200,248,22,106,200,28,248,22,77,23,198,2,249,22,93,248,22,81,
199,194,192,28,28,248,22,77,23,196,2,249,22,151,9,248,22,80,23,198,2,
2,38,11,86,94,248,80,159,38,8,27,39,193,253,213,200,201,202,203,11,80,
158,43,54,28,28,248,22,77,23,196,2,28,249,22,151,9,248,22,80,23,198,
2,2,34,28,248,22,77,248,22,104,23,197,2,249,22,151,9,248,22,108,23,
198,2,2,38,11,11,11,86,94,248,80,159,38,8,27,39,193,253,213,248,22,
104,201,201,202,203,248,22,106,201,80,158,43,54,86,94,23,193,1,27,88,163,
8,36,37,47,11,79,115,104,111,119,45,99,111,108,108,101,99,116,105,111,110,
45,101,114,114,223,5,33,71,27,28,248,22,77,23,198,2,28,249,22,151,9,
2,34,248,22,80,23,200,2,27,248,22,104,23,199,2,28,28,249,22,153,9,
23,195,2,2,36,10,249,22,153,9,23,195,2,2,35,86,94,23,193,1,28,
23,199,2,27,248,22,148,5,23,201,2,28,248,22,77,193,248,22,80,193,192,
250,22,184,9,2,22,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,151,9,2,34,248,22,80,23,201,
2,27,28,28,28,249,22,153,9,248,22,104,23,202,2,2,36,10,249,22,153,
9,248,22,104,23,202,2,2,35,23,200,2,11,27,248,22,148,5,23,202,2,
27,28,249,22,153,9,248,22,104,23,204,2,2,35,248,22,81,23,202,1,248,
22,106,23,202,1,28,248,22,77,23,195,2,249,2,67,248,22,80,23,197,2,
249,22,93,248,22,81,23,199,1,23,197,1,249,2,67,23,196,1,23,195,1,
249,2,67,2,36,28,249,22,153,9,248,22,104,23,204,2,2,35,248,22,81,
23,202,1,248,22,106,23,202,1,28,248,22,77,193,248,22,81,193,11,11,11,
27,28,248,22,64,23,196,2,27,248,80,159,43,47,39,249,22,79,23,199,2,
247,22,154,15,28,23,193,2,192,86,94,23,193,1,90,159,38,11,89,161,38,
36,11,249,80,159,46,53,39,248,22,70,23,201,2,11,27,28,248,22,87,23,
195,2,2,39,249,22,164,7,23,197,2,2,40,251,80,159,49,58,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,81,23,199,1,23,
197,1,28,248,22,141,7,23,196,2,86,94,23,196,1,27,248,80,159,43,8,
28,39,23,202,2,27,248,80,159,44,47,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,53,39,23,201,2,11,250,22,1,22,130,15,23,199,1,249,22,93,249,
22,2,32,0,88,163,8,36,37,44,11,9,222,33,72,23,200,1,248,22,89,
248,2,73,23,201,1,28,248,22,176,14,23,196,2,86,94,23,196,1,248,80,
159,42,8,29,39,248,22,139,15,28,248,22,136,15,23,198,2,23,197,2,249,
22,137,15,23,199,2,248,80,159,46,8,28,39,23,205,2,28,249,22,151,9,
248,22,80,23,198,2,2,27,27,248,80,159,43,47,39,249,22,79,23,199,2,
247,22,154,15,28,23,193,2,192,86,94,23,193,1,90,159,39,11,89,161,38,
36,11,249,80,159,47,53,39,248,22,104,23,202,2,11,89,161,37,38,11,28,
248,22,87,248,22,106,23,201,2,28,248,22,87,23,194,2,249,22,168,15,2,
75,23,196,2,11,10,27,28,23,196,2,248,2,73,23,196,2,28,248,22,87,
23,195,2,2,39,28,249,22,168,15,2,75,23,197,2,248,2,73,23,196,2,
249,22,164,7,23,197,2,2,40,27,28,23,197,1,86,94,23,196,1,249,22,
93,28,248,22,87,248,22,106,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,30,39,248,22,106,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,58,39,23,206,1,248,22,80,23,198,
2,248,22,81,23,198,1,23,198,1,28,249,22,151,9,248,22,80,23,198,2,
2,37,248,80,159,42,8,29,39,248,22,139,15,249,22,137,15,248,22,141,15,
248,22,104,23,201,2,248,80,159,46,8,28,39,23,205,2,12,86,94,28,28,
248,22,176,14,23,194,2,10,248,22,166,8,23,194,2,86,94,23,201,1,12,
28,23,201,2,250,22,186,9,67,114,101,113,117,105,114,101,249,22,189,7,6,
17,17,98,97,100,32,109,111,100,117,108,101,32,112,97,116,104,126,97,28,23,
198,2,248,22,80,23,199,2,6,0,0,23,204,1,86,94,23,201,1,250,22,
188,9,2,22,2,33,23,198,2,27,28,248,22,166,8,23,195,2,249,22,171,
8,23,196,2,36,249,22,139,15,248,22,140,15,23,197,2,11,27,28,248,22,
166,8,23,196,2,249,22,171,8,23,197,2,37,248,80,159,44,59,39,23,195,
2,90,159,39,11,89,161,39,36,11,28,248,22,166,8,23,199,2,250,22,7,
2,41,249,22,171,8,23,203,2,38,2,41,248,22,133,15,23,198,2,86,95,
23,195,1,23,193,1,27,28,248,22,166,8,23,200,2,249,22,171,8,23,201,
2,39,249,80,159,49,57,39,23,197,2,5,0,27,28,248,22,166,8,23,201,
2,249,22,171,8,23,202,2,40,248,22,147,5,23,200,2,27,250,22,160,2,
80,159,52,41,38,248,22,189,15,247,22,151,13,11,27,28,23,194,2,23,194,
1,86,94,23,194,1,27,249,22,79,247,22,140,2,247,22,140,2,86,94,250,
22,158,2,80,159,54,41,38,248,22,189,15,247,22,151,13,195,192,27,28,23,
204,2,248,22,147,5,249,22,79,248,22,148,5,23,200,2,23,207,2,23,196,
2,86,95,28,23,212,1,27,250,22,160,2,248,22,80,23,199,2,196,11,28,
23,193,1,12,27,27,28,248,22,17,80,159,55,50,38,80,159,54,50,38,247,
22,19,251,22,33,11,80,159,58,49,38,9,23,197,1,27,248,22,189,15,247,
22,151,13,86,94,249,22,3,20,20,94,88,163,8,36,37,54,11,9,226,14,
13,2,3,33,78,23,195,1,23,196,2,248,28,248,22,17,80,159,56,50,38,
32,0,88,163,36,37,42,11,9,222,33,79,80,159,55,8,31,39,20,20,96,
88,163,36,36,56,8,140,128,9,230,19,15,13,12,8,7,5,2,33,80,23,
195,1,23,198,1,23,208,1,12,28,28,248,22,166,8,23,204,1,11,28,248,
22,141,7,23,206,2,10,28,248,22,64,23,206,2,10,28,248,22,77,23,206,
2,249,22,151,9,248,22,80,23,208,2,2,27,11,249,80,159,53,48,39,28,
248,22,141,7,23,208,2,249,22,79,23,209,1,248,80,159,56,8,28,39,23,
215,1,86,94,23,212,1,249,22,79,23,209,1,247,22,154,15,252,22,168,8,
23,209,1,23,208,1,23,206,1,23,204,1,23,203,1,12,192,86,96,20,18,
159,11,80,158,36,54,248,80,159,37,8,26,37,249,22,33,11,80,159,39,56,
37,248,22,187,4,80,159,37,55,38,248,22,171,5,80,159,37,37,39,248,22,
145,14,80,159,37,44,39,20,18,159,11,80,158,36,54,248,80,159,37,8,26,
37,249,22,33,11,80,159,39,56,37,20,18,159,11,80,158,36,54,248,80,159,
37,8,26,37,249,22,33,11,80,159,39,56,37,159,36,20,113,159,36,16,1,
11,16,0,20,26,144,9,2,1,2,1,29,11,11,11,9,9,11,11,11,10,
38,80,158,36,36,20,113,159,41,16,27,2,2,2,3,30,2,6,2,7,6,
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,3,30,2,8,72,112,97,116,104,45,115,116,114,105,
110,103,63,11,2,9,30,2,8,75,112,97,116,104,45,97,100,100,45,115,117,
102,102,105,120,8,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,30,2,23,2,7,6,30,2,8,79,112,
97,116,104,45,114,101,112,108,97,99,101,45,115,117,102,102,105,120,10,30,2,
8,73,102,105,110,100,45,99,111,108,45,102,105,108,101,3,30,2,8,76,110,
111,114,109,97,108,45,99,97,115,101,45,112,97,116,104,7,2,24,2,25,30,
2,23,74,114,101,112,97,114,97,109,101,116,101,114,105,122,101,7,16,0,37,
39,36,16,0,36,16,15,2,16,2,17,2,9,2,13,2,18,2,19,2,12,
2,3,2,11,2,2,2,14,2,15,2,10,2,20,2,22,51,11,11,11,16,
3,2,24,2,21,2,25,16,3,11,11,11,16,3,2,24,2,21,2,25,39,
39,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,23,20,15,16,2,88,163,36,37,45,8,240,0,64,0,0,
9,223,0,33,42,80,159,36,8,31,39,20,15,16,2,88,163,8,36,37,45,
8,240,0,0,2,0,9,223,0,33,43,80,159,36,8,30,39,20,15,16,2,
88,163,36,37,49,8,240,0,0,32,0,72,112,97,116,104,45,115,115,45,62,
114,107,116,223,0,33,44,80,159,36,8,29,39,20,15,16,2,88,163,36,37,
50,8,240,0,128,1,0,67,103,101,116,45,100,105,114,223,0,33,45,80,159,
36,8,28,39,20,15,16,2,88,164,8,34,37,45,8,240,0,0,20,0,1,
21,112,114,101,112,45,112,108,97,110,101,116,45,114,101,115,111,108,118,101,114,
33,37,224,1,0,33,46,80,159,36,8,27,39,20,15,16,2,248,22,163,8,
69,115,111,45,115,117,102,102,105,120,80,159,36,36,37,20,15,16,2,88,163,
36,38,8,42,8,125,2,3,223,0,33,55,80,159,36,37,37,20,15,16,2,
32,0,88,163,8,36,41,52,11,2,10,222,33,56,80,159,36,43,37,20,15,
16,2,20,27,158,32,0,88,163,8,36,37,42,11,2,11,222,192,32,0,88,
163,8,36,37,42,11,2,11,222,192,80,159,36,44,37,20,15,16,2,247,22,
143,2,80,159,36,41,37,20,15,16,2,8,128,8,80,159,36,45,37,20,15,
16,2,249,22,167,8,8,128,8,11,80,159,36,46,37,20,15,16,2,88,163,
8,36,37,50,8,128,16,2,14,223,0,33,57,80,159,36,47,37,20,15,16,
2,88,163,8,36,38,55,8,128,16,2,15,223,0,33,58,80,159,36,48,37,
20,15,16,2,247,22,75,80,159,36,49,37,20,15,16,2,248,22,18,74,109,
111,100,117,108,101,45,108,111,97,100,105,110,103,80,159,36,50,37,20,15,16,
2,11,80,158,36,51,20,15,16,2,11,80,158,36,52,20,15,16,2,32,0,
88,163,36,38,8,25,11,2,20,222,33,64,80,159,36,53,37,20,15,16,2,
11,80,158,36,54,20,15,16,2,27,11,20,19,158,36,90,159,37,10,89,161,
37,36,10,20,25,96,2,22,88,163,8,36,38,54,8,32,9,224,2,1,33,
65,88,163,36,39,49,11,9,223,0,33,66,88,163,36,40,8,32,16,2,8,
240,44,120,0,0,8,240,230,248,0,0,9,224,2,1,33,81,207,80,159,36,
55,37,20,15,16,2,88,163,36,36,45,8,240,2,1,28,4,2,24,223,0,
33,82,80,159,36,8,24,37,20,15,16,2,20,27,158,88,163,8,36,36,45,
8,240,0,0,20,4,2,25,223,0,33,83,88,163,8,36,36,45,8,240,0,
0,20,4,2,25,223,0,33,84,80,159,36,8,25,37,96,29,94,2,4,68,
35,37,107,101,114,110,101,108,11,29,94,2,4,69,35,37,109,105,110,45,115,
116,120,11,2,8,2,23,9,9,9,36,0};
EVAL_ONE_SIZED_STR((char *)expr, 7928);
}
{
SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,53,46,51,46,48,46,49,52,84,0,0,0,0,0,0,0,0,0,
SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,53,46,51,46,48,46,49,53,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,98,1,
0,0,69,35,37,98,117,105,108,116,105,110,65,113,117,111,116,101,29,94,2,
@ -921,8 +945,8 @@
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,224,
85,0,0,100,159,2,3,36,36,159,2,4,36,36,159,2,5,36,36,159,2,
11,29,94,2,2,68,35,37,107,101,114,110,101,108,11,97,36,11,8,240,12,
86,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,113,159,36,16,1,11,16,0,20,26,144,9,2,1,
2,1,29,11,11,11,9,9,11,11,11,18,96,11,46,46,46,36,80,158,36,

View File

@ -463,7 +463,7 @@ void scheme_init_module_resolver(void)
o = scheme_make_prim_w_arity(default_module_resolver,
"default-module-name-resolver",
1, 4);
2, 4);
scheme_set_param(config, MZCONFIG_CURRENT_MODULE_RESOLVER, o);
@ -906,7 +906,7 @@ static Scheme_Object *default_module_resolver(int argc, Scheme_Object **argv)
{
Scheme_Object *p = argv[0];
if (argc == 1)
if (argc == 2)
return scheme_void; /* ignore notify */
/* if (quote SYMBOL) */
@ -926,12 +926,12 @@ static Scheme_Object *default_module_resolver(int argc, Scheme_Object **argv)
static Scheme_Object *check_resolver(int argc, Scheme_Object **argv)
{
if (scheme_check_proc_arity(NULL, 1, 0, argc, argv)
if (scheme_check_proc_arity(NULL, 2, 0, argc, argv)
&& scheme_check_proc_arity(NULL, 4, 0, argc, argv))
return argv[0];
scheme_wrong_contract("current-module-name-resolver",
"(case-> (any/c . -> . any) (any/c any/c any/c any/c . -> . any))",
"(case-> (any/c any/c . -> . any) (any/c any/c any/c any/c . -> . any))",
0, argc, argv);
return NULL;
@ -1429,7 +1429,7 @@ static Scheme_Object *do_namespace_attach_module(const char *who, int argc, Sche
{
Scheme_Env *from_env, *to_env, *menv, *menv2;
Scheme_Object *todo, *next_phase_todo, *prev_phase_todo;
Scheme_Object *name, *notifies = scheme_null, *a[1], *resolver;
Scheme_Object *name, *notifies = scheme_null, *a[2], *resolver;
Scheme_Object *to_modchain, *from_modchain, *l, *main_modidx;
Scheme_Hash_Table *checked, *next_checked, *prev_checked;
Scheme_Object *past_checkeds, *future_checkeds, *future_todos, *past_to_modchains, *past_todos;
@ -2025,8 +2025,9 @@ static Scheme_Object *do_namespace_attach_module(const char *who, int argc, Sche
resolver = scheme_get_param(config, MZCONFIG_CURRENT_MODULE_RESOLVER);
while (!SCHEME_NULLP(notifies)) {
a[0] = SCHEME_CAR(notifies);
a[1] = (Scheme_Object *)from_env;
scheme_apply(resolver, 1, a);
scheme_apply(resolver, 2, a);
notifies = SCHEME_CDR(notifies);
}
@ -6131,7 +6132,8 @@ static Scheme_Object *do_module_execute(Scheme_Object *data, Scheme_Env *genv,
Scheme_Object *resolver, *a[1];
resolver = scheme_get_param(config, MZCONFIG_CURRENT_MODULE_RESOLVER);
a[0] = m->modname;
scheme_apply(resolver, 1, a);
a[1] = scheme_false;
scheme_apply(resolver, 2, a);
}
/* Replacing an already-running or already-syntaxing module? */

View File

@ -13,12 +13,12 @@
consistently.)
*/
#define MZSCHEME_VERSION "5.3.0.14"
#define MZSCHEME_VERSION "5.3.0.15"
#define MZSCHEME_VERSION_X 5
#define MZSCHEME_VERSION_Y 3
#define MZSCHEME_VERSION_Z 0
#define MZSCHEME_VERSION_W 14
#define MZSCHEME_VERSION_W 15
#define MZSCHEME_VERSION_MAJOR ((MZSCHEME_VERSION_X * 100) + MZSCHEME_VERSION_Y)
#define MZSCHEME_VERSION_MINOR ((MZSCHEME_VERSION_Z * 1000) + MZSCHEME_VERSION_W)

View File

@ -668,7 +668,13 @@
"(and a"
"(let((am(date-of a modes)))"
"(or(and(not bm) am) "
"(and am bm(>=(cdr am)(cdr bm)) am)))))))"
"(and am bm(>=(cdr am)(cdr bm)) am))))))"
"(with-dir*(lambda(base t) "
"(parameterize((current-load-relative-directory "
"(if(path? base) "
" base "
"(current-directory))))"
"(t)))))"
"(lambda(path expect-module)"
"(unless(path-string? path)"
" (raise-argument-error 'load/use-compiled \"path-string?\" path))"
@ -680,6 +686,16 @@
"(not(car expect-module)))"
"(andmap symbol?(cdr expect-module))))"
" (raise-argument-error 'load/use-compiled \"(or/c #f symbol? (cons/c (or/c #f symbol?) (non-empty-listof symbol?)))\" path))"
"(define name(and expect-module(current-module-declare-name)))"
"(define ns-hts(and name"
"(hash-ref -module-hash-table-table"
"(namespace-module-registry(current-namespace))"
" #f)))"
"(define use-path/src(and ns-hts(hash-ref(cdr ns-hts) name #f)))"
"(if use-path/src"
"(parameterize((current-module-declare-source(cadr use-path/src)))"
"(with-dir*(caddr use-path/src)"
"(lambda()((current-load)(car use-path/src) expect-module))))"
"(let*-values(((orig-path)(resolve path))"
"((base orig-file dir?)(split-path path))"
"((file alt-file)(if expect-module"
@ -728,14 +744,9 @@
" (path-add-suffix alt-file #\".zo\"))))"
"(so(get-so file #t))"
"(alt-so(get-so alt-file #t))"
"(with-dir(lambda(t) "
"(parameterize((current-load-relative-directory "
"(if(path? base) "
" base "
"(current-directory))))"
"(t))))"
"(try-main?(or main-path-d(not alt-path-d)))"
"(try-alt?(and alt-file(or alt-path-d(not main-path-d)))))"
"(try-alt?(and alt-file(or alt-path-d(not main-path-d))))"
"(with-dir(lambda(t)(with-dir* base t))))"
"(cond"
"((and try-main?"
"(date>=? modes so path-d))"
@ -750,11 +761,13 @@
"((and try-main?"
"(date>=? modes zo path-d))"
" =>(lambda(zo-d)"
"(register-zo-path name ns-hts(car zo-d) #f base)"
"(parameterize((current-module-declare-source #f))"
"(with-dir(lambda()((current-load)(car zo-d) expect-module))))))"
"((and try-alt?"
"(date>=? modes alt-zo path-d))"
" =>(lambda(zo-d)"
"(register-zo-path name ns-hts(car zo-d) alt-path base)"
"(parameterize((current-module-declare-source alt-path))"
"(with-dir(lambda()((current-load)(car zo-d) expect-module))))))"
"((or(not(pair? expect-module))"
@ -765,7 +778,10 @@
"(parameterize((current-module-declare-source(and expect-module "
"(not try-main?)"
" p)))"
"(with-dir(lambda()((current-load) p expect-module)))))))))))))"
"(with-dir(lambda()((current-load) p expect-module))))))))))))))"
"(define(register-zo-path name ns-hts path src-path base)"
"(when ns-hts"
"(hash-set!(cdr ns-hts) name(list path src-path base))))"
"(define-values(default-reader-guard)"
"(lambda(path) path))"
"(define-values(-module-hash-table-table)(make-weak-hasheq)) "
@ -815,23 +831,39 @@
" (set! planet-resolver (dynamic-require '(lib \"planet/resolver.rkt\") 'planet-module-name-resolver))))))"
"(define-values(standard-module-name-resolver)"
"(case-lambda "
"((s) "
"((s from-namespace) "
"(unless(resolved-module-path? s)"
"(raise-argument-error 'standard-module-name-resolver"
" \"resolved-module-path?\""
" s))"
"(unless(or(not from-namespace)(namespace? from-namespace))"
"(raise-argument-error 'standard-module-name-resolver"
" \"(or/c #f namespace?)\""
" from-namespace))"
"(when planet-resolver"
"(planet-resolver s))"
"(let((ht(or(hash-ref -module-hash-table-table"
"(let((hts(or(hash-ref -module-hash-table-table"
"(namespace-module-registry(current-namespace))"
" #f)"
"(let((ht(make-hasheq)))"
"(let((hts(cons(make-hasheq)(make-hasheq))))"
"(hash-set! -module-hash-table-table"
"(namespace-module-registry(current-namespace))"
" ht)"
" ht))))"
"(hash-set! ht s 'attach)))"
"((s relto stx)(standard-module-name-resolver s relto stx #t))"
" hts)"
" hts))))"
"(hash-set!(car hts) s 'declared)"
"(when from-namespace"
"(let((root-name(if(pair?(resolved-module-path-name s))"
"(make-resolved-module-path(car(resolved-module-path-name s)))"
" s))"
"(from-hts(hash-ref -module-hash-table-table"
"(namespace-module-registry from-namespace)"
" #f)))"
"(when from-hts"
"(let((use-path/src(hash-ref(cdr from-hts) root-name #f)))"
"(when use-path/src"
"(hash-set!(cdr hts) root-name use-path/src))))))))"
"((s relto stx) "
"(standard-module-name-resolver s relto stx #t)) "
"((s relto stx load?)"
"(unless(module-path? s)"
"(if stx"
@ -1048,21 +1080,21 @@
"(let*((root-modname(if(vector? s-parsed)"
"(vector-ref s-parsed 4)"
"(make-resolved-module-path filename)))"
"(ht(or(hash-ref -module-hash-table-table"
"(hts(or(hash-ref -module-hash-table-table"
"(namespace-module-registry(current-namespace))"
" #f)"
"(let((ht(make-hasheq)))"
"(let((hts(cons(make-hasheq)(make-hasheq))))"
"(hash-set! -module-hash-table-table"
"(namespace-module-registry(current-namespace))"
" ht)"
" ht)))"
" hts)"
" hts)))"
"(modname(if subm-path"
"(make-resolved-module-path "
"(cons(resolved-module-path-name root-modname)"
" subm-path))"
" root-modname)))"
"(when load?"
"(let((got(hash-ref ht modname #f)))"
"(let((got(hash-ref(car hts) modname #f)))"
"(unless got"
"(let((loading"
"(let((tag(if(continuation-prompt-available? -loading-prompt-tag)"
@ -1101,11 +1133,10 @@
" filename "
"(let((sym(string->symbol(path->string no-sfx))))"
"(if subm-path"
"(if(hash-ref ht root-modname #f)"
"(if(hash-ref(car hts) root-modname #f)"
"(cons #f subm-path)"
"(cons sym subm-path))"
" sym))))))))"
"(hash-set! ht modname #t))))"
" sym)))))))))))"
"(when(and(not(vector? s-parsed))"
"(or(string? s)"
"(symbol? s)"

View File

@ -777,7 +777,13 @@
(and a
(let ([am (date-of a modes)])
(or (and (not bm) am)
(and am bm (>= (cdr am) (cdr bm)) am)))))])
(and am bm (>= (cdr am) (cdr bm)) am)))))]
[with-dir* (lambda (base t)
(parameterize ([current-load-relative-directory
(if (path? base)
base
(current-directory))])
(t)))])
(lambda (path expect-module)
(unless (path-string? path)
(raise-argument-error 'load/use-compiled "path-string?" path))
@ -789,100 +795,113 @@
(not (car expect-module)))
(andmap symbol? (cdr expect-module))))
(raise-argument-error 'load/use-compiled "(or/c #f symbol? (cons/c (or/c #f symbol?) (non-empty-listof symbol?)))" path))
(let*-values ([(orig-path) (resolve path)]
[(base orig-file dir?) (split-path path)]
[(file alt-file) (if expect-module
(let* ([b (path->bytes orig-file)]
[len (bytes-length b)])
(cond
[(and (len . >= . 4)
(bytes=? #".rkt" (subbytes b (- len 4))))
;; .rkt => try .rkt then .ss
(values orig-file
(bytes->path (bytes-append (subbytes b 0 (- len 4)) #".ss")))]
[else
;; No search path
(values orig-file #f)]))
(values orig-file #f))]
[(path) (if (eq? file orig-file)
orig-path
(build-path base file))]
[(alt-path) (and alt-file
(if (eq? alt-file orig-file)
orig-path
(build-path base alt-file)))]
[(base) (if (eq? base 'relative) 'same base)]
[(modes) (use-compiled-file-paths)])
(let* ([main-path-d (date-of-1 path)]
[alt-path-d (and alt-path
(not main-path-d)
(date-of-1 alt-path))]
[path-d (or main-path-d alt-path-d)]
[get-so (lambda (file rep-sfx?)
(lambda (compiled-dir)
(build-path base
compiled-dir
"native"
(system-library-subpath)
(if rep-sfx?
(path-add-suffix
file
dll-suffix)
file))))]
[zo (lambda (compiled-dir)
(build-path base
compiled-dir
(path-add-suffix file #".zo")))]
[alt-zo (lambda (compiled-dir)
(define name (and expect-module (current-module-declare-name)))
(define ns-hts (and name
(hash-ref -module-hash-table-table
(namespace-module-registry (current-namespace))
#f)))
(define use-path/src (and ns-hts (hash-ref (cdr ns-hts) name #f)))
(if use-path/src
;; Use previous decision of .zo vs. source:
(parameterize ([current-module-declare-source (cadr use-path/src)])
(with-dir* (caddr use-path/src)
(lambda () ((current-load) (car use-path/src) expect-module))))
;; Check .zo vs. src dates, etc.:
(let*-values ([(orig-path) (resolve path)]
[(base orig-file dir?) (split-path path)]
[(file alt-file) (if expect-module
(let* ([b (path->bytes orig-file)]
[len (bytes-length b)])
(cond
[(and (len . >= . 4)
(bytes=? #".rkt" (subbytes b (- len 4))))
;; .rkt => try .rkt then .ss
(values orig-file
(bytes->path (bytes-append (subbytes b 0 (- len 4)) #".ss")))]
[else
;; No search path
(values orig-file #f)]))
(values orig-file #f))]
[(path) (if (eq? file orig-file)
orig-path
(build-path base file))]
[(alt-path) (and alt-file
(if (eq? alt-file orig-file)
orig-path
(build-path base alt-file)))]
[(base) (if (eq? base 'relative) 'same base)]
[(modes) (use-compiled-file-paths)])
(let* ([main-path-d (date-of-1 path)]
[alt-path-d (and alt-path
(not main-path-d)
(date-of-1 alt-path))]
[path-d (or main-path-d alt-path-d)]
[get-so (lambda (file rep-sfx?)
(lambda (compiled-dir)
(build-path base
compiled-dir
"native"
(system-library-subpath)
(if rep-sfx?
(path-add-suffix
file
dll-suffix)
file))))]
[zo (lambda (compiled-dir)
(build-path base
compiled-dir
(path-add-suffix alt-file #".zo")))]
[so (get-so file #t)]
[alt-so (get-so alt-file #t)]
[with-dir (lambda (t)
(parameterize ([current-load-relative-directory
(if (path? base)
base
(current-directory))])
(t)))]
[try-main? (or main-path-d (not alt-path-d))]
[try-alt? (and alt-file (or alt-path-d (not main-path-d)))])
(cond
[(and try-main?
(date>=? modes so path-d))
=> (lambda (so-d)
(parameterize ([current-module-declare-source #f])
(with-dir (lambda () ((current-load-extension) (car so-d) expect-module)))))]
[(and try-alt?
(date>=? modes alt-so alt-path-d))
=> (lambda (so-d)
(parameterize ([current-module-declare-source alt-path])
(with-dir (lambda () ((current-load-extension) (car so-d) expect-module)))))]
[(and try-main?
(date>=? modes zo path-d))
=> (lambda (zo-d)
(parameterize ([current-module-declare-source #f])
(with-dir (lambda () ((current-load) (car zo-d) expect-module)))))]
[(and try-alt?
(date>=? modes alt-zo path-d))
=> (lambda (zo-d)
(parameterize ([current-module-declare-source alt-path])
(with-dir (lambda () ((current-load) (car zo-d) expect-module)))))]
[(or (not (pair? expect-module))
(car expect-module))
(let ([p (if try-main? path alt-path)])
;; "quiet" failure when asking for a submodule:
(unless (and (pair? expect-module)
(not (file-exists? p)))
(parameterize ([current-module-declare-source (and expect-module
(not try-main?)
p)])
(with-dir (lambda () ((current-load) p expect-module))))))]))))))
(path-add-suffix file #".zo")))]
[alt-zo (lambda (compiled-dir)
(build-path base
compiled-dir
(path-add-suffix alt-file #".zo")))]
[so (get-so file #t)]
[alt-so (get-so alt-file #t)]
[try-main? (or main-path-d (not alt-path-d))]
[try-alt? (and alt-file (or alt-path-d (not main-path-d)))]
[with-dir (lambda (t) (with-dir* base t))])
(cond
[(and try-main?
(date>=? modes so path-d))
=> (lambda (so-d)
(parameterize ([current-module-declare-source #f])
(with-dir (lambda () ((current-load-extension) (car so-d) expect-module)))))]
[(and try-alt?
(date>=? modes alt-so alt-path-d))
=> (lambda (so-d)
(parameterize ([current-module-declare-source alt-path])
(with-dir (lambda () ((current-load-extension) (car so-d) expect-module)))))]
[(and try-main?
(date>=? modes zo path-d))
=> (lambda (zo-d)
(register-zo-path name ns-hts (car zo-d) #f base)
(parameterize ([current-module-declare-source #f])
(with-dir (lambda () ((current-load) (car zo-d) expect-module)))))]
[(and try-alt?
(date>=? modes alt-zo path-d))
=> (lambda (zo-d)
(register-zo-path name ns-hts (car zo-d) alt-path base)
(parameterize ([current-module-declare-source alt-path])
(with-dir (lambda () ((current-load) (car zo-d) expect-module)))))]
[(or (not (pair? expect-module))
(car expect-module))
(let ([p (if try-main? path alt-path)])
;; "quiet" failure when asking for a submodule:
(unless (and (pair? expect-module)
(not (file-exists? p)))
(parameterize ([current-module-declare-source (and expect-module
(not try-main?)
p)])
(with-dir (lambda () ((current-load) p expect-module))))))])))))))
(define (register-zo-path name ns-hts path src-path base)
(when ns-hts
(hash-set! (cdr ns-hts) name (list path src-path base))))
(define-values (default-reader-guard)
(lambda (path) path))
(define-values (-module-hash-table-table) (make-weak-hasheq)) ; weak map from namespace to module ht
(define-values (-module-hash-table-table) (make-weak-hasheq)) ; weak map from namespace to pair of module-name hts
;; weak map from `lib' path + corrent-library-paths to symbols:
;; We'd like to use a weak `equal?'-based hash table here,
@ -939,25 +958,42 @@
(set! planet-resolver (dynamic-require '(lib "planet/resolver.rkt") 'planet-module-name-resolver))))))
(define-values (standard-module-name-resolver)
(case-lambda
[(s)
[(s from-namespace)
(unless (resolved-module-path? s)
(raise-argument-error 'standard-module-name-resolver
"resolved-module-path?"
s))
;; Just register s as loaded
(unless (or (not from-namespace) (namespace? from-namespace))
(raise-argument-error 'standard-module-name-resolver
"(or/c #f namespace?)"
from-namespace))
(when planet-resolver
;; Let planet resolver register, too:
(planet-resolver s))
(let ([ht (or (hash-ref -module-hash-table-table
(namespace-module-registry (current-namespace))
#f)
(let ([ht (make-hasheq)])
(hash-set! -module-hash-table-table
(namespace-module-registry (current-namespace))
ht)
ht))])
(hash-set! ht s 'attach))]
[(s relto stx) (standard-module-name-resolver s relto stx #t)]
;; Register s as loaded:
(let ([hts (or (hash-ref -module-hash-table-table
(namespace-module-registry (current-namespace))
#f)
(let ([hts (cons (make-hasheq) (make-hasheq))])
(hash-set! -module-hash-table-table
(namespace-module-registry (current-namespace))
hts)
hts))])
(hash-set! (car hts) s 'declared)
;; If attach from another namespace, copy over source-file path, if any:
(when from-namespace
(let ([root-name (if (pair? (resolved-module-path-name s))
(make-resolved-module-path (car (resolved-module-path-name s)))
s)]
[from-hts (hash-ref -module-hash-table-table
(namespace-module-registry from-namespace)
#f)])
(when from-hts
(let ([use-path/src (hash-ref (cdr from-hts) root-name #f)])
(when use-path/src
(hash-set! (cdr hts) root-name use-path/src)))))))]
[(s relto stx) ; for backward-compatibility
(standard-module-name-resolver s relto stx #t)]
[(s relto stx load?)
;; If stx is not #f, raise syntax error for ill-formed paths
(unless (module-path? s)
@ -1181,14 +1217,14 @@
(let* ([root-modname (if (vector? s-parsed)
(vector-ref s-parsed 4)
(make-resolved-module-path filename))]
[ht (or (hash-ref -module-hash-table-table
(namespace-module-registry (current-namespace))
#f)
(let ([ht (make-hasheq)])
(hash-set! -module-hash-table-table
(namespace-module-registry (current-namespace))
ht)
ht))]
[hts (or (hash-ref -module-hash-table-table
(namespace-module-registry (current-namespace))
#f)
(let ([hts (cons (make-hasheq) (make-hasheq))])
(hash-set! -module-hash-table-table
(namespace-module-registry (current-namespace))
hts)
hts))]
[modname (if subm-path
(make-resolved-module-path
(cons (resolved-module-path-name root-modname)
@ -1196,7 +1232,7 @@
root-modname)])
;; Loaded already?
(when load?
(let ([got (hash-ref ht modname #f)])
(let ([got (hash-ref (car hts) modname #f)])
(unless got
;; Currently loading?
(let ([loading
@ -1236,15 +1272,12 @@
filename
(let ([sym (string->symbol (path->string no-sfx))])
(if subm-path
(if (hash-ref ht root-modname #f)
(if (hash-ref (car hts) root-modname #f)
;; Root is already loaded, so only use .zo
(cons #f subm-path)
;; Root isn't loaded, so it's ok to load form source:
(cons sym subm-path))
sym))))))))
;; Possibly redundant, because notification should have arrived,
;; but non-redundant when a requested submodule wasn't found:
(hash-set! ht modname #t))))
sym)))))))))))
;; If a `lib' path, cache pathname manipulations
(when (and (not (vector? s-parsed))
(or (string? s)