diff --git a/pkgs/base/info.rkt b/pkgs/base/info.rkt index 95afdfd40f..925cde7806 100644 --- a/pkgs/base/info.rkt +++ b/pkgs/base/info.rkt @@ -12,7 +12,7 @@ (define collection 'multi) -(define version "6.2.900.6") +(define version "6.2.900.8") (define deps `("racket-lib" ["racket" #:version ,version])) diff --git a/pkgs/racket-doc/scribblings/raco/make.scrbl b/pkgs/racket-doc/scribblings/raco/make.scrbl index 4407484024..4e5d4af085 100644 --- a/pkgs/racket-doc/scribblings/raco/make.scrbl +++ b/pkgs/racket-doc/scribblings/raco/make.scrbl @@ -497,6 +497,18 @@ result will not call @racket[proc] with @racket['unlock].) compilations of the same racket source files in multiple places. } +@defproc[(install-module-hashes! [bstr btyes?] + [start exact-nonnegatve-integer? 0] + [end exact-nonnegatve-integer? (bytes-length bstr)]) + void?]{ + +Adjusts the bytecode representation in @racket[bstr] (from bytes +@racket[start] to @racket[end]) to install a hash code, including any +submodules within the region. The existing representation should have +zero bytes in place of each hash string, which is what @racket[write] +produces for a compiled form. + +@history[#:added "6.2.900.8"]} @; ---------------------------------------------------------------------- diff --git a/pkgs/racket-doc/scribblings/reference/hashes.scrbl b/pkgs/racket-doc/scribblings/reference/hashes.scrbl index 576242727c..bd41fff249 100644 --- a/pkgs/racket-doc/scribblings/reference/hashes.scrbl +++ b/pkgs/racket-doc/scribblings/reference/hashes.scrbl @@ -355,13 +355,15 @@ procedure and mutability of @racket[hash].} @defproc[(hash-map [hash hash?] - [proc (any/c any/c . -> . any/c)]) + [proc (any/c any/c . -> . any/c)] + [try-order? any/c #f]) (listof any/c)]{ Applies the procedure @racket[proc] to each element in @racket[hash] in an unspecified order, accumulating the results into a list. The procedure @racket[proc] is called each time with a -key and its value. +key and its value, and the procedure's individual results appear in +order in the result list. If a hash table is extended with new keys (either through @racket[proc] or by another thread) while a @racket[hash-map] or @@ -372,7 +374,14 @@ change does not affect a traversal if the key has been seen already, otherwise the traversal skips a deleted key or uses the remapped key's new value. -@see-also-concurrency-caveat[]} +If @racket[try-order?] is true, then the order of keys and values +passed to @racket[proc] is normalized under certain circumstances, +such as when the keys are all symbols and @racket[hash] is not an +@tech{impersonator}. + +@see-also-concurrency-caveat[] + +@history[#:changed "6.2.900.8" @elem{Added the @racket[try-order?] argument.}]} @defproc[(hash-keys [hash hash?]) (listof any/c)]{ @@ -396,15 +405,19 @@ See @racket[hash-map] for information about modifying @racket[hash] during @racket[hash->list]. @see-also-concurrency-caveat[]} @defproc[(hash-for-each [hash hash?] - [proc (any/c any/c . -> . any)]) + [proc (any/c any/c . -> . any)] + [try-order? any/c #f]) void?]{ Applies @racket[proc] to each element in @racket[hash] (for the side-effects of @racket[proc]) in an unspecified order. The procedure @racket[proc] is called each time with a key and its value. -See @racket[hash-map] for information about modifying @racket[hash] -within @racket[proc]. @see-also-concurrency-caveat[]} +See @racket[hash-map] for information about @racket[try-order?] and +about modifying @racket[hash] within @racket[proc]. +@see-also-concurrency-caveat[] + +@history[#:changed "6.2.900.8" @elem{Added the @racket[try-order?] argument.}]} @defproc[(hash-count [hash hash?]) diff --git a/pkgs/racket-doc/scribblings/reference/namespaces.scrbl b/pkgs/racket-doc/scribblings/reference/namespaces.scrbl index ecc8b4e560..83f1e67f0d 100644 --- a/pkgs/racket-doc/scribblings/reference/namespaces.scrbl +++ b/pkgs/racket-doc/scribblings/reference/namespaces.scrbl @@ -21,16 +21,22 @@ otherwise.} @defproc[(make-empty-namespace) namespace?]{ -Creates a new namespace that is empty, and whose @tech{module +Creates a new @tech{namespace} that is empty, and whose @tech{module registry} contains no mappings. The namespace's @tech{base phase} is the same as the @tech{base phase} of the @tech{current namespace}. Attach modules from an existing namespace to the new one -with @racket[namespace-attach-module].} +with @racket[namespace-attach-module]. + +The new namespace is associated with a new @deftech{root namespace}, +which has the same @tech{module registry} as the returned namespace +and has a @tech{base phase} of 0. The new @tech{root namespace} is +the same as the returned namespace if both have @tech{base phase} 0.} @defproc[(make-base-empty-namespace) namespace?]{ -Creates a new empty namespace, but with @racketmodname[racket/base] +Creates a new empty @tech{namespace} like @racket[make-empty-namespace], +but with @racketmodname[racket/base] attached. The namespace's @tech{base phase} is the same as the @tech{phase} in which the @racket[make-base-empty-namespace] function was created.} @@ -38,7 +44,8 @@ function was created.} @defproc[(make-base-namespace) namespace?]{ -Creates a new namespace with @racketmodname[racket/base] attached and +Creates a new @tech{namespace} like @racket[make-empty-namespace], but +with @racketmodname[racket/base] attached and @racket[require]d into the top-level environment. The namespace's @tech{base phase} is the same as the @tech{phase} in which the @racket[make-base-namespace] function was created.} @@ -62,7 +69,8 @@ Returns @racket[#t] if @racket[v] is a namespace-anchor value, @defproc[(namespace-anchor->empty-namespace [a namespace-anchor?]) namespace?]{ -Returns an empty namespace that shares a @tech{module registry} with +Returns an empty namespace that shares a @tech{module registry} +and @tech{root namespace} with the source of the anchor, and whose @tech{base phase} is the @tech{phase} in which the anchor was created. diff --git a/pkgs/racket-doc/scribblings/reference/read.scrbl b/pkgs/racket-doc/scribblings/reference/read.scrbl index f1cc3b1f90..635187e1aa 100644 --- a/pkgs/racket-doc/scribblings/reference/read.scrbl +++ b/pkgs/racket-doc/scribblings/reference/read.scrbl @@ -121,7 +121,9 @@ See @secref["readtables"] for an extended example that uses (or/c (any/c any/c . -> . any) #f)]{ Reads from @racket[in] in the same way as @racket[read], but stopping as -soon as a @tech{reader language} (or its absence) is determined. +soon as a @tech{reader language} (or its absence) is determined, and +using the @tech{current namespace} to load a reader module instead +of its @tech{root namespace} (if those are different). A @deftech{reader language} is specified by @litchar{#lang} or @litchar{#!} (see @secref["parse-reader"]) at the beginning of the diff --git a/pkgs/racket-doc/scribblings/reference/reader.scrbl b/pkgs/racket-doc/scribblings/reference/reader.scrbl index b30f99a816..f01f408323 100644 --- a/pkgs/racket-doc/scribblings/reference/reader.scrbl +++ b/pkgs/racket-doc/scribblings/reference/reader.scrbl @@ -866,7 +866,8 @@ and passes it to the procedure that is the value of the module path. The module path is passed to @racket[dynamic-require] with either @racket['read] or @racket['read-syntax] (depending on whether the reader is in @racket[read] or @racket[read-syntax] -mode). +mode). The module is loaded in a @tech{root namespace} of the +@tech{current namespace}. The arity of the resulting procedure determines whether it accepts extra source-location information: a @racketidfont{read} procedure diff --git a/pkgs/racket-test-core/tests/racket/basic.rktl b/pkgs/racket-test-core/tests/racket/basic.rktl index c57b19231e..1e49626a45 100644 --- a/pkgs/racket-test-core/tests/racket/basic.rktl +++ b/pkgs/racket-test-core/tests/racket/basic.rktl @@ -2548,8 +2548,8 @@ (arity-test hash-set 3 3) (arity-test hash-remove! 2 2) (arity-test hash-remove 2 2) -(arity-test hash-map 2 2) -(arity-test hash-for-each 2 2) +(arity-test hash-map 2 3) +(arity-test hash-for-each 2 3) (arity-test hash? 1 1) (arity-test hash-eq? 1 1) (arity-test hash-weak? 1 1) diff --git a/pkgs/racket-test/tests/racket/deterministic-zo.rkt b/pkgs/racket-test/tests/racket/deterministic-zo.rkt new file mode 100644 index 0000000000..5b8762aa6b --- /dev/null +++ b/pkgs/racket-test/tests/racket/deterministic-zo.rkt @@ -0,0 +1,68 @@ +#lang racket/base +(require syntax/modread + racket/file + compiler/compilation-path + compiler/cm) + +(define (go dir collects-dir fn) + (parameterize ([current-load-relative-directory dir]) + (define path (build-path dir fn)) + (define stx + (check-module-form + (call-with-input-file* + path + (lambda (i) + (port-count-lines! i) + (with-module-reading-parameterization + (lambda () + (read-syntax path i))))) + 'mod + #f)) + (define o (open-output-bytes)) + (parameterize ([current-namespace (make-base-namespace)] + [current-write-relative-directory (cons dir collects-dir)]) + (dynamic-require 'racket/private/base #f) + (write (compile stx) o)) + (define bstr (get-output-bytes o)) + (install-module-hashes! bstr) + bstr)) + +(define (check-file dir collects-dir sub-dir f) + (printf "~a\n" (build-path sub-dir f)) + (define c1 (go dir collects-dir f)) + (define c2 (go dir collects-dir f)) + (unless (equal? c1 c2) + (call-with-output-file* "/tmp/c1" #:exists 'truncate (lambda (o) (write-bytes c1 o))) + (call-with-output-file* "/tmp/c2" #:exists 'truncate (lambda (o) (write-bytes c2 o))) + (error "failed")) + (define zo (get-compilation-bytecode-file (build-path dir f) #:modes '("compiled"))) + (when (file-exists? zo) + (define c3 (file->bytes zo)) + (unless (equal? c3 c1) + (call-with-output-file* "/tmp/c1" #:exists 'truncate (lambda (o) (write-bytes c1 o))) + (call-with-output-file* "/tmp/c2" #:exists 'truncate (lambda (o) (write-bytes c3 o))) + (error "failed relative to built")))) + +(define (check dir [collects-dir dir] [sub-dir 'same] #:limit [limit +inf.0]) + (for/fold ([limit limit]) ([f (in-list (directory-list dir))] + #:when (positive? limit)) + (cond + [(and (regexp-match? #rx"[.]rkt$" f) + (file-exists? (build-path dir f))) + (check-file dir collects-dir sub-dir f) + (sub1 limit)] + [(directory-exists? (build-path dir f)) + (check (build-path dir f) collects-dir (build-path sub-dir f) #:limit limit)] + [else limit]))) + +(define (check-one collects-dir collects file) + (check-file (build-path collects-dir collects) collects-dir collects file)) + +(let-values ([(dir name dir?) + (split-path + (collection-file-path "sc.rkt" "racket/private"))]) + (define collects-dir (simplify-path (build-path dir 'up 'up))) + ;; To check just one: + #; (check-one collects-dir "syntax" "free-vars.rkt") + (check (simplify-path collects-dir)) + (void)) diff --git a/racket/collects/compiler/cm.rkt b/racket/collects/compiler/cm.rkt index b92adca448..6236e761a0 100644 --- a/racket/collects/compiler/cm.rkt +++ b/racket/collects/compiler/cm.rkt @@ -31,7 +31,9 @@ parallel-lock-client make-compile-lock - compile-lock->parallel-lock-client) + compile-lock->parallel-lock-client + + install-module-hashes!) (define cm-logger (make-logger 'compiler/cm (current-logger))) (define (default-manager-trace-handler str) @@ -308,10 +310,13 @@ (write (list* (version) (cons (or src-sha1 (get-source-sha1 path)) (get-dep-sha1s deps up-to-date collection-cache read-src-syntax mode roots #t #hash())) - deps) + (sort deps s-expdate sec)]) (format "~a-~a-~a ~a:~a:~a" @@ -459,7 +464,7 @@ (write code b) ;; Compute SHA1 over modules within bytecode (let* ([s (get-output-bytes b)]) - (install-module-hashes! s 0 (bytes-length s)) + (install-module-hashes! s) ;; Write out the bytecode with module hash (write-bytes s out))))) ;; redundant, but close as early as possible: @@ -471,7 +476,7 @@ external-deps external-module-deps reader-deps up-to-date collection-cache read-src-syntax))))) -(define (install-module-hashes! s start len) +(define (install-module-hashes! s [start 0] [len (bytes-length s)]) (define vlen (bytes-ref s (+ start 2))) (define mode (integer->char (bytes-ref s (+ start 3 vlen)))) (case mode diff --git a/racket/collects/racket/contract/private/arrow-higher-order.rkt b/racket/collects/racket/contract/private/arrow-higher-order.rkt index c0994902ee..28e82fc5d6 100644 --- a/racket/collects/racket/contract/private/arrow-higher-order.rkt +++ b/racket/collects/racket/contract/private/arrow-higher-order.rkt @@ -1,6 +1,7 @@ #lang racket/base (require (for-syntax racket/base - "arr-util.rkt") + "arr-util.rkt" + "helpers.rkt") "arity-checking.rkt" "kwd-info-struct.rkt" "blame.rkt" @@ -151,7 +152,7 @@ [(rng-x ...) (if rngs (generate-temporaries rngs) '())]) (with-syntax ([(rng-checker-name ...) (if rngs - (list (gensym 'rng-checker)) + (list (gen-id 'rng-checker)) null)] [(rng-checker ...) (if rngs @@ -274,7 +275,7 @@ (arrow:check-tail-contract #'(rng-ctc ...) #'(rng-checker-name ...) outer-stx-gen))))]) - (with-syntax ([basic-lambda-name (gensym 'basic-lambda)] + (with-syntax ([basic-lambda-name (gen-id 'basic-lambda)] [basic-lambda #'(λ basic-params ;; Arrow contract domain checking is instrumented ;; both here, and in `arity-checking-wrapper'. @@ -290,7 +291,7 @@ (cons blame neg-party) (let () pre ... basic-return)))] - [kwd-lambda-name (gensym 'kwd-lambda)] + [kwd-lambda-name (gen-id 'kwd-lambda)] [kwd-lambda #`(λ kwd-lam-params (with-continuation-mark contract-continuation-mark-key diff --git a/racket/collects/racket/contract/private/arrow.rkt b/racket/collects/racket/contract/private/arrow.rkt index c27630dfff..8f0202189c 100644 --- a/racket/collects/racket/contract/private/arrow.rkt +++ b/racket/collects/racket/contract/private/arrow.rkt @@ -229,7 +229,7 @@ [(rng-x ...) (if rngs (generate-temporaries rngs) '())]) (with-syntax ([(rng-checker-name ...) (if rngs - (list (gensym 'rng-checker)) + (list (gen-id 'rng-checker)) null)] [(rng-checker ...) (if rngs @@ -322,7 +322,7 @@ #,(if no-rng-checking? (outer-stx-gen #'()) (check-tail-contract #'(rng-ctc ...) #'(rng-checker-name ...) outer-stx-gen))))]) - (with-syntax ([basic-lambda-name (gensym 'basic-lambda)] + (with-syntax ([basic-lambda-name (gen-id 'basic-lambda)] [basic-lambda #'(λ basic-params ;; Arrow contract domain checking is instrumented ;; both here, and in `arity-checking-wrapper'. @@ -337,7 +337,7 @@ contract-continuation-mark-key blame (let () pre ... basic-return)))] - [kwd-lambda-name (gensym 'kwd-lambda)] + [kwd-lambda-name (gen-id 'kwd-lambda)] [kwd-lambda #`(λ kwd-lam-params (with-continuation-mark contract-continuation-mark-key blame diff --git a/racket/collects/racket/contract/private/helpers.rkt b/racket/collects/racket/contract/private/helpers.rkt index 63ff6dc25c..c98706571d 100644 --- a/racket/collects/racket/contract/private/helpers.rkt +++ b/racket/collects/racket/contract/private/helpers.rkt @@ -8,7 +8,8 @@ all-but-last known-good-contract? known-good-contracts - update-loc) + update-loc + gen-id) (require setup/main-collects racket/struct-info @@ -373,5 +374,8 @@ (free-identifier=? id (datum->syntax #'here r-id)))) (define (known-good-contracts) - (for/list ([(k v) (in-hash known-good-syms-ht)]) + (for/list ([k (in-list (sort (hash-keys known-good-syms-ht) symbolsyntax #'here k))) + +(define (gen-id sym) + (car (generate-temporaries (list sym)))) diff --git a/racket/collects/racket/match/compiler.rkt b/racket/collects/racket/match/compiler.rkt index 21ea8e1260..758b20e679 100644 --- a/racket/collects/racket/match/compiler.rkt +++ b/racket/collects/racket/match/compiler.rkt @@ -15,17 +15,27 @@ (define vars-seen (make-parameter null)) (define (hash-on f elems #:equal? [eql #t]) - (define-values (ht ref set!) + (define-values (ht h-ref h-set!) (case eql [(#t) (values (make-hash) hash-ref hash-set!)] [(#f) (values (make-hasheq) hash-ref hash-set!)])) + (define keys null) ;; put all the elements e in the ht, indexed by (f e) (for ([r ;; they need to be in the original order when they come out (reverse elems)]) (define k (f r)) - (set! ht k (cons r (ref ht k (lambda () null))))) - ht) + (h-set! ht k (cons r (h-ref ht k (lambda () + (set! keys (cons k keys)) + null))))) + ;; Return a list, instead of a hash, to make order deterministic + ;; based on the recorded order of keys + (for/list ([k (in-list keys)]) + (cons k (hash-ref ht k)))) + +;; Like `hash-map`, bu for a list produced by `hash-on`: +(define (hash-on-map ht-l f) + (map (lambda (p) (f (car p) (cdr p))) ht-l)) ;; generate a clause of kind k ;; for rows rows, with matched variable x and rest variable xs @@ -74,7 +84,7 @@ (let ([ht (hash-on (lambda (r) (length (Vector-ps (Row-first-pat r)))) rows)]) (with-syntax ([(clauses ...) - (hash-map + (hash-on-map ht (lambda (arity rows) (define ns (build-list arity values)) @@ -123,7 +133,7 @@ [(Exact? first) (let ([ht (hash-on (compose Exact-v Row-first-pat) block #:equal? #t)]) (with-syntax ([(clauses ...) - (hash-map + (hash-on-map ht (lambda (k v) #`[(equal? #,x '#,k) @@ -188,7 +198,7 @@ (let ;; put all the rows in the hash, indexed by their constructor ([ht (hash-on (lambda (r) (pat-key (Row-first-pat r))) block)]) (with-syntax ([(clauses ...) - (hash-map + (hash-on-map ht (lambda (k v) (gen-clause k v x xs esc)))]) #`(cond clauses ... [else (#,esc)])))] ;; the Or rule @@ -298,7 +308,7 @@ ;; we use the pattern so that it can have a custom equal+hash (define ht (hash-on (lambda (r) (Row-first-pat r)) block #:equal? #t)) (with-syntax ([(clauses ...) - (hash-map + (hash-on-map ht (lambda (k v) (gen-clause (Pred-pred k) v x xs esc)))]) #`(cond clauses ... [else (#,esc)]))] diff --git a/racket/collects/racket/match/patterns.rkt b/racket/collects/racket/match/patterns.rkt index 196ca7d9c0..ca95354537 100644 --- a/racket/collects/racket/match/patterns.rkt +++ b/racket/collects/racket/match/patterns.rkt @@ -146,10 +146,13 @@ (define (merge l) (cond [(null? l) null] [(null? (cdr l)) (car l)] - [else (let ([m (make-module-identifier-mapping)]) + [else (let ([m (make-module-identifier-mapping)] + [in-order null]) (for* ([ids l] [id ids]) - (module-identifier-mapping-put! m id #t)) - (module-identifier-mapping-map m (lambda (k v) k)))])) + (unless (module-identifier-mapping-get m id (lambda () #f)) + (set! in-order (cons id in-order)) + (module-identifier-mapping-put! m id #t))) + (reverse in-order))])) ;; bound-vars : Pat -> listof identifiers (define (bound-vars p) (cond diff --git a/racket/collects/racket/private/define-et-al.rkt b/racket/collects/racket/private/define-et-al.rkt index 7dd7f7c5b3..fea6207fc0 100644 --- a/racket/collects/racket/private/define-et-al.rkt +++ b/racket/collects/racket/private/define-et-al.rkt @@ -81,7 +81,7 @@ [exprs (stx-cdr (stx-cdr code))]) (datum->syntax (quote-syntax here) - `(call/ec (lambda (,var) ,@(stx->list exprs))) + `(call-with-escape-continuation (lambda (,var) ,@(stx->list exprs))) code)) (raise-syntax-error #f diff --git a/racket/collects/racket/private/more-scheme.rkt b/racket/collects/racket/private/more-scheme.rkt index 7f110c5fbd..02e16ed2ff 100644 --- a/racket/collects/racket/private/more-scheme.rkt +++ b/racket/collects/racket/private/more-scheme.rkt @@ -303,7 +303,7 @@ (lambda (stx) (syntax-case stx () [(_ var body1 body ...) - (syntax/loc stx (call/cc (lambda (var) body1 body ...)))]))) + (syntax/loc stx (call-with-current-continuation (lambda (var) body1 body ...)))]))) (define-syntax fluid-let (lambda (stx) diff --git a/racket/collects/racket/private/pre-base.rkt b/racket/collects/racket/private/pre-base.rkt index 8336f08866..a1b5d93520 100644 --- a/racket/collects/racket/private/pre-base.rkt +++ b/racket/collects/racket/private/pre-base.rkt @@ -148,6 +148,9 @@ (cdr l))) stx) (raise-syntax-error #f "bad syntax" stx))))) + + (define-values (call/cc) call-with-current-continuation) + (define-values (call/ec) call-with-escape-continuation) (#%provide (all-from-except "more-scheme.rkt" old-case fluid-let) (all-from-except "misc.rkt" collection-path collection-file-path) @@ -207,4 +210,5 @@ define-struct/derived struct-field-index struct-copy - double-flonum?)) + double-flonum? + call/cc call/ec)) diff --git a/racket/collects/racket/private/qq-and-or.rkt b/racket/collects/racket/private/qq-and-or.rkt index 03199e18e7..56cfe63b1e 100644 --- a/racket/collects/racket/private/qq-and-or.rkt +++ b/racket/collects/racket/private/qq-and-or.rkt @@ -421,7 +421,7 @@ (list (quote-syntax quote) rest) rest))))))))) - (let-values (((l0) (hash-map (syntax-e x) cons))) + (let-values (((l0) (hash-map (syntax-e x) cons #t))) (let-values (((l) (qq-hash-assocs l0 level))) (if (eq? l0 l) diff --git a/racket/collects/racket/private/sc.rkt b/racket/collects/racket/private/sc.rkt index 578293e751..ce8e282079 100644 --- a/racket/collects/racket/private/sc.rkt +++ b/racket/collects/racket/private/sc.rkt @@ -730,6 +730,7 @@ (let* ([ht (if proto-r #f (make-hasheq))] + [in-order null] ; same content as ht, but in deterministic order [l (expander p proto-r p #t (and proto-r (sub1 (length proto-r))) (if proto-r @@ -742,7 +743,9 @@ l))]) (if pr (set-mcdr! pr (cons r (mcdr pr))) - (hash-set! ht (syntax-e r) (cons (mcons r (list r)) l))))))) + (let ([pr (mcons r (list r))]) + (set! in-order (cons pr in-order)) + (hash-set! ht (syntax-e r) (cons pr l)))))))) #f)]) (if proto-r `(lambda (r) @@ -766,7 +769,7 @@ ;; This is a trick to minimize the syntax structure we keep: (quote-syntax ,(datum->syntax #f '... p))) main))) - (let ([l (apply append (hash-map ht (lambda (k v) v)))]) + (let ([l in-order]) (values ;; Get list of unique vars: (map mcar l) diff --git a/racket/collects/setup/main.rkt b/racket/collects/setup/main.rkt index 3877ac9bf7..08158b7567 100644 --- a/racket/collects/setup/main.rkt +++ b/racket/collects/setup/main.rkt @@ -120,7 +120,7 @@ (let loop ([skip-zo? (null? (use-compiled-file-paths))]) (when skip-zo? (print-bootstrapping)) - ((call/ec + ((call-with-escape-continuation (lambda (escape) ;; Create a new namespace, and also install load handlers ;; to check file dates, if necessary. diff --git a/racket/collects/syntax/parse/experimental/dset.rkt b/racket/collects/syntax/parse/experimental/dset.rkt new file mode 100644 index 0000000000..57c53e5d1c --- /dev/null +++ b/racket/collects/syntax/parse/experimental/dset.rkt @@ -0,0 +1,54 @@ +#lang racket/base + +;; A dset is an `equal?`-based set, but it preserves order based on +;; the history of additions, so that if items are added in a +;; deterministic order, they come back out in a deterministic order. + +(provide dset + dset-empty? + dset->list + dset-add + dset-union + dset-subtract + dset-filter) + +(define dset + (case-lambda + [() (hash)] + [(e) (hash e 0)])) + +(define (dset-empty? ds) + (zero? (hash-count ds))) + +(define (dset->list ds) + (map cdr + (sort (for/list ([(k v) (in-hash ds)]) + (cons v k)) + < + #:key car))) + +(define (dset-add ds e) + (if (hash-ref ds e #f) + ds + (hash-set ds e (hash-count ds)))) + +(define (dset-union ds1 ds2) + (cond + [((hash-count ds1) . > . (hash-count ds2)) + (dset-union ds2 ds1)] + [else + (for/fold ([ds2 ds2]) ([e (dset->list ds1)]) + (dset-add ds2 e))])) + +(define (dset-subtract ds1 ds2) + ;; ! takes O(size(ds2)) time ! + (for/fold ([r (dset)]) ([e (in-list (dset->list ds1))]) + (if (hash-ref ds2 e #f) + r + (dset-add r e)))) + +(define (dset-filter ds pred) + (for/fold ([r (dset)]) ([e (in-list (dset->list ds))]) + (if (pred e) + (dset-add r e) + r))) diff --git a/racket/collects/syntax/parse/experimental/template.rkt b/racket/collects/syntax/parse/experimental/template.rkt index 609135b15f..d415813f97 100644 --- a/racket/collects/syntax/parse/experimental/template.rkt +++ b/racket/collects/syntax/parse/experimental/template.rkt @@ -1,6 +1,6 @@ #lang racket/base (require (for-syntax racket/base - racket/set + "dset.rkt" racket/syntax syntax/parse/private/minimatch racket/private/stx ;; syntax/stx @@ -229,19 +229,19 @@ instead of integers and integer vectors. (if loc-id (let* ([loc-sm (make-syntax-mapping 0 loc-id)] [loc-pvar (pvar loc-sm #f #f)]) - (values (set-union drivers (set loc-pvar)) + (values (dset-add drivers loc-pvar) (relocate-guide pre-guide loc-pvar))) (values drivers pre-guide))]) - (let* ([main-env (set->env drivers (hash))] + (let* ([main-env (dset->env drivers (hash))] [guide (guide-resolve-env pre-guide main-env)]) (values guide (index-hash->vector main-env) props-guide)))) - ;; set->env : (setof env-entry) -> hash[env-entry => nat] - (define (set->env drivers init-env) + ;; dset->env : (dsetof env-entry) -> hash[env-entry => nat] + (define (dset->env drivers init-env) (for/fold ([env init-env]) - ([pvar (in-set drivers)] + ([pvar (in-list (dset->list drivers))] [n (in-naturals (+ 1 (hash-count init-env)))]) (hash-set env pvar n))) @@ -265,7 +265,7 @@ instead of integers and integer vectors. (let-values ([(sub-loop-env r-uptos) (for/fold ([env (hash)] [r-uptos null]) ([new-hdrivers (in-list new-hdrivers/level)]) - (let ([new-env (set->env new-hdrivers env)]) + (let ([new-env (dset->env new-hdrivers env)]) (values new-env (cons (hash-count new-env) r-uptos))))]) (let ([sub-loop-vector (index-hash->vector sub-loop-env get-index)]) (vector 'dots @@ -414,7 +414,7 @@ instead of integers and integer vectors. (define (list-guide . gs) (foldr cons-guide '_ gs)) - ;; parse-t : stx nat boolean -> (values (setof env-entry) pre-guide props-guide) + ;; parse-t : stx nat boolean -> (values (dsetof env-entry) pre-guide props-guide) (define (parse-t t depth esc?) (syntax-case t (?? ?@ unsyntax quasitemplate) [id @@ -430,18 +430,18 @@ instead of integers and integer vectors. [else (let ([pvar (lookup #'id depth)]) (cond [(pvar? pvar) - (values (set pvar) pvar '_)] + (values (dset pvar) pvar '_)] [(template-metafunction? pvar) (wrong-syntax t "illegal use of syntax metafunction")] [else - (wrap-props #'id (set) '_ '_)]))])] + (wrap-props #'id (dset) '_ '_)]))])] [(mf . template) (and (not esc?) (identifier? #'mf) (template-metafunction? (lookup #'mf #f))) (let-values ([(mf) (lookup #'mf #f)] [(drivers guide props-guide) (parse-t #'template depth esc?)]) - (values (set-union (set mf) drivers) + (values (dset-add drivers mf) (vector 'metafun mf guide) (cons-guide '_ props-guide)))] [(unsyntax t1) @@ -452,7 +452,7 @@ instead of integers and integer vectors. (set-box! qval (cons (cons #'tmp t) (unbox qval))) (let* ([fake-sm (make-syntax-mapping 0 #'tmp)] [fake-pvar (pvar fake-sm #f #f)]) - (values (set fake-pvar) (vector 'unsyntax fake-pvar) '_)))] + (values (dset fake-pvar) (vector 'unsyntax fake-pvar) '_)))] [else (parameterize ((quasi (car qval))) (let-values ([(drivers guide props-guide) (parse-t #'t1 depth esc?)]) @@ -479,7 +479,7 @@ instead of integers and integer vectors. (not esc?) (let-values ([(drivers1 guide1 props-guide1) (parse-t #'t1 depth esc?)] [(drivers2 guide2 props-guide2) (parse-t #'t2 depth esc?)]) - (values (set-union drivers1 drivers2) + (values (dset-union drivers1 drivers2) (vector 'orelse guide1 guide2) (list-guide '_ props-guide1 props-guide2)))] [(head DOTS . tail) @@ -496,26 +496,26 @@ instead of integers and integer vectors. (parse-h #'head (+ depth nesting) esc?)] [(tdrivers tguide tprops-guide) (parse-t tail depth esc?)]) - (when (set-empty? hdrivers) + (when (dset-empty? hdrivers) (wrong-syntax #'head "no pattern variables before ellipsis in template")) - (when (set-empty? (set-filter hdrivers (pvar/dd<=? depth))) + (when (dset-empty? (dset-filter hdrivers (pvar/dd<=? depth))) ;; FIXME: improve error message? (let ([bad-dots ;; select the nestingth (last) ellipsis as the bad one (stx-car (stx-drop nesting t))]) (wrong-syntax bad-dots "too many ellipses in template"))) (wrap-props t - (set-union hdrivers tdrivers) + (dset-union hdrivers tdrivers) ;; pre-guide hdrivers is (listof (setof pvar)) ;; set of pvars new to each level (let* ([hdrivers/level (for/list ([i (in-range nesting)]) - (set-filter hdrivers (pvar/dd<=? (+ depth i))))] + (dset-filter hdrivers (pvar/dd<=? (+ depth i))))] [new-hdrivers/level - (let loop ([raw hdrivers/level] [last (set)]) + (let loop ([raw hdrivers/level] [last (dset)]) (cond [(null? raw) null] [else - (cons (set-subtract (car raw) last) + (cons (dset-subtract (car raw) last) (loop (cdr raw) (car raw)))]))]) (vector 'dots hguide new-hdrivers/level nesting #f tguide)) (cons-guide hprops-guide (cons-guide '_ tprops-guide)))))] @@ -525,7 +525,7 @@ instead of integers and integer vectors. [(tdrivers tguide tprops-guide) (parse-t #'tail depth esc?)]) (wrap-props t - (set-union hdrivers tdrivers) + (dset-union hdrivers tdrivers) (cond [(and (eq? hguide '_) (eq? tguide '_)) '_] [hsplice? (vector 'app hguide tguide)] [else (cons hguide tguide)]) @@ -551,9 +551,9 @@ instead of integers and integer vectors. (if (eq? guide '_) '_ (vector 'box guide)) (if (eq? props-guide '_) '_ (vector 'box props-guide))))] [const - (wrap-props t (set) '_ '_)])) + (wrap-props t (dset) '_ '_)])) - ;; parse-h : stx nat boolean -> (values (setof env-entry) boolean pre-head-guide props-guide) + ;; parse-h : stx nat boolean -> (values (dsetof env-entry) boolean pre-head-guide props-guide) (define (parse-h h depth esc?) (syntax-case h (?? ?@ unsyntax-splicing) [(?? t) @@ -567,7 +567,7 @@ instead of integers and integer vectors. (not esc?) (let-values ([(drivers1 splice?1 guide1 props-guide1) (parse-h #'t1 depth esc?)] [(drivers2 splice?2 guide2 props-guide2) (parse-h #'t2 depth esc?)]) - (values (set-union drivers1 drivers2) + (values (dset-union drivers1 drivers2) (or splice?1 splice?2) (vector (if (or splice?1 splice?2) 'orelse-h 'orelse) guide1 guide2) @@ -584,7 +584,7 @@ instead of integers and integer vectors. (set-box! qval (cons (cons #'tmp h) (unbox qval))) (let* ([fake-sm (make-syntax-mapping 0 #'tmp)] [fake-pvar (pvar fake-sm #f #f)]) - (values (set fake-pvar) #t (vector 'unsyntax-splicing fake-pvar) '_)))] + (values (dset fake-pvar) #t (vector 'unsyntax-splicing fake-pvar) '_)))] [else (parameterize ((quasi (car qval))) (let*-values ([(drivers guide props-guide) (parse-t #'t1 depth esc?)] @@ -598,10 +598,6 @@ instead of integers and integer vectors. (let-values ([(drivers guide props-guide) (parse-t #'t depth esc?)]) (values drivers #f guide props-guide))])) - ;; Note: always creates equal?-based set. - (define (set-filter s pred?) - (for/set ([el (in-set s)] #:when (pred? el)) el)) - (define (lookup id depth) (let ([v (syntax-local-value id (lambda () #f))]) (cond [(syntax-pattern-variable? v) diff --git a/racket/collects/syntax/parse/private/rep-attrs.rkt b/racket/collects/syntax/parse/private/rep-attrs.rkt index bf46b9f331..746b340198 100644 --- a/racket/collects/syntax/parse/private/rep-attrs.rkt +++ b/racket/collects/syntax/parse/private/rep-attrs.rkt @@ -89,13 +89,16 @@ of signatures easier for reified syntax-classes. (define count-t (make-bound-id-table)) (define attr-t (make-bound-id-table)) (define list-count (length attrss)) + (define attr-keys null) (for* ([attrs (in-list attrss)] [attr (in-list attrs)]) (define name (attr-name attr)) (define prev (bound-id-table-ref attr-t name #f)) + (unless prev (set! attr-keys (cons name attr-keys))) (bound-id-table-set! attr-t name (join-attrs attr prev)) (let ([pc (bound-id-table-ref count-t name 0)]) (bound-id-table-set! count-t name (add1 pc)))) - (for/list ([a (in-list (bound-id-table-map attr-t (lambda (_ v) v)))]) + (for/list ([k (in-list attr-keys)]) + (define a (bound-id-table-ref attr-t k)) (if (= (bound-id-table-ref count-t (attr-name a)) list-count) a (attr-make-uncertain a)))) diff --git a/racket/src/racket/gc2/check-sdep.rkt b/racket/src/racket/gc2/check-sdep.rkt index e2a0f8a1b6..0f5ff1b12d 100644 --- a/racket/src/racket/gc2/check-sdep.rkt +++ b/racket/src/racket/gc2/check-sdep.rkt @@ -12,7 +12,7 @@ [(regexp-match? #rx"[.][ch]$" path) (define-values (ts) (file-or-directory-modify-seconds path)) (define-values (sdep) (path-replace-suffix path ".sdep")) - (call/ec + (call-with-escape-continuation (lambda (esc) (with-continuation-mark exception-handler-key diff --git a/racket/src/racket/gc2/xform.rkt b/racket/src/racket/gc2/xform.rkt index 1f731af3fc..93274506d1 100644 --- a/racket/src/racket/gc2/xform.rkt +++ b/racket/src/racket/gc2/xform.rkt @@ -71,7 +71,7 @@ ;; In case multiple xforms run in parallel, use a lock file ;; so that only one is building. (let ([lock-file "XFORM-LOCK"]) - ((call/ec + ((call-with-escape-continuation (lambda (escape) (parameterize ([uncaught-exception-handler (lambda (exn) diff --git a/racket/src/racket/src/bool.c b/racket/src/racket/src/bool.c index 759b895b54..9781955772 100644 --- a/racket/src/racket/src/bool.c +++ b/racket/src/racket/src/bool.c @@ -858,19 +858,19 @@ int is_equal (Scheme_Object *obj1, Scheme_Object *obj2, Equal_Info *eql) } case scheme_module_index_type: { - if (!eql->eq_for_modidx) { - Scheme_Modidx *midx1, *midx2; + Scheme_Modidx *midx1, *midx2; # include "mzeqchk.inc" - midx1 = (Scheme_Modidx *)obj1; - midx2 = (Scheme_Modidx *)obj2; - if (is_equal(midx1->path, midx2->path, eql)) { - obj1 = midx1->base; - obj2 = midx2->base; - goto top; - } else - return 0; - } else + midx1 = (Scheme_Modidx *)obj1; + midx2 = (Scheme_Modidx *)obj2; + if (eql->eq_for_modidx + && (SCHEME_FALSEP(midx1->path) + || SCHEME_FALSEP(midx2->path))) return 0; + else if (is_equal(midx1->path, midx2->path, eql)) { + obj1 = midx1->base; + obj2 = midx2->base; + goto top; + } } case scheme_scope_table_type: { diff --git a/racket/src/racket/src/compenv.c b/racket/src/racket/src/compenv.c index 5f7de25852..4fac159c22 100644 --- a/racket/src/racket/src/compenv.c +++ b/racket/src/racket/src/compenv.c @@ -944,7 +944,7 @@ Scheme_Object *scheme_hash_module_variable(Scheme_Env *env, Scheme_Object *modid Scheme_Hash_Table *ht; if (!env->modvars) { - ht = scheme_make_hash_table(SCHEME_hash_ptr); + ht = scheme_make_hash_table_equal_modix_eq(); env->modvars = ht; } diff --git a/racket/src/racket/src/cstartup.inc b/racket/src/racket/src/cstartup.inc index a415534ec3..7f2b33898f 100644 --- a/racket/src/racket/src/cstartup.inc +++ b/racket/src/racket/src/cstartup.inc @@ -1,1053 +1,1052 @@ { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,9,54,46,50,46,57,48,48,46,54,84,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,9,54,46,50,46,57,48,48,46,56,84,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,54,0,0,0,1,0,0,8,0, -18,0,22,0,29,0,36,0,41,0,46,0,51,0,63,0,66,0,73,0,86, -0,90,0,94,0,103,0,109,0,123,0,137,0,140,0,146,0,157,0,159,0, -173,0,180,0,202,0,204,0,218,0,246,0,251,0,254,0,35,1,42,1,114, -1,121,1,132,1,141,1,174,1,207,1,13,2,18,2,99,2,104,2,109,2, -130,2,27,3,48,3,101,3,170,3,239,3,129,4,21,5,32,5,115,5,0, -0,144,7,0,0,3,1,5,105,110,115,112,48,71,35,37,109,105,110,45,115, -116,120,29,11,11,11,68,108,101,116,114,101,99,68,100,101,102,105,110,101,66, -99,111,110,100,66,119,104,101,110,66,108,101,116,42,73,108,101,116,42,45,118, -97,108,117,101,115,64,111,114,68,117,110,108,101,115,115,74,112,97,114,97,109, -101,116,101,114,105,122,101,65,108,101,116,65,97,110,100,70,104,101,114,101,45, +18,0,22,0,26,0,31,0,38,0,42,0,47,0,59,0,66,0,69,0,82, +0,89,0,94,0,103,0,109,0,123,0,137,0,140,0,146,0,157,0,159,0, +173,0,180,0,202,0,204,0,218,0,246,0,251,0,255,0,72,1,79,1,90, +1,128,1,135,1,144,1,177,1,210,1,16,2,21,2,102,2,107,2,112,2, +133,2,30,3,51,3,104,3,173,3,242,3,132,4,24,5,35,5,118,5,0, +0,147,7,0,0,3,1,5,105,110,115,112,48,71,35,37,109,105,110,45,115, +116,120,29,11,11,11,65,97,110,100,66,99,111,110,100,68,100,101,102,105,110, +101,65,108,101,116,66,108,101,116,42,73,108,101,116,42,45,118,97,108,117,101, +115,68,108,101,116,114,101,99,64,111,114,74,112,97,114,97,109,101,116,101,114, +105,122,101,68,117,110,108,101,115,115,66,119,104,101,110,70,104,101,114,101,45, 115,116,120,67,113,117,111,116,101,29,94,2,16,70,35,37,107,101,114,110,101, 108,11,29,94,2,16,70,35,37,112,97,114,97,109,122,11,64,105,102,67,98, 101,103,105,110,72,108,101,116,45,118,97,108,117,101,115,63,120,75,108,101,116, 114,101,99,45,118,97,108,117,101,115,68,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,63,118,75, 100,101,102,105,110,101,45,118,97,108,117,101,115,38,28,16,3,93,16,2,29, -11,11,11,2,3,2,29,93,143,16,5,40,2,31,39,2,33,2,2,39,38, -29,93,2,30,36,30,39,36,31,144,40,143,2,32,16,4,2,17,40,39,2, -1,16,2,2,15,93,143,2,32,147,2,1,2,3,40,2,15,143,2,3,40, -2,15,38,32,143,2,31,2,29,36,33,145,40,143,2,34,16,4,2,17,39, -39,2,1,143,2,34,16,4,2,18,39,39,2,1,16,22,2,14,2,35,2, -12,2,35,2,5,2,35,2,10,2,35,2,6,2,35,2,13,2,35,2,11, -2,35,2,8,2,35,2,9,2,35,2,7,2,35,2,4,2,35,38,34,143, -2,33,2,29,38,35,93,143,2,34,143,2,1,2,3,18,143,66,104,101,114, -101,2,28,27,248,22,166,4,195,249,22,159,4,80,143,42,39,251,22,92,2, -19,248,22,104,199,12,249,22,82,2,20,248,22,106,201,27,248,22,166,4,195, -249,22,159,4,80,143,42,39,251,22,92,2,19,248,22,104,199,249,22,82,2, -20,248,22,106,201,12,27,248,22,84,248,22,166,4,196,28,248,22,90,193,20, -14,144,40,39,40,28,248,22,90,248,22,84,194,248,22,163,20,193,249,22,159, -4,80,143,42,39,251,22,92,2,19,248,22,163,20,199,249,22,82,2,14,248, -22,164,20,201,11,18,143,10,2,28,27,248,22,84,248,22,166,4,196,28,248, -22,90,193,20,14,144,40,39,40,28,248,22,90,248,22,84,194,248,22,163,20, -193,249,22,159,4,80,143,42,39,250,22,92,2,21,248,22,92,249,22,92,248, -22,92,2,22,248,22,163,20,201,251,22,92,2,19,2,22,2,22,249,22,82, -2,10,248,22,164,20,204,18,143,11,2,28,248,22,166,4,193,27,248,22,166, -4,194,249,22,82,248,22,92,248,22,83,196,248,22,164,20,195,27,248,22,84, -248,22,166,4,23,197,1,249,22,159,4,80,143,42,39,28,248,22,66,248,22, -160,4,248,22,83,23,198,2,27,249,22,2,32,0,88,148,8,36,40,46,11, -9,222,33,43,248,22,166,4,248,22,104,23,200,2,250,22,92,2,23,248,22, -92,249,22,92,248,22,92,248,22,163,20,23,204,2,250,22,93,2,24,249,22, -2,22,83,23,204,2,248,22,106,23,206,2,249,22,82,248,22,163,20,23,202, -1,249,22,2,22,104,23,200,1,250,22,93,2,21,249,22,2,32,0,88,148, -8,36,40,50,11,9,222,33,44,248,22,166,4,248,22,163,20,201,248,22,164, -20,198,27,248,22,166,4,194,249,22,82,248,22,92,248,22,83,196,248,22,164, -20,195,27,248,22,84,248,22,166,4,23,197,1,249,22,159,4,80,143,42,39, -250,22,93,2,23,249,22,2,32,0,88,148,8,36,40,50,11,9,222,33,46, -248,22,166,4,248,22,83,201,248,22,164,20,198,27,248,22,84,248,22,166,4, -196,27,248,22,166,4,248,22,83,195,249,22,159,4,80,143,43,39,28,248,22, -90,195,250,22,93,2,21,9,248,22,164,20,199,250,22,92,2,13,248,22,92, -248,22,83,199,250,22,93,2,8,248,22,164,20,201,248,22,164,20,202,27,248, -22,84,248,22,166,4,196,27,248,22,166,4,248,22,83,195,249,22,159,4,80, -143,43,39,28,248,22,90,195,250,22,93,2,21,9,248,22,164,20,199,250,22, -92,2,21,248,22,92,248,22,83,199,250,22,93,2,9,248,22,164,20,201,248, -22,164,20,202,27,248,22,84,248,22,166,4,23,197,1,27,249,22,1,22,96, -249,22,2,22,166,4,248,22,166,4,248,22,83,199,248,22,187,4,249,22,159, -4,80,143,44,39,251,22,92,1,22,119,105,116,104,45,99,111,110,116,105,110, -117,97,116,105,111,110,45,109,97,114,107,2,25,250,22,93,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,21, -95,1,27,99,111,110,116,105,110,117,97,116,105,111,110,45,109,97,114,107,45, -115,101,116,45,102,105,114,115,116,11,2,25,202,250,22,93,2,21,9,248,22, -164,20,204,27,248,22,84,248,22,166,4,196,28,248,22,90,193,20,14,144,40, -39,40,249,22,159,4,80,143,42,39,27,248,22,166,4,248,22,83,197,28,249, -22,171,9,64,61,62,248,22,160,4,248,22,104,196,250,22,92,2,21,248,22, -92,249,22,92,21,93,2,26,248,22,163,20,199,250,22,93,2,6,249,22,92, -2,26,249,22,92,248,22,113,203,2,26,248,22,164,20,202,251,22,92,2,19, -28,249,22,171,9,248,22,160,4,248,22,163,20,200,66,101,108,115,101,10,248, -22,163,20,197,250,22,93,2,21,9,248,22,164,20,200,249,22,82,2,6,248, -22,164,20,202,18,143,94,10,66,118,111,105,100,2,28,27,248,22,84,248,22, -166,4,196,249,22,159,4,80,143,42,39,28,248,22,66,248,22,160,4,248,22, -83,197,250,22,92,2,27,248,22,92,248,22,163,20,199,248,22,104,198,27,248, -22,160,4,248,22,163,20,197,250,22,92,2,27,248,22,92,248,22,83,197,250, -22,93,2,24,248,22,164,20,199,248,22,164,20,202,144,39,20,120,145,2,1, -39,16,1,11,16,0,20,26,15,61,9,2,2,2,2,2,3,11,11,11,11, -9,9,11,11,11,10,39,80,143,39,39,20,120,145,2,1,39,16,0,16,0, -41,42,39,16,0,39,16,0,39,11,11,11,16,11,2,4,2,5,2,6,2, -7,2,8,2,9,2,10,2,11,2,12,2,13,2,14,16,11,11,11,11,11, -11,11,11,11,11,11,11,16,11,2,4,2,5,2,6,2,7,2,8,2,9, -2,10,2,11,2,12,2,13,2,14,39,50,40,16,0,39,16,1,2,15,40, -11,11,11,16,0,16,0,16,0,39,39,11,12,11,11,16,0,16,0,16,0, -39,39,16,12,16,5,11,20,15,16,2,20,14,144,39,39,40,80,143,39,39, -39,20,120,145,2,1,39,16,1,2,15,16,1,33,36,10,16,5,2,11,88, -148,8,36,40,56,40,9,223,0,33,37,39,20,120,145,2,1,39,16,1,2, -15,16,0,11,16,5,2,7,88,148,8,36,40,56,40,9,223,0,33,38,39, -20,120,145,2,1,39,16,1,2,15,16,0,11,16,5,2,14,88,148,8,36, -40,56,42,9,223,0,33,39,39,20,120,145,2,1,39,16,1,2,15,16,1, -33,40,11,16,5,2,10,88,148,8,36,40,59,42,9,223,0,33,41,39,20, -120,145,2,1,39,16,1,2,15,16,1,33,42,11,16,5,2,13,88,148,8, -36,40,61,40,9,223,0,33,45,39,20,120,145,2,1,39,16,1,2,15,16, -0,11,16,5,2,4,88,148,8,36,40,56,40,9,223,0,33,47,39,20,120, -145,2,1,39,16,1,2,15,16,0,11,16,5,2,8,88,148,8,36,40,57, -40,9,223,0,33,48,39,20,120,145,2,1,39,16,1,2,15,16,0,11,16, -5,2,9,88,148,8,36,40,57,40,9,223,0,33,49,39,20,120,145,2,1, -39,16,1,2,15,16,0,11,16,5,2,12,88,148,8,36,40,59,40,9,223, -0,33,50,39,20,120,145,2,1,39,16,1,2,15,16,0,11,16,5,2,6, -88,148,8,36,40,61,42,9,223,0,33,51,39,20,120,145,2,1,39,16,1, -2,15,16,1,33,52,11,16,5,2,5,88,148,8,36,40,57,40,9,223,0, -33,53,39,20,120,145,2,1,39,16,1,2,15,16,0,11,16,0,94,2,17, -2,18,93,2,17,9,9,39,9,0}; - EVAL_ONE_SIZED_STR((char *)expr, 2088); +11,11,11,2,3,2,29,93,143,16,5,39,2,31,40,2,34,2,2,39,38, +29,93,2,30,36,30,0,39,36,31,1,145,40,143,2,32,16,4,2,17,39, +39,2,1,143,2,32,16,4,2,18,39,39,2,1,16,22,2,4,2,33,2, +5,2,33,2,6,2,33,2,7,2,33,2,8,2,33,2,9,2,33,2,10, +2,33,2,11,2,33,2,12,2,33,2,13,2,33,2,14,2,33,38,32,143, +2,31,2,29,38,33,93,143,2,32,143,2,1,2,3,36,34,2,144,40,143, +2,35,16,4,2,17,40,39,2,1,16,2,2,15,93,143,2,35,147,2,1, +2,3,40,2,15,143,2,3,40,2,15,38,35,143,2,34,2,29,18,143,66, +104,101,114,101,2,28,27,248,22,164,4,195,249,22,157,4,80,143,42,39,251, +22,90,2,19,248,22,102,199,12,249,22,80,2,20,248,22,104,201,27,248,22, +164,4,195,249,22,157,4,80,143,42,39,251,22,90,2,19,248,22,102,199,249, +22,80,2,20,248,22,104,201,12,27,248,22,82,248,22,164,4,196,28,248,22, +88,193,20,14,144,40,39,40,28,248,22,88,248,22,82,194,248,22,161,20,193, +249,22,157,4,80,143,42,39,251,22,90,2,19,248,22,161,20,199,249,22,80, +2,4,248,22,162,20,201,11,18,143,10,2,28,27,248,22,82,248,22,164,4, +196,28,248,22,88,193,20,14,144,40,39,40,28,248,22,88,248,22,82,194,248, +22,161,20,193,249,22,157,4,80,143,42,39,250,22,90,2,21,248,22,90,249, +22,90,248,22,90,2,22,248,22,161,20,201,251,22,90,2,19,2,22,2,22, +249,22,80,2,11,248,22,162,20,204,18,143,11,2,28,248,22,164,4,193,27, +248,22,164,4,194,249,22,80,248,22,90,248,22,81,196,248,22,162,20,195,27, +248,22,82,248,22,164,4,23,197,1,249,22,157,4,80,143,42,39,28,248,22, +64,248,22,158,4,248,22,81,23,198,2,27,249,22,2,32,0,88,148,8,36, +40,46,11,9,222,33,43,248,22,164,4,248,22,102,23,200,2,250,22,90,2, +23,248,22,90,249,22,90,248,22,90,248,22,161,20,23,204,2,250,22,91,2, +24,249,22,2,22,81,23,204,2,248,22,104,23,206,2,249,22,80,248,22,161, +20,23,202,1,249,22,2,22,102,23,200,1,250,22,91,2,21,249,22,2,32, +0,88,148,8,36,40,50,11,9,222,33,44,248,22,164,4,248,22,161,20,201, +248,22,162,20,198,27,248,22,164,4,194,249,22,80,248,22,90,248,22,81,196, +248,22,162,20,195,27,248,22,82,248,22,164,4,23,197,1,249,22,157,4,80, +143,42,39,250,22,91,2,23,249,22,2,32,0,88,148,8,36,40,50,11,9, +222,33,46,248,22,164,4,248,22,81,201,248,22,162,20,198,27,248,22,82,248, +22,164,4,196,27,248,22,164,4,248,22,81,195,249,22,157,4,80,143,43,39, +28,248,22,88,195,250,22,91,2,21,9,248,22,162,20,199,250,22,90,2,7, +248,22,90,248,22,81,199,250,22,91,2,8,248,22,162,20,201,248,22,162,20, +202,27,248,22,82,248,22,164,4,196,27,248,22,164,4,248,22,81,195,249,22, +157,4,80,143,43,39,28,248,22,88,195,250,22,91,2,21,9,248,22,162,20, +199,250,22,90,2,21,248,22,90,248,22,81,199,250,22,91,2,9,248,22,162, +20,201,248,22,162,20,202,27,248,22,82,248,22,164,4,23,197,1,27,249,22, +1,22,94,249,22,2,22,164,4,248,22,164,4,248,22,81,199,248,22,185,4, +249,22,157,4,80,143,44,39,251,22,90,1,22,119,105,116,104,45,99,111,110, +116,105,110,117,97,116,105,111,110,45,109,97,114,107,2,25,250,22,91,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,21,95,1,27,99,111,110,116,105,110,117,97,116,105,111,110,45,109,97, +114,107,45,115,101,116,45,102,105,114,115,116,11,2,25,202,250,22,91,2,21, +9,248,22,162,20,204,27,248,22,82,248,22,164,4,196,28,248,22,88,193,20, +14,144,40,39,40,249,22,157,4,80,143,42,39,27,248,22,164,4,248,22,81, +197,28,249,22,169,9,64,61,62,248,22,158,4,248,22,102,196,250,22,90,2, +21,248,22,90,249,22,90,21,93,2,26,248,22,161,20,199,250,22,91,2,5, +249,22,90,2,26,249,22,90,248,22,111,203,2,26,248,22,162,20,202,251,22, +90,2,19,28,249,22,169,9,248,22,158,4,248,22,161,20,200,66,101,108,115, +101,10,248,22,161,20,197,250,22,91,2,21,9,248,22,162,20,200,249,22,80, +2,5,248,22,162,20,202,18,143,94,10,66,118,111,105,100,2,28,27,248,22, +82,248,22,164,4,196,249,22,157,4,80,143,42,39,28,248,22,64,248,22,158, +4,248,22,81,197,250,22,90,2,27,248,22,90,248,22,161,20,199,248,22,102, +198,27,248,22,158,4,248,22,161,20,197,250,22,90,2,27,248,22,90,248,22, +81,197,250,22,91,2,24,248,22,162,20,199,248,22,162,20,202,144,39,20,121, +145,2,1,39,16,1,11,16,0,20,27,15,61,9,2,2,2,2,2,3,11, +11,11,11,9,9,11,11,11,10,39,80,143,39,39,20,121,145,2,1,39,16, +0,16,0,41,42,39,16,0,39,16,0,39,11,11,11,16,11,2,4,2,5, +2,6,2,7,2,8,2,9,2,10,2,11,2,12,2,13,2,14,16,11,11, +11,11,11,11,11,11,11,11,11,11,16,11,2,4,2,5,2,6,2,7,2, +8,2,9,2,10,2,11,2,12,2,13,2,14,39,50,40,16,0,39,16,1, +2,15,40,11,11,11,16,0,16,0,16,0,39,39,11,12,11,11,16,0,16, +0,16,0,39,39,16,12,16,5,11,20,15,16,2,20,14,144,39,39,40,80, +143,39,39,39,20,121,145,2,1,39,16,1,2,15,16,1,33,36,10,16,5, +2,13,88,148,8,36,40,56,40,9,223,0,33,37,39,20,121,145,2,1,39, +16,1,2,15,16,0,11,16,5,2,14,88,148,8,36,40,56,40,9,223,0, +33,38,39,20,121,145,2,1,39,16,1,2,15,16,0,11,16,5,2,4,88, +148,8,36,40,56,42,9,223,0,33,39,39,20,121,145,2,1,39,16,1,2, +15,16,1,33,40,11,16,5,2,11,88,148,8,36,40,59,42,9,223,0,33, +41,39,20,121,145,2,1,39,16,1,2,15,16,1,33,42,11,16,5,2,7, +88,148,8,36,40,61,40,9,223,0,33,45,39,20,121,145,2,1,39,16,1, +2,15,16,0,11,16,5,2,10,88,148,8,36,40,56,40,9,223,0,33,47, +39,20,121,145,2,1,39,16,1,2,15,16,0,11,16,5,2,8,88,148,8, +36,40,57,40,9,223,0,33,48,39,20,121,145,2,1,39,16,1,2,15,16, +0,11,16,5,2,9,88,148,8,36,40,57,40,9,223,0,33,49,39,20,121, +145,2,1,39,16,1,2,15,16,0,11,16,5,2,12,88,148,8,36,40,59, +40,9,223,0,33,50,39,20,121,145,2,1,39,16,1,2,15,16,0,11,16, +5,2,5,88,148,8,36,40,61,42,9,223,0,33,51,39,20,121,145,2,1, +39,16,1,2,15,16,1,33,52,11,16,5,2,6,88,148,8,36,40,57,40, +9,223,0,33,53,39,20,121,145,2,1,39,16,1,2,15,16,0,11,16,0, +94,2,17,2,18,93,2,17,9,9,39,9,0}; + EVAL_ONE_SIZED_STR((char *)expr, 2091); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,9,54,46,50,46,57,48,48,46,54,84,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,194,0,0,0,1,0,0,8,0, -16,0,29,0,34,0,51,0,63,0,85,0,114,0,158,0,164,0,173,0,180, -0,195,0,213,0,225,0,241,0,255,0,21,1,41,1,48,1,82,1,99,1, -116,1,139,1,154,1,193,1,211,1,242,1,254,1,15,2,27,2,42,2,66, -2,98,2,127,2,143,2,161,2,181,2,202,2,220,2,251,2,9,3,26,3, -70,3,78,3,83,3,127,3,134,3,144,3,159,3,168,3,173,3,175,3,208, -3,232,3,253,3,10,4,20,4,29,4,40,4,58,4,71,4,81,4,91,4, -97,4,102,4,114,4,117,4,121,4,126,4,169,4,182,4,185,4,209,4,248, -4,255,4,12,5,34,5,45,5,75,5,98,5,106,5,130,5,151,5,95,6, -125,6,206,9,229,9,246,9,170,11,17,12,31,12,235,12,211,14,220,14,229, -14,243,14,253,14,14,16,117,16,230,16,47,17,120,17,224,17,253,17,68,18, -206,18,21,19,234,19,96,20,109,20,227,20,240,20,79,21,146,21,159,21,170, -21,66,22,184,22,228,22,83,23,161,25,185,25,47,26,129,27,136,27,188,27, -203,27,194,28,210,28,65,29,224,29,231,29,109,31,186,31,203,31,103,32,123, -32,183,32,190,32,50,33,104,33,123,33,74,34,90,34,51,35,40,36,77,36, -86,36,163,37,8,40,24,40,91,40,112,40,132,40,152,40,209,40,169,43,135, -44,151,44,122,45,180,45,213,45,89,46,248,46,8,47,105,47,122,47,200,49, -251,51,11,52,241,53,173,54,175,54,202,54,218,54,234,54,75,55,142,56,74, -57,90,57,99,57,106,57,172,58,238,59,100,60,146,63,20,64,152,64,97,66, -47,67,89,67,197,67,0,0,144,75,0,0,3,1,5,105,110,115,112,48,69, -35,37,117,116,105,108,115,74,112,97,116,104,45,115,116,114,105,110,103,63,66, -98,115,98,115,78,110,111,114,109,97,108,45,99,97,115,101,45,112,97,116,104, -73,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,67,113,117,111,116,101,70,35,37,112,97,114,97,109,122,29,94,2,10, -2,11,11,76,45,99,104,101,99,107,45,114,101,108,112,97,116,104,79,45,99, -104,101,99,107,45,99,111,108,108,101,99,116,105,111,110,73,45,99,104,101,99, -107,45,102,97,105,108,77,99,111,108,108,101,99,116,105,111,110,45,112,97,116, -104,75,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,1,18,102,105,110, -100,45,109,97,105,110,45,99,111,108,108,101,99,116,115,29,94,2,10,2,11, -11,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,78,102,105,110,100,45,109, -97,105,110,45,99,111,110,102,105,103,78,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,76,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,79, -97,100,100,45,99,111,110,102,105,103,45,115,101,97,114,99,104,1,29,102,105, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,9,54,46,50,46,57,48,48,46,56,84,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0,1,0,0,8,0, +16,0,29,0,34,0,51,0,63,0,85,0,114,0,158,0,164,0,178,0,193, +0,211,0,223,0,239,0,253,0,19,1,39,1,73,1,90,1,107,1,130,1, +145,1,184,1,202,1,233,1,245,1,6,2,18,2,33,2,57,2,89,2,118, +2,134,2,152,2,172,2,193,2,211,2,242,2,0,3,17,3,61,3,69,3, +74,3,118,3,125,3,135,3,150,3,159,3,164,3,166,3,199,3,223,3,244, +3,1,4,11,4,20,4,31,4,49,4,62,4,72,4,82,4,88,4,93,4, +105,4,108,4,112,4,117,4,160,4,173,4,176,4,200,4,239,4,246,4,3, +5,25,5,36,5,66,5,89,5,97,5,121,5,142,5,86,6,116,6,197,9, +220,9,237,9,161,11,8,12,22,12,226,12,202,14,211,14,220,14,234,14,244, +14,5,16,108,16,221,16,38,17,111,17,215,17,244,17,59,18,197,18,12,19, +225,19,87,20,100,20,218,20,231,20,70,21,137,21,150,21,161,21,57,22,175, +22,219,22,74,23,152,25,176,25,38,26,120,27,127,27,179,27,192,27,182,28, +198,28,53,29,212,29,219,29,96,31,173,31,190,31,90,32,110,32,170,32,177, +32,37,33,91,33,110,33,61,34,77,34,38,35,27,36,64,36,73,36,150,37, +251,39,11,40,78,40,99,40,119,40,139,40,196,40,156,43,122,44,138,44,109, +45,167,45,200,45,76,46,235,46,251,46,92,47,109,47,187,49,238,51,254,51, +228,53,160,54,162,54,189,54,205,54,221,54,62,55,129,56,61,57,77,57,86, +57,93,57,159,58,225,59,87,60,133,63,7,64,139,64,84,66,34,67,76,67, +184,67,0,0,131,75,0,0,3,1,5,105,110,115,112,48,69,35,37,117,116, +105,108,115,74,112,97,116,104,45,115,116,114,105,110,103,63,66,98,115,98,115, +78,110,111,114,109,97,108,45,99,97,115,101,45,112,97,116,104,73,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,67,113, +117,111,116,101,29,94,2,10,70,35,37,112,97,114,97,109,122,11,76,45,99, +104,101,99,107,45,114,101,108,112,97,116,104,79,45,99,104,101,99,107,45,99, +111,108,108,101,99,116,105,111,110,73,45,99,104,101,99,107,45,102,97,105,108, +77,99,111,108,108,101,99,116,105,111,110,45,112,97,116,104,75,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,1,18,102,105,110,100,45,109,97,105,110, +45,99,111,108,108,101,99,116,115,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,78,102,105,110,100,45,109,97,105,110,45,99,111,110,102,105,103,78,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,76,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,79,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,73,108,105,110,107,115,45, +99,97,99,104,101,78,115,116,97,109,112,45,112,114,111,109,112,116,45,116,97, +103,73,102,105,108,101,45,62,115,116,97,109,112,76,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, +1,27,102,105,108,101,45,101,120,105,115,116,115,63,47,109,97,121,98,101,45, +99,111,109,112,105,108,101,100,77,112,97,116,104,45,97,100,100,45,115,117,102, +102,105,120,79,99,104,101,99,107,45,115,117,102,102,105,120,45,99,97,108,108, +1,18,112,97,116,104,45,97,100,106,117,115,116,45,115,117,102,102,105,120,1, +19,112,97,116,104,45,114,101,112,108,97,99,101,45,115,117,102,102,105,120,79, +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,108,105,110,107,115,73,108,105,110,107,115,45,99,97,99,104,101,78,115,116, -97,109,112,45,112,114,111,109,112,116,45,116,97,103,73,102,105,108,101,45,62, -115,116,97,109,112,76,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,1,27,102,105,108,101,45,101, -120,105,115,116,115,63,47,109,97,121,98,101,45,99,111,109,112,105,108,101,100, -77,112,97,116,104,45,97,100,100,45,115,117,102,102,105,120,79,99,104,101,99, -107,45,115,117,102,102,105,120,45,99,97,108,108,1,18,112,97,116,104,45,97, -100,106,117,115,116,45,115,117,102,102,105,120,1,19,112,97,116,104,45,114,101, -112,108,97,99,101,45,115,117,102,102,105,120,79,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,75,101, -109,98,101,100,100,101,100,45,108,111,97,100,78,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,69,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,70,114,101,108,97,116, -105,118,101,66,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,74,99,111,108,108,101,99,116,115,45,100,105,114,71,101,120,101, -99,45,102,105,108,101,70,111,114,105,103,45,100,105,114,72,99,111,110,102,105, -103,45,100,105,114,79,105,110,115,116,97,108,108,97,116,105,111,110,45,110,97, -109,101,6,10,10,108,105,110,107,115,46,114,107,116,100,71,97,100,100,111,110, -45,100,105,114,71,102,115,45,99,104,97,110,103,101,67,101,114,114,111,114,66, -114,111,111,116,73,115,116,97,116,105,99,45,114,111,111,116,6,0,0,6,1, -1,47,5,3,46,122,111,6,40,40,114,101,109,111,118,105,110,103,32,115,117, -102,102,105,120,32,109,97,107,101,115,32,112,97,116,104,32,101,108,101,109,101, -110,116,32,101,109,112,116,121,6,10,10,103,105,118,101,110,32,112,97,116,104, -5,1,95,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,68,102,105,110,105,115,104,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,175,15,194,28, -192,192,28,248,22,155,7,194,27,248,22,134,16,195,28,192,192,248,22,135,16, -195,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, -176,15,23,195,2,10,28,248,22,175,15,23,195,2,10,28,248,22,155,7,23, -195,2,28,248,22,134,16,23,195,2,10,248,22,135,16,23,195,2,11,12,250, -22,182,11,2,43,2,44,23,197,2,28,28,248,22,176,15,23,195,2,249,22, -171,9,248,22,177,15,23,197,2,2,45,249,22,171,9,247,22,182,8,2,45, -27,28,248,22,155,7,23,196,2,23,195,2,248,22,167,8,248,22,180,15,23, -197,2,28,249,22,172,16,2,81,23,195,2,28,248,22,155,7,195,248,22,183, -15,195,194,27,248,22,130,8,23,195,1,249,22,184,15,248,22,170,8,250,22, -180,16,2,82,28,249,22,172,16,2,83,23,201,2,23,199,1,250,22,180,16, -2,84,23,202,1,2,46,80,144,47,40,41,2,45,28,248,22,155,7,194,248, -22,183,15,194,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, -175,15,23,195,2,10,28,248,22,155,7,23,195,2,28,248,22,134,16,23,195, -2,10,248,22,135,16,23,195,2,11,10,248,22,176,15,23,195,2,12,252,22, -182,11,2,6,2,47,39,23,199,2,23,200,2,28,28,28,248,22,175,15,23, -196,2,10,28,248,22,155,7,23,196,2,28,248,22,134,16,23,196,2,10,248, -22,135,16,23,196,2,11,10,248,22,176,15,23,196,2,12,252,22,182,11,2, -6,2,47,40,23,199,2,23,200,2,27,28,248,22,176,15,23,196,2,248,22, -177,15,23,196,2,247,22,178,15,86,95,28,28,248,22,136,16,23,196,2,10, -249,22,171,9,247,22,178,15,23,195,2,12,253,22,184,11,2,6,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,48,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,178,15,28,249,22,171,9,28,248,22,176,15,23,199,2,248,22, -177,15,23,199,2,247,22,178,15,23,195,2,12,253,22,184,11,2,6,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,48,23,201, -2,6,9,9,114,111,111,116,32,112,97,116,104,23,202,2,27,27,248,22,140, -16,28,248,22,136,16,23,199,2,23,198,1,248,22,137,16,23,199,1,86,94, -28,28,248,22,176,15,23,194,2,10,28,248,22,175,15,23,194,2,10,28,248, -22,155,7,23,194,2,28,248,22,134,16,23,194,2,10,248,22,135,16,23,194, -2,11,12,250,22,182,11,2,43,2,44,23,196,2,28,28,248,22,176,15,23, -194,2,249,22,171,9,248,22,177,15,23,196,2,2,45,249,22,171,9,247,22, -182,8,2,45,27,28,248,22,155,7,23,195,2,23,194,2,248,22,167,8,248, -22,180,15,23,196,2,28,249,22,172,16,2,81,23,195,2,28,248,22,155,7, -194,248,22,183,15,194,193,27,248,22,130,8,23,195,1,249,22,184,15,248,22, -170,8,250,22,180,16,2,82,28,249,22,172,16,2,83,23,201,2,23,199,1, -250,22,180,16,2,84,23,202,1,2,46,80,144,50,40,41,2,45,28,248,22, -155,7,193,248,22,183,15,193,192,27,248,22,180,15,23,195,2,28,249,22,171, -9,23,197,2,66,117,110,105,120,28,249,22,152,8,194,5,1,47,28,248,22, -176,15,198,197,248,22,183,15,198,249,22,129,16,199,249,22,184,15,249,22,155, -8,248,22,180,15,200,40,198,28,249,22,171,9,23,197,2,2,45,249,22,129, -16,23,200,1,249,22,184,15,28,249,22,172,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,156,8,2,49,250,22,155,8,203,43,44,5,1,92,249,22, -155,8,202,45,28,249,22,172,16,2,86,23,199,2,249,22,156,8,2,49,249, -22,155,8,200,43,28,249,22,172,16,2,86,23,199,2,249,22,156,8,2,49, -249,22,155,8,200,43,28,249,22,172,16,0,14,35,114,120,34,94,92,92,92, -92,92,92,92,92,34,23,199,2,249,22,156,8,5,4,85,78,67,92,249,22, -155,8,200,41,28,249,22,172,16,0,12,35,114,120,34,94,91,97,45,122,93, -58,34,198,249,22,156,8,250,22,155,8,201,39,40,249,22,155,8,200,41,12, -198,12,32,88,88,148,8,36,42,56,11,72,102,111,117,110,100,45,101,120,101, -99,222,33,91,32,89,88,148,8,36,43,61,11,66,110,101,120,116,222,33,90, -27,248,22,138,16,23,196,2,28,249,22,173,9,23,195,2,23,197,1,11,28, -248,22,134,16,23,194,2,27,249,22,129,16,23,197,1,23,196,1,28,23,197, -2,90,144,42,11,89,146,42,39,11,248,22,132,16,23,197,2,86,95,23,195, -1,23,194,1,27,28,23,202,2,27,248,22,138,16,23,199,2,28,249,22,173, -9,23,195,2,23,200,2,11,28,248,22,134,16,23,194,2,250,2,88,23,205, -2,23,206,2,249,22,129,16,23,200,2,23,198,1,250,2,88,23,205,2,23, -206,2,23,196,1,11,28,23,193,2,192,86,94,23,193,1,27,28,248,22,175, -15,23,196,2,27,249,22,129,16,23,198,2,23,205,2,28,28,248,22,188,15, -193,10,248,22,187,15,193,192,11,11,28,23,193,2,192,86,94,23,193,1,28, -23,203,2,11,27,248,22,138,16,23,200,2,28,249,22,173,9,194,23,201,1, -11,28,248,22,134,16,193,250,2,88,205,206,249,22,129,16,200,197,250,2,88, -205,206,195,192,86,94,23,194,1,28,23,196,2,90,144,42,11,89,146,42,39, -11,248,22,132,16,23,197,2,86,95,23,195,1,23,194,1,27,28,23,201,2, -27,248,22,138,16,23,199,2,28,249,22,173,9,23,195,2,23,200,2,11,28, -248,22,134,16,23,194,2,250,2,88,23,204,2,23,205,2,249,22,129,16,23, -200,2,23,198,1,250,2,88,23,204,2,23,205,2,23,196,1,11,28,23,193, -2,192,86,94,23,193,1,27,28,248,22,175,15,23,196,2,27,249,22,129,16, -23,198,2,23,204,2,28,28,248,22,188,15,193,10,248,22,187,15,193,192,11, -11,28,23,193,2,192,86,94,23,193,1,28,23,202,2,11,27,248,22,138,16, -23,200,2,28,249,22,173,9,194,23,201,1,11,28,248,22,134,16,193,250,2, -88,204,205,249,22,129,16,200,197,250,2,88,204,205,195,192,28,23,193,2,90, -144,42,11,89,146,42,39,11,248,22,132,16,23,199,2,86,95,23,195,1,23, -194,1,27,28,23,198,2,251,2,89,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,175,15,195,27,249, -22,129,16,197,200,28,28,248,22,188,15,193,10,248,22,187,15,193,192,11,11, -28,192,192,28,198,11,251,2,89,198,203,201,202,194,32,92,88,148,8,36,43, -60,11,2,52,222,33,93,28,248,22,90,23,197,2,11,27,249,22,129,16,248, -22,137,16,248,22,83,23,201,2,23,196,2,28,248,22,187,15,23,194,2,250, -2,88,197,198,195,86,94,23,193,1,27,248,22,164,20,23,199,1,28,248,22, -90,23,194,2,11,27,249,22,129,16,248,22,137,16,248,22,83,23,198,2,23, -198,2,28,248,22,187,15,23,194,2,250,2,88,199,200,195,86,94,23,193,1, -27,248,22,164,20,23,196,1,28,248,22,90,23,194,2,11,27,249,22,129,16, -248,22,137,16,248,22,83,23,198,2,23,200,2,28,248,22,187,15,23,194,2, -250,2,88,201,202,195,86,94,23,193,1,27,248,22,164,20,23,196,1,28,248, -22,90,23,194,2,11,27,249,22,129,16,248,22,137,16,248,22,83,197,201,28, -248,22,187,15,193,250,2,88,203,204,195,251,2,92,203,204,205,248,22,164,20, -198,86,95,28,28,248,22,175,15,23,195,2,10,28,248,22,155,7,23,195,2, -28,248,22,134,16,23,195,2,10,248,22,135,16,23,195,2,11,12,250,22,182, -11,2,7,2,50,23,197,2,28,28,23,195,2,28,28,248,22,175,15,23,196, -2,10,28,248,22,155,7,23,196,2,28,248,22,134,16,23,196,2,10,248,22, -135,16,23,196,2,11,248,22,134,16,23,196,2,11,10,12,250,22,182,11,2, -7,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,134,16,23,195,2,90,144, -42,11,89,146,42,39,11,248,22,132,16,23,198,2,249,22,171,9,194,2,51, -11,27,249,22,177,8,247,22,176,8,5,4,80,65,84,72,27,28,23,194,2, -249,80,143,43,44,249,22,167,8,23,198,1,7,63,9,86,94,23,194,1,9, -27,28,249,22,171,9,247,22,182,8,2,45,249,22,82,248,22,184,15,5,1, -46,23,196,1,23,194,1,28,248,22,90,23,194,2,11,27,249,22,129,16,248, -22,137,16,248,22,83,23,198,2,23,200,2,28,248,22,187,15,23,194,2,250, -2,88,201,202,195,86,94,23,193,1,27,248,22,164,20,23,196,1,28,248,22, -90,23,194,2,11,27,249,22,129,16,248,22,137,16,248,22,83,23,198,2,23, -202,2,28,248,22,187,15,23,194,2,250,2,88,203,204,195,86,94,23,193,1, -27,248,22,164,20,23,196,1,28,248,22,90,23,194,2,11,27,249,22,129,16, -248,22,137,16,248,22,83,23,198,2,23,204,2,28,248,22,187,15,23,194,2, -250,2,88,205,206,195,86,94,23,193,1,27,248,22,164,20,23,196,1,28,248, -22,90,23,194,2,11,27,249,22,129,16,248,22,137,16,248,22,83,197,205,28, -248,22,187,15,193,250,2,88,23,15,23,16,195,251,2,92,23,15,23,16,23, -17,248,22,164,20,198,27,248,22,137,16,23,196,1,28,248,22,187,15,193,250, -2,88,198,199,195,11,250,80,144,42,43,42,196,197,11,250,80,144,42,43,42, -196,11,11,32,97,88,148,8,36,42,58,11,2,52,222,33,99,0,8,35,114, -120,35,34,92,34,34,27,249,22,168,16,23,197,2,23,198,2,28,23,193,2, -86,94,23,196,1,27,248,22,104,23,195,2,27,27,248,22,113,23,197,1,27, -249,22,168,16,23,201,2,23,196,2,28,23,193,2,86,94,23,194,1,27,248, -22,104,23,195,2,27,250,2,97,202,23,204,1,248,22,113,23,199,1,27,28, -249,22,171,9,247,22,182,8,2,45,250,22,180,16,2,98,23,198,1,2,53, -194,28,249,22,152,8,194,2,53,249,22,96,202,195,249,22,82,248,22,184,15, -195,195,86,95,23,199,1,23,193,1,27,28,249,22,171,9,247,22,182,8,2, -45,250,22,180,16,2,98,23,198,1,2,53,194,28,249,22,152,8,194,2,53, -249,22,96,200,9,249,22,82,248,22,184,15,195,9,27,28,249,22,171,9,247, -22,182,8,2,45,250,22,180,16,2,98,23,198,1,2,53,194,28,249,22,152, -8,194,2,53,249,22,96,198,195,249,22,82,248,22,184,15,195,195,86,94,23, -193,1,27,28,249,22,171,9,247,22,182,8,2,45,250,22,180,16,2,98,23, -200,1,2,53,196,28,249,22,152,8,194,2,53,249,22,96,196,9,249,22,82, -248,22,184,15,195,9,86,95,28,28,248,22,144,8,194,10,248,22,155,7,194, -12,250,22,182,11,2,8,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,91,195,249,22,4,22, -175,15,196,11,12,250,22,182,11,2,8,6,14,14,40,108,105,115,116,111,102, -32,112,97,116,104,63,41,197,250,2,97,197,195,28,248,22,155,7,197,248,22, -169,8,197,196,28,28,248,22,0,23,195,2,249,22,50,23,196,2,39,11,20, -13,144,80,144,39,46,40,26,29,80,144,8,29,47,40,249,22,33,11,80,144, -8,31,46,40,22,145,15,10,22,146,15,10,22,147,15,10,22,150,15,10,22, -149,15,11,22,151,15,10,22,148,15,10,22,152,15,10,22,153,15,10,22,154, -15,10,22,155,15,10,22,156,15,11,22,157,15,10,22,143,15,11,247,23,194, -1,250,22,182,11,2,9,2,54,23,197,1,86,94,28,28,248,22,175,15,23, -195,2,10,28,248,22,155,7,23,195,2,28,248,22,134,16,23,195,2,10,248, -22,135,16,23,195,2,11,12,250,22,182,11,23,196,2,2,50,23,197,2,28, -248,22,134,16,23,195,2,12,251,22,184,11,23,197,1,2,55,2,48,23,198, -1,86,94,28,28,248,22,175,15,23,195,2,10,28,248,22,155,7,23,195,2, -28,248,22,134,16,23,195,2,10,248,22,135,16,23,195,2,11,12,250,22,182, -11,23,196,2,2,50,23,197,2,28,248,22,134,16,23,195,2,12,251,22,184, -11,23,197,1,2,55,2,48,23,198,1,86,94,86,94,28,28,248,22,175,15, -23,195,2,10,28,248,22,155,7,23,195,2,28,248,22,134,16,23,195,2,10, -248,22,135,16,23,195,2,11,12,250,22,182,11,23,196,2,2,50,23,197,2, -28,248,22,134,16,23,195,2,86,94,23,194,1,12,251,22,184,11,23,197,2, -2,55,2,48,23,198,1,249,22,3,20,20,94,88,148,8,36,40,50,11,9, -223,2,33,103,23,195,1,23,197,1,28,28,248,22,0,23,195,2,249,22,50, -23,196,2,40,11,12,250,22,182,11,23,196,1,2,56,23,197,1,86,94,28, -28,248,22,175,15,23,194,2,10,28,248,22,155,7,23,194,2,28,248,22,134, -16,23,194,2,10,248,22,135,16,23,194,2,11,12,250,22,182,11,2,16,2, -50,23,196,2,28,248,22,134,16,23,194,2,12,251,22,184,11,2,16,2,55, -2,48,23,197,1,86,95,86,94,86,94,28,28,248,22,175,15,23,196,2,10, -28,248,22,155,7,23,196,2,28,248,22,134,16,23,196,2,10,248,22,135,16, -23,196,2,11,12,250,22,182,11,2,16,2,50,23,198,2,28,248,22,134,16, -23,196,2,12,251,22,184,11,2,16,2,55,2,48,23,199,2,249,22,3,32, -0,88,148,8,36,40,49,11,9,222,33,106,23,198,2,28,28,248,22,0,23, -195,2,249,22,50,23,196,2,40,11,12,250,22,182,11,2,16,2,56,23,197, -2,252,80,143,44,52,23,199,1,23,200,1,23,201,1,11,11,86,94,28,28, -248,22,175,15,23,194,2,10,28,248,22,155,7,23,194,2,28,248,22,134,16, -23,194,2,10,248,22,135,16,23,194,2,11,12,250,22,182,11,2,18,2,50, -23,196,2,28,248,22,134,16,23,194,2,12,251,22,184,11,2,18,2,55,2, -48,23,197,1,86,96,86,94,28,28,248,22,175,15,23,197,2,10,28,248,22, -155,7,23,197,2,28,248,22,134,16,23,197,2,10,248,22,135,16,23,197,2, -11,12,250,22,182,11,2,18,2,50,23,199,2,28,248,22,134,16,23,197,2, -12,251,22,184,11,2,18,2,55,2,48,23,200,2,86,94,86,94,28,28,248, -22,175,15,23,198,2,10,28,248,22,155,7,23,198,2,28,248,22,134,16,23, -198,2,10,248,22,135,16,23,198,2,11,12,250,22,182,11,2,18,2,50,23, -200,2,28,248,22,134,16,23,198,2,12,251,22,184,11,2,18,2,55,2,48, -23,201,2,249,22,3,32,0,88,148,8,36,40,49,11,9,222,33,108,23,200, -2,28,28,248,22,0,23,195,2,249,22,50,23,196,2,40,11,12,250,22,182, -11,2,18,2,56,23,197,2,252,80,143,44,52,23,199,1,23,202,1,23,203, -1,23,201,1,23,200,1,27,248,22,152,16,2,57,28,248,22,136,16,23,194, -2,248,22,139,16,23,194,1,28,248,22,135,16,23,194,2,90,144,42,11,89, -146,42,39,11,248,22,132,16,249,22,137,16,250,80,144,49,43,42,248,22,152, -16,2,58,11,11,248,22,152,16,2,59,86,95,23,195,1,23,194,1,248,22, -139,16,249,22,137,16,23,199,1,23,196,1,27,250,80,144,44,43,42,248,22, -152,16,2,58,23,197,1,10,28,23,193,2,248,22,139,16,23,194,1,11,249, -80,144,41,55,40,39,80,144,41,8,40,42,27,248,22,152,16,2,60,28,248, -22,136,16,23,194,2,248,22,139,16,23,194,1,28,248,22,135,16,23,194,2, -90,144,42,11,89,146,42,39,11,248,22,132,16,249,22,137,16,250,80,144,49, -43,42,248,22,152,16,2,58,11,11,248,22,152,16,2,59,86,95,23,195,1, -23,194,1,248,22,139,16,249,22,137,16,23,199,1,23,196,1,27,250,80,144, -44,43,42,248,22,152,16,2,58,23,197,1,10,28,23,193,2,248,22,139,16, -23,194,1,11,249,80,144,41,55,40,40,80,144,41,8,41,42,27,20,13,144, -80,144,40,46,40,26,29,80,144,8,30,47,40,249,22,33,11,80,144,8,32, -46,40,22,145,15,10,22,146,15,10,22,147,15,10,22,150,15,10,22,149,15, -11,22,151,15,10,22,148,15,10,22,152,15,10,22,153,15,10,22,154,15,10, -22,155,15,10,22,156,15,11,22,157,15,10,22,143,15,11,247,22,150,6,28, -248,22,151,2,193,192,11,27,28,23,195,2,249,22,129,16,23,197,1,6,11, -11,99,111,110,102,105,103,46,114,107,116,100,86,94,23,195,1,11,27,28,23, -194,2,28,248,22,187,15,23,195,2,249,22,142,6,23,196,1,80,144,43,8, -42,42,11,11,28,192,192,21,17,1,0,250,22,160,2,23,196,1,2,61,247, -22,173,8,250,22,160,2,195,2,61,247,22,173,8,28,248,22,155,7,23,195, -2,27,248,22,183,15,23,196,1,28,248,22,136,16,23,194,2,192,249,22,137, -16,23,195,1,27,247,80,144,43,54,42,28,23,193,2,192,86,94,23,193,1, -247,22,153,16,28,248,22,144,8,23,195,2,27,248,22,184,15,23,196,1,28, -248,22,136,16,23,194,2,192,249,22,137,16,23,195,1,27,247,80,144,43,54, -42,28,23,193,2,192,86,94,23,193,1,247,22,153,16,28,248,22,175,15,23, -195,2,28,248,22,136,16,23,195,2,193,249,22,137,16,23,196,1,27,247,80, -144,42,54,42,28,23,193,2,192,86,94,23,193,1,247,22,153,16,193,27,248, -22,152,16,2,57,28,248,22,136,16,23,194,2,248,22,139,16,23,194,1,28, -248,22,135,16,23,194,2,90,144,42,11,89,146,42,39,11,248,22,132,16,249, -22,137,16,250,80,144,49,43,42,248,22,152,16,2,58,11,11,248,22,152,16, -2,59,86,95,23,195,1,23,194,1,248,22,139,16,249,22,137,16,23,199,1, -23,196,1,27,250,80,144,44,43,42,248,22,152,16,2,58,23,197,1,10,28, -23,193,2,248,22,139,16,23,194,1,11,28,248,22,136,16,23,195,2,193,249, -22,137,16,23,196,1,27,249,80,144,44,55,40,39,80,144,44,8,43,42,28, -23,193,2,192,86,94,23,193,1,247,22,153,16,28,248,22,136,16,23,195,2, -248,22,139,16,23,195,1,28,248,22,135,16,23,195,2,90,144,42,11,89,146, -42,39,11,248,22,132,16,249,22,137,16,250,80,144,48,43,42,248,22,152,16, -2,58,11,11,248,22,152,16,2,59,86,95,23,195,1,23,194,1,248,22,139, -16,249,22,137,16,23,200,1,23,196,1,27,250,80,144,43,43,42,248,22,152, -16,2,58,23,198,1,10,28,23,193,2,248,22,139,16,23,194,1,11,28,248, -22,90,23,196,2,9,28,248,22,83,23,196,2,249,22,82,27,248,22,163,20, -23,199,2,28,248,22,155,7,23,194,2,27,248,22,183,15,23,195,1,28,248, -22,136,16,23,194,2,192,249,22,137,16,23,195,1,27,247,80,144,46,54,42, -28,23,193,2,192,86,94,23,193,1,247,22,153,16,28,248,22,144,8,23,194, -2,27,248,22,184,15,23,195,1,28,248,22,136,16,23,194,2,192,249,22,137, -16,23,195,1,27,247,80,144,46,54,42,28,23,193,2,192,86,94,23,193,1, -247,22,153,16,28,248,22,175,15,23,194,2,28,248,22,136,16,23,194,2,192, -249,22,137,16,23,195,1,27,247,80,144,45,54,42,28,23,193,2,192,86,94, -23,193,1,247,22,153,16,192,27,248,22,164,20,23,199,1,28,248,22,90,23, -194,2,9,28,248,22,83,23,194,2,249,22,82,248,80,144,45,60,42,248,22, -163,20,23,197,2,27,248,22,164,20,23,197,1,28,248,22,90,23,194,2,9, -28,248,22,83,23,194,2,249,22,82,248,80,144,48,60,42,248,22,163,20,23, -197,2,249,80,144,49,8,44,42,23,204,1,248,22,164,20,23,198,1,249,22, -96,23,202,2,249,80,144,49,8,44,42,23,204,1,248,22,164,20,23,198,1, -249,22,96,23,199,2,27,248,22,164,20,23,197,1,28,248,22,90,23,194,2, -9,28,248,22,83,23,194,2,249,22,82,248,80,144,48,60,42,248,22,163,20, -23,197,2,249,80,144,49,8,44,42,23,204,1,248,22,164,20,23,198,1,249, -22,96,23,202,2,249,80,144,49,8,44,42,23,204,1,248,22,164,20,23,198, -1,249,22,96,23,196,2,27,248,22,164,20,23,199,1,28,248,22,90,23,194, -2,9,28,248,22,83,23,194,2,249,22,82,248,80,144,45,60,42,248,22,163, -20,23,197,2,27,248,22,164,20,23,197,1,28,248,22,90,23,194,2,9,28, -248,22,83,23,194,2,249,22,82,248,80,144,48,60,42,248,22,163,20,23,197, -2,249,80,144,49,8,44,42,23,204,1,248,22,164,20,23,198,1,249,22,96, -23,202,2,249,80,144,49,8,44,42,23,204,1,248,22,164,20,23,198,1,249, -22,96,23,199,2,27,248,22,164,20,23,197,1,28,248,22,90,23,194,2,9, -28,248,22,83,23,194,2,249,22,82,248,80,144,48,60,42,248,22,163,20,23, -197,2,249,80,144,49,8,44,42,23,204,1,248,22,164,20,23,198,1,249,22, -96,23,202,2,249,80,144,49,8,44,42,23,204,1,248,22,164,20,23,198,1, -27,250,22,160,2,23,198,1,23,199,1,11,28,192,249,80,144,42,8,44,42, -198,194,196,27,248,22,152,16,2,60,28,248,22,136,16,23,194,2,248,22,139, -16,23,194,1,28,248,22,135,16,23,194,2,90,144,42,11,89,146,42,39,11, -248,22,132,16,249,22,137,16,250,80,144,49,43,42,248,22,152,16,2,58,11, -11,248,22,152,16,2,59,86,95,23,195,1,23,194,1,248,22,139,16,249,22, -137,16,23,199,1,23,196,1,27,250,80,144,44,43,42,248,22,152,16,2,58, -23,197,1,10,28,23,193,2,248,22,139,16,23,194,1,11,27,248,80,144,41, -58,42,249,80,144,43,55,40,40,80,144,43,8,45,42,27,27,250,22,160,2, -23,198,2,72,108,105,110,107,115,45,102,105,108,101,11,27,28,23,194,2,23, -194,1,86,94,23,194,1,249,22,129,16,27,250,22,160,2,23,202,2,71,115, -104,97,114,101,45,100,105,114,11,28,192,192,249,22,129,16,64,117,112,6,5, -5,115,104,97,114,101,2,62,28,248,22,155,7,23,194,2,27,248,22,183,15, -23,195,1,28,248,22,136,16,23,194,2,192,249,22,137,16,23,195,1,27,247, -80,144,47,54,42,28,23,193,2,192,86,94,23,193,1,247,22,153,16,28,248, -22,144,8,23,194,2,27,248,22,184,15,23,195,1,28,248,22,136,16,23,194, -2,192,249,22,137,16,23,195,1,27,247,80,144,47,54,42,28,23,193,2,192, -86,94,23,193,1,247,22,153,16,28,248,22,175,15,23,194,2,28,248,22,136, -16,23,194,2,192,249,22,137,16,23,195,1,27,247,80,144,46,54,42,28,23, -193,2,192,86,94,23,193,1,247,22,153,16,192,250,22,96,248,22,92,11,28, -247,22,160,16,28,247,22,161,16,248,22,92,250,22,129,16,248,22,152,16,2, -63,250,22,160,2,23,204,2,2,61,247,22,173,8,2,62,9,9,28,247,22, -161,16,250,80,144,47,8,23,42,23,200,1,1,18,108,105,110,107,115,45,115, -101,97,114,99,104,45,102,105,108,101,115,248,22,92,23,200,1,9,248,22,174, -13,23,194,1,249,22,16,80,144,41,8,26,41,28,248,22,130,13,23,197,2, -86,94,23,196,1,32,0,88,148,8,36,39,44,11,9,222,11,20,20,94,88, -148,8,36,39,46,11,9,223,3,33,126,23,196,1,32,128,2,88,148,39,40, -59,11,2,52,222,33,129,2,90,144,42,11,89,146,42,39,11,248,22,132,16, -23,197,1,86,95,23,195,1,23,194,1,28,248,22,175,15,23,194,2,28,248, -22,188,15,23,194,2,249,22,147,6,23,195,1,32,0,88,148,8,36,39,44, -11,9,222,11,90,144,42,11,89,146,42,39,11,248,22,132,16,23,197,1,86, -95,23,195,1,23,194,1,28,248,22,175,15,23,194,2,28,248,22,188,15,23, -194,2,249,22,147,6,23,195,1,32,0,88,148,8,36,39,44,11,9,222,11, -90,144,42,11,89,146,42,39,11,248,22,132,16,23,197,1,86,95,23,195,1, -23,194,1,28,248,22,175,15,23,194,2,28,248,22,188,15,23,194,2,249,22, -147,6,23,195,1,32,0,88,148,8,36,39,44,11,9,222,11,90,144,42,11, -89,146,42,39,11,248,22,132,16,23,197,1,86,95,23,195,1,23,194,1,28, -248,22,175,15,23,194,2,28,248,22,188,15,23,194,2,249,22,147,6,23,195, -1,32,0,88,148,8,36,39,44,11,9,222,11,248,2,128,2,23,194,1,11, -11,11,11,32,130,2,88,148,8,36,40,58,11,2,52,222,33,131,2,27,249, -22,165,6,8,128,128,23,196,2,28,248,22,150,7,23,194,2,9,249,22,82, -23,195,1,27,249,22,165,6,8,128,128,23,199,2,28,248,22,150,7,23,194, -2,9,249,22,82,23,195,1,27,249,22,165,6,8,128,128,23,202,2,28,248, -22,150,7,23,194,2,9,249,22,82,23,195,1,27,249,22,165,6,8,128,128, -23,205,2,28,248,22,150,7,23,194,2,9,249,22,82,23,195,1,248,2,130, -2,23,206,1,27,249,22,165,6,8,128,128,23,196,2,28,248,22,144,8,23, -194,2,28,249,22,134,4,248,22,149,8,23,196,2,8,128,128,249,22,1,22, -156,8,249,22,82,23,197,1,27,249,22,165,6,8,128,128,23,201,2,28,248, -22,150,7,23,194,2,9,249,22,82,23,195,1,27,249,22,165,6,8,128,128, -23,204,2,28,248,22,150,7,23,194,2,9,249,22,82,23,195,1,27,249,22, -165,6,8,128,128,23,207,2,28,248,22,150,7,23,194,2,9,249,22,82,23, -195,1,27,249,22,165,6,8,128,128,23,210,2,28,248,22,150,7,23,194,2, -9,249,22,82,23,195,1,248,2,130,2,23,211,1,192,192,248,22,135,6,23, -194,1,20,13,144,80,144,40,8,28,40,80,144,40,8,46,42,27,28,249,22, -191,8,248,22,182,8,2,64,41,90,144,42,11,89,146,42,39,11,248,22,132, -16,23,198,2,86,95,23,195,1,23,194,1,28,248,22,175,15,23,194,2,28, -248,22,188,15,23,194,2,249,22,147,6,23,195,1,32,0,88,148,8,36,39, -44,11,9,222,11,90,144,42,11,89,146,42,39,11,248,22,132,16,23,197,1, -86,95,23,195,1,23,194,1,28,248,22,175,15,23,194,2,28,248,22,188,15, -23,194,2,249,22,147,6,23,195,1,32,0,88,148,8,36,39,44,11,9,222, -11,90,144,42,11,89,146,42,39,11,248,22,132,16,23,197,1,86,95,23,195, -1,23,194,1,28,248,22,175,15,23,194,2,28,248,22,188,15,23,194,2,249, -22,147,6,23,195,1,32,0,88,148,8,36,39,44,11,9,222,11,90,144,42, -11,89,146,42,39,11,248,22,132,16,23,197,1,86,95,23,195,1,23,194,1, -28,248,22,175,15,23,194,2,28,248,22,188,15,23,194,2,249,22,147,6,23, -195,1,32,0,88,148,8,36,39,44,11,9,222,11,248,2,128,2,23,194,1, -11,11,11,11,11,28,248,22,187,15,23,195,2,27,28,249,22,191,8,248,22, -182,8,2,64,41,249,22,147,6,23,197,2,32,0,88,148,8,36,39,44,11, -9,222,11,11,86,94,28,23,194,2,248,22,149,6,23,195,1,86,94,23,194, -1,12,249,22,82,27,248,22,190,5,23,199,1,250,22,46,22,37,88,148,39, -39,8,24,11,9,223,3,33,132,2,20,20,94,88,148,8,36,39,46,11,9, -223,3,33,133,2,23,196,1,194,249,22,82,11,194,28,28,23,195,2,28,248, -22,84,23,196,2,248,22,169,9,249,22,176,14,39,248,22,164,20,23,199,2, -11,11,194,86,94,23,195,1,249,22,14,20,20,94,88,148,8,32,39,61,16, -4,39,8,128,80,8,240,0,64,0,0,39,9,224,2,3,33,134,2,23,196, -1,80,144,41,8,26,41,27,248,22,169,9,194,28,192,192,248,22,169,9,248, -22,83,195,86,95,28,248,22,151,12,23,198,2,27,247,22,143,12,28,249,22, -133,12,23,195,2,2,65,251,22,139,12,23,197,1,2,65,250,22,139,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,147,12,23,206,2,247,22,29,12,12,28,23,193,2, -250,22,158,2,80,144,45,8,25,41,23,198,1,249,22,82,23,198,1,21,17, -0,0,86,95,23,195,1,23,193,1,12,28,248,22,151,12,23,198,2,86,94, -23,197,1,248,23,195,1,247,22,140,2,196,88,148,39,40,58,8,240,0,0, -0,2,9,226,0,2,1,3,33,137,2,20,20,94,248,22,150,6,23,194,2, -28,248,22,150,7,248,22,150,6,23,195,1,12,248,22,178,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,135,6,23,194,1,28,248,22,91,193,28, -28,249,22,130,4,41,248,22,95,195,10,249,22,130,4,42,248,22,95,195,28, -28,248,22,155,7,248,22,83,194,10,28,249,22,171,9,2,66,248,22,163,20, -195,10,249,22,171,9,2,67,248,22,163,20,195,28,27,248,22,104,194,28,248, -22,175,15,193,10,28,248,22,155,7,193,28,248,22,134,16,193,10,248,22,135, -16,193,11,27,248,22,90,248,22,106,195,28,192,192,248,22,181,16,248,22,113, -195,11,11,11,11,28,248,22,188,15,249,22,129,16,23,196,2,23,198,2,27, -248,22,70,248,22,179,15,23,198,1,250,22,158,2,23,198,2,23,196,2,249, -22,82,23,199,1,250,22,160,2,23,203,1,23,201,1,9,12,250,22,158,2, -23,197,1,23,198,1,249,22,82,23,198,1,23,201,1,28,28,248,22,90,248, -22,106,23,197,2,10,249,22,172,16,248,22,113,23,198,2,247,22,173,8,27, -248,22,139,16,249,22,137,16,248,22,104,23,200,2,23,198,1,28,249,22,171, -9,248,22,163,20,23,199,2,2,67,86,94,23,196,1,249,22,3,20,20,94, -88,148,8,36,40,56,11,9,224,3,2,33,142,2,23,196,1,248,22,142,16, -23,196,1,28,249,22,171,9,248,22,163,20,23,199,2,2,66,86,94,23,196, -1,86,94,28,250,22,160,2,23,197,2,11,11,12,250,22,158,2,23,197,2, -11,9,249,22,166,2,23,196,2,20,20,95,88,148,8,36,41,53,11,9,224, -3,2,33,143,2,23,195,1,23,196,1,27,248,22,70,248,22,163,20,23,199, -1,250,22,158,2,23,198,2,23,196,2,249,22,82,248,22,131,2,23,200,1, -250,22,160,2,23,203,1,23,201,1,9,12,250,22,158,2,23,196,1,23,197, -1,248,22,97,23,199,1,27,28,28,23,194,2,248,22,169,9,248,22,83,23, -196,2,10,9,27,249,22,190,5,23,198,2,68,98,105,110,97,114,121,250,22, -46,22,37,88,148,8,36,39,47,11,9,223,3,33,139,2,20,20,94,88,148, -8,36,39,46,11,9,223,3,33,140,2,23,196,1,86,94,28,28,248,22,91, -23,194,2,249,22,4,32,0,88,148,8,36,40,48,11,9,222,33,141,2,23, -195,2,11,12,248,22,178,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,140,2,27,90,144,42,11,89,146,42, -39,11,248,22,132,16,23,201,2,192,86,96,249,22,3,20,20,94,88,148,8, -36,40,57,11,9,224,2,3,33,144,2,23,195,1,23,197,1,249,22,166,2, -195,88,148,8,36,41,51,11,9,223,3,33,145,2,250,22,158,2,80,144,47, -8,25,41,23,200,1,249,22,82,23,201,1,198,193,20,13,144,80,144,40,8, -28,40,250,80,144,43,8,47,42,23,198,2,23,196,2,11,27,250,22,160,2, -80,144,44,8,25,41,23,197,2,21,143,11,17,0,0,27,248,22,83,23,195, -2,27,249,80,144,45,8,27,42,23,198,2,23,196,2,28,249,22,173,9,23, -195,2,23,196,1,248,22,164,20,195,86,94,23,195,1,20,13,144,80,144,43, -8,28,40,250,80,144,46,8,47,42,23,201,1,23,199,2,23,196,2,27,20, -20,95,88,148,8,36,39,55,8,240,0,0,0,2,9,225,5,4,1,33,146, -2,23,194,1,23,197,1,28,249,22,50,23,195,2,39,20,13,144,80,144,44, -46,40,26,29,80,144,8,34,47,40,249,22,33,11,80,144,8,36,46,40,22, -145,15,10,22,146,15,10,22,147,15,10,22,150,15,10,22,149,15,11,22,151, -15,10,22,148,15,10,22,152,15,10,22,153,15,10,22,154,15,10,22,155,15, -10,22,156,15,11,22,157,15,10,22,143,15,11,247,23,193,1,250,22,182,11, -2,9,2,54,23,196,1,248,22,8,20,20,94,88,148,39,40,8,43,16,4, -8,128,6,8,128,104,8,240,0,128,0,0,39,9,224,1,2,33,147,2,23, -195,1,0,7,35,114,120,34,47,43,34,28,248,22,155,7,23,195,2,27,249, -22,170,16,2,149,2,23,197,2,28,23,193,2,28,249,22,130,4,248,22,103, -23,196,2,248,22,184,3,248,22,158,7,23,199,2,249,22,7,250,22,177,7, -23,200,1,39,248,22,103,23,199,1,23,198,1,249,22,7,250,22,177,7,23, -200,2,39,248,22,103,23,199,2,249,22,82,249,22,177,7,23,201,1,248,22, -105,23,200,1,23,200,1,249,22,7,23,197,1,23,198,1,90,144,42,11,89, -146,42,39,11,248,22,132,16,23,198,1,86,94,23,195,1,28,249,22,171,9, -23,195,2,2,51,86,94,23,193,1,249,22,7,23,196,1,23,200,1,27,249, -22,82,23,197,1,23,201,1,28,248,22,155,7,23,195,2,27,249,22,170,16, -2,149,2,23,197,2,28,23,193,2,28,249,22,130,4,248,22,103,23,196,2, -248,22,184,3,248,22,158,7,23,199,2,249,22,7,250,22,177,7,23,200,1, -39,248,22,103,23,199,1,23,196,1,249,22,7,250,22,177,7,23,200,2,39, -248,22,103,23,199,2,249,22,82,249,22,177,7,23,201,1,248,22,105,23,200, -1,23,198,1,249,22,7,23,197,1,23,196,1,90,144,42,11,89,146,42,39, -11,248,22,132,16,23,198,1,86,94,23,195,1,28,249,22,171,9,23,195,2, -2,51,86,94,23,193,1,249,22,7,23,196,1,23,198,1,249,80,144,48,8, -31,42,194,249,22,82,197,199,28,248,22,90,23,196,2,9,28,248,22,83,23, -196,2,28,248,22,151,2,248,22,163,20,23,197,2,250,22,96,249,22,2,22, -131,2,250,22,160,2,248,22,163,20,23,204,2,23,202,2,9,250,22,160,2, -248,22,163,20,23,202,2,11,9,27,248,22,164,20,23,200,1,28,248,22,90, -23,194,2,9,28,248,22,83,23,194,2,28,248,22,151,2,248,22,163,20,23, -195,2,250,22,96,249,22,2,22,131,2,250,22,160,2,248,22,163,20,23,202, -2,23,206,2,9,250,22,160,2,248,22,163,20,23,200,2,11,9,249,80,144, -48,8,48,42,23,203,1,248,22,164,20,23,199,1,27,248,80,144,45,8,30, -42,248,22,163,20,23,196,2,250,22,96,250,22,160,2,23,199,2,23,205,2, -9,250,22,160,2,23,199,1,11,9,249,80,144,49,8,48,42,23,204,1,248, -22,164,20,23,200,1,249,22,96,247,22,156,16,249,80,144,47,8,48,42,23, -202,1,248,22,164,20,23,198,1,27,248,80,144,41,8,30,42,248,22,163,20, -23,198,2,250,22,96,250,22,160,2,23,199,2,23,201,2,9,250,22,160,2, -23,199,1,11,9,27,248,22,164,20,23,201,1,28,248,22,90,23,194,2,9, -28,248,22,83,23,194,2,28,248,22,151,2,248,22,163,20,23,195,2,250,22, -96,249,22,2,22,131,2,250,22,160,2,248,22,163,20,23,202,2,23,207,2, -9,250,22,160,2,248,22,163,20,23,200,2,11,9,249,80,144,49,8,48,42, -23,204,1,248,22,164,20,23,199,1,27,248,80,144,46,8,30,42,248,22,163, -20,23,196,2,250,22,96,250,22,160,2,23,199,2,23,206,2,9,250,22,160, -2,23,199,1,11,9,249,80,144,50,8,48,42,23,205,1,248,22,164,20,23, -200,1,249,22,96,247,22,156,16,249,80,144,48,8,48,42,23,203,1,248,22, -164,20,23,198,1,249,22,96,247,22,156,16,27,248,22,164,20,23,199,1,28, -248,22,90,23,194,2,9,28,248,22,83,23,194,2,28,248,22,151,2,248,22, -163,20,23,195,2,250,22,96,249,22,2,22,131,2,250,22,160,2,248,22,163, -20,23,202,2,23,205,2,9,250,22,160,2,248,22,163,20,23,200,2,11,9, -249,80,144,47,8,48,42,23,202,1,248,22,164,20,23,199,1,27,248,80,144, -44,8,30,42,248,22,163,20,23,196,2,250,22,96,250,22,160,2,23,199,2, -23,204,2,9,250,22,160,2,23,199,1,11,9,249,80,144,48,8,48,42,23, -203,1,248,22,164,20,23,200,1,249,22,96,247,22,156,16,249,80,144,46,8, -48,42,23,201,1,248,22,164,20,23,198,1,32,152,2,88,148,8,36,40,50, -11,2,52,222,33,153,2,28,248,22,90,248,22,84,23,195,2,248,22,92,27, -248,22,163,20,195,28,248,22,175,15,193,248,22,179,15,193,192,250,22,93,27, -248,22,163,20,23,198,2,28,248,22,175,15,193,248,22,179,15,193,192,2,69, -248,2,152,2,248,22,164,20,23,198,1,250,22,139,8,6,7,7,10,32,126, -97,32,126,97,6,1,1,32,23,196,1,249,22,139,8,6,6,6,10,32,32, -32,126,97,248,22,134,2,23,196,1,32,156,2,88,148,39,41,51,11,68,102, -105,108,116,101,114,222,33,157,2,28,248,22,90,23,195,2,9,28,248,23,194, -2,248,22,83,23,196,2,249,22,82,248,22,163,20,23,197,2,249,2,156,2, -23,197,1,248,22,164,20,23,199,1,249,2,156,2,23,195,1,248,22,164,20, -23,197,1,28,248,22,90,23,201,2,86,95,23,200,1,23,199,1,28,23,201, -2,28,197,249,22,129,16,202,199,200,27,28,248,22,90,23,198,2,2,68,249, -22,1,22,178,7,248,2,152,2,23,200,2,248,23,199,1,251,22,139,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,90,23,203,1,28,248,22,175,15, -23,202,2,248,22,179,15,23,202,1,23,201,1,250,22,178,7,28,248,22,175, -15,23,205,2,248,22,179,15,23,205,1,23,204,1,2,69,23,201,2,249,22, -1,22,178,7,249,22,2,32,0,88,148,8,36,40,48,11,9,222,33,154,2, -27,248,22,95,23,206,2,27,248,22,95,247,22,156,16,28,249,22,131,4,249, -22,186,3,23,198,2,23,197,2,44,23,206,2,249,22,96,247,22,156,16,248, -22,92,249,22,139,8,6,50,50,46,46,46,32,91,126,97,32,97,100,100,105, -116,105,111,110,97,108,32,108,105,110,107,101,100,32,97,110,100,32,112,97,99, -107,97,103,101,32,100,105,114,101,99,116,111,114,105,101,115,93,249,22,186,3, -23,201,1,23,200,1,28,249,22,5,22,133,2,23,202,2,250,22,139,8,6, -49,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,178,7,249,22,2, -32,0,88,148,8,36,40,48,11,9,222,33,155,2,249,2,156,2,22,133,2, -23,209,1,86,95,23,200,1,23,198,1,2,68,27,248,22,83,23,202,2,27, -28,248,22,175,15,23,195,2,249,22,129,16,23,196,1,23,199,2,248,22,134, -2,23,195,1,28,28,248,22,175,15,248,22,163,20,23,204,2,248,22,188,15, -23,194,2,10,27,250,22,1,22,129,16,23,197,1,23,202,2,28,28,248,22, -90,23,200,2,10,248,22,188,15,23,194,2,28,23,201,2,28,28,250,80,144, -45,8,32,42,195,203,204,10,27,28,248,22,175,15,202,248,22,179,15,202,201, -19,248,22,158,7,23,195,2,27,28,249,22,134,4,23,196,4,43,28,249,22, -161,7,6,4,4,46,114,107,116,249,22,177,7,23,199,2,249,22,186,3,23, -200,4,43,249,22,178,7,250,22,177,7,23,200,1,39,249,22,186,3,23,201, -4,43,6,3,3,46,115,115,86,94,23,195,1,11,11,28,23,193,2,250,80, -144,48,8,32,42,198,23,196,1,23,15,11,2,28,200,249,22,129,16,194,202, -192,26,8,80,144,50,8,49,42,204,205,206,23,15,23,16,23,17,248,22,164, -20,23,19,28,23,19,23,19,200,192,26,8,80,144,50,8,49,42,204,205,206, -23,15,23,16,23,17,248,22,164,20,23,19,23,19,26,8,80,144,49,8,49, -42,203,204,205,206,23,15,23,16,248,22,164,20,23,18,23,18,90,144,41,11, -89,146,41,39,11,249,80,144,43,8,31,42,23,199,1,23,200,1,27,248,22, -70,28,248,22,175,15,195,248,22,179,15,195,194,27,27,247,22,157,16,28,248, -22,90,23,194,2,9,28,248,22,83,23,194,2,28,248,22,151,2,248,22,163, -20,23,195,2,250,22,96,249,22,2,22,131,2,250,22,160,2,248,22,163,20, -23,202,2,23,203,2,9,250,22,160,2,248,22,163,20,23,200,2,11,9,249, -80,144,49,8,48,42,23,200,1,248,22,164,20,23,199,1,27,248,80,144,46, -8,30,42,248,22,163,20,23,196,2,250,22,96,250,22,160,2,23,199,2,23, -202,2,9,250,22,160,2,23,199,1,11,9,249,80,144,50,8,48,42,23,201, -1,248,22,164,20,23,200,1,249,22,96,247,22,156,16,249,80,144,48,8,48, -42,23,199,1,248,22,164,20,23,198,1,26,8,80,144,51,8,49,42,200,202, -203,205,23,16,23,17,200,11,32,160,2,88,148,8,36,42,59,11,2,52,222, -33,161,2,28,248,22,135,4,23,196,2,86,94,23,195,1,19,248,22,149,8, -23,195,2,19,248,22,149,8,23,196,2,249,22,185,15,27,251,22,156,8,250, -22,155,8,23,205,2,39,23,204,4,2,53,249,22,155,8,23,204,1,23,202, -4,2,70,28,248,22,135,4,248,22,149,8,23,195,2,86,94,23,193,1,251, -22,184,11,2,39,2,71,2,72,202,192,28,248,22,176,15,198,248,22,177,15, -198,247,22,178,15,2,2,27,248,22,184,3,23,197,1,28,249,22,171,9,8, -46,249,22,150,8,23,198,2,23,197,2,27,248,22,183,3,23,195,2,249,22, -185,15,27,251,22,156,8,250,22,155,8,23,205,2,39,23,204,1,2,73,249, -22,155,8,23,204,1,23,202,1,2,70,28,248,22,135,4,248,22,149,8,23, -195,2,86,94,23,193,1,251,22,184,11,2,39,2,71,2,72,202,192,28,248, -22,176,15,198,248,22,177,15,198,247,22,178,15,250,2,160,2,196,197,195,248, -22,187,15,27,250,22,129,16,23,200,1,23,202,1,23,199,1,28,249,22,171, -9,23,197,2,66,115,97,109,101,192,28,248,22,134,16,23,196,2,249,22,129, -16,194,196,249,80,144,46,42,42,23,195,1,23,197,1,249,22,5,20,20,96, -88,148,39,40,54,47,9,226,5,4,2,6,33,162,2,23,199,1,23,195,1, -23,197,1,23,196,1,27,248,22,187,15,249,22,129,16,23,198,2,23,199,2, -28,23,193,2,192,86,94,23,193,1,28,23,197,1,27,90,144,41,11,89,146, -41,39,11,250,80,144,46,8,34,42,23,202,2,2,70,2,39,27,248,22,181, -15,23,196,1,27,250,2,160,2,23,197,2,23,204,1,248,22,149,8,23,198, -1,28,248,22,176,15,195,249,22,129,16,196,194,192,27,247,22,158,16,249,22, -5,20,20,96,88,148,39,40,51,47,9,226,5,6,2,3,33,163,2,23,196, -1,23,195,1,23,199,1,247,22,159,16,11,86,95,28,28,248,22,176,15,23, -194,2,10,28,248,22,175,15,23,194,2,10,28,248,22,155,7,23,194,2,28, -248,22,134,16,23,194,2,10,248,22,135,16,23,194,2,11,12,252,22,182,11, -23,200,2,2,44,39,23,198,2,23,199,2,28,28,248,22,155,7,23,195,2, -10,248,22,144,8,23,195,2,86,94,23,194,1,12,252,22,182,11,23,200,2, -2,74,40,23,198,2,23,199,1,90,144,42,11,89,146,42,39,11,248,22,132, -16,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,185,11,23,201,1,2,75,23,199,1,249,22,7,23,195,1, -23,196,1,32,166,2,88,148,8,36,46,61,11,2,76,222,33,167,2,249,22, -185,15,27,251,22,156,8,250,22,155,8,23,203,2,39,23,207,1,23,205,1, -249,23,203,1,23,202,1,23,208,1,28,248,22,155,7,23,204,2,249,22,170, -8,23,205,1,8,63,23,203,1,28,248,22,135,4,248,22,149,8,23,195,2, -86,94,23,193,1,251,22,184,11,2,39,2,71,2,72,201,192,28,248,22,176, -15,197,248,22,177,15,197,247,22,178,15,32,168,2,88,148,8,36,45,8,24, -11,2,52,222,33,169,2,28,248,22,135,4,23,199,2,86,95,23,198,1,23, -194,1,19,248,22,149,8,23,195,2,19,248,22,149,8,23,196,2,249,22,185, -15,27,251,22,156,8,250,22,155,8,23,205,2,39,23,204,4,2,53,249,23, -206,1,23,204,1,23,202,4,28,248,22,155,7,23,207,2,249,22,170,8,23, -208,1,8,63,23,206,1,28,248,22,135,4,248,22,149,8,23,195,2,86,94, -23,193,1,251,22,184,11,2,39,2,71,2,72,204,192,28,248,22,176,15,200, -248,22,177,15,200,247,22,178,15,2,2,27,248,22,184,3,23,200,1,28,249, -22,171,9,8,46,249,22,150,8,23,198,2,23,197,2,27,248,22,183,3,23, -195,2,249,22,185,15,27,251,22,156,8,250,22,155,8,23,205,2,39,23,204, -1,23,203,1,249,23,206,1,23,204,1,23,202,1,28,248,22,155,7,23,207, -2,249,22,170,8,23,208,1,8,63,23,206,1,28,248,22,135,4,248,22,149, -8,23,195,2,86,94,23,193,1,251,22,184,11,2,39,2,71,2,72,204,192, -28,248,22,176,15,200,248,22,177,15,200,247,22,178,15,28,248,22,135,4,23, -194,2,86,95,23,195,1,23,193,1,19,248,22,149,8,23,196,2,19,248,22, -149,8,23,197,2,249,22,185,15,27,251,22,156,8,250,22,155,8,23,206,2, -39,23,204,4,2,53,249,23,207,1,23,205,1,23,202,4,28,248,22,155,7, -23,208,2,249,22,170,8,23,209,1,8,63,23,207,1,28,248,22,135,4,248, -22,149,8,23,195,2,86,94,23,193,1,251,22,184,11,2,39,2,71,2,72, -205,192,28,248,22,176,15,201,248,22,177,15,201,247,22,178,15,2,2,27,248, -22,184,3,23,195,1,28,249,22,171,9,8,46,249,22,150,8,23,199,2,23, -197,2,27,248,22,183,3,23,195,2,249,22,185,15,27,251,22,156,8,250,22, -155,8,23,206,2,39,23,204,1,23,204,1,249,23,207,1,23,205,1,23,202, -1,28,248,22,155,7,23,208,2,249,22,170,8,23,209,1,8,63,23,207,1, -28,248,22,135,4,248,22,149,8,23,195,2,86,94,23,193,1,251,22,184,11, -2,39,2,71,2,72,205,192,28,248,22,176,15,201,248,22,177,15,201,247,22, -178,15,28,248,22,135,4,193,254,2,166,2,201,203,204,205,248,22,149,8,202, -2,53,248,22,149,8,202,27,248,22,184,3,194,28,249,22,171,9,8,46,249, -22,150,8,199,196,254,2,166,2,202,204,205,206,199,203,248,22,183,3,200,253, -2,168,2,201,202,203,204,205,198,90,144,41,11,89,146,41,39,11,86,95,28, -28,248,22,176,15,23,199,2,10,28,248,22,175,15,23,199,2,10,28,248,22, -155,7,23,199,2,28,248,22,134,16,23,199,2,10,248,22,135,16,23,199,2, -11,12,252,22,182,11,23,200,2,2,44,39,23,203,2,23,204,2,28,28,248, -22,155,7,23,200,2,10,248,22,144,8,23,200,2,12,252,22,182,11,23,200, -2,2,74,40,23,203,2,23,204,2,90,144,42,11,89,146,42,39,11,248,22, -132,16,23,202,2,86,94,23,195,1,86,94,28,192,12,250,22,185,11,23,201, -1,2,75,23,204,2,249,22,7,194,195,27,248,22,181,15,23,196,1,27,19, -248,22,149,8,23,196,2,28,248,22,135,4,23,194,4,86,94,23,199,1,19, -248,22,149,8,23,197,2,19,248,22,149,8,23,198,2,249,22,185,15,27,251, -22,156,8,250,22,155,8,23,207,2,39,23,204,4,2,53,249,23,211,1,23, -206,1,23,202,4,28,248,22,155,7,23,212,2,249,22,170,8,23,213,1,8, -63,23,211,1,28,248,22,135,4,248,22,149,8,23,195,2,86,94,23,193,1, -251,22,184,11,2,39,2,71,2,72,23,17,192,28,248,22,176,15,205,248,22, -177,15,205,247,22,178,15,2,2,27,248,22,184,3,23,195,4,28,249,22,171, -9,8,46,249,22,150,8,23,200,2,23,197,2,27,248,22,183,3,23,195,2, -249,22,185,15,27,251,22,156,8,250,22,155,8,23,207,2,39,23,204,1,23, -208,1,249,23,211,1,23,206,1,23,202,1,28,248,22,155,7,23,212,2,249, -22,170,8,23,213,1,8,63,23,211,1,28,248,22,135,4,248,22,149,8,23, -195,2,86,94,23,193,1,251,22,184,11,2,39,2,71,2,72,23,17,192,28, -248,22,176,15,205,248,22,177,15,205,247,22,178,15,28,248,22,135,4,23,194, -2,86,95,23,200,1,23,193,1,254,2,166,2,23,203,2,23,208,1,23,209, -1,23,210,1,248,22,149,8,23,204,2,2,53,248,22,149,8,23,204,1,27, -248,22,184,3,23,195,1,28,249,22,171,9,8,46,249,22,150,8,23,201,2, -23,197,2,254,2,166,2,23,204,1,23,209,1,23,210,1,23,211,1,23,200, -2,23,208,1,248,22,183,3,23,201,1,253,2,168,2,23,203,1,23,207,1, -23,208,1,23,209,1,23,210,1,23,199,1,2,28,248,22,176,15,195,249,22, -129,16,196,194,192,32,171,2,88,148,8,36,43,61,11,2,52,222,33,172,2, -28,248,22,135,4,23,197,2,86,94,23,196,1,19,248,22,149,8,23,195,2, -35,248,22,149,8,23,196,2,249,22,185,15,27,251,22,156,8,250,22,155,8, -23,205,1,39,23,204,4,2,53,2,53,28,248,22,155,7,23,205,2,249,22, -170,8,23,206,1,8,63,23,204,1,28,248,22,135,4,248,22,149,8,23,195, -2,86,94,23,193,1,251,22,184,11,2,39,2,71,2,72,202,192,28,248,22, -176,15,198,248,22,177,15,198,247,22,178,15,2,27,248,22,184,3,23,198,1, -28,249,22,171,9,8,46,249,22,150,8,23,198,2,23,197,2,35,248,22,183, -3,23,195,2,249,22,185,15,27,251,22,156,8,250,22,155,8,23,205,1,39, -23,204,1,2,53,2,53,28,248,22,155,7,23,205,2,249,22,170,8,23,206, -1,8,63,23,204,1,28,248,22,135,4,248,22,149,8,23,195,2,86,94,23, -193,1,251,22,184,11,2,39,2,71,2,72,202,192,28,248,22,176,15,198,248, -22,177,15,198,247,22,178,15,28,248,22,135,4,23,194,2,86,94,23,193,1, -19,248,22,149,8,23,196,2,35,248,22,149,8,23,197,2,249,22,185,15,27, -251,22,156,8,250,22,155,8,23,206,1,39,23,204,4,2,53,2,53,28,248, -22,155,7,23,206,2,249,22,170,8,23,207,1,8,63,23,205,1,28,248,22, -135,4,248,22,149,8,23,195,2,86,94,23,193,1,251,22,184,11,2,39,2, -71,2,72,203,192,28,248,22,176,15,199,248,22,177,15,199,247,22,178,15,2, -27,248,22,184,3,23,195,1,28,249,22,171,9,8,46,249,22,150,8,23,199, -2,23,197,2,35,248,22,183,3,23,195,2,249,22,185,15,27,251,22,156,8, -250,22,155,8,23,206,1,39,23,204,1,2,53,2,53,28,248,22,155,7,23, -206,2,249,22,170,8,23,207,1,8,63,23,205,1,28,248,22,135,4,248,22, -149,8,23,195,2,86,94,23,193,1,251,22,184,11,2,39,2,71,2,72,203, -192,28,248,22,176,15,199,248,22,177,15,199,247,22,178,15,251,2,171,2,198, -199,200,196,90,144,41,11,89,146,41,39,11,86,95,28,28,248,22,176,15,23, -196,2,10,28,248,22,175,15,23,196,2,10,28,248,22,155,7,23,196,2,28, -248,22,134,16,23,196,2,10,248,22,135,16,23,196,2,11,12,252,22,182,11, -2,39,2,44,39,23,200,2,23,201,2,28,28,248,22,155,7,23,197,2,10, -248,22,144,8,23,197,2,12,252,22,182,11,2,39,2,74,40,23,200,2,23, -201,2,90,144,42,11,89,146,42,39,11,248,22,132,16,23,199,2,86,94,23, -195,1,86,94,28,192,12,250,22,185,11,2,39,2,75,23,201,2,249,22,7, -194,195,27,248,22,181,15,23,196,1,27,251,2,171,2,23,198,2,23,201,1, -23,202,1,248,22,149,8,23,199,1,28,248,22,176,15,195,249,22,129,16,196, -194,192,2,53,252,80,144,44,8,35,42,2,39,2,53,32,0,88,148,8,36, -41,46,11,9,222,33,174,2,198,199,32,176,2,88,148,8,36,43,60,11,2, -52,222,33,179,2,32,177,2,88,148,8,36,45,60,11,2,76,222,33,178,2, -249,22,185,15,27,251,22,156,8,250,22,155,8,23,203,2,39,23,206,1,23, -204,1,249,22,155,8,23,202,1,23,207,1,28,248,22,155,7,23,203,2,249, -22,170,8,23,204,1,8,63,23,202,1,28,248,22,135,4,248,22,149,8,23, -195,2,86,94,23,193,1,251,22,184,11,2,39,2,71,2,72,200,192,28,248, -22,176,15,196,248,22,177,15,196,247,22,178,15,28,248,22,135,4,23,197,2, -86,94,23,196,1,19,248,22,149,8,23,195,2,19,248,22,149,8,23,196,2, -249,22,185,15,27,251,22,156,8,250,22,155,8,23,205,2,39,23,204,4,2, -53,249,22,155,8,23,204,1,23,202,4,28,248,22,155,7,23,205,2,249,22, -170,8,23,206,1,8,63,23,204,1,28,248,22,135,4,248,22,149,8,23,195, -2,86,94,23,193,1,251,22,184,11,2,39,2,71,2,72,202,192,28,248,22, -176,15,198,248,22,177,15,198,247,22,178,15,2,2,27,248,22,184,3,23,198, -1,28,249,22,171,9,8,46,249,22,150,8,23,198,2,23,197,2,27,248,22, -183,3,23,195,2,249,22,185,15,27,251,22,156,8,250,22,155,8,23,205,2, -39,23,204,1,2,73,249,22,155,8,23,204,1,23,202,1,28,248,22,155,7, -23,205,2,249,22,170,8,23,206,1,8,63,23,204,1,28,248,22,135,4,248, -22,149,8,23,195,2,86,94,23,193,1,251,22,184,11,2,39,2,71,2,72, -202,192,28,248,22,176,15,198,248,22,177,15,198,247,22,178,15,28,248,22,135, -4,193,253,2,177,2,199,200,201,248,22,149,8,200,2,53,248,22,149,8,200, -27,248,22,184,3,194,28,249,22,171,9,8,46,249,22,150,8,198,196,253,2, -177,2,200,201,202,198,2,73,248,22,183,3,199,251,2,176,2,198,199,200,196, -90,144,41,11,89,146,41,39,11,86,95,28,28,248,22,176,15,23,196,2,10, -28,248,22,175,15,23,196,2,10,28,248,22,155,7,23,196,2,28,248,22,134, -16,23,196,2,10,248,22,135,16,23,196,2,11,12,252,22,182,11,2,39,2, -44,39,23,200,2,23,201,2,28,28,248,22,155,7,23,197,2,10,248,22,144, -8,23,197,2,12,252,22,182,11,2,39,2,74,40,23,200,2,23,201,2,90, -144,42,11,89,146,42,39,11,248,22,132,16,23,199,2,86,94,23,195,1,86, -94,28,192,12,250,22,185,11,2,39,2,75,23,201,2,249,22,7,194,195,27, -248,22,181,15,23,196,1,27,251,2,176,2,23,198,2,23,201,1,23,202,1, -248,22,149,8,23,199,1,28,248,22,176,15,195,249,22,129,16,196,194,192,252, -80,144,44,8,35,42,2,39,2,73,22,155,8,198,199,249,247,22,178,5,23, -195,1,11,249,247,22,178,5,194,11,28,248,22,90,23,195,2,9,27,27,248, -22,83,23,197,2,28,248,22,136,16,23,194,2,248,22,139,16,23,194,1,28, -248,22,135,16,23,194,2,90,144,42,11,89,146,42,39,11,248,22,132,16,249, -22,137,16,250,80,144,50,43,42,248,22,152,16,2,58,11,11,248,22,152,16, -2,59,86,95,23,195,1,23,194,1,248,22,139,16,249,22,137,16,23,199,1, -23,196,1,27,250,80,144,45,43,42,248,22,152,16,2,58,23,197,1,10,28, -23,193,2,248,22,139,16,23,194,1,11,28,23,193,2,249,22,82,248,22,139, -16,249,22,137,16,23,198,1,247,22,153,16,27,248,22,164,20,23,199,1,28, -248,22,90,23,194,2,9,27,248,80,144,45,56,42,248,22,83,23,196,2,28, -23,193,2,249,22,82,248,22,139,16,249,22,137,16,23,198,1,247,22,153,16, -248,80,144,47,8,50,42,248,22,164,20,23,198,1,86,94,23,193,1,248,80, -144,45,8,50,42,248,22,164,20,23,196,1,86,94,23,193,1,27,248,22,164, -20,23,197,1,28,248,22,90,23,194,2,9,27,248,80,144,43,56,42,248,22, -83,23,196,2,28,23,193,2,249,22,82,248,22,139,16,249,22,137,16,23,198, -1,247,22,153,16,248,80,144,45,8,50,42,248,22,164,20,23,198,1,86,94, -23,193,1,248,80,144,43,8,50,42,248,22,164,20,23,196,1,28,248,22,90, -23,195,2,9,27,27,248,22,83,23,197,2,28,248,22,136,16,23,194,2,248, -22,139,16,23,194,1,28,248,22,135,16,23,194,2,90,144,42,11,89,146,42, -39,11,248,22,132,16,249,22,137,16,250,80,144,50,43,42,248,22,152,16,2, -58,11,11,248,22,152,16,2,59,86,95,23,195,1,23,194,1,248,22,139,16, -249,22,137,16,23,199,1,23,196,1,27,250,80,144,45,43,42,248,22,152,16, -2,58,23,197,1,10,28,23,193,2,248,22,139,16,23,194,1,11,28,23,193, -2,249,22,82,248,22,139,16,249,22,137,16,23,198,1,247,22,153,16,27,248, -22,164,20,23,199,1,28,248,22,90,23,194,2,9,27,248,80,144,45,56,42, -248,22,83,23,196,2,28,23,193,2,249,22,82,248,22,139,16,249,22,137,16, -23,198,1,247,22,153,16,248,80,144,47,8,51,42,248,22,164,20,23,198,1, -86,94,23,193,1,248,80,144,45,8,51,42,248,22,164,20,23,196,1,86,94, -23,193,1,27,248,22,164,20,23,197,1,28,248,22,90,23,194,2,9,27,248, -80,144,43,56,42,248,22,83,23,196,2,28,23,193,2,249,22,82,248,22,139, -16,249,22,137,16,23,198,1,247,22,153,16,248,80,144,45,8,51,42,248,22, -164,20,23,198,1,86,94,23,193,1,248,80,144,43,8,51,42,248,22,164,20, -23,196,1,27,248,22,152,16,2,60,28,248,22,136,16,23,194,2,248,22,139, -16,23,194,1,28,248,22,135,16,23,194,2,90,144,42,11,89,146,42,39,11, -248,22,132,16,249,22,137,16,250,80,144,49,43,42,248,22,152,16,2,58,11, -11,248,22,152,16,2,59,86,95,23,195,1,23,194,1,248,22,139,16,249,22, -137,16,23,199,1,23,196,1,27,250,80,144,44,43,42,248,22,152,16,2,58, -23,197,1,10,28,23,193,2,248,22,139,16,23,194,1,11,28,248,22,90,23, -195,2,9,27,27,248,22,83,23,197,2,28,248,22,136,16,23,194,2,248,22, -139,16,23,194,1,28,248,22,135,16,23,194,2,90,144,42,11,89,146,42,39, -11,248,22,132,16,249,22,137,16,250,80,144,50,43,42,248,22,152,16,2,58, -11,11,248,22,152,16,2,59,86,95,23,195,1,23,194,1,248,22,139,16,249, -22,137,16,23,199,1,23,196,1,27,250,80,144,45,43,42,248,22,152,16,2, -58,23,197,1,10,28,23,193,2,248,22,139,16,23,194,1,11,28,23,193,2, -249,22,82,248,22,139,16,249,22,137,16,23,198,1,247,22,153,16,27,248,22, -164,20,23,199,1,28,248,22,90,23,194,2,9,27,27,248,22,83,23,196,2, -28,248,22,136,16,23,194,2,248,22,139,16,23,194,1,28,248,22,135,16,23, -194,2,90,144,42,11,89,146,42,39,11,248,22,132,16,249,22,137,16,250,80, -144,54,43,42,248,22,152,16,2,58,11,11,248,22,152,16,2,59,86,95,23, -195,1,23,194,1,248,22,139,16,249,22,137,16,23,199,1,23,196,1,27,250, -80,144,49,43,42,248,22,152,16,2,58,23,197,1,10,28,23,193,2,248,22, -139,16,23,194,1,11,28,23,193,2,249,22,82,248,22,139,16,249,22,137,16, -23,198,1,247,22,153,16,27,248,22,164,20,23,198,1,28,248,22,90,23,194, -2,9,27,248,80,144,49,56,42,248,22,83,23,196,2,28,23,193,2,249,22, -82,248,22,139,16,249,22,137,16,23,198,1,247,22,153,16,248,80,144,51,8, -53,42,248,22,164,20,23,198,1,86,94,23,193,1,248,80,144,49,8,53,42, -248,22,164,20,23,196,1,86,94,23,193,1,27,248,22,164,20,23,196,1,28, -248,22,90,23,194,2,9,27,248,80,144,47,56,42,248,22,83,23,196,2,28, -23,193,2,249,22,82,248,22,139,16,249,22,137,16,23,198,1,247,22,153,16, -248,80,144,49,8,53,42,248,22,164,20,23,198,1,86,94,23,193,1,248,80, -144,47,8,53,42,248,22,164,20,23,196,1,86,94,23,193,1,27,248,22,164, -20,23,197,1,28,248,22,90,23,194,2,9,27,27,248,22,83,23,196,2,28, -248,22,136,16,23,194,2,248,22,139,16,23,194,1,28,248,22,135,16,23,194, -2,90,144,42,11,89,146,42,39,11,248,22,132,16,249,22,137,16,250,80,144, -52,43,42,248,22,152,16,2,58,11,11,248,22,152,16,2,59,86,95,23,195, -1,23,194,1,248,22,139,16,249,22,137,16,23,199,1,23,196,1,27,250,80, -144,47,43,42,248,22,152,16,2,58,23,197,1,10,28,23,193,2,248,22,139, -16,23,194,1,11,28,23,193,2,249,22,82,248,22,139,16,249,22,137,16,23, -198,1,247,22,153,16,27,248,22,164,20,23,198,1,28,248,22,90,23,194,2, -9,27,248,80,144,47,56,42,248,22,83,23,196,2,28,23,193,2,249,22,82, -248,22,139,16,249,22,137,16,23,198,1,247,22,153,16,248,80,144,49,8,53, -42,248,22,164,20,23,198,1,86,94,23,193,1,248,80,144,47,8,53,42,248, -22,164,20,23,196,1,86,94,23,193,1,27,248,22,164,20,23,196,1,28,248, -22,90,23,194,2,9,27,248,80,144,45,56,42,248,22,83,23,196,2,28,23, -193,2,249,22,82,248,22,139,16,249,22,137,16,23,198,1,247,22,153,16,248, -80,144,47,8,53,42,248,22,164,20,23,198,1,86,94,23,193,1,248,80,144, -45,8,53,42,248,22,164,20,23,196,1,27,247,22,160,16,27,248,80,144,42, -58,42,247,80,144,42,57,42,249,80,144,43,44,41,28,23,196,2,27,249,22, -177,8,247,22,176,8,2,77,28,192,249,22,167,8,194,7,63,2,68,2,68, -250,80,144,46,8,23,42,23,198,2,2,78,27,28,23,200,1,250,22,129,16, -248,22,152,16,2,63,250,22,160,2,23,205,1,2,61,247,22,173,8,2,79, -86,94,23,199,1,11,27,248,80,144,49,8,50,42,250,22,96,9,248,22,92, -248,22,152,16,2,57,9,28,193,249,22,82,195,194,192,27,247,22,160,16,27, +45,112,97,116,104,115,75,101,109,98,101,100,100,101,100,45,108,111,97,100,78, +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,69,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,70,114,101,108,97,116,105,118,101,66,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,74,99,111,108,108,101,99,116,115, +45,100,105,114,71,101,120,101,99,45,102,105,108,101,70,111,114,105,103,45,100, +105,114,72,99,111,110,102,105,103,45,100,105,114,79,105,110,115,116,97,108,108, +97,116,105,111,110,45,110,97,109,101,6,10,10,108,105,110,107,115,46,114,107, +116,100,71,97,100,100,111,110,45,100,105,114,71,102,115,45,99,104,97,110,103, +101,67,101,114,114,111,114,66,114,111,111,116,73,115,116,97,116,105,99,45,114, +111,111,116,6,0,0,6,1,1,47,5,3,46,122,111,6,40,40,114,101,109, +111,118,105,110,103,32,115,117,102,102,105,120,32,109,97,107,101,115,32,112,97, +116,104,32,101,108,101,109,101,110,116,32,101,109,112,116,121,6,10,10,103,105, +118,101,110,32,112,97,116,104,5,1,95,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,68,102,105,110,105,115,104,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,173,15,194,28,192,192,28,248,22,153,7,194,27,248,22,132,16, +195,28,192,192,248,22,133,16,195,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,174,15,23,195,2,10,28,248,22,173,15,23,195, +2,10,28,248,22,153,7,23,195,2,28,248,22,132,16,23,195,2,10,248,22, +133,16,23,195,2,11,12,250,22,180,11,2,41,2,42,23,197,2,28,28,248, +22,174,15,23,195,2,249,22,169,9,248,22,175,15,23,197,2,2,43,249,22, +169,9,247,22,180,8,2,43,27,28,248,22,153,7,23,196,2,23,195,2,248, +22,165,8,248,22,178,15,23,197,2,28,249,22,170,16,2,79,23,195,2,28, +248,22,153,7,195,248,22,181,15,195,194,27,248,22,128,8,23,195,1,249,22, +182,15,248,22,168,8,250,22,178,16,2,80,28,249,22,170,16,2,81,23,201, +2,23,199,1,250,22,178,16,2,82,23,202,1,2,44,80,144,47,40,41,2, +43,28,248,22,153,7,194,248,22,181,15,194,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,173,15,23,195,2,10,28,248,22,153,7,23,195, +2,28,248,22,132,16,23,195,2,10,248,22,133,16,23,195,2,11,10,248,22, +174,15,23,195,2,12,252,22,180,11,2,6,2,45,39,23,199,2,23,200,2, +28,28,28,248,22,173,15,23,196,2,10,28,248,22,153,7,23,196,2,28,248, +22,132,16,23,196,2,10,248,22,133,16,23,196,2,11,10,248,22,174,15,23, +196,2,12,252,22,180,11,2,6,2,45,40,23,199,2,23,200,2,27,28,248, +22,174,15,23,196,2,248,22,175,15,23,196,2,247,22,176,15,86,95,28,28, +248,22,134,16,23,196,2,10,249,22,169,9,247,22,176,15,23,195,2,12,253, +22,182,11,2,6,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, +46,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,176,15,28,249,22,169,9,28,248, +22,174,15,23,199,2,248,22,175,15,23,199,2,247,22,176,15,23,195,2,12, +253,22,182,11,2,6,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,46,23,201,2,6,9,9,114,111,111,116,32,112,97,116,104, +23,202,2,27,27,248,22,138,16,28,248,22,134,16,23,199,2,23,198,1,248, +22,135,16,23,199,1,86,94,28,28,248,22,174,15,23,194,2,10,28,248,22, +173,15,23,194,2,10,28,248,22,153,7,23,194,2,28,248,22,132,16,23,194, +2,10,248,22,133,16,23,194,2,11,12,250,22,180,11,2,41,2,42,23,196, +2,28,28,248,22,174,15,23,194,2,249,22,169,9,248,22,175,15,23,196,2, +2,43,249,22,169,9,247,22,180,8,2,43,27,28,248,22,153,7,23,195,2, +23,194,2,248,22,165,8,248,22,178,15,23,196,2,28,249,22,170,16,2,79, +23,195,2,28,248,22,153,7,194,248,22,181,15,194,193,27,248,22,128,8,23, +195,1,249,22,182,15,248,22,168,8,250,22,178,16,2,80,28,249,22,170,16, +2,81,23,201,2,23,199,1,250,22,178,16,2,82,23,202,1,2,44,80,144, +50,40,41,2,43,28,248,22,153,7,193,248,22,181,15,193,192,27,248,22,178, +15,23,195,2,28,249,22,169,9,23,197,2,66,117,110,105,120,28,249,22,150, +8,194,5,1,47,28,248,22,174,15,198,197,248,22,181,15,198,249,22,191,15, +199,249,22,182,15,249,22,153,8,248,22,178,15,200,40,198,28,249,22,169,9, +23,197,2,2,43,249,22,191,15,23,200,1,249,22,182,15,28,249,22,170,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,154,8,2,47,250,22,153,8, +203,43,44,5,1,92,249,22,153,8,202,45,28,249,22,170,16,2,84,23,199, +2,249,22,154,8,2,47,249,22,153,8,200,43,28,249,22,170,16,2,84,23, +199,2,249,22,154,8,2,47,249,22,153,8,200,43,28,249,22,170,16,0,14, +35,114,120,34,94,92,92,92,92,92,92,92,92,34,23,199,2,249,22,154,8, +5,4,85,78,67,92,249,22,153,8,200,41,28,249,22,170,16,0,12,35,114, +120,34,94,91,97,45,122,93,58,34,198,249,22,154,8,250,22,153,8,201,39, +40,249,22,153,8,200,41,12,198,12,32,86,88,148,8,36,42,56,11,72,102, +111,117,110,100,45,101,120,101,99,222,33,89,32,87,88,148,8,36,43,61,11, +66,110,101,120,116,222,33,88,27,248,22,136,16,23,196,2,28,249,22,171,9, +23,195,2,23,197,1,11,28,248,22,132,16,23,194,2,27,249,22,191,15,23, +197,1,23,196,1,28,23,197,2,90,144,42,11,89,146,42,39,11,248,22,130, +16,23,197,2,86,95,23,195,1,23,194,1,27,28,23,202,2,27,248,22,136, +16,23,199,2,28,249,22,171,9,23,195,2,23,200,2,11,28,248,22,132,16, +23,194,2,250,2,86,23,205,2,23,206,2,249,22,191,15,23,200,2,23,198, +1,250,2,86,23,205,2,23,206,2,23,196,1,11,28,23,193,2,192,86,94, +23,193,1,27,28,248,22,173,15,23,196,2,27,249,22,191,15,23,198,2,23, +205,2,28,28,248,22,186,15,193,10,248,22,185,15,193,192,11,11,28,23,193, +2,192,86,94,23,193,1,28,23,203,2,11,27,248,22,136,16,23,200,2,28, +249,22,171,9,194,23,201,1,11,28,248,22,132,16,193,250,2,86,205,206,249, +22,191,15,200,197,250,2,86,205,206,195,192,86,94,23,194,1,28,23,196,2, +90,144,42,11,89,146,42,39,11,248,22,130,16,23,197,2,86,95,23,195,1, +23,194,1,27,28,23,201,2,27,248,22,136,16,23,199,2,28,249,22,171,9, +23,195,2,23,200,2,11,28,248,22,132,16,23,194,2,250,2,86,23,204,2, +23,205,2,249,22,191,15,23,200,2,23,198,1,250,2,86,23,204,2,23,205, +2,23,196,1,11,28,23,193,2,192,86,94,23,193,1,27,28,248,22,173,15, +23,196,2,27,249,22,191,15,23,198,2,23,204,2,28,28,248,22,186,15,193, +10,248,22,185,15,193,192,11,11,28,23,193,2,192,86,94,23,193,1,28,23, +202,2,11,27,248,22,136,16,23,200,2,28,249,22,171,9,194,23,201,1,11, +28,248,22,132,16,193,250,2,86,204,205,249,22,191,15,200,197,250,2,86,204, +205,195,192,28,23,193,2,90,144,42,11,89,146,42,39,11,248,22,130,16,23, +199,2,86,95,23,195,1,23,194,1,27,28,23,198,2,251,2,87,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,173,15,195,27,249,22,191,15,197,200,28,28,248,22,186,15,193,10, +248,22,185,15,193,192,11,11,28,192,192,28,198,11,251,2,87,198,203,201,202, +194,32,90,88,148,8,36,43,60,11,2,50,222,33,91,28,248,22,88,23,197, +2,11,27,249,22,191,15,248,22,135,16,248,22,81,23,201,2,23,196,2,28, +248,22,185,15,23,194,2,250,2,86,197,198,195,86,94,23,193,1,27,248,22, +162,20,23,199,1,28,248,22,88,23,194,2,11,27,249,22,191,15,248,22,135, +16,248,22,81,23,198,2,23,198,2,28,248,22,185,15,23,194,2,250,2,86, +199,200,195,86,94,23,193,1,27,248,22,162,20,23,196,1,28,248,22,88,23, +194,2,11,27,249,22,191,15,248,22,135,16,248,22,81,23,198,2,23,200,2, +28,248,22,185,15,23,194,2,250,2,86,201,202,195,86,94,23,193,1,27,248, +22,162,20,23,196,1,28,248,22,88,23,194,2,11,27,249,22,191,15,248,22, +135,16,248,22,81,197,201,28,248,22,185,15,193,250,2,86,203,204,195,251,2, +90,203,204,205,248,22,162,20,198,86,95,28,28,248,22,173,15,23,195,2,10, +28,248,22,153,7,23,195,2,28,248,22,132,16,23,195,2,10,248,22,133,16, +23,195,2,11,12,250,22,180,11,2,7,2,48,23,197,2,28,28,23,195,2, +28,28,248,22,173,15,23,196,2,10,28,248,22,153,7,23,196,2,28,248,22, +132,16,23,196,2,10,248,22,133,16,23,196,2,11,248,22,132,16,23,196,2, +11,10,12,250,22,180,11,2,7,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,132,16,23,195,2,90,144,42,11,89,146,42,39,11,248,22,130,16,23,198, +2,249,22,169,9,194,2,49,11,27,249,22,175,8,247,22,174,8,5,4,80, +65,84,72,27,28,23,194,2,249,80,143,43,44,249,22,165,8,23,198,1,7, +63,9,86,94,23,194,1,9,27,28,249,22,169,9,247,22,180,8,2,43,249, +22,80,248,22,182,15,5,1,46,23,196,1,23,194,1,28,248,22,88,23,194, +2,11,27,249,22,191,15,248,22,135,16,248,22,81,23,198,2,23,200,2,28, +248,22,185,15,23,194,2,250,2,86,201,202,195,86,94,23,193,1,27,248,22, +162,20,23,196,1,28,248,22,88,23,194,2,11,27,249,22,191,15,248,22,135, +16,248,22,81,23,198,2,23,202,2,28,248,22,185,15,23,194,2,250,2,86, +203,204,195,86,94,23,193,1,27,248,22,162,20,23,196,1,28,248,22,88,23, +194,2,11,27,249,22,191,15,248,22,135,16,248,22,81,23,198,2,23,204,2, +28,248,22,185,15,23,194,2,250,2,86,205,206,195,86,94,23,193,1,27,248, +22,162,20,23,196,1,28,248,22,88,23,194,2,11,27,249,22,191,15,248,22, +135,16,248,22,81,197,205,28,248,22,185,15,193,250,2,86,23,15,23,16,195, +251,2,90,23,15,23,16,23,17,248,22,162,20,198,27,248,22,135,16,23,196, +1,28,248,22,185,15,193,250,2,86,198,199,195,11,250,80,144,42,43,42,196, +197,11,250,80,144,42,43,42,196,11,11,32,95,88,148,8,36,42,58,11,2, +50,222,33,97,0,8,35,114,120,35,34,92,34,34,27,249,22,166,16,23,197, +2,23,198,2,28,23,193,2,86,94,23,196,1,27,248,22,102,23,195,2,27, +27,248,22,111,23,197,1,27,249,22,166,16,23,201,2,23,196,2,28,23,193, +2,86,94,23,194,1,27,248,22,102,23,195,2,27,250,2,95,202,23,204,1, +248,22,111,23,199,1,27,28,249,22,169,9,247,22,180,8,2,43,250,22,178, +16,2,96,23,198,1,2,51,194,28,249,22,150,8,194,2,51,249,22,94,202, +195,249,22,80,248,22,182,15,195,195,86,95,23,199,1,23,193,1,27,28,249, +22,169,9,247,22,180,8,2,43,250,22,178,16,2,96,23,198,1,2,51,194, +28,249,22,150,8,194,2,51,249,22,94,200,9,249,22,80,248,22,182,15,195, +9,27,28,249,22,169,9,247,22,180,8,2,43,250,22,178,16,2,96,23,198, +1,2,51,194,28,249,22,150,8,194,2,51,249,22,94,198,195,249,22,80,248, +22,182,15,195,195,86,94,23,193,1,27,28,249,22,169,9,247,22,180,8,2, +43,250,22,178,16,2,96,23,200,1,2,51,196,28,249,22,150,8,194,2,51, +249,22,94,196,9,249,22,80,248,22,182,15,195,9,86,95,28,28,248,22,142, +8,194,10,248,22,153,7,194,12,250,22,180,11,2,8,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,89,195,249,22,4,22,173,15,196,11,12,250,22,180,11,2,8,6,14, +14,40,108,105,115,116,111,102,32,112,97,116,104,63,41,197,250,2,95,197,195, +28,248,22,153,7,197,248,22,167,8,197,196,28,28,248,22,0,23,195,2,249, +22,48,23,196,2,39,11,20,13,144,80,144,39,46,40,26,29,80,144,8,29, +47,40,249,22,31,11,80,144,8,31,46,40,22,143,15,10,22,144,15,10,22, +145,15,10,22,148,15,10,22,147,15,11,22,149,15,10,22,146,15,10,22,150, +15,10,22,151,15,10,22,152,15,10,22,153,15,10,22,154,15,11,22,155,15, +10,22,141,15,11,247,23,194,1,250,22,180,11,2,9,2,52,23,197,1,86, +94,28,28,248,22,173,15,23,195,2,10,28,248,22,153,7,23,195,2,28,248, +22,132,16,23,195,2,10,248,22,133,16,23,195,2,11,12,250,22,180,11,23, +196,2,2,48,23,197,2,28,248,22,132,16,23,195,2,12,251,22,182,11,23, +197,1,2,53,2,46,23,198,1,86,94,28,28,248,22,173,15,23,195,2,10, +28,248,22,153,7,23,195,2,28,248,22,132,16,23,195,2,10,248,22,133,16, +23,195,2,11,12,250,22,180,11,23,196,2,2,48,23,197,2,28,248,22,132, +16,23,195,2,12,251,22,182,11,23,197,1,2,53,2,46,23,198,1,86,94, +86,94,28,28,248,22,173,15,23,195,2,10,28,248,22,153,7,23,195,2,28, +248,22,132,16,23,195,2,10,248,22,133,16,23,195,2,11,12,250,22,180,11, +23,196,2,2,48,23,197,2,28,248,22,132,16,23,195,2,86,94,23,194,1, +12,251,22,182,11,23,197,2,2,53,2,46,23,198,1,249,22,3,20,20,94, +88,148,8,36,40,50,11,9,223,2,33,101,23,195,1,23,197,1,28,28,248, +22,0,23,195,2,249,22,48,23,196,2,40,11,12,250,22,180,11,23,196,1, +2,54,23,197,1,86,94,28,28,248,22,173,15,23,194,2,10,28,248,22,153, +7,23,194,2,28,248,22,132,16,23,194,2,10,248,22,133,16,23,194,2,11, +12,250,22,180,11,2,15,2,48,23,196,2,28,248,22,132,16,23,194,2,12, +251,22,182,11,2,15,2,53,2,46,23,197,1,86,95,86,94,86,94,28,28, +248,22,173,15,23,196,2,10,28,248,22,153,7,23,196,2,28,248,22,132,16, +23,196,2,10,248,22,133,16,23,196,2,11,12,250,22,180,11,2,15,2,48, +23,198,2,28,248,22,132,16,23,196,2,12,251,22,182,11,2,15,2,53,2, +46,23,199,2,249,22,3,32,0,88,148,8,36,40,49,11,9,222,33,104,23, +198,2,28,28,248,22,0,23,195,2,249,22,48,23,196,2,40,11,12,250,22, +180,11,2,15,2,54,23,197,2,252,80,143,44,52,23,199,1,23,200,1,23, +201,1,11,11,86,94,28,28,248,22,173,15,23,194,2,10,28,248,22,153,7, +23,194,2,28,248,22,132,16,23,194,2,10,248,22,133,16,23,194,2,11,12, +250,22,180,11,2,17,2,48,23,196,2,28,248,22,132,16,23,194,2,12,251, +22,182,11,2,17,2,53,2,46,23,197,1,86,96,86,94,28,28,248,22,173, +15,23,197,2,10,28,248,22,153,7,23,197,2,28,248,22,132,16,23,197,2, +10,248,22,133,16,23,197,2,11,12,250,22,180,11,2,17,2,48,23,199,2, +28,248,22,132,16,23,197,2,12,251,22,182,11,2,17,2,53,2,46,23,200, +2,86,94,86,94,28,28,248,22,173,15,23,198,2,10,28,248,22,153,7,23, +198,2,28,248,22,132,16,23,198,2,10,248,22,133,16,23,198,2,11,12,250, +22,180,11,2,17,2,48,23,200,2,28,248,22,132,16,23,198,2,12,251,22, +182,11,2,17,2,53,2,46,23,201,2,249,22,3,32,0,88,148,8,36,40, +49,11,9,222,33,106,23,200,2,28,28,248,22,0,23,195,2,249,22,48,23, +196,2,40,11,12,250,22,180,11,2,17,2,54,23,197,2,252,80,143,44,52, +23,199,1,23,202,1,23,203,1,23,201,1,23,200,1,27,248,22,150,16,2, +55,28,248,22,134,16,23,194,2,248,22,137,16,23,194,1,28,248,22,133,16, +23,194,2,90,144,42,11,89,146,42,39,11,248,22,130,16,249,22,135,16,250, +80,144,49,43,42,248,22,150,16,2,56,11,11,248,22,150,16,2,57,86,95, +23,195,1,23,194,1,248,22,137,16,249,22,135,16,23,199,1,23,196,1,27, +250,80,144,44,43,42,248,22,150,16,2,56,23,197,1,10,28,23,193,2,248, +22,137,16,23,194,1,11,249,80,144,41,55,40,39,80,144,41,8,40,42,27, +248,22,150,16,2,58,28,248,22,134,16,23,194,2,248,22,137,16,23,194,1, +28,248,22,133,16,23,194,2,90,144,42,11,89,146,42,39,11,248,22,130,16, +249,22,135,16,250,80,144,49,43,42,248,22,150,16,2,56,11,11,248,22,150, +16,2,57,86,95,23,195,1,23,194,1,248,22,137,16,249,22,135,16,23,199, +1,23,196,1,27,250,80,144,44,43,42,248,22,150,16,2,56,23,197,1,10, +28,23,193,2,248,22,137,16,23,194,1,11,249,80,144,41,55,40,40,80,144, +41,8,41,42,27,20,13,144,80,144,40,46,40,26,29,80,144,8,30,47,40, +249,22,31,11,80,144,8,32,46,40,22,143,15,10,22,144,15,10,22,145,15, +10,22,148,15,10,22,147,15,11,22,149,15,10,22,146,15,10,22,150,15,10, +22,151,15,10,22,152,15,10,22,153,15,10,22,154,15,11,22,155,15,10,22, +141,15,11,247,22,148,6,28,248,22,149,2,193,192,11,27,28,23,195,2,249, +22,191,15,23,197,1,6,11,11,99,111,110,102,105,103,46,114,107,116,100,86, +94,23,195,1,11,27,28,23,194,2,28,248,22,185,15,23,195,2,249,22,140, +6,23,196,1,80,144,43,8,42,42,11,11,28,192,192,21,17,1,0,250,22, +158,2,23,196,1,2,59,247,22,171,8,250,22,158,2,195,2,59,247,22,171, +8,28,248,22,153,7,23,195,2,27,248,22,181,15,23,196,1,28,248,22,134, +16,23,194,2,192,249,22,135,16,23,195,1,27,247,80,144,43,54,42,28,23, +193,2,192,86,94,23,193,1,247,22,151,16,28,248,22,142,8,23,195,2,27, +248,22,182,15,23,196,1,28,248,22,134,16,23,194,2,192,249,22,135,16,23, +195,1,27,247,80,144,43,54,42,28,23,193,2,192,86,94,23,193,1,247,22, +151,16,28,248,22,173,15,23,195,2,28,248,22,134,16,23,195,2,193,249,22, +135,16,23,196,1,27,247,80,144,42,54,42,28,23,193,2,192,86,94,23,193, +1,247,22,151,16,193,27,248,22,150,16,2,55,28,248,22,134,16,23,194,2, +248,22,137,16,23,194,1,28,248,22,133,16,23,194,2,90,144,42,11,89,146, +42,39,11,248,22,130,16,249,22,135,16,250,80,144,49,43,42,248,22,150,16, +2,56,11,11,248,22,150,16,2,57,86,95,23,195,1,23,194,1,248,22,137, +16,249,22,135,16,23,199,1,23,196,1,27,250,80,144,44,43,42,248,22,150, +16,2,56,23,197,1,10,28,23,193,2,248,22,137,16,23,194,1,11,28,248, +22,134,16,23,195,2,193,249,22,135,16,23,196,1,27,249,80,144,44,55,40, +39,80,144,44,8,43,42,28,23,193,2,192,86,94,23,193,1,247,22,151,16, +28,248,22,134,16,23,195,2,248,22,137,16,23,195,1,28,248,22,133,16,23, +195,2,90,144,42,11,89,146,42,39,11,248,22,130,16,249,22,135,16,250,80, +144,48,43,42,248,22,150,16,2,56,11,11,248,22,150,16,2,57,86,95,23, +195,1,23,194,1,248,22,137,16,249,22,135,16,23,200,1,23,196,1,27,250, +80,144,43,43,42,248,22,150,16,2,56,23,198,1,10,28,23,193,2,248,22, +137,16,23,194,1,11,28,248,22,88,23,196,2,9,28,248,22,81,23,196,2, +249,22,80,27,248,22,161,20,23,199,2,28,248,22,153,7,23,194,2,27,248, +22,181,15,23,195,1,28,248,22,134,16,23,194,2,192,249,22,135,16,23,195, +1,27,247,80,144,46,54,42,28,23,193,2,192,86,94,23,193,1,247,22,151, +16,28,248,22,142,8,23,194,2,27,248,22,182,15,23,195,1,28,248,22,134, +16,23,194,2,192,249,22,135,16,23,195,1,27,247,80,144,46,54,42,28,23, +193,2,192,86,94,23,193,1,247,22,151,16,28,248,22,173,15,23,194,2,28, +248,22,134,16,23,194,2,192,249,22,135,16,23,195,1,27,247,80,144,45,54, +42,28,23,193,2,192,86,94,23,193,1,247,22,151,16,192,27,248,22,162,20, +23,199,1,28,248,22,88,23,194,2,9,28,248,22,81,23,194,2,249,22,80, +248,80,144,45,60,42,248,22,161,20,23,197,2,27,248,22,162,20,23,197,1, +28,248,22,88,23,194,2,9,28,248,22,81,23,194,2,249,22,80,248,80,144, +48,60,42,248,22,161,20,23,197,2,249,80,144,49,8,44,42,23,204,1,248, +22,162,20,23,198,1,249,22,94,23,202,2,249,80,144,49,8,44,42,23,204, +1,248,22,162,20,23,198,1,249,22,94,23,199,2,27,248,22,162,20,23,197, +1,28,248,22,88,23,194,2,9,28,248,22,81,23,194,2,249,22,80,248,80, +144,48,60,42,248,22,161,20,23,197,2,249,80,144,49,8,44,42,23,204,1, +248,22,162,20,23,198,1,249,22,94,23,202,2,249,80,144,49,8,44,42,23, +204,1,248,22,162,20,23,198,1,249,22,94,23,196,2,27,248,22,162,20,23, +199,1,28,248,22,88,23,194,2,9,28,248,22,81,23,194,2,249,22,80,248, +80,144,45,60,42,248,22,161,20,23,197,2,27,248,22,162,20,23,197,1,28, +248,22,88,23,194,2,9,28,248,22,81,23,194,2,249,22,80,248,80,144,48, +60,42,248,22,161,20,23,197,2,249,80,144,49,8,44,42,23,204,1,248,22, +162,20,23,198,1,249,22,94,23,202,2,249,80,144,49,8,44,42,23,204,1, +248,22,162,20,23,198,1,249,22,94,23,199,2,27,248,22,162,20,23,197,1, +28,248,22,88,23,194,2,9,28,248,22,81,23,194,2,249,22,80,248,80,144, +48,60,42,248,22,161,20,23,197,2,249,80,144,49,8,44,42,23,204,1,248, +22,162,20,23,198,1,249,22,94,23,202,2,249,80,144,49,8,44,42,23,204, +1,248,22,162,20,23,198,1,27,250,22,158,2,23,198,1,23,199,1,11,28, +192,249,80,144,42,8,44,42,198,194,196,27,248,22,150,16,2,58,28,248,22, +134,16,23,194,2,248,22,137,16,23,194,1,28,248,22,133,16,23,194,2,90, +144,42,11,89,146,42,39,11,248,22,130,16,249,22,135,16,250,80,144,49,43, +42,248,22,150,16,2,56,11,11,248,22,150,16,2,57,86,95,23,195,1,23, +194,1,248,22,137,16,249,22,135,16,23,199,1,23,196,1,27,250,80,144,44, +43,42,248,22,150,16,2,56,23,197,1,10,28,23,193,2,248,22,137,16,23, +194,1,11,27,248,80,144,41,58,42,249,80,144,43,55,40,40,80,144,43,8, +45,42,27,27,250,22,158,2,23,198,2,72,108,105,110,107,115,45,102,105,108, +101,11,27,28,23,194,2,23,194,1,86,94,23,194,1,249,22,191,15,27,250, +22,158,2,23,202,2,71,115,104,97,114,101,45,100,105,114,11,28,192,192,249, +22,191,15,64,117,112,6,5,5,115,104,97,114,101,2,60,28,248,22,153,7, +23,194,2,27,248,22,181,15,23,195,1,28,248,22,134,16,23,194,2,192,249, +22,135,16,23,195,1,27,247,80,144,47,54,42,28,23,193,2,192,86,94,23, +193,1,247,22,151,16,28,248,22,142,8,23,194,2,27,248,22,182,15,23,195, +1,28,248,22,134,16,23,194,2,192,249,22,135,16,23,195,1,27,247,80,144, +47,54,42,28,23,193,2,192,86,94,23,193,1,247,22,151,16,28,248,22,173, +15,23,194,2,28,248,22,134,16,23,194,2,192,249,22,135,16,23,195,1,27, +247,80,144,46,54,42,28,23,193,2,192,86,94,23,193,1,247,22,151,16,192, +250,22,94,248,22,90,11,28,247,22,158,16,28,247,22,159,16,248,22,90,250, +22,191,15,248,22,150,16,2,61,250,22,158,2,23,204,2,2,59,247,22,171, +8,2,60,9,9,28,247,22,159,16,250,80,144,47,8,23,42,23,200,1,1, +18,108,105,110,107,115,45,115,101,97,114,99,104,45,102,105,108,101,115,248,22, +90,23,200,1,9,248,22,172,13,23,194,1,249,22,14,80,144,41,8,26,41, +28,248,22,128,13,23,197,2,86,94,23,196,1,32,0,88,148,8,36,39,44, +11,9,222,11,20,20,94,88,148,8,36,39,46,11,9,223,3,33,124,23,196, +1,32,126,88,148,39,40,59,11,2,50,222,33,127,90,144,42,11,89,146,42, +39,11,248,22,130,16,23,197,1,86,95,23,195,1,23,194,1,28,248,22,173, +15,23,194,2,28,248,22,186,15,23,194,2,249,22,145,6,23,195,1,32,0, +88,148,8,36,39,44,11,9,222,11,90,144,42,11,89,146,42,39,11,248,22, +130,16,23,197,1,86,95,23,195,1,23,194,1,28,248,22,173,15,23,194,2, +28,248,22,186,15,23,194,2,249,22,145,6,23,195,1,32,0,88,148,8,36, +39,44,11,9,222,11,90,144,42,11,89,146,42,39,11,248,22,130,16,23,197, +1,86,95,23,195,1,23,194,1,28,248,22,173,15,23,194,2,28,248,22,186, +15,23,194,2,249,22,145,6,23,195,1,32,0,88,148,8,36,39,44,11,9, +222,11,90,144,42,11,89,146,42,39,11,248,22,130,16,23,197,1,86,95,23, +195,1,23,194,1,28,248,22,173,15,23,194,2,28,248,22,186,15,23,194,2, +249,22,145,6,23,195,1,32,0,88,148,8,36,39,44,11,9,222,11,248,2, +126,23,194,1,11,11,11,11,32,128,2,88,148,8,36,40,58,11,2,50,222, +33,129,2,27,249,22,163,6,8,128,128,23,196,2,28,248,22,148,7,23,194, +2,9,249,22,80,23,195,1,27,249,22,163,6,8,128,128,23,199,2,28,248, +22,148,7,23,194,2,9,249,22,80,23,195,1,27,249,22,163,6,8,128,128, +23,202,2,28,248,22,148,7,23,194,2,9,249,22,80,23,195,1,27,249,22, +163,6,8,128,128,23,205,2,28,248,22,148,7,23,194,2,9,249,22,80,23, +195,1,248,2,128,2,23,206,1,27,249,22,163,6,8,128,128,23,196,2,28, +248,22,142,8,23,194,2,28,249,22,132,4,248,22,147,8,23,196,2,8,128, +128,249,22,1,22,154,8,249,22,80,23,197,1,27,249,22,163,6,8,128,128, +23,201,2,28,248,22,148,7,23,194,2,9,249,22,80,23,195,1,27,249,22, +163,6,8,128,128,23,204,2,28,248,22,148,7,23,194,2,9,249,22,80,23, +195,1,27,249,22,163,6,8,128,128,23,207,2,28,248,22,148,7,23,194,2, +9,249,22,80,23,195,1,27,249,22,163,6,8,128,128,23,210,2,28,248,22, +148,7,23,194,2,9,249,22,80,23,195,1,248,2,128,2,23,211,1,192,192, +248,22,133,6,23,194,1,20,13,144,80,144,40,8,28,40,80,144,40,8,46, +42,27,28,249,22,189,8,248,22,180,8,2,62,41,90,144,42,11,89,146,42, +39,11,248,22,130,16,23,198,2,86,95,23,195,1,23,194,1,28,248,22,173, +15,23,194,2,28,248,22,186,15,23,194,2,249,22,145,6,23,195,1,32,0, +88,148,8,36,39,44,11,9,222,11,90,144,42,11,89,146,42,39,11,248,22, +130,16,23,197,1,86,95,23,195,1,23,194,1,28,248,22,173,15,23,194,2, +28,248,22,186,15,23,194,2,249,22,145,6,23,195,1,32,0,88,148,8,36, +39,44,11,9,222,11,90,144,42,11,89,146,42,39,11,248,22,130,16,23,197, +1,86,95,23,195,1,23,194,1,28,248,22,173,15,23,194,2,28,248,22,186, +15,23,194,2,249,22,145,6,23,195,1,32,0,88,148,8,36,39,44,11,9, +222,11,90,144,42,11,89,146,42,39,11,248,22,130,16,23,197,1,86,95,23, +195,1,23,194,1,28,248,22,173,15,23,194,2,28,248,22,186,15,23,194,2, +249,22,145,6,23,195,1,32,0,88,148,8,36,39,44,11,9,222,11,248,2, +126,23,194,1,11,11,11,11,11,28,248,22,185,15,23,195,2,27,28,249,22, +189,8,248,22,180,8,2,62,41,249,22,145,6,23,197,2,32,0,88,148,8, +36,39,44,11,9,222,11,11,86,94,28,23,194,2,248,22,147,6,23,195,1, +86,94,23,194,1,12,249,22,80,27,248,22,188,5,23,199,1,250,22,44,22, +35,88,148,39,39,8,24,11,9,223,3,33,130,2,20,20,94,88,148,8,36, +39,46,11,9,223,3,33,131,2,23,196,1,194,249,22,80,11,194,28,28,23, +195,2,28,248,22,82,23,196,2,248,22,167,9,249,22,174,14,39,248,22,162, +20,23,199,2,11,11,194,86,94,23,195,1,249,22,12,20,20,94,88,148,8, +32,39,61,16,4,39,8,128,80,8,240,0,64,0,0,39,9,224,2,3,33, +132,2,23,196,1,80,144,41,8,26,41,27,248,22,167,9,194,28,192,192,248, +22,167,9,248,22,81,195,86,95,28,248,22,149,12,23,198,2,27,247,22,141, +12,28,249,22,131,12,23,195,2,2,63,251,22,137,12,23,197,1,2,63,250, +22,137,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,145,12,23,206,2,247,22,27,12,12, +28,23,193,2,250,22,156,2,80,144,45,8,25,41,23,198,1,249,22,80,23, +198,1,21,17,0,0,86,95,23,195,1,23,193,1,12,28,248,22,149,12,23, +198,2,86,94,23,197,1,248,23,195,1,247,22,138,2,196,88,148,39,40,58, +8,240,0,0,0,2,9,226,0,2,1,3,33,135,2,20,20,94,248,22,148, +6,23,194,2,28,248,22,148,7,248,22,148,6,23,195,1,12,248,22,176,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,133,6,23,194,1,28,248, +22,89,193,28,28,249,22,128,4,41,248,22,93,195,10,249,22,128,4,42,248, +22,93,195,28,28,248,22,153,7,248,22,81,194,10,28,249,22,169,9,2,64, +248,22,161,20,195,10,249,22,169,9,2,65,248,22,161,20,195,28,27,248,22, +102,194,28,248,22,173,15,193,10,28,248,22,153,7,193,28,248,22,132,16,193, +10,248,22,133,16,193,11,27,248,22,88,248,22,104,195,28,192,192,248,22,179, +16,248,22,111,195,11,11,11,11,28,248,22,186,15,249,22,191,15,23,196,2, +23,198,2,27,248,22,68,248,22,177,15,23,198,1,250,22,156,2,23,198,2, +23,196,2,249,22,80,23,199,1,250,22,158,2,23,203,1,23,201,1,9,12, +250,22,156,2,23,197,1,23,198,1,249,22,80,23,198,1,23,201,1,28,28, +248,22,88,248,22,104,23,197,2,10,249,22,170,16,248,22,111,23,198,2,247, +22,171,8,27,248,22,137,16,249,22,135,16,248,22,102,23,200,2,23,198,1, +28,249,22,169,9,248,22,161,20,23,199,2,2,65,86,94,23,196,1,249,22, +3,20,20,94,88,148,8,36,40,56,11,9,224,3,2,33,140,2,23,196,1, +248,22,140,16,23,196,1,28,249,22,169,9,248,22,161,20,23,199,2,2,64, +86,94,23,196,1,86,94,28,250,22,158,2,23,197,2,11,11,12,250,22,156, +2,23,197,2,11,9,249,22,164,2,23,196,2,20,20,95,88,148,8,36,41, +53,11,9,224,3,2,33,141,2,23,195,1,23,196,1,27,248,22,68,248,22, +161,20,23,199,1,250,22,156,2,23,198,2,23,196,2,249,22,80,248,22,129, +2,23,200,1,250,22,158,2,23,203,1,23,201,1,9,12,250,22,156,2,23, +196,1,23,197,1,248,22,95,23,199,1,27,28,28,23,194,2,248,22,167,9, +248,22,81,23,196,2,10,9,27,249,22,188,5,23,198,2,68,98,105,110,97, +114,121,250,22,44,22,35,88,148,8,36,39,47,11,9,223,3,33,137,2,20, +20,94,88,148,8,36,39,46,11,9,223,3,33,138,2,23,196,1,86,94,28, +28,248,22,89,23,194,2,249,22,4,32,0,88,148,8,36,40,48,11,9,222, +33,139,2,23,195,2,11,12,248,22,176,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,138,2,27,90,144,42, +11,89,146,42,39,11,248,22,130,16,23,201,2,192,86,96,249,22,3,20,20, +94,88,148,8,36,40,57,11,9,224,2,3,33,142,2,23,195,1,23,197,1, +249,22,164,2,195,88,148,8,36,41,51,11,9,223,3,33,143,2,250,22,156, +2,80,144,47,8,25,41,23,200,1,249,22,80,23,201,1,198,193,20,13,144, +80,144,40,8,28,40,250,80,144,43,8,47,42,23,198,2,23,196,2,11,27, +250,22,158,2,80,144,44,8,25,41,23,197,2,21,143,11,17,0,0,27,248, +22,81,23,195,2,27,249,80,144,45,8,27,42,23,198,2,23,196,2,28,249, +22,171,9,23,195,2,23,196,1,248,22,162,20,195,86,94,23,195,1,20,13, +144,80,144,43,8,28,40,250,80,144,46,8,47,42,23,201,1,23,199,2,23, +196,2,27,20,20,95,88,148,8,36,39,55,8,240,0,0,0,2,9,225,5, +4,1,33,144,2,23,194,1,23,197,1,28,249,22,48,23,195,2,39,20,13, +144,80,144,44,46,40,26,29,80,144,8,34,47,40,249,22,31,11,80,144,8, +36,46,40,22,143,15,10,22,144,15,10,22,145,15,10,22,148,15,10,22,147, +15,11,22,149,15,10,22,146,15,10,22,150,15,10,22,151,15,10,22,152,15, +10,22,153,15,10,22,154,15,11,22,155,15,10,22,141,15,11,247,23,193,1, +250,22,180,11,2,9,2,52,23,196,1,248,22,8,20,20,94,88,148,39,40, +8,43,16,4,8,128,6,8,128,104,8,240,0,128,0,0,39,9,224,1,2, +33,145,2,23,195,1,0,7,35,114,120,34,47,43,34,28,248,22,153,7,23, +195,2,27,249,22,168,16,2,147,2,23,197,2,28,23,193,2,28,249,22,128, +4,248,22,101,23,196,2,248,22,182,3,248,22,156,7,23,199,2,249,22,7, +250,22,175,7,23,200,1,39,248,22,101,23,199,1,23,198,1,249,22,7,250, +22,175,7,23,200,2,39,248,22,101,23,199,2,249,22,80,249,22,175,7,23, +201,1,248,22,103,23,200,1,23,200,1,249,22,7,23,197,1,23,198,1,90, +144,42,11,89,146,42,39,11,248,22,130,16,23,198,1,86,94,23,195,1,28, +249,22,169,9,23,195,2,2,49,86,94,23,193,1,249,22,7,23,196,1,23, +200,1,27,249,22,80,23,197,1,23,201,1,28,248,22,153,7,23,195,2,27, +249,22,168,16,2,147,2,23,197,2,28,23,193,2,28,249,22,128,4,248,22, +101,23,196,2,248,22,182,3,248,22,156,7,23,199,2,249,22,7,250,22,175, +7,23,200,1,39,248,22,101,23,199,1,23,196,1,249,22,7,250,22,175,7, +23,200,2,39,248,22,101,23,199,2,249,22,80,249,22,175,7,23,201,1,248, +22,103,23,200,1,23,198,1,249,22,7,23,197,1,23,196,1,90,144,42,11, +89,146,42,39,11,248,22,130,16,23,198,1,86,94,23,195,1,28,249,22,169, +9,23,195,2,2,49,86,94,23,193,1,249,22,7,23,196,1,23,198,1,249, +80,144,48,8,31,42,194,249,22,80,197,199,28,248,22,88,23,196,2,9,28, +248,22,81,23,196,2,28,248,22,149,2,248,22,161,20,23,197,2,250,22,94, +249,22,2,22,129,2,250,22,158,2,248,22,161,20,23,204,2,23,202,2,9, +250,22,158,2,248,22,161,20,23,202,2,11,9,27,248,22,162,20,23,200,1, +28,248,22,88,23,194,2,9,28,248,22,81,23,194,2,28,248,22,149,2,248, +22,161,20,23,195,2,250,22,94,249,22,2,22,129,2,250,22,158,2,248,22, +161,20,23,202,2,23,206,2,9,250,22,158,2,248,22,161,20,23,200,2,11, +9,249,80,144,48,8,48,42,23,203,1,248,22,162,20,23,199,1,27,248,80, +144,45,8,30,42,248,22,161,20,23,196,2,250,22,94,250,22,158,2,23,199, +2,23,205,2,9,250,22,158,2,23,199,1,11,9,249,80,144,49,8,48,42, +23,204,1,248,22,162,20,23,200,1,249,22,94,247,22,154,16,249,80,144,47, +8,48,42,23,202,1,248,22,162,20,23,198,1,27,248,80,144,41,8,30,42, +248,22,161,20,23,198,2,250,22,94,250,22,158,2,23,199,2,23,201,2,9, +250,22,158,2,23,199,1,11,9,27,248,22,162,20,23,201,1,28,248,22,88, +23,194,2,9,28,248,22,81,23,194,2,28,248,22,149,2,248,22,161,20,23, +195,2,250,22,94,249,22,2,22,129,2,250,22,158,2,248,22,161,20,23,202, +2,23,207,2,9,250,22,158,2,248,22,161,20,23,200,2,11,9,249,80,144, +49,8,48,42,23,204,1,248,22,162,20,23,199,1,27,248,80,144,46,8,30, +42,248,22,161,20,23,196,2,250,22,94,250,22,158,2,23,199,2,23,206,2, +9,250,22,158,2,23,199,1,11,9,249,80,144,50,8,48,42,23,205,1,248, +22,162,20,23,200,1,249,22,94,247,22,154,16,249,80,144,48,8,48,42,23, +203,1,248,22,162,20,23,198,1,249,22,94,247,22,154,16,27,248,22,162,20, +23,199,1,28,248,22,88,23,194,2,9,28,248,22,81,23,194,2,28,248,22, +149,2,248,22,161,20,23,195,2,250,22,94,249,22,2,22,129,2,250,22,158, +2,248,22,161,20,23,202,2,23,205,2,9,250,22,158,2,248,22,161,20,23, +200,2,11,9,249,80,144,47,8,48,42,23,202,1,248,22,162,20,23,199,1, +27,248,80,144,44,8,30,42,248,22,161,20,23,196,2,250,22,94,250,22,158, +2,23,199,2,23,204,2,9,250,22,158,2,23,199,1,11,9,249,80,144,48, +8,48,42,23,203,1,248,22,162,20,23,200,1,249,22,94,247,22,154,16,249, +80,144,46,8,48,42,23,201,1,248,22,162,20,23,198,1,32,150,2,88,148, +8,36,40,50,11,2,50,222,33,151,2,28,248,22,88,248,22,82,23,195,2, +248,22,90,27,248,22,161,20,195,28,248,22,173,15,193,248,22,177,15,193,192, +250,22,91,27,248,22,161,20,23,198,2,28,248,22,173,15,193,248,22,177,15, +193,192,2,67,248,2,150,2,248,22,162,20,23,198,1,250,22,137,8,6,7, +7,10,32,126,97,32,126,97,6,1,1,32,23,196,1,249,22,137,8,6,6, +6,10,32,32,32,126,97,248,22,132,2,23,196,1,32,154,2,88,148,39,41, +51,11,68,102,105,108,116,101,114,222,33,155,2,28,248,22,88,23,195,2,9, +28,248,23,194,2,248,22,81,23,196,2,249,22,80,248,22,161,20,23,197,2, +249,2,154,2,23,197,1,248,22,162,20,23,199,1,249,2,154,2,23,195,1, +248,22,162,20,23,197,1,28,248,22,88,23,201,2,86,95,23,200,1,23,199, +1,28,23,201,2,28,197,249,22,191,15,202,199,200,27,28,248,22,88,23,198, +2,2,66,249,22,1,22,176,7,248,2,150,2,23,200,2,248,23,199,1,251, +22,137,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,88,23,203,1,28, +248,22,173,15,23,202,2,248,22,177,15,23,202,1,23,201,1,250,22,176,7, +28,248,22,173,15,23,205,2,248,22,177,15,23,205,1,23,204,1,2,67,23, +201,2,249,22,1,22,176,7,249,22,2,32,0,88,148,8,36,40,48,11,9, +222,33,152,2,27,248,22,93,23,206,2,27,248,22,93,247,22,154,16,28,249, +22,129,4,249,22,184,3,23,198,2,23,197,2,44,23,206,2,249,22,94,247, +22,154,16,248,22,90,249,22,137,8,6,50,50,46,46,46,32,91,126,97,32, +97,100,100,105,116,105,111,110,97,108,32,108,105,110,107,101,100,32,97,110,100, +32,112,97,99,107,97,103,101,32,100,105,114,101,99,116,111,114,105,101,115,93, +249,22,184,3,23,201,1,23,200,1,28,249,22,5,22,131,2,23,202,2,250, +22,137,8,6,49,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,176, +7,249,22,2,32,0,88,148,8,36,40,48,11,9,222,33,153,2,249,2,154, +2,22,131,2,23,209,1,86,95,23,200,1,23,198,1,2,66,27,248,22,81, +23,202,2,27,28,248,22,173,15,23,195,2,249,22,191,15,23,196,1,23,199, +2,248,22,132,2,23,195,1,28,28,248,22,173,15,248,22,161,20,23,204,2, +248,22,186,15,23,194,2,10,27,250,22,1,22,191,15,23,197,1,23,202,2, +28,28,248,22,88,23,200,2,10,248,22,186,15,23,194,2,28,23,201,2,28, +28,250,80,144,45,8,32,42,195,203,204,10,27,28,248,22,173,15,202,248,22, +177,15,202,201,19,248,22,156,7,23,195,2,27,28,249,22,132,4,23,196,4, +43,28,249,22,159,7,6,4,4,46,114,107,116,249,22,175,7,23,199,2,249, +22,184,3,23,200,4,43,249,22,176,7,250,22,175,7,23,200,1,39,249,22, +184,3,23,201,4,43,6,3,3,46,115,115,86,94,23,195,1,11,11,28,23, +193,2,250,80,144,48,8,32,42,198,23,196,1,23,15,11,2,28,200,249,22, +191,15,194,202,192,26,8,80,144,50,8,49,42,204,205,206,23,15,23,16,23, +17,248,22,162,20,23,19,28,23,19,23,19,200,192,26,8,80,144,50,8,49, +42,204,205,206,23,15,23,16,23,17,248,22,162,20,23,19,23,19,26,8,80, +144,49,8,49,42,203,204,205,206,23,15,23,16,248,22,162,20,23,18,23,18, +90,144,41,11,89,146,41,39,11,249,80,144,43,8,31,42,23,199,1,23,200, +1,27,248,22,68,28,248,22,173,15,195,248,22,177,15,195,194,27,27,247,22, +155,16,28,248,22,88,23,194,2,9,28,248,22,81,23,194,2,28,248,22,149, +2,248,22,161,20,23,195,2,250,22,94,249,22,2,22,129,2,250,22,158,2, +248,22,161,20,23,202,2,23,203,2,9,250,22,158,2,248,22,161,20,23,200, +2,11,9,249,80,144,49,8,48,42,23,200,1,248,22,162,20,23,199,1,27, +248,80,144,46,8,30,42,248,22,161,20,23,196,2,250,22,94,250,22,158,2, +23,199,2,23,202,2,9,250,22,158,2,23,199,1,11,9,249,80,144,50,8, +48,42,23,201,1,248,22,162,20,23,200,1,249,22,94,247,22,154,16,249,80, +144,48,8,48,42,23,199,1,248,22,162,20,23,198,1,26,8,80,144,51,8, +49,42,200,202,203,205,23,16,23,17,200,11,32,158,2,88,148,8,36,42,59, +11,2,50,222,33,159,2,28,248,22,133,4,23,196,2,86,94,23,195,1,19, +248,22,147,8,23,195,2,19,248,22,147,8,23,196,2,249,22,183,15,27,251, +22,154,8,250,22,153,8,23,205,2,39,23,204,4,2,51,249,22,153,8,23, +204,1,23,202,4,2,68,28,248,22,133,4,248,22,147,8,23,195,2,86,94, +23,193,1,251,22,182,11,2,37,2,69,2,70,202,192,28,248,22,174,15,198, +248,22,175,15,198,247,22,176,15,2,2,27,248,22,182,3,23,197,1,28,249, +22,169,9,8,46,249,22,148,8,23,198,2,23,197,2,27,248,22,181,3,23, +195,2,249,22,183,15,27,251,22,154,8,250,22,153,8,23,205,2,39,23,204, +1,2,71,249,22,153,8,23,204,1,23,202,1,2,68,28,248,22,133,4,248, +22,147,8,23,195,2,86,94,23,193,1,251,22,182,11,2,37,2,69,2,70, +202,192,28,248,22,174,15,198,248,22,175,15,198,247,22,176,15,250,2,158,2, +196,197,195,248,22,185,15,27,250,22,191,15,23,200,1,23,202,1,23,199,1, +28,249,22,169,9,23,197,2,66,115,97,109,101,192,28,248,22,132,16,23,196, +2,249,22,191,15,194,196,249,80,144,46,42,42,23,195,1,23,197,1,249,22, +5,20,20,96,88,148,39,40,54,47,9,226,5,4,2,6,33,160,2,23,199, +1,23,195,1,23,197,1,23,196,1,27,248,22,185,15,249,22,191,15,23,198, +2,23,199,2,28,23,193,2,192,86,94,23,193,1,28,23,197,1,27,90,144, +41,11,89,146,41,39,11,250,80,144,46,8,34,42,23,202,2,2,68,2,37, +27,248,22,179,15,23,196,1,27,250,2,158,2,23,197,2,23,204,1,248,22, +147,8,23,198,1,28,248,22,174,15,195,249,22,191,15,196,194,192,27,247,22, +156,16,249,22,5,20,20,96,88,148,39,40,51,47,9,226,5,6,2,3,33, +161,2,23,196,1,23,195,1,23,199,1,247,22,157,16,11,86,95,28,28,248, +22,174,15,23,194,2,10,28,248,22,173,15,23,194,2,10,28,248,22,153,7, +23,194,2,28,248,22,132,16,23,194,2,10,248,22,133,16,23,194,2,11,12, +252,22,180,11,23,200,2,2,42,39,23,198,2,23,199,2,28,28,248,22,153, +7,23,195,2,10,248,22,142,8,23,195,2,86,94,23,194,1,12,252,22,180, +11,23,200,2,2,72,40,23,198,2,23,199,1,90,144,42,11,89,146,42,39, +11,248,22,130,16,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,183,11,23,201,1,2,73,23,199,1,249,22, +7,23,195,1,23,196,1,32,164,2,88,148,8,36,46,61,11,2,74,222,33, +165,2,249,22,183,15,27,251,22,154,8,250,22,153,8,23,203,2,39,23,207, +1,23,205,1,249,23,203,1,23,202,1,23,208,1,28,248,22,153,7,23,204, +2,249,22,168,8,23,205,1,8,63,23,203,1,28,248,22,133,4,248,22,147, +8,23,195,2,86,94,23,193,1,251,22,182,11,2,37,2,69,2,70,201,192, +28,248,22,174,15,197,248,22,175,15,197,247,22,176,15,32,166,2,88,148,8, +36,45,8,24,11,2,50,222,33,167,2,28,248,22,133,4,23,199,2,86,95, +23,198,1,23,194,1,19,248,22,147,8,23,195,2,19,248,22,147,8,23,196, +2,249,22,183,15,27,251,22,154,8,250,22,153,8,23,205,2,39,23,204,4, +2,51,249,23,206,1,23,204,1,23,202,4,28,248,22,153,7,23,207,2,249, +22,168,8,23,208,1,8,63,23,206,1,28,248,22,133,4,248,22,147,8,23, +195,2,86,94,23,193,1,251,22,182,11,2,37,2,69,2,70,204,192,28,248, +22,174,15,200,248,22,175,15,200,247,22,176,15,2,2,27,248,22,182,3,23, +200,1,28,249,22,169,9,8,46,249,22,148,8,23,198,2,23,197,2,27,248, +22,181,3,23,195,2,249,22,183,15,27,251,22,154,8,250,22,153,8,23,205, +2,39,23,204,1,23,203,1,249,23,206,1,23,204,1,23,202,1,28,248,22, +153,7,23,207,2,249,22,168,8,23,208,1,8,63,23,206,1,28,248,22,133, +4,248,22,147,8,23,195,2,86,94,23,193,1,251,22,182,11,2,37,2,69, +2,70,204,192,28,248,22,174,15,200,248,22,175,15,200,247,22,176,15,28,248, +22,133,4,23,194,2,86,95,23,195,1,23,193,1,19,248,22,147,8,23,196, +2,19,248,22,147,8,23,197,2,249,22,183,15,27,251,22,154,8,250,22,153, +8,23,206,2,39,23,204,4,2,51,249,23,207,1,23,205,1,23,202,4,28, +248,22,153,7,23,208,2,249,22,168,8,23,209,1,8,63,23,207,1,28,248, +22,133,4,248,22,147,8,23,195,2,86,94,23,193,1,251,22,182,11,2,37, +2,69,2,70,205,192,28,248,22,174,15,201,248,22,175,15,201,247,22,176,15, +2,2,27,248,22,182,3,23,195,1,28,249,22,169,9,8,46,249,22,148,8, +23,199,2,23,197,2,27,248,22,181,3,23,195,2,249,22,183,15,27,251,22, +154,8,250,22,153,8,23,206,2,39,23,204,1,23,204,1,249,23,207,1,23, +205,1,23,202,1,28,248,22,153,7,23,208,2,249,22,168,8,23,209,1,8, +63,23,207,1,28,248,22,133,4,248,22,147,8,23,195,2,86,94,23,193,1, +251,22,182,11,2,37,2,69,2,70,205,192,28,248,22,174,15,201,248,22,175, +15,201,247,22,176,15,28,248,22,133,4,193,254,2,164,2,201,203,204,205,248, +22,147,8,202,2,51,248,22,147,8,202,27,248,22,182,3,194,28,249,22,169, +9,8,46,249,22,148,8,199,196,254,2,164,2,202,204,205,206,199,203,248,22, +181,3,200,253,2,166,2,201,202,203,204,205,198,90,144,41,11,89,146,41,39, +11,86,95,28,28,248,22,174,15,23,199,2,10,28,248,22,173,15,23,199,2, +10,28,248,22,153,7,23,199,2,28,248,22,132,16,23,199,2,10,248,22,133, +16,23,199,2,11,12,252,22,180,11,23,200,2,2,42,39,23,203,2,23,204, +2,28,28,248,22,153,7,23,200,2,10,248,22,142,8,23,200,2,12,252,22, +180,11,23,200,2,2,72,40,23,203,2,23,204,2,90,144,42,11,89,146,42, +39,11,248,22,130,16,23,202,2,86,94,23,195,1,86,94,28,192,12,250,22, +183,11,23,201,1,2,73,23,204,2,249,22,7,194,195,27,248,22,179,15,23, +196,1,27,19,248,22,147,8,23,196,2,28,248,22,133,4,23,194,4,86,94, +23,199,1,19,248,22,147,8,23,197,2,19,248,22,147,8,23,198,2,249,22, +183,15,27,251,22,154,8,250,22,153,8,23,207,2,39,23,204,4,2,51,249, +23,211,1,23,206,1,23,202,4,28,248,22,153,7,23,212,2,249,22,168,8, +23,213,1,8,63,23,211,1,28,248,22,133,4,248,22,147,8,23,195,2,86, +94,23,193,1,251,22,182,11,2,37,2,69,2,70,23,17,192,28,248,22,174, +15,205,248,22,175,15,205,247,22,176,15,2,2,27,248,22,182,3,23,195,4, +28,249,22,169,9,8,46,249,22,148,8,23,200,2,23,197,2,27,248,22,181, +3,23,195,2,249,22,183,15,27,251,22,154,8,250,22,153,8,23,207,2,39, +23,204,1,23,208,1,249,23,211,1,23,206,1,23,202,1,28,248,22,153,7, +23,212,2,249,22,168,8,23,213,1,8,63,23,211,1,28,248,22,133,4,248, +22,147,8,23,195,2,86,94,23,193,1,251,22,182,11,2,37,2,69,2,70, +23,17,192,28,248,22,174,15,205,248,22,175,15,205,247,22,176,15,28,248,22, +133,4,23,194,2,86,95,23,200,1,23,193,1,254,2,164,2,23,203,2,23, +208,1,23,209,1,23,210,1,248,22,147,8,23,204,2,2,51,248,22,147,8, +23,204,1,27,248,22,182,3,23,195,1,28,249,22,169,9,8,46,249,22,148, +8,23,201,2,23,197,2,254,2,164,2,23,204,1,23,209,1,23,210,1,23, +211,1,23,200,2,23,208,1,248,22,181,3,23,201,1,253,2,166,2,23,203, +1,23,207,1,23,208,1,23,209,1,23,210,1,23,199,1,2,28,248,22,174, +15,195,249,22,191,15,196,194,192,32,169,2,88,148,8,36,43,61,11,2,50, +222,33,170,2,28,248,22,133,4,23,197,2,86,94,23,196,1,19,248,22,147, +8,23,195,2,35,248,22,147,8,23,196,2,249,22,183,15,27,251,22,154,8, +250,22,153,8,23,205,1,39,23,204,4,2,51,2,51,28,248,22,153,7,23, +205,2,249,22,168,8,23,206,1,8,63,23,204,1,28,248,22,133,4,248,22, +147,8,23,195,2,86,94,23,193,1,251,22,182,11,2,37,2,69,2,70,202, +192,28,248,22,174,15,198,248,22,175,15,198,247,22,176,15,2,27,248,22,182, +3,23,198,1,28,249,22,169,9,8,46,249,22,148,8,23,198,2,23,197,2, +35,248,22,181,3,23,195,2,249,22,183,15,27,251,22,154,8,250,22,153,8, +23,205,1,39,23,204,1,2,51,2,51,28,248,22,153,7,23,205,2,249,22, +168,8,23,206,1,8,63,23,204,1,28,248,22,133,4,248,22,147,8,23,195, +2,86,94,23,193,1,251,22,182,11,2,37,2,69,2,70,202,192,28,248,22, +174,15,198,248,22,175,15,198,247,22,176,15,28,248,22,133,4,23,194,2,86, +94,23,193,1,19,248,22,147,8,23,196,2,35,248,22,147,8,23,197,2,249, +22,183,15,27,251,22,154,8,250,22,153,8,23,206,1,39,23,204,4,2,51, +2,51,28,248,22,153,7,23,206,2,249,22,168,8,23,207,1,8,63,23,205, +1,28,248,22,133,4,248,22,147,8,23,195,2,86,94,23,193,1,251,22,182, +11,2,37,2,69,2,70,203,192,28,248,22,174,15,199,248,22,175,15,199,247, +22,176,15,2,27,248,22,182,3,23,195,1,28,249,22,169,9,8,46,249,22, +148,8,23,199,2,23,197,2,35,248,22,181,3,23,195,2,249,22,183,15,27, +251,22,154,8,250,22,153,8,23,206,1,39,23,204,1,2,51,2,51,28,248, +22,153,7,23,206,2,249,22,168,8,23,207,1,8,63,23,205,1,28,248,22, +133,4,248,22,147,8,23,195,2,86,94,23,193,1,251,22,182,11,2,37,2, +69,2,70,203,192,28,248,22,174,15,199,248,22,175,15,199,247,22,176,15,251, +2,169,2,198,199,200,196,90,144,41,11,89,146,41,39,11,86,95,28,28,248, +22,174,15,23,196,2,10,28,248,22,173,15,23,196,2,10,28,248,22,153,7, +23,196,2,28,248,22,132,16,23,196,2,10,248,22,133,16,23,196,2,11,12, +252,22,180,11,2,37,2,42,39,23,200,2,23,201,2,28,28,248,22,153,7, +23,197,2,10,248,22,142,8,23,197,2,12,252,22,180,11,2,37,2,72,40, +23,200,2,23,201,2,90,144,42,11,89,146,42,39,11,248,22,130,16,23,199, +2,86,94,23,195,1,86,94,28,192,12,250,22,183,11,2,37,2,73,23,201, +2,249,22,7,194,195,27,248,22,179,15,23,196,1,27,251,2,169,2,23,198, +2,23,201,1,23,202,1,248,22,147,8,23,199,1,28,248,22,174,15,195,249, +22,191,15,196,194,192,2,51,252,80,144,44,8,35,42,2,37,2,51,32,0, +88,148,8,36,41,46,11,9,222,33,172,2,198,199,32,174,2,88,148,8,36, +43,60,11,2,50,222,33,177,2,32,175,2,88,148,8,36,45,60,11,2,74, +222,33,176,2,249,22,183,15,27,251,22,154,8,250,22,153,8,23,203,2,39, +23,206,1,23,204,1,249,22,153,8,23,202,1,23,207,1,28,248,22,153,7, +23,203,2,249,22,168,8,23,204,1,8,63,23,202,1,28,248,22,133,4,248, +22,147,8,23,195,2,86,94,23,193,1,251,22,182,11,2,37,2,69,2,70, +200,192,28,248,22,174,15,196,248,22,175,15,196,247,22,176,15,28,248,22,133, +4,23,197,2,86,94,23,196,1,19,248,22,147,8,23,195,2,19,248,22,147, +8,23,196,2,249,22,183,15,27,251,22,154,8,250,22,153,8,23,205,2,39, +23,204,4,2,51,249,22,153,8,23,204,1,23,202,4,28,248,22,153,7,23, +205,2,249,22,168,8,23,206,1,8,63,23,204,1,28,248,22,133,4,248,22, +147,8,23,195,2,86,94,23,193,1,251,22,182,11,2,37,2,69,2,70,202, +192,28,248,22,174,15,198,248,22,175,15,198,247,22,176,15,2,2,27,248,22, +182,3,23,198,1,28,249,22,169,9,8,46,249,22,148,8,23,198,2,23,197, +2,27,248,22,181,3,23,195,2,249,22,183,15,27,251,22,154,8,250,22,153, +8,23,205,2,39,23,204,1,2,71,249,22,153,8,23,204,1,23,202,1,28, +248,22,153,7,23,205,2,249,22,168,8,23,206,1,8,63,23,204,1,28,248, +22,133,4,248,22,147,8,23,195,2,86,94,23,193,1,251,22,182,11,2,37, +2,69,2,70,202,192,28,248,22,174,15,198,248,22,175,15,198,247,22,176,15, +28,248,22,133,4,193,253,2,175,2,199,200,201,248,22,147,8,200,2,51,248, +22,147,8,200,27,248,22,182,3,194,28,249,22,169,9,8,46,249,22,148,8, +198,196,253,2,175,2,200,201,202,198,2,71,248,22,181,3,199,251,2,174,2, +198,199,200,196,90,144,41,11,89,146,41,39,11,86,95,28,28,248,22,174,15, +23,196,2,10,28,248,22,173,15,23,196,2,10,28,248,22,153,7,23,196,2, +28,248,22,132,16,23,196,2,10,248,22,133,16,23,196,2,11,12,252,22,180, +11,2,37,2,42,39,23,200,2,23,201,2,28,28,248,22,153,7,23,197,2, +10,248,22,142,8,23,197,2,12,252,22,180,11,2,37,2,72,40,23,200,2, +23,201,2,90,144,42,11,89,146,42,39,11,248,22,130,16,23,199,2,86,94, +23,195,1,86,94,28,192,12,250,22,183,11,2,37,2,73,23,201,2,249,22, +7,194,195,27,248,22,179,15,23,196,1,27,251,2,174,2,23,198,2,23,201, +1,23,202,1,248,22,147,8,23,199,1,28,248,22,174,15,195,249,22,191,15, +196,194,192,252,80,144,44,8,35,42,2,37,2,71,22,153,8,198,199,249,247, +22,176,5,23,195,1,11,249,247,22,176,5,194,11,28,248,22,88,23,195,2, +9,27,27,248,22,81,23,197,2,28,248,22,134,16,23,194,2,248,22,137,16, +23,194,1,28,248,22,133,16,23,194,2,90,144,42,11,89,146,42,39,11,248, +22,130,16,249,22,135,16,250,80,144,50,43,42,248,22,150,16,2,56,11,11, +248,22,150,16,2,57,86,95,23,195,1,23,194,1,248,22,137,16,249,22,135, +16,23,199,1,23,196,1,27,250,80,144,45,43,42,248,22,150,16,2,56,23, +197,1,10,28,23,193,2,248,22,137,16,23,194,1,11,28,23,193,2,249,22, +80,248,22,137,16,249,22,135,16,23,198,1,247,22,151,16,27,248,22,162,20, +23,199,1,28,248,22,88,23,194,2,9,27,248,80,144,45,56,42,248,22,81, +23,196,2,28,23,193,2,249,22,80,248,22,137,16,249,22,135,16,23,198,1, +247,22,151,16,248,80,144,47,8,50,42,248,22,162,20,23,198,1,86,94,23, +193,1,248,80,144,45,8,50,42,248,22,162,20,23,196,1,86,94,23,193,1, +27,248,22,162,20,23,197,1,28,248,22,88,23,194,2,9,27,248,80,144,43, +56,42,248,22,81,23,196,2,28,23,193,2,249,22,80,248,22,137,16,249,22, +135,16,23,198,1,247,22,151,16,248,80,144,45,8,50,42,248,22,162,20,23, +198,1,86,94,23,193,1,248,80,144,43,8,50,42,248,22,162,20,23,196,1, +28,248,22,88,23,195,2,9,27,27,248,22,81,23,197,2,28,248,22,134,16, +23,194,2,248,22,137,16,23,194,1,28,248,22,133,16,23,194,2,90,144,42, +11,89,146,42,39,11,248,22,130,16,249,22,135,16,250,80,144,50,43,42,248, +22,150,16,2,56,11,11,248,22,150,16,2,57,86,95,23,195,1,23,194,1, +248,22,137,16,249,22,135,16,23,199,1,23,196,1,27,250,80,144,45,43,42, +248,22,150,16,2,56,23,197,1,10,28,23,193,2,248,22,137,16,23,194,1, +11,28,23,193,2,249,22,80,248,22,137,16,249,22,135,16,23,198,1,247,22, +151,16,27,248,22,162,20,23,199,1,28,248,22,88,23,194,2,9,27,248,80, +144,45,56,42,248,22,81,23,196,2,28,23,193,2,249,22,80,248,22,137,16, +249,22,135,16,23,198,1,247,22,151,16,248,80,144,47,8,51,42,248,22,162, +20,23,198,1,86,94,23,193,1,248,80,144,45,8,51,42,248,22,162,20,23, +196,1,86,94,23,193,1,27,248,22,162,20,23,197,1,28,248,22,88,23,194, +2,9,27,248,80,144,43,56,42,248,22,81,23,196,2,28,23,193,2,249,22, +80,248,22,137,16,249,22,135,16,23,198,1,247,22,151,16,248,80,144,45,8, +51,42,248,22,162,20,23,198,1,86,94,23,193,1,248,80,144,43,8,51,42, +248,22,162,20,23,196,1,27,248,22,150,16,2,58,28,248,22,134,16,23,194, +2,248,22,137,16,23,194,1,28,248,22,133,16,23,194,2,90,144,42,11,89, +146,42,39,11,248,22,130,16,249,22,135,16,250,80,144,49,43,42,248,22,150, +16,2,56,11,11,248,22,150,16,2,57,86,95,23,195,1,23,194,1,248,22, +137,16,249,22,135,16,23,199,1,23,196,1,27,250,80,144,44,43,42,248,22, +150,16,2,56,23,197,1,10,28,23,193,2,248,22,137,16,23,194,1,11,28, +248,22,88,23,195,2,9,27,27,248,22,81,23,197,2,28,248,22,134,16,23, +194,2,248,22,137,16,23,194,1,28,248,22,133,16,23,194,2,90,144,42,11, +89,146,42,39,11,248,22,130,16,249,22,135,16,250,80,144,50,43,42,248,22, +150,16,2,56,11,11,248,22,150,16,2,57,86,95,23,195,1,23,194,1,248, +22,137,16,249,22,135,16,23,199,1,23,196,1,27,250,80,144,45,43,42,248, +22,150,16,2,56,23,197,1,10,28,23,193,2,248,22,137,16,23,194,1,11, +28,23,193,2,249,22,80,248,22,137,16,249,22,135,16,23,198,1,247,22,151, +16,27,248,22,162,20,23,199,1,28,248,22,88,23,194,2,9,27,27,248,22, +81,23,196,2,28,248,22,134,16,23,194,2,248,22,137,16,23,194,1,28,248, +22,133,16,23,194,2,90,144,42,11,89,146,42,39,11,248,22,130,16,249,22, +135,16,250,80,144,54,43,42,248,22,150,16,2,56,11,11,248,22,150,16,2, +57,86,95,23,195,1,23,194,1,248,22,137,16,249,22,135,16,23,199,1,23, +196,1,27,250,80,144,49,43,42,248,22,150,16,2,56,23,197,1,10,28,23, +193,2,248,22,137,16,23,194,1,11,28,23,193,2,249,22,80,248,22,137,16, +249,22,135,16,23,198,1,247,22,151,16,27,248,22,162,20,23,198,1,28,248, +22,88,23,194,2,9,27,248,80,144,49,56,42,248,22,81,23,196,2,28,23, +193,2,249,22,80,248,22,137,16,249,22,135,16,23,198,1,247,22,151,16,248, +80,144,51,8,53,42,248,22,162,20,23,198,1,86,94,23,193,1,248,80,144, +49,8,53,42,248,22,162,20,23,196,1,86,94,23,193,1,27,248,22,162,20, +23,196,1,28,248,22,88,23,194,2,9,27,248,80,144,47,56,42,248,22,81, +23,196,2,28,23,193,2,249,22,80,248,22,137,16,249,22,135,16,23,198,1, +247,22,151,16,248,80,144,49,8,53,42,248,22,162,20,23,198,1,86,94,23, +193,1,248,80,144,47,8,53,42,248,22,162,20,23,196,1,86,94,23,193,1, +27,248,22,162,20,23,197,1,28,248,22,88,23,194,2,9,27,27,248,22,81, +23,196,2,28,248,22,134,16,23,194,2,248,22,137,16,23,194,1,28,248,22, +133,16,23,194,2,90,144,42,11,89,146,42,39,11,248,22,130,16,249,22,135, +16,250,80,144,52,43,42,248,22,150,16,2,56,11,11,248,22,150,16,2,57, +86,95,23,195,1,23,194,1,248,22,137,16,249,22,135,16,23,199,1,23,196, +1,27,250,80,144,47,43,42,248,22,150,16,2,56,23,197,1,10,28,23,193, +2,248,22,137,16,23,194,1,11,28,23,193,2,249,22,80,248,22,137,16,249, +22,135,16,23,198,1,247,22,151,16,27,248,22,162,20,23,198,1,28,248,22, +88,23,194,2,9,27,248,80,144,47,56,42,248,22,81,23,196,2,28,23,193, +2,249,22,80,248,22,137,16,249,22,135,16,23,198,1,247,22,151,16,248,80, +144,49,8,53,42,248,22,162,20,23,198,1,86,94,23,193,1,248,80,144,47, +8,53,42,248,22,162,20,23,196,1,86,94,23,193,1,27,248,22,162,20,23, +196,1,28,248,22,88,23,194,2,9,27,248,80,144,45,56,42,248,22,81,23, +196,2,28,23,193,2,249,22,80,248,22,137,16,249,22,135,16,23,198,1,247, +22,151,16,248,80,144,47,8,53,42,248,22,162,20,23,198,1,86,94,23,193, +1,248,80,144,45,8,53,42,248,22,162,20,23,196,1,27,247,22,158,16,27, 248,80,144,42,58,42,247,80,144,42,57,42,249,80,144,43,44,41,28,23,196, -2,27,249,22,177,8,247,22,176,8,2,77,28,192,249,22,167,8,194,7,63, -2,68,2,68,250,80,144,46,8,23,42,23,198,2,2,78,27,28,23,200,1, -250,22,129,16,248,22,152,16,2,63,250,22,160,2,23,205,1,2,61,247,22, -173,8,2,79,86,94,23,199,1,11,27,248,80,144,49,8,51,42,250,22,96, -23,207,1,248,22,92,248,22,152,16,2,57,9,28,193,249,22,82,195,194,192, -27,247,22,160,16,27,248,80,144,42,58,42,249,80,144,44,55,40,40,80,144, -44,8,52,42,249,80,144,43,44,41,28,23,196,2,27,249,22,177,8,247,22, -176,8,2,77,28,192,249,22,167,8,194,7,63,2,68,2,68,250,80,144,46, -8,23,42,23,198,2,2,78,27,28,23,200,1,250,22,129,16,248,22,152,16, -2,63,250,22,160,2,23,205,1,2,61,247,22,173,8,2,79,86,94,23,199, -1,11,27,27,250,22,96,23,207,1,248,22,92,248,22,152,16,2,57,23,208, -1,28,248,22,90,23,194,2,9,27,27,248,22,83,23,196,2,28,248,22,136, -16,23,194,2,248,22,139,16,23,194,1,28,248,22,135,16,23,194,2,90,144, -42,11,89,146,42,39,11,248,22,132,16,249,22,137,16,250,80,144,60,43,42, -248,22,152,16,2,58,11,11,248,22,152,16,2,59,86,95,23,195,1,23,194, -1,248,22,139,16,249,22,137,16,23,199,1,23,196,1,27,250,80,144,55,43, -42,248,22,152,16,2,58,23,197,1,10,28,23,193,2,248,22,139,16,23,194, -1,11,28,23,193,2,249,22,82,248,22,139,16,249,22,137,16,23,198,1,247, -22,153,16,27,248,22,164,20,23,198,1,28,248,22,90,23,194,2,9,27,248, -80,144,55,56,42,248,22,83,23,196,2,28,23,193,2,249,22,82,248,22,139, -16,249,22,137,16,23,198,1,247,22,153,16,248,80,144,57,8,53,42,248,22, -164,20,23,198,1,86,94,23,193,1,248,80,144,55,8,53,42,248,22,164,20, -23,196,1,86,94,23,193,1,27,248,22,164,20,23,196,1,28,248,22,90,23, -194,2,9,27,248,80,144,53,56,42,248,22,83,23,196,2,28,23,193,2,249, -22,82,248,22,139,16,249,22,137,16,23,198,1,247,22,153,16,248,80,144,55, -8,53,42,248,22,164,20,23,198,1,86,94,23,193,1,248,80,144,53,8,53, -42,248,22,164,20,23,196,1,28,193,249,22,82,195,194,192,27,20,13,144,80, -144,40,46,40,26,9,80,144,49,47,40,249,22,33,11,80,144,51,46,40,22, -149,15,10,22,156,15,10,22,157,15,10,22,158,15,10,248,22,150,6,23,196, -2,28,248,22,150,7,23,194,2,12,86,94,248,22,179,9,23,194,1,27,20, -13,144,80,144,41,46,40,26,9,80,144,50,47,40,249,22,33,11,80,144,52, -46,40,22,149,15,10,22,156,15,10,22,157,15,10,22,158,15,10,248,22,150, -6,23,197,2,28,248,22,150,7,23,194,2,12,86,94,248,22,179,9,23,194, -1,27,20,13,144,80,144,42,46,40,26,9,80,144,51,47,40,249,22,33,11, -80,144,53,46,40,22,149,15,10,22,156,15,10,22,157,15,10,22,158,15,10, -248,22,150,6,23,198,2,28,248,22,150,7,23,194,2,12,86,94,248,22,179, -9,23,194,1,248,80,144,43,8,54,42,197,86,94,249,22,141,7,247,22,174, -5,23,196,2,248,22,165,6,249,22,138,4,39,249,22,186,3,28,23,198,2, -23,198,1,86,94,23,198,1,39,23,199,1,27,248,22,191,5,28,23,198,2, -86,95,23,197,1,23,196,1,23,198,1,86,94,23,198,1,27,250,80,144,45, -43,42,248,22,152,16,2,58,11,11,27,248,22,141,4,23,199,1,27,28,23, -194,2,23,194,1,86,94,23,194,1,39,27,248,22,141,4,23,202,1,249,22, -142,6,23,198,1,20,20,95,88,148,8,36,39,51,11,9,224,3,2,33,128, -3,23,195,1,23,196,1,248,80,144,41,8,54,42,193,144,39,20,120,145,2, -1,39,16,1,11,16,0,20,26,15,56,9,2,2,2,2,29,11,11,11,11, -11,11,11,9,9,11,11,11,10,46,80,143,39,39,20,120,145,2,1,54,16, -40,2,3,2,4,2,5,2,6,2,7,2,8,2,9,30,2,12,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,12,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,4,2,13,2,14,2,15,2,16,2,17,2,18, -2,19,30,2,20,1,19,99,97,99,104,101,45,99,111,110,102,105,103,117,114, -97,116,105,111,110,11,1,2,21,2,22,2,23,2,24,2,25,2,26,2,27, -2,28,2,29,2,30,2,31,30,2,20,1,21,101,120,99,101,112,116,105,111, -110,45,104,97,110,100,108,101,114,45,107,101,121,11,3,2,32,2,33,2,34, -2,35,2,36,2,37,2,38,2,39,2,40,2,41,2,42,16,0,40,42,39, -16,0,39,16,19,2,14,2,15,2,13,2,27,2,4,2,37,2,25,2,26, -2,21,2,31,2,35,2,23,2,24,2,33,2,29,2,32,2,34,2,38,2, -30,58,11,11,11,16,17,2,9,2,18,2,16,2,42,2,17,2,7,2,28, -2,41,2,19,2,22,2,40,2,5,2,36,2,8,2,39,2,3,2,6,16, -17,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,16,17,2, -9,2,18,2,16,2,42,2,17,2,7,2,28,2,41,2,19,2,22,2,40, -2,5,2,36,2,8,2,39,2,3,2,6,56,56,40,12,11,11,16,0,16, -0,16,0,39,39,11,12,11,11,16,0,16,0,16,0,39,39,16,51,20,15, -16,2,32,0,88,148,8,36,40,48,11,2,3,222,33,80,80,144,39,39,40, -20,15,16,2,249,22,157,7,7,92,7,92,80,144,39,40,40,20,15,16,2, -88,148,8,36,40,57,41,2,5,223,0,33,85,80,144,39,41,40,20,15,16, -2,88,148,8,36,41,61,41,2,6,223,0,33,87,80,144,39,42,40,20,15, -16,2,20,25,96,2,7,88,148,8,36,42,8,24,8,32,9,223,0,33,94, -88,148,8,36,41,50,55,9,223,0,33,95,88,148,8,36,40,49,55,9,223, -0,33,96,80,144,39,43,40,20,15,16,2,27,248,22,164,16,248,22,169,8, -27,28,249,22,171,9,247,22,182,8,2,45,6,1,1,59,6,1,1,58,250, -22,139,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,148,8,36,41,51,11,2,8,223,0,33,100,80,144,39, -44,40,20,15,16,2,88,148,39,40,8,38,8,128,6,2,9,223,0,33,101, -80,144,39,45,40,20,15,16,2,32,0,88,148,8,36,41,50,11,2,13,222, -33,102,80,144,39,48,40,20,15,16,2,32,0,88,148,8,36,42,51,11,2, -14,222,33,104,80,144,39,49,40,20,15,16,2,32,0,88,148,8,36,41,49, -11,2,15,222,33,105,80,144,39,50,40,20,15,16,2,88,148,39,42,53,8, -128,128,2,16,223,0,33,107,80,144,39,51,40,20,15,16,2,88,148,39,44, -55,8,128,128,2,18,223,0,33,109,80,144,39,53,40,20,15,16,2,88,148, -39,39,56,55,9,223,0,33,110,80,144,39,8,40,42,20,15,16,2,88,148, -39,39,47,16,4,39,40,8,128,4,39,2,19,223,0,33,111,80,144,39,54, -40,20,15,16,2,88,148,39,39,56,55,9,223,0,33,112,80,144,39,8,41, -42,20,15,16,2,88,148,39,39,47,16,4,39,40,8,128,8,39,2,22,223, -0,33,113,80,144,39,57,40,20,15,16,2,88,148,8,36,39,8,38,8,128, -6,9,223,0,33,114,80,144,39,8,42,42,20,15,16,2,88,148,8,36,40, -50,16,4,39,39,8,128,16,39,2,23,223,0,33,115,80,144,39,58,40,20, -15,16,2,20,27,143,32,0,88,148,39,40,48,11,2,24,222,33,116,32,0, -88,148,39,40,48,11,2,24,222,33,117,80,144,39,59,40,20,15,16,2,88, -148,8,36,40,50,8,240,0,128,0,0,2,25,223,0,33,118,80,144,39,60, -40,20,15,16,2,88,148,39,39,56,55,9,223,0,33,119,80,144,39,8,43, -42,20,15,16,2,88,148,8,36,40,51,16,4,39,40,8,128,32,39,2,26, -223,0,33,120,80,144,39,61,40,20,15,16,2,88,148,39,40,56,55,2,21, -223,0,33,121,80,144,39,56,40,20,15,16,2,88,148,8,36,41,58,16,4, -8,240,0,128,0,0,8,32,8,128,64,39,2,52,223,0,33,122,80,144,39, -8,44,42,20,15,16,2,88,148,8,36,42,52,16,4,39,39,8,128,64,39, -2,27,223,0,33,123,80,144,39,8,23,40,20,15,16,2,88,148,39,39,56, -55,9,223,0,33,124,80,144,39,8,45,42,20,15,16,2,88,148,8,36,39, -57,16,4,8,240,0,128,0,0,8,137,2,8,128,128,39,2,28,223,0,33, -125,80,144,39,8,24,40,20,15,16,2,247,22,142,2,80,144,39,8,25,40, -20,15,16,2,248,22,18,67,115,116,97,109,112,80,144,39,8,26,40,20,15, -16,2,88,148,39,40,49,8,240,0,0,0,4,9,223,0,33,127,80,144,39, -8,46,42,20,15,16,2,88,148,39,41,51,16,4,39,8,128,80,8,240,0, -64,0,0,39,2,31,223,0,33,135,2,80,144,39,8,27,40,20,15,16,2, -32,0,88,148,8,36,40,48,11,2,32,222,33,136,2,80,144,39,8,29,40, -20,15,16,2,88,148,8,36,42,48,8,240,0,0,0,2,74,109,97,107,101, -45,104,97,110,100,108,101,114,223,0,33,138,2,80,144,39,8,47,42,20,15, -16,2,88,148,39,40,47,16,4,8,128,6,8,128,104,8,240,0,128,0,0, -39,2,33,223,0,33,148,2,80,144,39,8,30,40,20,15,16,2,88,148,39, -41,59,16,2,39,8,240,0,128,0,0,2,34,223,0,33,150,2,80,144,39, -8,31,40,20,15,16,2,88,148,8,36,41,61,16,4,39,8,240,0,64,0, -0,39,40,2,52,223,0,33,151,2,80,144,39,8,48,42,20,15,16,2,88, -148,39,47,8,33,16,4,39,39,40,41,67,99,108,111,111,112,223,0,33,158, -2,80,144,39,8,49,42,20,15,16,2,88,148,39,44,8,25,16,4,39,8, -240,0,192,0,0,39,42,2,17,223,0,33,159,2,80,144,39,52,40,20,15, -16,2,88,148,39,42,58,16,4,47,39,43,39,2,35,223,0,33,164,2,80, -144,39,8,32,40,20,15,16,2,32,0,88,148,39,42,53,11,2,37,222,33, -165,2,80,144,39,8,34,40,20,15,16,2,32,0,88,148,8,36,44,8,27, -11,2,38,222,33,170,2,80,144,39,8,35,40,20,15,16,2,20,27,143,32, -0,88,148,8,36,41,55,11,2,39,222,33,173,2,88,148,8,100,41,52,16, -4,39,39,47,39,2,39,223,0,33,175,2,80,144,39,8,36,40,20,15,16, -2,20,27,143,32,0,88,148,8,36,41,55,11,2,36,222,33,180,2,88,148, -8,100,41,52,16,4,39,39,47,39,2,36,223,0,33,181,2,80,144,39,8, -33,40,20,15,16,2,20,27,143,32,0,88,148,39,40,47,11,2,40,222,33, -182,2,32,0,88,148,39,40,47,11,2,40,222,33,183,2,80,144,39,8,37, -40,20,15,16,2,88,148,8,36,40,58,16,4,55,41,39,43,2,52,223,0, -33,184,2,80,144,39,8,50,42,20,15,16,2,88,148,8,36,40,58,16,4, -55,41,39,47,2,52,223,0,33,185,2,80,144,39,8,51,42,20,15,16,2, -88,148,39,39,56,55,9,223,0,33,186,2,80,144,39,8,52,42,20,15,16, -2,88,148,8,36,40,8,23,16,4,55,41,39,8,32,2,52,223,0,33,187, -2,80,144,39,8,53,42,20,15,16,2,20,25,96,2,41,88,148,39,39,60, -16,4,8,32,8,140,2,39,43,9,223,0,33,188,2,88,148,39,40,61,16, -4,8,32,8,140,2,39,47,9,223,0,33,189,2,88,148,39,41,8,30,16, -4,8,48,8,139,2,39,8,48,9,223,0,33,190,2,80,144,39,8,38,40, -20,15,16,2,88,148,8,36,40,60,16,4,8,128,6,39,39,8,64,2,52, -223,0,33,191,2,80,144,39,8,54,42,20,15,16,2,88,148,8,36,42,56, -16,4,55,39,39,8,64,2,42,223,0,33,129,3,80,144,39,8,39,40,95, -29,94,2,10,70,35,37,107,101,114,110,101,108,11,29,94,2,10,71,35,37, -109,105,110,45,115,116,120,11,2,20,9,9,9,39,9,0}; - EVAL_ONE_SIZED_STR((char *)expr, 19776); +2,27,249,22,175,8,247,22,174,8,2,75,28,192,249,22,165,8,194,7,63, +2,66,2,66,250,80,144,46,8,23,42,23,198,2,2,76,27,28,23,200,1, +250,22,191,15,248,22,150,16,2,61,250,22,158,2,23,205,1,2,59,247,22, +171,8,2,77,86,94,23,199,1,11,27,248,80,144,49,8,50,42,250,22,94, +9,248,22,90,248,22,150,16,2,55,9,28,193,249,22,80,195,194,192,27,247, +22,158,16,27,248,80,144,42,58,42,247,80,144,42,57,42,249,80,144,43,44, +41,28,23,196,2,27,249,22,175,8,247,22,174,8,2,75,28,192,249,22,165, +8,194,7,63,2,66,2,66,250,80,144,46,8,23,42,23,198,2,2,76,27, +28,23,200,1,250,22,191,15,248,22,150,16,2,61,250,22,158,2,23,205,1, +2,59,247,22,171,8,2,77,86,94,23,199,1,11,27,248,80,144,49,8,51, +42,250,22,94,23,207,1,248,22,90,248,22,150,16,2,55,9,28,193,249,22, +80,195,194,192,27,247,22,158,16,27,248,80,144,42,58,42,249,80,144,44,55, +40,40,80,144,44,8,52,42,249,80,144,43,44,41,28,23,196,2,27,249,22, +175,8,247,22,174,8,2,75,28,192,249,22,165,8,194,7,63,2,66,2,66, +250,80,144,46,8,23,42,23,198,2,2,76,27,28,23,200,1,250,22,191,15, +248,22,150,16,2,61,250,22,158,2,23,205,1,2,59,247,22,171,8,2,77, +86,94,23,199,1,11,27,27,250,22,94,23,207,1,248,22,90,248,22,150,16, +2,55,23,208,1,28,248,22,88,23,194,2,9,27,27,248,22,81,23,196,2, +28,248,22,134,16,23,194,2,248,22,137,16,23,194,1,28,248,22,133,16,23, +194,2,90,144,42,11,89,146,42,39,11,248,22,130,16,249,22,135,16,250,80, +144,60,43,42,248,22,150,16,2,56,11,11,248,22,150,16,2,57,86,95,23, +195,1,23,194,1,248,22,137,16,249,22,135,16,23,199,1,23,196,1,27,250, +80,144,55,43,42,248,22,150,16,2,56,23,197,1,10,28,23,193,2,248,22, +137,16,23,194,1,11,28,23,193,2,249,22,80,248,22,137,16,249,22,135,16, +23,198,1,247,22,151,16,27,248,22,162,20,23,198,1,28,248,22,88,23,194, +2,9,27,248,80,144,55,56,42,248,22,81,23,196,2,28,23,193,2,249,22, +80,248,22,137,16,249,22,135,16,23,198,1,247,22,151,16,248,80,144,57,8, +53,42,248,22,162,20,23,198,1,86,94,23,193,1,248,80,144,55,8,53,42, +248,22,162,20,23,196,1,86,94,23,193,1,27,248,22,162,20,23,196,1,28, +248,22,88,23,194,2,9,27,248,80,144,53,56,42,248,22,81,23,196,2,28, +23,193,2,249,22,80,248,22,137,16,249,22,135,16,23,198,1,247,22,151,16, +248,80,144,55,8,53,42,248,22,162,20,23,198,1,86,94,23,193,1,248,80, +144,53,8,53,42,248,22,162,20,23,196,1,28,193,249,22,80,195,194,192,27, +20,13,144,80,144,40,46,40,26,9,80,144,49,47,40,249,22,31,11,80,144, +51,46,40,22,147,15,10,22,154,15,10,22,155,15,10,22,156,15,10,248,22, +148,6,23,196,2,28,248,22,148,7,23,194,2,12,86,94,248,22,177,9,23, +194,1,27,20,13,144,80,144,41,46,40,26,9,80,144,50,47,40,249,22,31, +11,80,144,52,46,40,22,147,15,10,22,154,15,10,22,155,15,10,22,156,15, +10,248,22,148,6,23,197,2,28,248,22,148,7,23,194,2,12,86,94,248,22, +177,9,23,194,1,27,20,13,144,80,144,42,46,40,26,9,80,144,51,47,40, +249,22,31,11,80,144,53,46,40,22,147,15,10,22,154,15,10,22,155,15,10, +22,156,15,10,248,22,148,6,23,198,2,28,248,22,148,7,23,194,2,12,86, +94,248,22,177,9,23,194,1,248,80,144,43,8,54,42,197,86,94,249,22,139, +7,247,22,172,5,23,196,2,248,22,163,6,249,22,136,4,39,249,22,184,3, +28,23,198,2,23,198,1,86,94,23,198,1,39,23,199,1,27,248,22,189,5, +28,23,198,2,86,95,23,197,1,23,196,1,23,198,1,86,94,23,198,1,27, +250,80,144,45,43,42,248,22,150,16,2,56,11,11,27,248,22,139,4,23,199, +1,27,28,23,194,2,23,194,1,86,94,23,194,1,39,27,248,22,139,4,23, +202,1,249,22,140,6,23,198,1,20,20,95,88,148,8,36,39,51,11,9,224, +3,2,33,190,2,23,195,1,23,196,1,248,80,144,41,8,54,42,193,144,39, +20,121,145,2,1,39,16,1,11,16,0,20,27,15,56,9,2,2,2,2,29, +11,11,11,11,11,11,11,9,9,11,11,11,10,46,80,143,39,39,20,121,145, +2,1,54,16,40,2,3,2,4,2,5,2,6,2,7,2,8,2,9,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,4,2,12,2,13,2,14,2,15, +2,16,2,17,2,18,30,2,11,1,19,99,97,99,104,101,45,99,111,110,102, +105,103,117,114,97,116,105,111,110,11,1,2,19,2,20,2,21,2,22,2,23, +2,24,2,25,2,26,2,27,2,28,2,29,30,2,11,1,21,101,120,99,101, +112,116,105,111,110,45,104,97,110,100,108,101,114,45,107,101,121,11,3,2,30, +2,31,2,32,2,33,2,34,2,35,2,36,2,37,2,38,2,39,2,40,16, +0,40,42,39,16,0,39,16,19,2,13,2,14,2,12,2,25,2,4,2,35, +2,23,2,24,2,19,2,29,2,33,2,21,2,22,2,31,2,27,2,30,2, +32,2,36,2,28,58,11,11,11,16,17,2,9,2,17,2,15,2,40,2,16, +2,7,2,26,2,39,2,18,2,20,2,38,2,5,2,34,2,8,2,37,2, +3,2,6,16,17,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, +11,16,17,2,9,2,17,2,15,2,40,2,16,2,7,2,26,2,39,2,18, +2,20,2,38,2,5,2,34,2,8,2,37,2,3,2,6,56,56,40,12,11, +11,16,0,16,0,16,0,39,39,11,12,11,11,16,0,16,0,16,0,39,39, +16,51,20,15,16,2,32,0,88,148,8,36,40,48,11,2,3,222,33,78,80, +144,39,39,40,20,15,16,2,249,22,155,7,7,92,7,92,80,144,39,40,40, +20,15,16,2,88,148,8,36,40,57,41,2,5,223,0,33,83,80,144,39,41, +40,20,15,16,2,88,148,8,36,41,61,41,2,6,223,0,33,85,80,144,39, +42,40,20,15,16,2,20,26,96,2,7,88,148,8,36,42,8,24,8,32,9, +223,0,33,92,88,148,8,36,41,50,55,9,223,0,33,93,88,148,8,36,40, +49,55,9,223,0,33,94,80,144,39,43,40,20,15,16,2,27,248,22,162,16, +248,22,167,8,27,28,249,22,169,9,247,22,180,8,2,43,6,1,1,59,6, +1,1,58,250,22,137,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,148,8,36,41,51,11,2,8,223,0,33, +98,80,144,39,44,40,20,15,16,2,88,148,39,40,8,38,8,128,6,2,9, +223,0,33,99,80,144,39,45,40,20,15,16,2,32,0,88,148,8,36,41,50, +11,2,12,222,33,100,80,144,39,48,40,20,15,16,2,32,0,88,148,8,36, +42,51,11,2,13,222,33,102,80,144,39,49,40,20,15,16,2,32,0,88,148, +8,36,41,49,11,2,14,222,33,103,80,144,39,50,40,20,15,16,2,88,148, +39,42,53,8,128,128,2,15,223,0,33,105,80,144,39,51,40,20,15,16,2, +88,148,39,44,55,8,128,128,2,17,223,0,33,107,80,144,39,53,40,20,15, +16,2,88,148,39,39,56,55,9,223,0,33,108,80,144,39,8,40,42,20,15, +16,2,88,148,39,39,47,16,4,39,40,8,128,4,39,2,18,223,0,33,109, +80,144,39,54,40,20,15,16,2,88,148,39,39,56,55,9,223,0,33,110,80, +144,39,8,41,42,20,15,16,2,88,148,39,39,47,16,4,39,40,8,128,8, +39,2,20,223,0,33,111,80,144,39,57,40,20,15,16,2,88,148,8,36,39, +8,38,8,128,6,9,223,0,33,112,80,144,39,8,42,42,20,15,16,2,88, +148,8,36,40,50,16,4,39,39,8,128,16,39,2,21,223,0,33,113,80,144, +39,58,40,20,15,16,2,20,28,143,32,0,88,148,39,40,48,11,2,22,222, +33,114,32,0,88,148,39,40,48,11,2,22,222,33,115,80,144,39,59,40,20, +15,16,2,88,148,8,36,40,50,8,240,0,128,0,0,2,23,223,0,33,116, +80,144,39,60,40,20,15,16,2,88,148,39,39,56,55,9,223,0,33,117,80, +144,39,8,43,42,20,15,16,2,88,148,8,36,40,51,16,4,39,40,8,128, +32,39,2,24,223,0,33,118,80,144,39,61,40,20,15,16,2,88,148,39,40, +56,55,2,19,223,0,33,119,80,144,39,56,40,20,15,16,2,88,148,8,36, +41,58,16,4,8,240,0,128,0,0,8,32,8,128,64,39,2,50,223,0,33, +120,80,144,39,8,44,42,20,15,16,2,88,148,8,36,42,52,16,4,39,39, +8,128,64,39,2,25,223,0,33,121,80,144,39,8,23,40,20,15,16,2,88, +148,39,39,56,55,9,223,0,33,122,80,144,39,8,45,42,20,15,16,2,88, +148,8,36,39,57,16,4,8,240,0,128,0,0,8,137,2,8,128,128,39,2, +26,223,0,33,123,80,144,39,8,24,40,20,15,16,2,247,22,140,2,80,144, +39,8,25,40,20,15,16,2,248,22,16,67,115,116,97,109,112,80,144,39,8, +26,40,20,15,16,2,88,148,39,40,49,8,240,0,0,0,4,9,223,0,33, +125,80,144,39,8,46,42,20,15,16,2,88,148,39,41,51,16,4,39,8,128, +80,8,240,0,64,0,0,39,2,29,223,0,33,133,2,80,144,39,8,27,40, +20,15,16,2,32,0,88,148,8,36,40,48,11,2,30,222,33,134,2,80,144, +39,8,29,40,20,15,16,2,88,148,8,36,42,48,8,240,0,0,0,2,74, +109,97,107,101,45,104,97,110,100,108,101,114,223,0,33,136,2,80,144,39,8, +47,42,20,15,16,2,88,148,39,40,47,16,4,8,128,6,8,128,104,8,240, +0,128,0,0,39,2,31,223,0,33,146,2,80,144,39,8,30,40,20,15,16, +2,88,148,39,41,59,16,2,39,8,240,0,128,0,0,2,32,223,0,33,148, +2,80,144,39,8,31,40,20,15,16,2,88,148,8,36,41,61,16,4,39,8, +240,0,64,0,0,39,40,2,50,223,0,33,149,2,80,144,39,8,48,42,20, +15,16,2,88,148,39,47,8,33,16,4,39,39,40,41,67,99,108,111,111,112, +223,0,33,156,2,80,144,39,8,49,42,20,15,16,2,88,148,39,44,8,25, +16,4,39,8,240,0,192,0,0,39,42,2,16,223,0,33,157,2,80,144,39, +52,40,20,15,16,2,88,148,39,42,58,16,4,47,39,43,39,2,33,223,0, +33,162,2,80,144,39,8,32,40,20,15,16,2,32,0,88,148,39,42,53,11, +2,35,222,33,163,2,80,144,39,8,34,40,20,15,16,2,32,0,88,148,8, +36,44,8,27,11,2,36,222,33,168,2,80,144,39,8,35,40,20,15,16,2, +20,28,143,32,0,88,148,8,36,41,55,11,2,37,222,33,171,2,88,148,8, +100,41,52,16,4,39,39,47,39,2,37,223,0,33,173,2,80,144,39,8,36, +40,20,15,16,2,20,28,143,32,0,88,148,8,36,41,55,11,2,34,222,33, +178,2,88,148,8,100,41,52,16,4,39,39,47,39,2,34,223,0,33,179,2, +80,144,39,8,33,40,20,15,16,2,20,28,143,32,0,88,148,39,40,47,11, +2,38,222,33,180,2,32,0,88,148,39,40,47,11,2,38,222,33,181,2,80, +144,39,8,37,40,20,15,16,2,88,148,8,36,40,58,16,4,55,41,39,43, +2,50,223,0,33,182,2,80,144,39,8,50,42,20,15,16,2,88,148,8,36, +40,58,16,4,55,41,39,47,2,50,223,0,33,183,2,80,144,39,8,51,42, +20,15,16,2,88,148,39,39,56,55,9,223,0,33,184,2,80,144,39,8,52, +42,20,15,16,2,88,148,8,36,40,8,23,16,4,55,41,39,8,32,2,50, +223,0,33,185,2,80,144,39,8,53,42,20,15,16,2,20,26,96,2,39,88, +148,39,39,60,16,4,8,32,8,140,2,39,43,9,223,0,33,186,2,88,148, +39,40,61,16,4,8,32,8,140,2,39,47,9,223,0,33,187,2,88,148,39, +41,8,30,16,4,8,48,8,139,2,39,8,48,9,223,0,33,188,2,80,144, +39,8,38,40,20,15,16,2,88,148,8,36,40,60,16,4,8,128,6,39,39, +8,64,2,50,223,0,33,189,2,80,144,39,8,54,42,20,15,16,2,88,148, +8,36,42,56,16,4,55,39,39,8,64,2,40,223,0,33,191,2,80,144,39, +8,39,40,95,29,94,2,10,70,35,37,107,101,114,110,101,108,11,29,94,2, +10,71,35,37,109,105,110,45,115,116,120,11,2,11,9,9,9,39,9,0}; + EVAL_ONE_SIZED_STR((char *)expr, 19759); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,9,54,46,50,46,57,48,48,46,54,84,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,9,54,46,50,46,57,48,48,46,56,84,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,1,0,0,8,0, 23,0,48,0,65,0,83,0,105,0,128,0,149,0,171,0,180,0,189,0,196, 0,205,0,212,0,0,0,247,1,0,0,3,1,5,105,110,115,112,48,76,35, @@ -1060,516 +1059,515 @@ 99,101,45,99,104,97,110,110,101,108,45,105,110,1,20,84,72,45,112,108,97, 99,101,45,99,104,97,110,110,101,108,45,111,117,116,249,80,143,41,42,23,196, 1,39,249,80,143,41,42,23,196,1,39,249,80,143,41,42,195,39,249,80,143, -41,42,23,196,1,40,249,80,143,41,42,195,40,144,39,20,120,145,2,1,39, -16,1,11,16,0,20,26,15,56,9,2,2,2,2,29,11,11,11,11,11,11, -11,9,9,11,11,11,10,48,80,143,39,39,20,120,145,2,1,39,16,7,2, +41,42,23,196,1,40,249,80,143,41,42,195,40,144,39,20,121,145,2,1,39, +16,1,11,16,0,20,27,15,56,9,2,2,2,2,29,11,11,11,11,11,11, +11,9,9,11,11,11,10,48,80,143,39,39,20,121,145,2,1,39,16,7,2, 3,2,4,2,5,2,6,2,7,2,8,2,9,16,0,40,42,39,16,0,39, 16,2,2,6,2,7,41,11,11,11,16,5,2,4,2,8,2,9,2,5,2, 3,16,5,11,11,11,11,11,16,5,2,4,2,8,2,9,2,5,2,3,44, 44,40,12,11,11,16,0,16,0,16,0,39,39,11,12,11,11,16,0,16,0, -16,0,39,39,16,3,20,15,16,6,253,22,190,10,2,4,11,41,39,11,248, -22,92,249,22,82,22,176,10,88,148,39,40,48,47,9,223,9,33,10,80,144, +16,0,39,39,16,3,20,15,16,6,253,22,188,10,2,4,11,41,39,11,248, +22,90,249,22,80,22,174,10,88,148,39,40,48,47,9,223,9,33,10,80,144, 39,39,40,80,144,39,40,40,80,144,39,41,40,80,144,39,42,40,80,144,39, -43,40,20,15,16,2,20,27,143,88,148,39,40,48,47,9,223,0,33,11,88, -148,39,40,48,47,9,223,0,33,12,80,144,39,44,40,20,15,16,2,20,27, +43,40,20,15,16,2,20,28,143,88,148,39,40,48,47,9,223,0,33,11,88, +148,39,40,48,47,9,223,0,33,12,80,144,39,44,40,20,15,16,2,20,28, 143,88,148,39,40,48,47,9,223,0,33,13,88,148,39,40,48,47,9,223,0, 33,14,80,144,39,45,40,93,29,94,67,113,117,111,116,101,70,35,37,107,101, 114,110,101,108,11,9,9,9,39,9,0}; EVAL_ONE_SIZED_STR((char *)expr, 577); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,9,54,46,50,46,57,48,48,46,54,84,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,103,0,0,0,1,0,0,8,0, -15,0,26,0,53,0,59,0,68,0,75,0,97,0,110,0,136,0,153,0,175, -0,183,0,195,0,210,0,226,0,244,0,9,1,21,1,37,1,60,1,84,1, -96,1,127,1,134,1,139,1,144,1,162,1,168,1,173,1,182,1,187,1,193, -1,198,1,202,1,217,1,224,1,229,1,233,1,238,1,245,1,0,2,7,2, -15,2,118,2,153,2,0,3,35,3,129,3,164,3,2,4,37,4,38,11,68, -11,119,11,194,11,210,11,226,11,240,11,0,12,75,12,91,12,107,12,123,12, -198,12,105,13,121,13,196,13,191,14,71,15,146,15,53,16,66,16,219,16,147, -17,190,17,16,18,144,18,206,18,214,18,225,18,3,20,106,20,134,20,147,20, -68,21,75,21,235,21,255,21,99,22,121,22,131,22,145,22,183,22,26,23,30, -23,37,23,243,23,137,32,190,32,214,32,238,32,0,0,17,37,0,0,3,1, -5,105,110,115,112,48,68,35,37,98,111,111,116,72,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,67,113,117,111,116,101,70,35,37,112,97,114, -97,109,122,29,94,2,5,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,29,94,2,5,69,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,78,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,69,67,65,67,72,69,45,78,73,45,112,97,116,104,45,99, -97,99,104,101,76,112,97,116,104,45,99,97,99,104,101,45,103,101,116,77,112, -97,116,104,45,99,97,99,104,101,45,115,101,116,33,79,45,108,111,97,100,105, -110,103,45,102,105,108,101,110,97,109,101,1,19,45,108,111,97,100,105,110,103, -45,112,114,111,109,112,116,45,116,97,103,73,45,112,114,101,118,45,114,101,108, -116,111,77,45,112,114,101,118,45,114,101,108,116,111,45,100,105,114,1,21,115, -112,108,105,116,45,114,101,108,97,116,105,118,101,45,115,116,114,105,110,103,1, -22,102,111,114,109,97,116,45,115,111,117,114,99,101,45,108,111,99,97,116,105, -111,110,73,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,5,2,6,11,66,98,111,111,116,66,115,101,97,108,79, -108,111,97,100,47,117,115,101,45,99,111,109,112,105,108,101,100,5,4,46,114, -107,116,66,115,97,109,101,6,6,6,110,97,116,105,118,101,5,3,46,122,111, -67,105,108,111,111,112,66,108,111,111,112,65,108,105,98,6,12,12,109,111,100, -117,108,101,45,112,97,116,104,63,68,115,117,98,109,111,100,6,2,2,46,46, -6,1,1,46,66,102,105,108,101,68,112,108,97,110,101,116,6,8,8,109,97, -105,110,46,114,107,116,6,4,4,46,114,107,116,69,105,103,110,111,114,101,100, -27,252,22,129,16,28,249,22,171,9,23,201,2,2,30,86,94,23,199,1,23, -200,1,28,248,22,134,16,23,200,2,249,22,129,16,23,202,1,23,201,1,249, -80,144,50,45,42,23,202,1,23,201,1,23,203,1,2,31,247,22,183,8,249, -80,144,50,46,42,23,203,1,80,144,50,39,41,27,250,22,147,16,196,11,32, -0,88,148,8,36,39,44,11,9,222,11,28,192,249,22,82,195,194,11,249,22, -5,20,20,96,88,148,8,36,40,57,8,129,3,9,226,5,4,3,6,33,45, -23,199,1,23,196,1,23,197,1,23,195,1,27,252,22,129,16,28,249,22,171, -9,23,201,2,2,30,86,94,23,199,1,23,200,1,28,248,22,134,16,23,200, -2,249,22,129,16,23,202,1,23,201,1,249,80,144,50,45,42,23,202,1,23, -201,1,23,203,1,2,31,247,22,183,8,249,80,144,50,46,42,23,203,1,80, -144,50,39,41,27,250,22,147,16,196,11,32,0,88,148,8,36,39,44,11,9, -222,11,28,192,249,22,82,195,194,11,249,22,5,20,20,96,88,148,8,36,40, -57,8,129,3,9,226,5,4,3,6,33,47,23,199,1,23,196,1,23,197,1, -23,195,1,27,250,22,129,16,28,249,22,171,9,23,199,2,2,30,86,94,23, -197,1,23,198,1,28,248,22,134,16,23,198,2,249,22,129,16,23,200,1,23, -199,1,249,80,144,48,45,42,23,200,1,23,199,1,23,201,1,249,80,144,48, -46,42,23,201,1,2,32,27,250,22,147,16,196,11,32,0,88,148,8,36,39, -44,11,9,222,11,28,192,249,22,82,195,194,11,249,22,5,20,20,96,88,148, -8,36,40,55,8,128,3,9,226,5,4,3,6,33,49,23,199,1,23,196,1, -23,197,1,23,195,1,27,250,22,129,16,28,249,22,171,9,23,199,2,2,30, -86,94,23,197,1,23,198,1,28,248,22,134,16,23,198,2,249,22,129,16,23, -200,1,23,199,1,249,80,144,48,45,42,23,200,1,23,199,1,23,201,1,249, -80,144,48,46,42,23,201,1,2,32,27,250,22,147,16,196,11,32,0,88,148, -8,36,39,44,11,9,222,11,28,192,249,22,82,195,194,11,249,22,5,20,20, -96,88,148,8,36,40,55,8,128,3,9,226,5,4,3,6,33,51,23,199,1, -23,196,1,23,197,1,23,195,1,86,95,28,248,80,144,40,43,42,23,195,2, -12,250,22,182,11,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,66,23,196,2,10,28,248,22,91, -23,196,2,28,249,22,132,4,248,22,95,23,198,2,40,28,28,248,22,66,248, -22,83,23,197,2,10,248,22,169,9,248,22,163,20,23,197,2,249,22,4,22, -66,248,22,164,20,23,198,2,11,11,11,10,12,250,22,182,11,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,27,28,23,196,2,247,22,129,5, -11,27,28,23,194,2,250,22,160,2,80,143,44,44,248,22,129,17,247,22,145, -14,11,11,27,28,23,194,2,250,22,160,2,248,22,84,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,144,80, -144,42,41,40,250,80,144,45,42,40,249,22,33,11,80,144,47,41,40,22,130, -5,248,22,104,23,197,2,27,248,22,113,23,195,2,20,13,144,80,144,43,41, -40,250,80,144,46,42,40,249,22,33,11,80,144,48,41,40,22,179,5,28,248, -22,175,15,23,197,2,23,196,1,86,94,23,196,1,247,22,153,16,249,247,22, -177,5,248,22,163,20,23,197,1,23,201,1,86,94,23,193,1,27,28,248,22, -136,16,23,199,2,23,198,2,27,247,22,179,5,28,192,249,22,137,16,23,201, -2,194,23,199,2,90,144,42,11,89,146,42,39,11,248,22,132,16,23,202,1, -86,94,23,195,1,90,144,41,11,89,146,41,39,11,28,23,204,2,27,248,22, -180,15,23,198,2,19,248,22,149,8,194,28,28,249,22,134,4,23,195,4,43, -249,22,152,8,2,29,249,22,155,8,197,249,22,186,3,23,199,4,43,11,249, -22,7,23,200,2,248,22,184,15,249,22,156,8,250,22,155,8,201,39,249,22, -186,3,23,203,4,43,5,3,46,115,115,249,22,7,23,200,2,11,2,249,22, -7,23,198,2,11,27,28,249,22,171,9,23,196,2,23,199,2,23,199,2,249, -22,129,16,23,198,2,23,196,2,27,28,23,196,2,28,249,22,171,9,23,198, -2,23,200,1,23,200,1,86,94,23,200,1,249,22,129,16,23,199,2,23,198, -2,86,94,23,198,1,11,27,28,249,22,171,9,23,200,2,70,114,101,108,97, -116,105,118,101,86,94,23,198,1,2,30,23,198,1,27,247,22,158,16,27,247, -22,159,16,27,250,22,147,16,23,201,2,11,32,0,88,148,8,36,39,44,11, -9,222,11,27,28,23,194,2,249,22,82,23,201,2,23,196,1,86,94,23,194, -1,11,27,28,23,199,2,28,23,194,2,11,27,250,22,147,16,23,203,2,11, -32,0,88,148,8,36,39,44,11,9,222,11,28,192,249,22,82,23,202,2,194, -11,11,27,28,23,195,2,23,195,2,23,194,2,27,28,23,196,2,23,196,2, -248,22,169,9,23,196,2,27,28,23,205,2,28,23,196,2,86,94,23,197,1, -23,196,2,248,22,169,9,23,198,1,11,27,28,23,195,2,27,249,22,5,88, -148,39,40,51,8,129,3,9,226,24,15,12,11,33,46,23,203,2,27,28,23, -198,2,11,193,28,192,192,28,193,28,23,198,2,28,249,22,134,4,248,22,84, -196,248,22,84,23,201,2,193,11,11,11,11,28,23,193,2,86,105,23,213,1, -23,212,1,23,206,1,23,205,1,23,204,1,23,203,1,23,201,1,23,200,1, -23,197,1,23,196,1,23,195,1,23,194,1,20,13,144,80,144,60,41,40,250, -80,144,8,24,42,40,249,22,33,11,80,144,8,26,41,40,22,130,5,11,20, -13,144,80,144,60,41,40,250,80,144,8,24,42,40,249,22,33,11,80,144,8, -26,41,40,22,179,5,28,248,22,175,15,23,206,2,23,205,1,86,94,23,205, -1,247,22,153,16,249,247,22,163,16,248,22,83,23,196,1,23,218,1,86,94, -23,193,1,27,28,23,195,2,27,249,22,5,88,148,39,40,51,8,129,3,9, -226,25,17,13,12,33,48,23,204,2,27,28,23,200,2,11,193,28,192,192,28, -193,28,199,28,249,22,134,4,248,22,84,196,248,22,84,202,193,11,11,11,11, -28,23,193,2,86,103,23,214,1,23,213,1,23,207,1,23,206,1,23,205,1, -23,202,1,23,201,1,23,197,1,23,196,1,23,195,1,20,13,144,80,144,61, -41,40,250,80,144,8,25,42,40,249,22,33,11,80,144,8,27,41,40,22,130, -5,23,207,1,20,13,144,80,144,61,41,40,250,80,144,8,25,42,40,249,22, -33,11,80,144,8,27,41,40,22,179,5,28,248,22,175,15,23,207,2,23,206, -1,86,94,23,206,1,247,22,153,16,249,247,22,163,16,248,22,83,23,196,1, -23,219,1,86,94,23,193,1,27,28,23,197,2,27,249,22,5,20,20,94,88, -148,39,40,51,8,128,3,9,226,26,17,14,13,33,50,23,210,1,23,205,2, -27,28,23,200,2,11,193,28,192,192,28,193,28,23,200,2,28,249,22,134,4, -248,22,84,196,248,22,84,23,203,2,193,11,11,11,86,94,23,207,1,11,28, -23,193,2,86,101,23,208,1,23,206,1,23,205,1,23,203,1,23,202,1,23, -198,1,23,197,1,23,196,1,86,94,27,248,22,83,23,195,2,28,23,215,2, -250,22,158,2,248,22,84,23,219,1,23,219,1,250,22,92,23,199,1,11,23, -211,2,12,20,13,144,80,144,8,23,41,40,250,80,144,8,26,42,40,249,22, -33,11,80,144,8,28,41,40,22,130,5,11,20,13,144,80,144,8,23,41,40, -250,80,144,8,26,42,40,249,22,33,11,80,144,8,28,41,40,22,179,5,28, -248,22,175,15,23,208,2,23,207,1,86,94,23,207,1,247,22,153,16,249,247, -22,177,5,248,22,163,20,23,196,1,23,220,1,86,94,23,193,1,27,28,23, -197,1,27,249,22,5,20,20,95,88,148,39,40,51,8,128,3,9,226,27,19, -15,14,33,52,23,207,1,23,212,1,23,206,1,27,28,23,201,2,11,193,28, -192,192,28,193,28,200,28,249,22,134,4,248,22,84,196,248,22,84,203,193,11, -11,11,86,96,23,209,1,23,204,1,23,203,1,11,28,23,193,2,86,95,23, -207,1,23,198,1,86,94,27,248,22,83,23,195,2,28,23,216,2,250,22,158, -2,248,22,84,23,220,1,23,220,1,250,22,92,23,199,1,23,213,2,23,212, -2,12,20,13,144,80,144,8,24,41,40,250,80,144,8,27,42,40,249,22,33, -11,80,144,8,29,41,40,22,130,5,23,209,1,20,13,144,80,144,8,24,41, -40,250,80,144,8,27,42,40,249,22,33,11,80,144,8,29,41,40,22,179,5, -28,248,22,175,15,23,209,2,23,208,1,86,94,23,208,1,247,22,153,16,249, -247,22,177,5,248,22,163,20,23,196,1,23,221,1,86,94,23,193,1,28,28, -248,22,80,23,220,2,248,22,163,20,23,220,2,10,27,28,23,199,2,86,94, -23,207,1,23,208,1,86,94,23,208,1,23,207,1,28,28,248,22,80,23,221, -2,248,22,169,9,248,22,187,15,23,195,2,11,12,20,13,144,80,144,8,25, -41,40,250,80,144,8,28,42,40,249,22,33,11,80,144,8,30,41,40,22,130, -5,28,23,223,2,28,23,202,1,11,23,196,2,86,94,23,202,1,11,20,13, -144,80,144,8,25,41,40,250,80,144,8,28,42,40,249,22,33,11,80,144,8, -30,41,40,22,179,5,28,248,22,175,15,23,210,2,23,209,1,86,94,23,209, -1,247,22,153,16,249,247,22,177,5,23,195,1,23,222,1,12,28,23,194,2, -250,22,158,2,248,22,84,23,198,1,23,196,1,250,22,92,23,201,1,23,202, -1,23,203,1,12,27,249,22,191,8,80,144,42,50,41,249,22,129,4,248,22, -189,3,248,22,175,2,200,8,128,8,27,28,193,248,22,178,2,194,11,28,192, -27,249,22,102,198,195,28,192,248,22,84,193,11,11,27,249,22,129,4,248,22, -189,3,248,22,175,2,23,199,2,8,128,8,27,249,22,191,8,80,144,43,50, -41,23,196,2,250,22,128,9,80,144,44,50,41,23,197,1,248,22,177,2,249, -22,82,249,22,82,23,204,1,23,205,1,27,28,23,200,2,248,22,178,2,200, -11,28,192,192,9,32,57,88,149,8,38,42,54,11,2,33,39,223,3,33,72, -32,58,88,149,8,38,42,53,11,2,33,39,223,3,33,71,32,59,88,148,8, -36,40,53,11,2,34,222,33,70,32,60,88,149,8,38,42,53,11,2,33,39, -223,3,33,61,28,249,22,130,4,23,197,2,23,195,4,248,22,92,194,28,249, -22,138,9,7,47,249,22,159,7,23,198,2,23,199,2,249,22,82,250,22,177, -7,23,199,2,39,23,200,2,248,2,59,249,22,177,7,23,199,1,248,22,183, -3,23,201,1,250,2,60,23,196,4,196,248,22,183,3,198,32,62,88,149,8, -38,42,55,11,2,33,39,223,3,33,69,32,63,88,149,8,38,42,54,11,2, -33,39,223,3,33,66,32,64,88,149,8,38,42,53,11,2,33,39,223,3,33, -65,28,249,22,130,4,23,197,2,23,195,4,248,22,92,194,28,249,22,138,9, -7,47,249,22,159,7,23,198,2,23,199,2,249,22,82,250,22,177,7,23,199, -2,39,23,200,2,248,2,59,249,22,177,7,23,199,1,248,22,183,3,23,201, -1,250,2,64,23,196,4,196,248,22,183,3,198,28,249,22,130,4,23,197,2, -23,195,4,248,22,92,194,28,249,22,138,9,7,47,249,22,159,7,23,198,2, -23,199,2,249,22,82,250,22,177,7,23,199,2,39,23,200,2,27,249,22,177, -7,23,199,1,248,22,183,3,23,201,1,19,248,22,158,7,23,195,2,250,2, -64,23,196,4,23,197,1,39,2,27,248,22,183,3,23,197,1,28,249,22,130, -4,23,195,2,23,196,4,248,22,92,195,28,249,22,138,9,7,47,249,22,159, -7,23,199,2,23,197,2,249,22,82,250,22,177,7,23,200,2,39,23,198,2, -248,2,59,249,22,177,7,23,200,1,248,22,183,3,23,199,1,250,2,63,23, -197,4,197,248,22,183,3,196,32,67,88,149,8,38,42,53,11,2,33,39,223, -3,33,68,28,249,22,130,4,23,197,2,23,195,4,248,22,92,194,28,249,22, -138,9,7,47,249,22,159,7,23,198,2,23,199,2,249,22,82,250,22,177,7, -23,199,2,39,23,200,2,248,2,59,249,22,177,7,23,199,1,248,22,183,3, -23,201,1,250,2,67,23,196,4,196,248,22,183,3,198,28,249,22,130,4,23, -197,2,23,195,4,248,22,92,194,28,249,22,138,9,7,47,249,22,159,7,23, -198,2,23,199,2,249,22,82,250,22,177,7,23,199,2,39,23,200,2,27,249, -22,177,7,23,199,1,248,22,183,3,23,201,1,19,248,22,158,7,23,195,2, -250,2,63,23,196,4,23,197,1,39,2,27,248,22,183,3,23,197,1,28,249, -22,130,4,23,195,2,23,196,4,248,22,92,195,28,249,22,138,9,7,47,249, -22,159,7,23,199,2,23,197,2,249,22,82,250,22,177,7,23,200,2,39,23, -198,2,27,249,22,177,7,23,200,1,248,22,183,3,23,199,1,19,248,22,158, -7,23,195,2,250,2,67,23,196,4,23,197,1,39,2,27,248,22,183,3,23, -195,1,28,249,22,130,4,23,195,2,23,197,4,248,22,92,196,28,249,22,138, -9,7,47,249,22,159,7,23,200,2,23,197,2,249,22,82,250,22,177,7,23, -201,2,39,23,198,2,248,2,59,249,22,177,7,23,201,1,248,22,183,3,23, -199,1,250,2,62,23,198,4,198,248,22,183,3,196,19,248,22,158,7,23,195, -2,28,249,22,130,4,39,23,195,4,248,22,92,194,28,249,22,138,9,7,47, -249,22,159,7,23,198,2,39,249,22,82,250,22,177,7,23,199,2,39,39,27, -249,22,177,7,23,199,1,40,19,248,22,158,7,23,195,2,250,2,60,23,196, -4,23,197,1,39,2,28,249,22,130,4,40,23,195,4,248,22,92,194,28,249, -22,138,9,7,47,249,22,159,7,23,198,2,40,249,22,82,250,22,177,7,23, -199,2,39,40,248,2,59,249,22,177,7,23,199,1,41,250,2,62,23,196,4, -196,41,2,28,249,22,130,4,23,197,2,23,195,4,248,22,92,194,28,249,22, -138,9,7,47,249,22,159,7,23,198,2,23,199,2,249,22,82,250,22,177,7, -23,199,2,39,23,200,2,248,2,59,249,22,177,7,23,199,1,248,22,183,3, -23,201,1,250,2,58,23,196,4,196,248,22,183,3,198,28,249,22,130,4,23, -197,2,23,195,4,248,22,92,194,28,249,22,138,9,7,47,249,22,159,7,23, -198,2,23,199,2,249,22,82,250,22,177,7,23,199,2,39,23,200,2,27,249, -22,177,7,23,199,1,248,22,183,3,23,201,1,19,248,22,158,7,23,195,2, -250,2,58,23,196,4,23,197,1,39,2,27,248,22,183,3,23,197,1,28,249, -22,130,4,23,195,2,23,196,4,248,22,92,195,28,249,22,138,9,7,47,249, -22,159,7,23,199,2,23,197,2,249,22,82,250,22,177,7,23,200,2,39,23, -198,2,248,2,59,249,22,177,7,23,200,1,248,22,183,3,23,199,1,250,2, -57,23,197,4,197,248,22,183,3,196,32,73,88,148,39,40,58,11,2,34,222, -33,74,28,248,22,90,248,22,84,23,195,2,249,22,7,9,248,22,163,20,23, -196,1,90,144,41,11,89,146,41,39,11,27,248,22,164,20,23,197,2,28,248, -22,90,248,22,84,23,195,2,249,22,7,9,248,22,163,20,195,90,144,41,11, -89,146,41,39,11,27,248,22,164,20,196,28,248,22,90,248,22,84,23,195,2, -249,22,7,9,248,22,163,20,195,90,144,41,11,89,146,41,39,11,248,2,73, -248,22,164,20,196,249,22,7,249,22,82,248,22,163,20,199,196,195,249,22,7, -249,22,82,248,22,163,20,199,196,195,249,22,7,249,22,82,248,22,163,20,23, -200,1,23,197,1,23,196,1,27,19,248,22,158,7,23,196,2,250,2,57,23, -196,4,23,198,1,39,2,28,23,195,1,192,28,248,22,90,248,22,84,23,195, -2,249,22,7,9,248,22,163,20,23,196,1,27,248,22,164,20,23,195,2,90, -144,41,11,89,146,41,39,11,28,248,22,90,248,22,84,23,197,2,249,22,7, -9,248,22,163,20,23,198,1,27,248,22,164,20,23,197,2,90,144,41,11,89, -146,41,39,11,28,248,22,90,248,22,84,23,197,2,249,22,7,9,248,22,163, -20,197,90,144,41,11,89,146,41,39,11,248,2,73,248,22,164,20,198,249,22, -7,249,22,82,248,22,163,20,201,196,195,249,22,7,249,22,82,248,22,163,20, -23,203,1,196,195,249,22,7,249,22,82,248,22,163,20,23,201,1,23,197,1, -23,196,1,248,22,144,12,252,22,163,10,248,22,165,4,23,200,2,248,22,161, -4,23,200,2,248,22,162,4,23,200,2,248,22,163,4,23,200,2,248,22,164, -4,23,200,1,28,24,194,2,12,20,13,144,80,144,39,61,40,80,143,39,59, -89,146,40,40,10,249,22,132,5,21,94,2,35,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,27,28,23,195,2,28,249,22,171,9,23,197,2,80,143,42,55,86,94, -23,195,1,80,143,40,56,27,248,22,155,5,23,197,2,27,28,248,22,80,23, -195,2,248,22,163,20,23,195,1,23,194,1,28,248,22,175,15,23,194,2,90, -144,42,11,89,146,42,39,11,248,22,132,16,23,197,1,86,95,20,18,144,11, -80,143,45,55,199,20,18,144,11,80,143,45,56,192,192,11,11,28,23,193,2, -192,86,94,23,193,1,27,247,22,179,5,28,23,193,2,192,86,94,23,193,1, -247,22,153,16,90,144,42,11,89,146,42,39,11,248,22,132,16,23,198,2,86, -95,23,195,1,23,193,1,28,249,22,168,16,0,11,35,114,120,34,91,46,93, -115,115,36,34,248,22,180,15,23,197,1,249,80,144,44,8,23,42,23,199,1, -2,29,196,249,80,144,41,57,42,195,10,249,22,14,23,196,1,80,144,41,54, -41,86,96,28,248,22,153,5,23,196,2,12,250,22,182,11,2,24,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,146,14,23,197,2,10,12,250,22,182,11, -2,24,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,144,44,44,41,248,22,129,17,247,22,145,14, -11,27,28,23,194,2,23,194,1,86,94,23,194,1,27,249,22,82,247,22,140, -2,247,22,140,2,86,94,250,22,158,2,80,144,46,44,41,248,22,129,17,247, -22,145,14,195,192,86,94,250,22,158,2,248,22,83,23,197,2,23,200,2,70, -100,101,99,108,97,114,101,100,28,23,198,2,27,28,248,22,80,248,22,155,5, -23,200,2,248,22,154,5,248,22,83,248,22,155,5,23,201,1,23,198,1,27, -250,22,160,2,80,144,47,44,41,248,22,129,17,23,204,1,11,28,23,193,2, -27,250,22,160,2,248,22,84,23,198,1,23,198,2,11,28,23,193,2,250,22, -158,2,248,22,164,20,23,200,1,23,198,1,23,196,1,12,12,12,86,94,251, -22,139,12,247,22,143,12,67,101,114,114,111,114,6,69,69,100,101,102,97,117, -108,116,32,109,111,100,117,108,101,32,110,97,109,101,32,114,101,115,111,108,118, -101,114,32,99,97,108,108,101,100,32,119,105,116,104,32,116,104,114,101,101,32, -97,114,103,117,109,101,110,116,115,32,40,100,101,112,114,101,99,97,116,101,100, -41,11,251,24,197,1,23,198,1,23,199,1,23,200,1,10,32,84,88,148,39, -41,50,11,78,102,108,97,116,116,101,110,45,115,117,98,45,112,97,116,104,222, -33,87,32,85,88,148,39,43,57,11,2,34,222,33,86,28,248,22,90,23,197, -2,28,248,22,90,195,192,249,22,82,194,248,22,97,197,28,249,22,173,9,248, -22,83,23,199,2,2,38,28,248,22,90,23,196,2,86,95,23,196,1,23,195, -1,250,22,178,11,2,24,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,93,2,37,28,249,22,173,9,23,201,2,2,39,23, -199,1,28,248,22,175,15,23,200,2,23,199,1,249,22,92,28,248,22,66,23, -202,2,2,5,2,40,23,201,1,23,200,1,251,2,85,196,197,248,22,84,199, -248,22,164,20,200,251,2,85,196,197,249,22,82,248,22,163,20,202,200,248,22, -164,20,200,251,2,85,196,197,9,197,27,250,22,178,7,27,28,23,199,2,28, -247,22,131,12,248,80,144,47,58,42,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,179,16,0,7,35,114, -120,34,92,110,34,23,203,1,249,22,139,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,174,13,28,23,196,2,251,22,182,12,23,198,1,247,22,29,248,22,92,23, -201,1,23,199,1,86,94,23,196,1,250,22,145,13,23,197,1,247,22,29,23, -198,1,32,89,88,148,8,36,40,53,11,69,115,115,45,62,114,107,116,222,33, -90,19,248,22,158,7,194,28,249,22,134,4,23,195,4,42,28,249,22,171,9, -7,46,249,22,159,7,197,249,22,186,3,23,199,4,42,28,28,249,22,171,9, -7,115,249,22,159,7,197,249,22,186,3,23,199,4,41,249,22,171,9,7,115, -249,22,159,7,197,249,22,186,3,23,199,4,40,11,249,22,178,7,250,22,177, -7,198,39,249,22,186,3,23,200,4,42,2,43,193,193,193,2,28,249,22,161, -7,194,2,39,2,30,28,249,22,161,7,194,2,38,64,117,112,192,0,8,35, -114,120,34,91,46,93,34,32,93,88,148,8,36,40,50,11,2,34,222,33,94, -28,248,22,90,23,194,2,9,250,22,93,6,4,4,10,32,32,32,248,22,179, -15,248,22,105,23,198,2,248,2,93,248,22,164,20,23,198,1,28,249,22,173, -9,248,22,84,23,200,2,23,197,1,28,249,22,171,9,248,22,163,20,23,200, -1,23,196,1,251,22,178,11,2,24,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,178,7, -248,2,93,248,22,97,23,201,1,12,12,247,23,193,1,250,22,159,4,11,196, -195,20,13,144,80,144,49,53,41,249,22,82,249,22,82,23,198,1,23,202,1, -23,195,1,20,13,144,80,144,49,41,40,252,80,144,54,42,40,249,22,33,11, -80,144,56,41,40,22,129,5,23,201,2,22,131,5,248,28,23,208,2,20,20, -94,88,148,8,36,40,49,11,9,223,15,33,97,23,208,1,86,94,23,208,1, -22,7,28,248,22,66,23,207,2,23,206,1,28,28,248,22,80,23,207,2,249, -22,171,9,248,22,163,20,23,209,2,2,35,11,23,206,1,86,94,23,206,1, -28,248,22,153,5,23,203,2,27,248,22,155,5,23,204,2,28,248,22,66,193, -249,22,92,2,5,194,192,23,202,2,249,247,22,178,5,23,201,1,27,248,22, -70,248,22,179,15,23,202,1,28,23,204,2,28,250,22,160,2,248,22,163,20, -23,202,1,23,202,1,11,249,22,82,11,205,249,22,82,194,205,192,86,96,28, -248,22,163,5,23,196,2,12,28,248,22,157,4,23,198,2,250,22,180,11,11, -6,15,15,98,97,100,32,109,111,100,117,108,101,32,112,97,116,104,23,200,2, -250,22,182,11,2,24,2,36,23,198,2,28,28,23,196,2,248,22,153,5,23, -197,2,10,12,250,22,182,11,2,24,6,31,31,40,111,114,47,99,32,35,102, -32,114,101,115,111,108,118,101,100,45,109,111,100,117,108,101,45,112,97,116,104, -63,41,23,199,2,28,28,23,197,2,248,22,157,4,23,198,2,10,12,250,22, -182,11,2,24,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,80,23,196,2,249,22,171,9,248,22,163, -20,23,198,2,2,5,11,86,97,23,198,1,23,197,1,23,196,1,23,193,1, -248,22,154,5,248,22,104,23,197,1,28,28,248,22,80,23,196,2,28,249,22, -171,9,248,22,163,20,23,198,2,2,37,28,248,22,80,248,22,104,23,197,2, -249,22,171,9,248,22,108,23,198,2,2,5,11,11,11,86,97,23,198,1,23, -197,1,23,196,1,23,193,1,248,22,154,5,249,2,84,248,22,121,23,199,2, -248,22,106,23,199,1,28,28,248,22,80,23,196,2,28,249,22,171,9,248,22, -163,20,23,198,2,2,37,28,28,249,22,173,9,248,22,104,23,198,2,2,39, -10,249,22,173,9,248,22,104,23,198,2,2,38,28,23,196,2,27,248,22,155, -5,23,198,2,28,248,22,66,193,10,28,248,22,80,193,248,22,66,248,22,163, -20,194,11,11,11,11,11,86,96,23,198,1,23,197,1,23,193,1,27,248,22, -155,5,23,198,1,248,22,154,5,249,2,84,28,248,22,80,23,197,2,248,22, -163,20,23,197,2,23,196,2,27,28,249,22,173,9,248,22,104,23,203,2,2, -38,248,22,164,20,200,248,22,106,200,28,248,22,80,23,198,2,249,22,96,248, -22,164,20,199,194,192,28,28,248,22,80,23,196,2,249,22,171,9,248,22,163, -20,23,198,2,2,41,11,86,94,248,80,144,41,8,29,42,23,194,2,253,24, -199,1,23,201,1,23,202,1,23,203,1,23,204,1,11,80,143,46,59,28,28, -248,22,80,23,196,2,28,249,22,171,9,248,22,163,20,23,198,2,2,37,28, -248,22,80,248,22,104,23,197,2,249,22,171,9,248,22,108,23,198,2,2,41, -11,11,11,86,94,248,80,144,41,8,29,42,23,194,2,253,24,199,1,248,22, -104,23,202,2,23,202,1,23,203,1,23,204,1,248,22,106,23,202,1,80,143, -46,59,86,94,23,193,1,27,88,148,8,36,40,57,8,240,0,0,8,0,1, -19,115,104,111,119,45,99,111,108,108,101,99,116,105,111,110,45,101,114,114,225, -2,5,3,33,88,27,28,248,22,80,23,198,2,28,249,22,171,9,2,37,248, -22,163,20,23,200,2,27,248,22,104,23,199,2,28,28,249,22,173,9,23,195, -2,2,39,10,249,22,173,9,23,195,2,2,38,86,94,23,193,1,28,23,199, -2,27,248,22,155,5,23,201,2,28,248,22,80,193,248,22,163,20,193,192,250, -22,178,11,2,24,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,80,23,199,2,28,249,22,171,9,2,37,248,22,163,20,23,201, -2,27,28,28,28,249,22,173,9,248,22,104,23,202,2,2,39,10,249,22,173, -9,248,22,104,23,202,2,2,38,23,200,2,11,27,248,22,155,5,23,202,2, -27,28,249,22,173,9,248,22,104,23,204,2,2,38,248,22,164,20,23,202,1, -248,22,106,23,202,1,28,248,22,80,23,195,2,249,2,84,248,22,163,20,23, -197,2,249,22,96,248,22,164,20,23,199,1,23,197,1,249,2,84,23,196,1, -23,195,1,249,2,84,2,39,28,249,22,173,9,248,22,104,23,204,2,2,38, -248,22,164,20,23,202,1,248,22,106,23,202,1,28,248,22,80,193,248,22,164, -20,193,11,11,11,27,28,248,22,66,23,196,2,27,248,80,144,46,51,42,249, -22,82,23,199,2,248,22,129,17,247,22,145,14,28,23,193,2,192,86,94,23, -193,1,90,144,41,11,89,146,41,39,11,249,80,144,49,57,42,248,22,73,23, -201,2,11,27,28,248,22,90,23,195,2,2,42,249,22,178,7,23,197,2,2, -43,252,80,144,53,8,24,42,23,205,1,28,248,22,90,23,200,2,23,200,1, -86,94,23,200,1,248,22,83,23,200,2,28,248,22,90,23,200,2,86,94,23, -199,1,9,248,22,84,23,200,1,23,198,1,10,28,248,22,155,7,23,196,2, -86,94,23,196,1,27,248,80,144,46,8,30,42,23,202,2,27,248,80,144,47, -51,42,249,22,82,23,200,2,23,197,2,28,23,193,2,192,86,94,23,193,1, -90,144,41,11,89,146,41,39,11,249,80,144,50,57,42,23,201,2,11,28,248, -22,90,23,194,2,86,94,23,193,1,249,22,129,16,23,198,1,248,2,89,23, -197,1,250,22,1,22,129,16,23,199,1,249,22,96,249,22,2,32,0,88,148, -8,36,40,47,11,9,222,33,91,23,200,1,248,22,92,248,2,89,23,201,1, -28,248,22,175,15,23,196,2,86,94,23,196,1,248,80,144,45,8,31,42,248, -22,139,16,28,248,22,136,16,23,198,2,23,197,2,249,22,137,16,23,199,2, -248,80,144,49,8,30,42,23,205,2,28,249,22,171,9,248,22,83,23,198,2, -2,35,27,248,80,144,46,51,42,249,22,82,23,199,2,248,22,129,17,247,22, -145,14,28,23,193,2,192,86,94,23,193,1,90,144,41,11,89,146,41,39,11, -249,80,144,49,57,42,248,22,104,23,201,2,11,27,28,248,22,90,248,22,106, -23,201,2,28,248,22,90,23,195,2,249,22,172,16,2,92,23,197,2,11,10, -27,28,23,194,2,248,2,89,23,197,2,28,248,22,90,23,196,2,2,42,28, -249,22,172,16,2,92,23,198,2,248,2,89,23,197,2,249,22,178,7,23,198, -2,2,43,27,28,23,195,1,86,94,23,197,1,249,22,96,28,248,22,90,248, -22,106,23,205,2,21,93,6,5,5,109,122,108,105,98,249,22,1,22,96,249, -22,2,80,144,56,8,32,42,248,22,106,23,208,2,23,198,1,28,248,22,90, -23,197,2,86,94,23,196,1,248,22,92,23,198,1,86,94,23,197,1,23,196, -1,252,80,144,55,8,24,42,23,207,1,248,22,83,23,199,2,248,22,164,20, -23,199,1,23,199,1,10,28,249,22,171,9,248,22,163,20,23,198,2,2,40, -248,80,144,45,8,31,42,248,22,139,16,249,22,137,16,248,22,141,16,248,22, -104,23,201,2,248,80,144,49,8,30,42,23,205,2,12,86,94,28,28,248,22, -175,15,23,194,2,10,248,22,186,8,23,194,2,12,28,23,201,2,250,22,180, -11,69,114,101,113,117,105,114,101,249,22,139,8,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,83,23,199, -2,6,0,0,23,204,2,250,22,182,11,2,24,2,36,23,198,2,27,28,248, -22,186,8,23,195,2,249,22,191,8,23,196,2,39,249,22,139,16,248,22,140, -16,23,197,2,11,27,28,248,22,186,8,23,196,2,249,22,191,8,23,197,2, -40,248,80,144,47,8,25,42,23,195,2,90,144,42,11,89,146,42,39,11,28, -248,22,186,8,23,199,2,250,22,7,2,44,249,22,191,8,23,203,2,41,2, -44,248,22,132,16,23,198,2,86,95,23,195,1,23,193,1,27,28,248,22,186, -8,23,200,2,249,22,191,8,23,201,2,42,249,80,144,52,8,23,42,23,197, -2,5,0,27,28,248,22,186,8,23,201,2,249,22,191,8,23,202,2,43,248, -22,154,5,23,200,2,27,250,22,160,2,80,144,55,44,41,248,22,129,17,247, -22,145,14,11,27,28,23,194,2,23,194,1,86,94,23,194,1,27,249,22,82, -247,22,140,2,247,22,140,2,86,94,250,22,158,2,80,144,57,44,41,248,22, -129,17,247,22,145,14,195,192,27,28,23,204,2,248,22,154,5,249,22,82,248, -22,155,5,23,200,2,23,207,2,23,196,2,86,95,28,23,212,2,28,250,22, -160,2,248,22,83,23,198,2,195,11,86,96,23,211,1,23,204,1,23,194,1, -12,27,251,22,33,11,80,144,59,53,41,9,28,248,22,17,80,144,60,54,41, -80,144,59,54,41,247,22,19,27,248,22,129,17,247,22,145,14,86,94,249,22, -3,88,148,8,36,40,57,11,9,226,13,12,2,3,33,95,23,196,2,248,28, -248,22,17,80,144,58,54,41,32,0,88,148,39,40,45,11,9,222,33,96,80, -144,57,8,33,42,20,20,98,88,148,39,39,8,25,8,240,12,64,0,0,9, -233,18,21,14,15,12,11,7,6,4,1,2,33,98,23,195,1,23,194,1,23, -197,1,23,207,1,23,214,1,12,28,28,248,22,186,8,23,204,1,86,94,23, -212,1,11,28,23,212,1,28,248,22,155,7,23,206,2,10,28,248,22,66,23, -206,2,10,28,248,22,80,23,206,2,249,22,171,9,248,22,163,20,23,208,2, -2,35,11,11,249,80,144,56,52,42,28,248,22,155,7,23,208,2,249,22,82, -23,209,1,248,80,144,59,8,30,42,23,215,1,86,94,23,212,1,249,22,82, -23,209,1,248,22,129,17,247,22,145,14,252,22,188,8,23,209,1,23,208,1, -23,206,1,23,204,1,23,203,1,12,192,86,96,20,18,144,11,80,143,39,59, -248,80,144,40,8,28,40,249,22,33,11,80,144,42,61,40,248,22,128,5,80, -144,40,60,41,248,22,178,5,80,144,40,40,42,248,22,144,15,80,144,40,48, -42,20,18,144,11,80,143,39,59,248,80,144,40,8,28,40,249,22,33,11,80, -144,42,61,40,20,18,144,11,80,143,39,59,248,80,144,40,8,28,40,249,22, -33,11,80,144,42,61,40,144,39,20,120,145,2,1,39,16,1,11,16,0,20, -26,15,56,9,2,2,2,2,29,11,11,11,11,11,11,11,9,9,11,11,11, -10,41,80,143,39,39,20,120,145,2,1,44,16,29,2,3,2,4,30,2,7, -2,8,11,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,11,4,30,2,9,74,112,97,116,104, -45,115,116,114,105,110,103,63,42,196,15,2,10,30,2,9,73,114,101,114,111, -111,116,45,112,97,116,104,44,196,16,30,2,9,77,112,97,116,104,45,97,100, -100,45,115,117,102,102,105,120,44,196,12,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,2,24,30,2,25, -2,8,11,6,30,2,9,1,19,112,97,116,104,45,114,101,112,108,97,99,101, -45,115,117,102,102,105,120,44,196,14,30,2,9,75,102,105,110,100,45,99,111, -108,45,102,105,108,101,49,196,4,30,2,9,78,110,111,114,109,97,108,45,99, -97,115,101,45,112,97,116,104,42,196,11,2,26,2,27,30,2,25,76,114,101, -112,97,114,97,109,101,116,101,114,105,122,101,11,7,16,0,40,42,39,16,0, -39,16,16,2,17,2,18,2,10,2,14,2,19,2,20,2,13,2,4,2,12, -2,3,2,22,2,15,2,16,2,11,2,21,2,24,55,11,11,11,16,3,2, -26,2,23,2,27,16,3,11,11,11,16,3,2,26,2,23,2,27,42,42,40, -12,11,11,16,0,16,0,16,0,39,39,11,12,11,11,16,0,16,0,16,0, -39,39,16,24,20,15,16,2,248,22,182,8,71,115,111,45,115,117,102,102,105, -120,80,144,39,39,40,20,15,16,2,88,148,39,41,8,39,8,189,3,2,4, -223,0,33,53,80,144,39,40,40,20,15,16,2,32,0,88,148,8,36,44,55, -11,2,11,222,33,54,80,144,39,47,40,20,15,16,2,20,27,143,32,0,88, -148,8,36,40,45,11,2,12,222,192,32,0,88,148,8,36,40,45,11,2,12, -222,192,80,144,39,48,40,20,15,16,2,247,22,143,2,80,144,39,44,40,20, -15,16,2,8,128,8,80,144,39,49,40,20,15,16,2,249,22,187,8,8,128, -8,11,80,144,39,50,40,20,15,16,2,88,148,8,36,40,53,8,128,32,2, -15,223,0,33,55,80,144,39,51,40,20,15,16,2,88,148,8,36,41,57,8, -128,32,2,16,223,0,33,56,80,144,39,52,40,20,15,16,2,247,22,78,80, -144,39,53,40,20,15,16,2,248,22,18,76,109,111,100,117,108,101,45,108,111, -97,100,105,110,103,80,144,39,54,40,20,15,16,2,11,80,143,39,55,20,15, -16,2,11,80,143,39,56,20,15,16,2,32,0,88,148,39,41,60,11,2,21, -222,33,75,80,144,39,57,40,20,15,16,2,32,0,88,148,8,36,40,52,11, -2,22,222,33,76,80,144,39,58,40,20,15,16,2,11,80,143,39,59,20,15, -16,2,88,149,8,34,40,48,8,240,0,0,80,0,1,21,112,114,101,112,45, -112,108,97,110,101,116,45,114,101,115,111,108,118,101,114,33,40,224,1,0,33, -77,80,144,39,8,29,42,20,15,16,2,88,148,39,40,53,8,240,0,0,3, -0,69,103,101,116,45,100,105,114,223,0,33,78,80,144,39,8,30,42,20,15, -16,2,88,148,39,40,52,8,240,0,0,128,0,74,112,97,116,104,45,115,115, -45,62,114,107,116,223,0,33,79,80,144,39,8,31,42,20,15,16,2,88,148, -8,36,40,48,8,240,0,0,4,0,9,223,0,33,80,80,144,39,8,32,42, -20,15,16,2,88,148,39,40,48,8,240,0,128,0,0,9,223,0,33,81,80, -144,39,8,33,42,20,15,16,2,27,11,20,19,143,39,90,144,40,10,89,146, -40,39,10,20,25,96,2,24,88,148,8,36,41,57,8,32,9,224,2,1,33, -82,88,148,39,42,52,11,9,223,0,33,83,88,148,39,43,8,32,16,4,8, -240,44,240,0,0,8,240,156,227,0,0,42,39,9,224,2,1,33,99,207,80, -144,39,60,40,20,15,16,2,88,148,39,39,48,16,2,8,130,8,8,176,65, -2,26,223,0,33,100,80,144,39,8,26,40,20,15,16,2,20,27,143,88,148, -8,36,39,48,16,2,39,8,144,65,2,27,223,0,33,101,88,148,8,36,39, -48,16,2,39,8,144,65,2,27,223,0,33,102,80,144,39,8,27,40,96,29, -94,2,5,70,35,37,107,101,114,110,101,108,11,29,94,2,5,71,35,37,109, -105,110,45,115,116,120,11,2,9,2,25,9,9,9,39,9,0}; - EVAL_ONE_SIZED_STR((char *)expr, 9739); + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,9,54,46,50,46,57,48,48,46,56,84,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,100,0,0,0,1,0,0,8,0, +15,0,26,0,53,0,59,0,73,0,86,0,112,0,129,0,151,0,159,0,171, +0,186,0,202,0,220,0,241,0,253,0,13,1,36,1,60,1,72,1,103,1, +108,1,113,1,131,1,137,1,142,1,151,1,156,1,162,1,167,1,171,1,186, +1,193,1,198,1,202,1,207,1,214,1,225,1,232,1,240,1,87,2,122,2, +225,2,4,3,98,3,133,3,227,3,6,4,7,11,37,11,88,11,163,11,179, +11,195,11,209,11,225,11,44,12,60,12,76,12,92,12,167,12,74,13,90,13, +165,13,160,14,40,15,115,15,22,16,35,16,188,16,116,17,159,17,241,17,113, +18,174,18,182,18,193,18,227,19,74,20,102,20,115,20,36,21,43,21,203,21, +223,21,67,22,89,22,99,22,113,22,151,22,250,22,254,22,5,23,211,23,104, +32,157,32,181,32,205,32,0,0,253,36,0,0,3,1,5,105,110,115,112,48, +68,35,37,98,111,111,116,72,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,67,113,117,111,116,101,29,94,2,5,70,35,37,112,97,114,97,109, +122,11,29,94,2,5,69,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,78, +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,69,67,65,67, +72,69,45,78,73,45,112,97,116,104,45,99,97,99,104,101,76,112,97,116,104, +45,99,97,99,104,101,45,103,101,116,77,112,97,116,104,45,99,97,99,104,101, +45,115,101,116,33,79,45,108,111,97,100,105,110,103,45,102,105,108,101,110,97, +109,101,1,19,45,108,111,97,100,105,110,103,45,112,114,111,109,112,116,45,116, +97,103,73,45,112,114,101,118,45,114,101,108,116,111,77,45,112,114,101,118,45, +114,101,108,116,111,45,100,105,114,1,21,115,112,108,105,116,45,114,101,108,97, +116,105,118,101,45,115,116,114,105,110,103,1,22,102,111,114,109,97,116,45,115, +111,117,114,99,101,45,108,111,99,97,116,105,111,110,73,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,66,98,111,111,116,66, +115,101,97,108,79,108,111,97,100,47,117,115,101,45,99,111,109,112,105,108,101, +100,5,4,46,114,107,116,66,115,97,109,101,6,6,6,110,97,116,105,118,101, +5,3,46,122,111,67,105,108,111,111,112,66,108,111,111,112,65,108,105,98,6, +12,12,109,111,100,117,108,101,45,112,97,116,104,63,68,115,117,98,109,111,100, +6,2,2,46,46,6,1,1,46,66,102,105,108,101,68,112,108,97,110,101,116, +6,8,8,109,97,105,110,46,114,107,116,6,4,4,46,114,107,116,69,105,103, +110,111,114,101,100,27,252,22,191,15,28,249,22,169,9,23,201,2,2,27,86, +94,23,199,1,23,200,1,28,248,22,132,16,23,200,2,249,22,191,15,23,202, +1,23,201,1,249,80,144,50,45,42,23,202,1,23,201,1,23,203,1,2,28, +247,22,181,8,249,80,144,50,46,42,23,203,1,80,144,50,39,41,27,250,22, +145,16,196,11,32,0,88,148,8,36,39,44,11,9,222,11,28,192,249,22,80, +195,194,11,249,22,5,20,20,96,88,148,8,36,40,57,8,129,3,9,226,5, +4,3,6,33,42,23,199,1,23,196,1,23,197,1,23,195,1,27,252,22,191, +15,28,249,22,169,9,23,201,2,2,27,86,94,23,199,1,23,200,1,28,248, +22,132,16,23,200,2,249,22,191,15,23,202,1,23,201,1,249,80,144,50,45, +42,23,202,1,23,201,1,23,203,1,2,28,247,22,181,8,249,80,144,50,46, +42,23,203,1,80,144,50,39,41,27,250,22,145,16,196,11,32,0,88,148,8, +36,39,44,11,9,222,11,28,192,249,22,80,195,194,11,249,22,5,20,20,96, +88,148,8,36,40,57,8,129,3,9,226,5,4,3,6,33,44,23,199,1,23, +196,1,23,197,1,23,195,1,27,250,22,191,15,28,249,22,169,9,23,199,2, +2,27,86,94,23,197,1,23,198,1,28,248,22,132,16,23,198,2,249,22,191, +15,23,200,1,23,199,1,249,80,144,48,45,42,23,200,1,23,199,1,23,201, +1,249,80,144,48,46,42,23,201,1,2,29,27,250,22,145,16,196,11,32,0, +88,148,8,36,39,44,11,9,222,11,28,192,249,22,80,195,194,11,249,22,5, +20,20,96,88,148,8,36,40,55,8,128,3,9,226,5,4,3,6,33,46,23, +199,1,23,196,1,23,197,1,23,195,1,27,250,22,191,15,28,249,22,169,9, +23,199,2,2,27,86,94,23,197,1,23,198,1,28,248,22,132,16,23,198,2, +249,22,191,15,23,200,1,23,199,1,249,80,144,48,45,42,23,200,1,23,199, +1,23,201,1,249,80,144,48,46,42,23,201,1,2,29,27,250,22,145,16,196, +11,32,0,88,148,8,36,39,44,11,9,222,11,28,192,249,22,80,195,194,11, +249,22,5,20,20,96,88,148,8,36,40,55,8,128,3,9,226,5,4,3,6, +33,48,23,199,1,23,196,1,23,197,1,23,195,1,86,95,28,248,80,144,40, +43,42,23,195,2,12,250,22,180,11,2,25,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,89,23,196,2,28,249,22,130,4,248,22,93,23,198,2,40,28, +28,248,22,64,248,22,81,23,197,2,10,248,22,167,9,248,22,161,20,23,197, +2,249,22,4,22,64,248,22,162,20,23,198,2,11,11,11,10,12,250,22,180, +11,2,25,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,191,4,11,27,28,23,194,2,250,22,158,2,80,143,44,44,248,22, +191,16,247,22,143,14,11,11,27,28,23,194,2,250,22,158,2,248,22,82,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,144,80,144,42,41,40,250,80,144,45,42,40,249,22,31,11,80,144, +47,41,40,22,128,5,248,22,102,23,197,2,27,248,22,111,23,195,2,20,13, +144,80,144,43,41,40,250,80,144,46,42,40,249,22,31,11,80,144,48,41,40, +22,177,5,28,248,22,173,15,23,197,2,23,196,1,86,94,23,196,1,247,22, +151,16,249,247,22,175,5,248,22,161,20,23,197,1,23,201,1,86,94,23,193, +1,27,28,248,22,134,16,23,199,2,23,198,2,27,247,22,177,5,28,192,249, +22,135,16,23,201,2,194,23,199,2,90,144,42,11,89,146,42,39,11,248,22, +130,16,23,202,1,86,94,23,195,1,90,144,41,11,89,146,41,39,11,28,23, +204,2,27,248,22,178,15,23,198,2,19,248,22,147,8,194,28,28,249,22,132, +4,23,195,4,43,249,22,150,8,2,26,249,22,153,8,197,249,22,184,3,23, +199,4,43,11,249,22,7,23,200,2,248,22,182,15,249,22,154,8,250,22,153, +8,201,39,249,22,184,3,23,203,4,43,5,3,46,115,115,249,22,7,23,200, +2,11,2,249,22,7,23,198,2,11,27,28,249,22,169,9,23,196,2,23,199, +2,23,199,2,249,22,191,15,23,198,2,23,196,2,27,28,23,196,2,28,249, +22,169,9,23,198,2,23,200,1,23,200,1,86,94,23,200,1,249,22,191,15, +23,199,2,23,198,2,86,94,23,198,1,11,27,28,249,22,169,9,23,200,2, +70,114,101,108,97,116,105,118,101,86,94,23,198,1,2,27,23,198,1,27,247, +22,156,16,27,247,22,157,16,27,250,22,145,16,23,201,2,11,32,0,88,148, +8,36,39,44,11,9,222,11,27,28,23,194,2,249,22,80,23,201,2,23,196, +1,86,94,23,194,1,11,27,28,23,199,2,28,23,194,2,11,27,250,22,145, +16,23,203,2,11,32,0,88,148,8,36,39,44,11,9,222,11,28,192,249,22, +80,23,202,2,194,11,11,27,28,23,195,2,23,195,2,23,194,2,27,28,23, +196,2,23,196,2,248,22,167,9,23,196,2,27,28,23,205,2,28,23,196,2, +86,94,23,197,1,23,196,2,248,22,167,9,23,198,1,11,27,28,23,195,2, +27,249,22,5,88,148,39,40,51,8,129,3,9,226,24,15,12,11,33,43,23, +203,2,27,28,23,198,2,11,193,28,192,192,28,193,28,23,198,2,28,249,22, +132,4,248,22,82,196,248,22,82,23,201,2,193,11,11,11,11,28,23,193,2, +86,105,23,213,1,23,212,1,23,206,1,23,205,1,23,204,1,23,203,1,23, +201,1,23,200,1,23,197,1,23,196,1,23,195,1,23,194,1,20,13,144,80, +144,60,41,40,250,80,144,8,24,42,40,249,22,31,11,80,144,8,26,41,40, +22,128,5,11,20,13,144,80,144,60,41,40,250,80,144,8,24,42,40,249,22, +31,11,80,144,8,26,41,40,22,177,5,28,248,22,173,15,23,206,2,23,205, +1,86,94,23,205,1,247,22,151,16,249,247,22,161,16,248,22,81,23,196,1, +23,218,1,86,94,23,193,1,27,28,23,195,2,27,249,22,5,88,148,39,40, +51,8,129,3,9,226,25,17,13,12,33,45,23,204,2,27,28,23,200,2,11, +193,28,192,192,28,193,28,199,28,249,22,132,4,248,22,82,196,248,22,82,202, +193,11,11,11,11,28,23,193,2,86,103,23,214,1,23,213,1,23,207,1,23, +206,1,23,205,1,23,202,1,23,201,1,23,197,1,23,196,1,23,195,1,20, +13,144,80,144,61,41,40,250,80,144,8,25,42,40,249,22,31,11,80,144,8, +27,41,40,22,128,5,23,207,1,20,13,144,80,144,61,41,40,250,80,144,8, +25,42,40,249,22,31,11,80,144,8,27,41,40,22,177,5,28,248,22,173,15, +23,207,2,23,206,1,86,94,23,206,1,247,22,151,16,249,247,22,161,16,248, +22,81,23,196,1,23,219,1,86,94,23,193,1,27,28,23,197,2,27,249,22, +5,20,20,94,88,148,39,40,51,8,128,3,9,226,26,17,14,13,33,47,23, +210,1,23,205,2,27,28,23,200,2,11,193,28,192,192,28,193,28,23,200,2, +28,249,22,132,4,248,22,82,196,248,22,82,23,203,2,193,11,11,11,86,94, +23,207,1,11,28,23,193,2,86,101,23,208,1,23,206,1,23,205,1,23,203, +1,23,202,1,23,198,1,23,197,1,23,196,1,86,94,27,248,22,81,23,195, +2,28,23,215,2,250,22,156,2,248,22,82,23,219,1,23,219,1,250,22,90, +23,199,1,11,23,211,2,12,20,13,144,80,144,8,23,41,40,250,80,144,8, +26,42,40,249,22,31,11,80,144,8,28,41,40,22,128,5,11,20,13,144,80, +144,8,23,41,40,250,80,144,8,26,42,40,249,22,31,11,80,144,8,28,41, +40,22,177,5,28,248,22,173,15,23,208,2,23,207,1,86,94,23,207,1,247, +22,151,16,249,247,22,175,5,248,22,161,20,23,196,1,23,220,1,86,94,23, +193,1,27,28,23,197,1,27,249,22,5,20,20,95,88,148,39,40,51,8,128, +3,9,226,27,19,15,14,33,49,23,207,1,23,212,1,23,206,1,27,28,23, +201,2,11,193,28,192,192,28,193,28,200,28,249,22,132,4,248,22,82,196,248, +22,82,203,193,11,11,11,86,96,23,209,1,23,204,1,23,203,1,11,28,23, +193,2,86,95,23,207,1,23,198,1,86,94,27,248,22,81,23,195,2,28,23, +216,2,250,22,156,2,248,22,82,23,220,1,23,220,1,250,22,90,23,199,1, +23,213,2,23,212,2,12,20,13,144,80,144,8,24,41,40,250,80,144,8,27, +42,40,249,22,31,11,80,144,8,29,41,40,22,128,5,23,209,1,20,13,144, +80,144,8,24,41,40,250,80,144,8,27,42,40,249,22,31,11,80,144,8,29, +41,40,22,177,5,28,248,22,173,15,23,209,2,23,208,1,86,94,23,208,1, +247,22,151,16,249,247,22,175,5,248,22,161,20,23,196,1,23,221,1,86,94, +23,193,1,28,28,248,22,78,23,220,2,248,22,161,20,23,220,2,10,27,28, +23,199,2,86,94,23,207,1,23,208,1,86,94,23,208,1,23,207,1,28,28, +248,22,78,23,221,2,248,22,167,9,248,22,185,15,23,195,2,11,12,20,13, +144,80,144,8,25,41,40,250,80,144,8,28,42,40,249,22,31,11,80,144,8, +30,41,40,22,128,5,28,23,223,2,28,23,202,1,11,23,196,2,86,94,23, +202,1,11,20,13,144,80,144,8,25,41,40,250,80,144,8,28,42,40,249,22, +31,11,80,144,8,30,41,40,22,177,5,28,248,22,173,15,23,210,2,23,209, +1,86,94,23,209,1,247,22,151,16,249,247,22,175,5,23,195,1,23,222,1, +12,28,23,194,2,250,22,156,2,248,22,82,23,198,1,23,196,1,250,22,90, +23,201,1,23,202,1,23,203,1,12,27,249,22,189,8,80,144,42,50,41,249, +22,191,3,248,22,187,3,248,22,173,2,200,8,128,8,27,28,193,248,22,176, +2,194,11,28,192,27,249,22,100,198,195,28,192,248,22,82,193,11,11,27,249, +22,191,3,248,22,187,3,248,22,173,2,23,199,2,8,128,8,27,249,22,189, +8,80,144,43,50,41,23,196,2,250,22,190,8,80,144,44,50,41,23,197,1, +248,22,175,2,249,22,80,249,22,80,23,204,1,23,205,1,27,28,23,200,2, +248,22,176,2,200,11,28,192,192,9,32,54,88,149,8,38,42,54,11,2,30, +39,223,3,33,69,32,55,88,149,8,38,42,53,11,2,30,39,223,3,33,68, +32,56,88,148,8,36,40,53,11,2,31,222,33,67,32,57,88,149,8,38,42, +53,11,2,30,39,223,3,33,58,28,249,22,128,4,23,197,2,23,195,4,248, +22,90,194,28,249,22,136,9,7,47,249,22,157,7,23,198,2,23,199,2,249, +22,80,250,22,175,7,23,199,2,39,23,200,2,248,2,56,249,22,175,7,23, +199,1,248,22,181,3,23,201,1,250,2,57,23,196,4,196,248,22,181,3,198, +32,59,88,149,8,38,42,55,11,2,30,39,223,3,33,66,32,60,88,149,8, +38,42,54,11,2,30,39,223,3,33,63,32,61,88,149,8,38,42,53,11,2, +30,39,223,3,33,62,28,249,22,128,4,23,197,2,23,195,4,248,22,90,194, +28,249,22,136,9,7,47,249,22,157,7,23,198,2,23,199,2,249,22,80,250, +22,175,7,23,199,2,39,23,200,2,248,2,56,249,22,175,7,23,199,1,248, +22,181,3,23,201,1,250,2,61,23,196,4,196,248,22,181,3,198,28,249,22, +128,4,23,197,2,23,195,4,248,22,90,194,28,249,22,136,9,7,47,249,22, +157,7,23,198,2,23,199,2,249,22,80,250,22,175,7,23,199,2,39,23,200, +2,27,249,22,175,7,23,199,1,248,22,181,3,23,201,1,19,248,22,156,7, +23,195,2,250,2,61,23,196,4,23,197,1,39,2,27,248,22,181,3,23,197, +1,28,249,22,128,4,23,195,2,23,196,4,248,22,90,195,28,249,22,136,9, +7,47,249,22,157,7,23,199,2,23,197,2,249,22,80,250,22,175,7,23,200, +2,39,23,198,2,248,2,56,249,22,175,7,23,200,1,248,22,181,3,23,199, +1,250,2,60,23,197,4,197,248,22,181,3,196,32,64,88,149,8,38,42,53, +11,2,30,39,223,3,33,65,28,249,22,128,4,23,197,2,23,195,4,248,22, +90,194,28,249,22,136,9,7,47,249,22,157,7,23,198,2,23,199,2,249,22, +80,250,22,175,7,23,199,2,39,23,200,2,248,2,56,249,22,175,7,23,199, +1,248,22,181,3,23,201,1,250,2,64,23,196,4,196,248,22,181,3,198,28, +249,22,128,4,23,197,2,23,195,4,248,22,90,194,28,249,22,136,9,7,47, +249,22,157,7,23,198,2,23,199,2,249,22,80,250,22,175,7,23,199,2,39, +23,200,2,27,249,22,175,7,23,199,1,248,22,181,3,23,201,1,19,248,22, +156,7,23,195,2,250,2,60,23,196,4,23,197,1,39,2,27,248,22,181,3, +23,197,1,28,249,22,128,4,23,195,2,23,196,4,248,22,90,195,28,249,22, +136,9,7,47,249,22,157,7,23,199,2,23,197,2,249,22,80,250,22,175,7, +23,200,2,39,23,198,2,27,249,22,175,7,23,200,1,248,22,181,3,23,199, +1,19,248,22,156,7,23,195,2,250,2,64,23,196,4,23,197,1,39,2,27, +248,22,181,3,23,195,1,28,249,22,128,4,23,195,2,23,197,4,248,22,90, +196,28,249,22,136,9,7,47,249,22,157,7,23,200,2,23,197,2,249,22,80, +250,22,175,7,23,201,2,39,23,198,2,248,2,56,249,22,175,7,23,201,1, +248,22,181,3,23,199,1,250,2,59,23,198,4,198,248,22,181,3,196,19,248, +22,156,7,23,195,2,28,249,22,128,4,39,23,195,4,248,22,90,194,28,249, +22,136,9,7,47,249,22,157,7,23,198,2,39,249,22,80,250,22,175,7,23, +199,2,39,39,27,249,22,175,7,23,199,1,40,19,248,22,156,7,23,195,2, +250,2,57,23,196,4,23,197,1,39,2,28,249,22,128,4,40,23,195,4,248, +22,90,194,28,249,22,136,9,7,47,249,22,157,7,23,198,2,40,249,22,80, +250,22,175,7,23,199,2,39,40,248,2,56,249,22,175,7,23,199,1,41,250, +2,59,23,196,4,196,41,2,28,249,22,128,4,23,197,2,23,195,4,248,22, +90,194,28,249,22,136,9,7,47,249,22,157,7,23,198,2,23,199,2,249,22, +80,250,22,175,7,23,199,2,39,23,200,2,248,2,56,249,22,175,7,23,199, +1,248,22,181,3,23,201,1,250,2,55,23,196,4,196,248,22,181,3,198,28, +249,22,128,4,23,197,2,23,195,4,248,22,90,194,28,249,22,136,9,7,47, +249,22,157,7,23,198,2,23,199,2,249,22,80,250,22,175,7,23,199,2,39, +23,200,2,27,249,22,175,7,23,199,1,248,22,181,3,23,201,1,19,248,22, +156,7,23,195,2,250,2,55,23,196,4,23,197,1,39,2,27,248,22,181,3, +23,197,1,28,249,22,128,4,23,195,2,23,196,4,248,22,90,195,28,249,22, +136,9,7,47,249,22,157,7,23,199,2,23,197,2,249,22,80,250,22,175,7, +23,200,2,39,23,198,2,248,2,56,249,22,175,7,23,200,1,248,22,181,3, +23,199,1,250,2,54,23,197,4,197,248,22,181,3,196,32,70,88,148,39,40, +58,11,2,31,222,33,71,28,248,22,88,248,22,82,23,195,2,249,22,7,9, +248,22,161,20,23,196,1,90,144,41,11,89,146,41,39,11,27,248,22,162,20, +23,197,2,28,248,22,88,248,22,82,23,195,2,249,22,7,9,248,22,161,20, +195,90,144,41,11,89,146,41,39,11,27,248,22,162,20,196,28,248,22,88,248, +22,82,23,195,2,249,22,7,9,248,22,161,20,195,90,144,41,11,89,146,41, +39,11,248,2,70,248,22,162,20,196,249,22,7,249,22,80,248,22,161,20,199, +196,195,249,22,7,249,22,80,248,22,161,20,199,196,195,249,22,7,249,22,80, +248,22,161,20,23,200,1,23,197,1,23,196,1,27,19,248,22,156,7,23,196, +2,250,2,54,23,196,4,23,198,1,39,2,28,23,195,1,192,28,248,22,88, +248,22,82,23,195,2,249,22,7,9,248,22,161,20,23,196,1,27,248,22,162, +20,23,195,2,90,144,41,11,89,146,41,39,11,28,248,22,88,248,22,82,23, +197,2,249,22,7,9,248,22,161,20,23,198,1,27,248,22,162,20,23,197,2, +90,144,41,11,89,146,41,39,11,28,248,22,88,248,22,82,23,197,2,249,22, +7,9,248,22,161,20,197,90,144,41,11,89,146,41,39,11,248,2,70,248,22, +162,20,198,249,22,7,249,22,80,248,22,161,20,201,196,195,249,22,7,249,22, +80,248,22,161,20,23,203,1,196,195,249,22,7,249,22,80,248,22,161,20,23, +201,1,23,197,1,23,196,1,248,22,142,12,252,22,161,10,248,22,163,4,23, +200,2,248,22,159,4,23,200,2,248,22,160,4,23,200,2,248,22,161,4,23, +200,2,248,22,162,4,23,200,1,28,24,194,2,12,20,13,144,80,144,39,41, +40,80,143,39,59,89,146,40,40,10,249,22,130,5,21,94,2,32,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,27,28,23,195,2,28,249,22,169,9,23,197,2,80, +143,42,55,86,94,23,195,1,80,143,40,56,27,248,22,153,5,23,197,2,27, +28,248,22,78,23,195,2,248,22,161,20,23,195,1,23,194,1,28,248,22,173, +15,23,194,2,90,144,42,11,89,146,42,39,11,248,22,130,16,23,197,1,86, +95,20,18,144,11,80,143,45,55,199,20,18,144,11,80,143,45,56,192,192,11, +11,28,23,193,2,192,86,94,23,193,1,27,247,22,177,5,28,23,193,2,192, +86,94,23,193,1,247,22,151,16,90,144,42,11,89,146,42,39,11,248,22,130, +16,23,198,2,86,95,23,195,1,23,193,1,28,249,22,166,16,0,11,35,114, +120,34,91,46,93,115,115,36,34,248,22,178,15,23,197,1,249,80,144,44,61, +42,23,199,1,2,26,196,249,80,144,41,57,42,195,10,249,22,12,23,196,1, +80,144,41,54,41,86,96,28,248,22,151,5,23,196,2,12,250,22,180,11,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,144,14,23,197,2,10,12, +250,22,180,11,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,158,2,80,144,44,44,41,248,22,191,16, +247,22,143,14,11,27,28,23,194,2,23,194,1,86,94,23,194,1,27,249,22, +80,247,22,138,2,247,22,138,2,86,94,250,22,156,2,80,144,46,44,41,248, +22,191,16,247,22,143,14,195,192,86,94,250,22,156,2,248,22,81,23,197,2, +23,200,2,70,100,101,99,108,97,114,101,100,28,23,198,2,27,28,248,22,78, +248,22,153,5,23,200,2,248,22,152,5,248,22,81,248,22,153,5,23,201,1, +23,198,1,27,250,22,158,2,80,144,47,44,41,248,22,191,16,23,204,1,11, +28,23,193,2,27,250,22,158,2,248,22,82,23,198,1,23,198,2,11,28,23, +193,2,250,22,156,2,248,22,162,20,23,200,1,23,198,1,23,196,1,12,12, +12,86,94,251,22,137,12,247,22,141,12,67,101,114,114,111,114,6,69,69,100, +101,102,97,117,108,116,32,109,111,100,117,108,101,32,110,97,109,101,32,114,101, +115,111,108,118,101,114,32,99,97,108,108,101,100,32,119,105,116,104,32,116,104, +114,101,101,32,97,114,103,117,109,101,110,116,115,32,40,100,101,112,114,101,99, +97,116,101,100,41,11,251,24,197,1,23,198,1,23,199,1,23,200,1,10,32, +81,88,148,39,41,50,11,78,102,108,97,116,116,101,110,45,115,117,98,45,112, +97,116,104,222,33,84,32,82,88,148,39,43,57,11,2,31,222,33,83,28,248, +22,88,23,197,2,28,248,22,88,195,192,249,22,80,194,248,22,95,197,28,249, +22,171,9,248,22,81,23,199,2,2,35,28,248,22,88,23,196,2,86,95,23, +196,1,23,195,1,250,22,176,11,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,91,2,34,28,249,22,171,9,23,201, +2,2,36,23,199,1,28,248,22,173,15,23,200,2,23,199,1,249,22,90,28, +248,22,64,23,202,2,2,5,2,37,23,201,1,23,200,1,251,2,82,196,197, +248,22,82,199,248,22,162,20,200,251,2,82,196,197,249,22,80,248,22,161,20, +202,200,248,22,162,20,200,251,2,82,196,197,9,197,27,250,22,176,7,27,28, +23,199,2,28,247,22,129,12,248,80,144,47,58,42,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,177,16, +0,7,35,114,120,34,92,110,34,23,203,1,249,22,137,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,172,13,28,23,196,2,251,22,180,12,23,198,1,247,22,27, +248,22,90,23,201,1,23,199,1,86,94,23,196,1,250,22,143,13,23,197,1, +247,22,27,23,198,1,32,86,88,148,8,36,40,53,11,69,115,115,45,62,114, +107,116,222,33,87,19,248,22,156,7,194,28,249,22,132,4,23,195,4,42,28, +249,22,169,9,7,46,249,22,157,7,197,249,22,184,3,23,199,4,42,28,28, +249,22,169,9,7,115,249,22,157,7,197,249,22,184,3,23,199,4,41,249,22, +169,9,7,115,249,22,157,7,197,249,22,184,3,23,199,4,40,11,249,22,176, +7,250,22,175,7,198,39,249,22,184,3,23,200,4,42,2,40,193,193,193,2, +28,249,22,159,7,194,2,36,2,27,28,249,22,159,7,194,2,35,64,117,112, +192,0,8,35,114,120,34,91,46,93,34,32,90,88,148,8,36,40,50,11,2, +31,222,33,91,28,248,22,88,23,194,2,9,250,22,91,6,4,4,10,32,32, +32,248,22,177,15,248,22,103,23,198,2,248,2,90,248,22,162,20,23,198,1, +28,249,22,171,9,248,22,82,23,200,2,23,197,1,28,249,22,169,9,248,22, +161,20,23,200,1,23,196,1,251,22,176,11,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,176,7,248,2,90,248,22,95,23,201,1,12,12,247,23,193,1,250,22, +157,4,11,196,195,20,13,144,80,144,49,53,41,249,22,80,249,22,80,23,198, +1,23,202,1,23,195,1,20,13,144,80,144,49,41,40,252,80,144,54,42,40, +249,22,31,11,80,144,56,41,40,22,191,4,23,201,2,22,129,5,248,28,23, +208,2,20,20,94,88,148,8,36,40,49,11,9,223,15,33,94,23,208,1,86, +94,23,208,1,22,7,28,248,22,64,23,207,2,23,206,1,28,28,248,22,78, +23,207,2,249,22,169,9,248,22,161,20,23,209,2,2,32,11,23,206,1,86, +94,23,206,1,28,248,22,151,5,23,203,2,27,248,22,153,5,23,204,2,28, +248,22,64,193,249,22,90,2,5,194,192,23,202,2,249,247,22,176,5,23,201, +1,27,248,22,68,248,22,177,15,23,202,1,28,23,204,2,28,250,22,158,2, +248,22,161,20,23,202,1,23,202,1,11,249,22,80,11,205,249,22,80,194,205, +192,86,96,28,248,22,161,5,23,196,2,12,28,248,22,155,4,23,198,2,250, +22,178,11,11,6,15,15,98,97,100,32,109,111,100,117,108,101,32,112,97,116, +104,23,200,2,250,22,180,11,2,22,2,33,23,198,2,28,28,23,196,2,248, +22,151,5,23,197,2,10,12,250,22,180,11,2,22,6,31,31,40,111,114,47, +99,32,35,102,32,114,101,115,111,108,118,101,100,45,109,111,100,117,108,101,45, +112,97,116,104,63,41,23,199,2,28,28,23,197,2,248,22,155,4,23,198,2, +10,12,250,22,180,11,2,22,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,78,23,196,2,249,22,169, +9,248,22,161,20,23,198,2,2,5,11,86,97,23,198,1,23,197,1,23,196, +1,23,193,1,248,22,152,5,248,22,102,23,197,1,28,28,248,22,78,23,196, +2,28,249,22,169,9,248,22,161,20,23,198,2,2,34,28,248,22,78,248,22, +102,23,197,2,249,22,169,9,248,22,106,23,198,2,2,5,11,11,11,86,97, +23,198,1,23,197,1,23,196,1,23,193,1,248,22,152,5,249,2,81,248,22, +119,23,199,2,248,22,104,23,199,1,28,28,248,22,78,23,196,2,28,249,22, +169,9,248,22,161,20,23,198,2,2,34,28,28,249,22,171,9,248,22,102,23, +198,2,2,36,10,249,22,171,9,248,22,102,23,198,2,2,35,28,23,196,2, +27,248,22,153,5,23,198,2,28,248,22,64,193,10,28,248,22,78,193,248,22, +64,248,22,161,20,194,11,11,11,11,11,86,96,23,198,1,23,197,1,23,193, +1,27,248,22,153,5,23,198,1,248,22,152,5,249,2,81,28,248,22,78,23, +197,2,248,22,161,20,23,197,2,23,196,2,27,28,249,22,171,9,248,22,102, +23,203,2,2,35,248,22,162,20,200,248,22,104,200,28,248,22,78,23,198,2, +249,22,94,248,22,162,20,199,194,192,28,28,248,22,78,23,196,2,249,22,169, +9,248,22,161,20,23,198,2,2,38,11,86,94,248,80,144,41,8,28,42,23, +194,2,253,24,199,1,23,201,1,23,202,1,23,203,1,23,204,1,11,80,143, +46,59,28,28,248,22,78,23,196,2,28,249,22,169,9,248,22,161,20,23,198, +2,2,34,28,248,22,78,248,22,102,23,197,2,249,22,169,9,248,22,106,23, +198,2,2,38,11,11,11,86,94,248,80,144,41,8,28,42,23,194,2,253,24, +199,1,248,22,102,23,202,2,23,202,1,23,203,1,23,204,1,248,22,104,23, +202,1,80,143,46,59,86,94,23,193,1,27,88,148,8,36,40,57,8,240,0, +0,8,0,1,19,115,104,111,119,45,99,111,108,108,101,99,116,105,111,110,45, +101,114,114,225,2,5,3,33,85,27,28,248,22,78,23,198,2,28,249,22,169, +9,2,34,248,22,161,20,23,200,2,27,248,22,102,23,199,2,28,28,249,22, +171,9,23,195,2,2,36,10,249,22,171,9,23,195,2,2,35,86,94,23,193, +1,28,23,199,2,27,248,22,153,5,23,201,2,28,248,22,78,193,248,22,161, +20,193,192,250,22,176,11,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,78,23,199,2,28,249,22,169,9,2,34,248,22, +161,20,23,201,2,27,28,28,28,249,22,171,9,248,22,102,23,202,2,2,36, +10,249,22,171,9,248,22,102,23,202,2,2,35,23,200,2,11,27,248,22,153, +5,23,202,2,27,28,249,22,171,9,248,22,102,23,204,2,2,35,248,22,162, +20,23,202,1,248,22,104,23,202,1,28,248,22,78,23,195,2,249,2,81,248, +22,161,20,23,197,2,249,22,94,248,22,162,20,23,199,1,23,197,1,249,2, +81,23,196,1,23,195,1,249,2,81,2,36,28,249,22,171,9,248,22,102,23, +204,2,2,35,248,22,162,20,23,202,1,248,22,104,23,202,1,28,248,22,78, +193,248,22,162,20,193,11,11,11,27,28,248,22,64,23,196,2,27,248,80,144, +46,51,42,249,22,80,23,199,2,248,22,191,16,247,22,143,14,28,23,193,2, +192,86,94,23,193,1,90,144,41,11,89,146,41,39,11,249,80,144,49,57,42, +248,22,71,23,201,2,11,27,28,248,22,88,23,195,2,2,39,249,22,176,7, +23,197,2,2,40,252,80,144,53,8,23,42,23,205,1,28,248,22,88,23,200, +2,23,200,1,86,94,23,200,1,248,22,81,23,200,2,28,248,22,88,23,200, +2,86,94,23,199,1,9,248,22,82,23,200,1,23,198,1,10,28,248,22,153, +7,23,196,2,86,94,23,196,1,27,248,80,144,46,8,29,42,23,202,2,27, +248,80,144,47,51,42,249,22,80,23,200,2,23,197,2,28,23,193,2,192,86, +94,23,193,1,90,144,41,11,89,146,41,39,11,249,80,144,50,57,42,23,201, +2,11,28,248,22,88,23,194,2,86,94,23,193,1,249,22,191,15,23,198,1, +248,2,86,23,197,1,250,22,1,22,191,15,23,199,1,249,22,94,249,22,2, +32,0,88,148,8,36,40,47,11,9,222,33,88,23,200,1,248,22,90,248,2, +86,23,201,1,28,248,22,173,15,23,196,2,86,94,23,196,1,248,80,144,45, +8,30,42,248,22,137,16,28,248,22,134,16,23,198,2,23,197,2,249,22,135, +16,23,199,2,248,80,144,49,8,29,42,23,205,2,28,249,22,169,9,248,22, +81,23,198,2,2,32,27,248,80,144,46,51,42,249,22,80,23,199,2,248,22, +191,16,247,22,143,14,28,23,193,2,192,86,94,23,193,1,90,144,41,11,89, +146,41,39,11,249,80,144,49,57,42,248,22,102,23,201,2,11,27,28,248,22, +88,248,22,104,23,201,2,28,248,22,88,23,195,2,249,22,170,16,2,89,23, +197,2,11,10,27,28,23,194,2,248,2,86,23,197,2,28,248,22,88,23,196, +2,2,39,28,249,22,170,16,2,89,23,198,2,248,2,86,23,197,2,249,22, +176,7,23,198,2,2,40,27,28,23,195,1,86,94,23,197,1,249,22,94,28, +248,22,88,248,22,104,23,205,2,21,93,6,5,5,109,122,108,105,98,249,22, +1,22,94,249,22,2,80,144,56,8,31,42,248,22,104,23,208,2,23,198,1, +28,248,22,88,23,197,2,86,94,23,196,1,248,22,90,23,198,1,86,94,23, +197,1,23,196,1,252,80,144,55,8,23,42,23,207,1,248,22,81,23,199,2, +248,22,162,20,23,199,1,23,199,1,10,28,249,22,169,9,248,22,161,20,23, +198,2,2,37,248,80,144,45,8,30,42,248,22,137,16,249,22,135,16,248,22, +139,16,248,22,102,23,201,2,248,80,144,49,8,29,42,23,205,2,12,86,94, +28,28,248,22,173,15,23,194,2,10,248,22,184,8,23,194,2,12,28,23,201, +2,250,22,178,11,69,114,101,113,117,105,114,101,249,22,137,8,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,81,23,199,2,6,0,0,23,204,2,250,22,180,11,2,22,2,33,23,198, +2,27,28,248,22,184,8,23,195,2,249,22,189,8,23,196,2,39,249,22,137, +16,248,22,138,16,23,197,2,11,27,28,248,22,184,8,23,196,2,249,22,189, +8,23,197,2,40,248,80,144,47,8,24,42,23,195,2,90,144,42,11,89,146, +42,39,11,28,248,22,184,8,23,199,2,250,22,7,2,41,249,22,189,8,23, +203,2,41,2,41,248,22,130,16,23,198,2,86,95,23,195,1,23,193,1,27, +28,248,22,184,8,23,200,2,249,22,189,8,23,201,2,42,249,80,144,52,61, +42,23,197,2,5,0,27,28,248,22,184,8,23,201,2,249,22,189,8,23,202, +2,43,248,22,152,5,23,200,2,27,250,22,158,2,80,144,55,44,41,248,22, +191,16,247,22,143,14,11,27,28,23,194,2,23,194,1,86,94,23,194,1,27, +249,22,80,247,22,138,2,247,22,138,2,86,94,250,22,156,2,80,144,57,44, +41,248,22,191,16,247,22,143,14,195,192,27,28,23,204,2,248,22,152,5,249, +22,80,248,22,153,5,23,200,2,23,207,2,23,196,2,86,95,28,23,212,2, +28,250,22,158,2,248,22,81,23,198,2,195,11,86,96,23,211,1,23,204,1, +23,194,1,12,27,251,22,31,11,80,144,59,53,41,9,28,248,22,15,80,144, +60,54,41,80,144,59,54,41,247,22,17,27,248,22,191,16,247,22,143,14,86, +94,249,22,3,88,148,8,36,40,57,11,9,226,13,12,2,3,33,92,23,196, +2,248,28,248,22,15,80,144,58,54,41,32,0,88,148,39,40,45,11,9,222, +33,93,80,144,57,8,32,42,20,20,98,88,148,39,39,8,25,8,240,12,64, +0,0,9,233,18,21,14,15,12,11,7,6,4,1,2,33,95,23,195,1,23, +194,1,23,197,1,23,207,1,23,214,1,12,28,28,248,22,184,8,23,204,1, +86,94,23,212,1,11,28,23,212,1,28,248,22,153,7,23,206,2,10,28,248, +22,64,23,206,2,10,28,248,22,78,23,206,2,249,22,169,9,248,22,161,20, +23,208,2,2,32,11,11,249,80,144,56,52,42,28,248,22,153,7,23,208,2, +249,22,80,23,209,1,248,80,144,59,8,29,42,23,215,1,86,94,23,212,1, +249,22,80,23,209,1,248,22,191,16,247,22,143,14,252,22,186,8,23,209,1, +23,208,1,23,206,1,23,204,1,23,203,1,12,192,86,96,20,18,144,11,80, +143,39,59,248,80,144,40,8,27,40,249,22,31,11,80,144,42,41,40,248,22, +190,4,80,144,40,60,41,248,22,176,5,80,144,40,40,42,248,22,142,15,80, +144,40,48,42,20,18,144,11,80,143,39,59,248,80,144,40,8,27,40,249,22, +31,11,80,144,42,41,40,20,18,144,11,80,143,39,59,248,80,144,40,8,27, +40,249,22,31,11,80,144,42,41,40,144,39,20,121,145,2,1,39,16,1,11, +16,0,20,27,15,56,9,2,2,2,2,29,11,11,11,11,11,11,11,9,9, +11,11,11,10,41,80,143,39,39,20,121,145,2,1,44,16,28,2,3,2,4, +30,2,6,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,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,4,30,2,7,74,112,97, +116,104,45,115,116,114,105,110,103,63,42,196,15,2,8,30,2,7,73,114,101, +114,111,111,116,45,112,97,116,104,44,196,16,30,2,7,77,112,97,116,104,45, +97,100,100,45,115,117,102,102,105,120,44,196,12,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,2,22,30, +2,7,1,19,112,97,116,104,45,114,101,112,108,97,99,101,45,115,117,102,102, +105,120,44,196,14,30,2,7,75,102,105,110,100,45,99,111,108,45,102,105,108, +101,49,196,4,30,2,7,78,110,111,114,109,97,108,45,99,97,115,101,45,112, +97,116,104,42,196,11,2,23,2,24,30,2,6,76,114,101,112,97,114,97,109, +101,116,101,114,105,122,101,11,7,16,0,40,42,39,16,0,39,16,16,2,15, +2,16,2,8,2,12,2,17,2,18,2,11,2,4,2,10,2,3,2,20,2, +13,2,14,2,9,2,19,2,22,55,11,11,11,16,3,2,23,2,21,2,24, +16,3,11,11,11,16,3,2,23,2,21,2,24,42,42,40,12,11,11,16,0, +16,0,16,0,39,39,11,12,11,11,16,0,16,0,16,0,39,39,16,24,20, +15,16,2,248,22,180,8,71,115,111,45,115,117,102,102,105,120,80,144,39,39, +40,20,15,16,2,88,148,39,41,8,39,8,189,3,2,4,223,0,33,50,80, +144,39,40,40,20,15,16,2,32,0,88,148,8,36,44,55,11,2,9,222,33, +51,80,144,39,47,40,20,15,16,2,20,28,143,32,0,88,148,8,36,40,45, +11,2,10,222,192,32,0,88,148,8,36,40,45,11,2,10,222,192,80,144,39, +48,40,20,15,16,2,247,22,141,2,80,144,39,44,40,20,15,16,2,8,128, +8,80,144,39,49,40,20,15,16,2,249,22,185,8,8,128,8,11,80,144,39, +50,40,20,15,16,2,88,148,8,36,40,53,8,128,32,2,13,223,0,33,52, +80,144,39,51,40,20,15,16,2,88,148,8,36,41,57,8,128,32,2,14,223, +0,33,53,80,144,39,52,40,20,15,16,2,247,22,76,80,144,39,53,40,20, +15,16,2,248,22,16,76,109,111,100,117,108,101,45,108,111,97,100,105,110,103, +80,144,39,54,40,20,15,16,2,11,80,143,39,55,20,15,16,2,11,80,143, +39,56,20,15,16,2,32,0,88,148,39,41,60,11,2,19,222,33,72,80,144, +39,57,40,20,15,16,2,32,0,88,148,8,36,40,52,11,2,20,222,33,73, +80,144,39,58,40,20,15,16,2,11,80,143,39,59,20,15,16,2,88,149,8, +34,40,48,8,240,4,0,16,0,1,21,112,114,101,112,45,112,108,97,110,101, +116,45,114,101,115,111,108,118,101,114,33,40,224,1,0,33,74,80,144,39,8, +28,42,20,15,16,2,88,148,39,40,53,8,240,0,0,3,0,69,103,101,116, +45,100,105,114,223,0,33,75,80,144,39,8,29,42,20,15,16,2,88,148,39, +40,52,8,240,0,0,64,0,74,112,97,116,104,45,115,115,45,62,114,107,116, +223,0,33,76,80,144,39,8,30,42,20,15,16,2,88,148,8,36,40,48,8, +240,0,0,4,0,9,223,0,33,77,80,144,39,8,31,42,20,15,16,2,88, +148,39,40,48,8,240,0,128,0,0,9,223,0,33,78,80,144,39,8,32,42, +20,15,16,2,27,11,20,19,143,39,90,144,40,10,89,146,40,39,10,20,26, +96,2,22,88,148,8,36,41,57,8,32,9,224,2,1,33,79,88,148,39,42, +52,11,9,223,0,33,80,88,148,39,43,8,32,16,4,8,240,44,240,0,0, +8,240,220,241,0,0,40,39,9,224,2,1,33,96,207,80,144,39,60,40,20, +15,16,2,88,148,39,39,48,16,2,8,134,8,8,176,32,2,23,223,0,33, +97,80,144,39,8,25,40,20,15,16,2,20,28,143,88,148,8,36,39,48,16, +2,43,8,144,32,2,24,223,0,33,98,88,148,8,36,39,48,16,2,43,8, +144,32,2,24,223,0,33,99,80,144,39,8,26,40,96,29,94,2,5,70,35, +37,107,101,114,110,101,108,11,29,94,2,5,71,35,37,109,105,110,45,115,116, +120,11,2,7,2,6,9,9,9,39,9,0}; + EVAL_ONE_SIZED_STR((char *)expr, 9713); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,9,54,46,50,46,57,48,48,46,54,84,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,9,54,46,50,46,57,48,48,46,56,84,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,1,0,0,8,0, -18,0,24,0,38,0,52,0,64,0,84,0,98,0,113,0,126,0,131,0,134, -0,146,0,229,0,236,0,6,1,0,0,196,1,0,0,3,1,5,105,110,115, +18,0,24,0,38,0,52,0,64,0,84,0,98,0,113,0,126,0,131,0,135, +0,147,0,231,0,238,0,8,1,0,0,198,1,0,0,3,1,5,105,110,115, 112,48,71,35,37,98,117,105,108,116,105,110,67,113,117,111,116,101,29,94,2, 3,70,35,37,107,101,114,110,101,108,11,29,94,2,3,70,35,37,101,120,112, 111,98,115,11,29,94,2,3,68,35,37,98,111,111,116,11,29,94,2,3,76, 35,37,112,108,97,99,101,45,115,116,114,117,99,116,11,29,94,2,3,70,35, 37,112,97,114,97,109,122,11,29,94,2,3,71,35,37,110,101,116,119,111,114, 107,11,29,94,2,3,69,35,37,117,116,105,108,115,11,38,11,93,2,12,36, -12,39,38,13,93,143,16,3,39,2,14,2,2,39,36,14,150,40,143,2,15, -16,4,2,4,39,39,2,1,143,2,15,16,4,2,5,39,39,2,1,143,2, -15,16,4,2,6,39,39,2,1,143,2,15,16,4,2,7,39,39,2,1,143, -2,15,16,4,2,8,39,39,2,1,143,2,15,16,4,2,9,39,39,2,1, -143,2,15,16,4,2,10,39,39,2,1,16,0,38,15,143,2,14,2,11,18, -143,16,2,143,10,16,3,9,2,11,2,13,143,11,16,3,9,9,2,13,16, -3,9,9,9,144,39,20,120,145,2,1,39,16,1,11,16,0,20,26,15,56, -9,2,2,2,2,29,11,11,11,11,11,11,11,9,9,11,11,11,33,16,39, -80,143,39,39,20,120,145,2,1,39,16,0,16,0,40,42,39,16,0,39,16, -0,39,11,11,11,16,0,16,0,16,0,39,39,40,12,11,11,16,0,16,0, -16,0,39,39,11,12,11,11,16,0,16,0,16,0,39,39,16,0,104,2,4, -2,5,29,94,2,3,71,35,37,102,111,114,101,105,103,110,11,29,94,2,3, -70,35,37,117,110,115,97,102,101,11,29,94,2,3,71,35,37,102,108,102,120, -110,117,109,11,2,6,2,7,2,8,2,9,2,10,29,94,2,3,69,35,37, -112,108,97,99,101,11,29,94,2,3,71,35,37,102,117,116,117,114,101,115,11, -9,9,9,39,9,0}; - EVAL_ONE_SIZED_STR((char *)expr, 530); +12,0,39,38,13,93,143,16,3,39,2,14,2,2,39,36,14,1,150,40,143, +2,15,16,4,2,4,39,39,2,1,143,2,15,16,4,2,5,39,39,2,1, +143,2,15,16,4,2,6,39,39,2,1,143,2,15,16,4,2,7,39,39,2, +1,143,2,15,16,4,2,8,39,39,2,1,143,2,15,16,4,2,9,39,39, +2,1,143,2,15,16,4,2,10,39,39,2,1,16,0,38,15,143,2,14,2, +11,18,143,16,2,143,10,16,3,9,2,11,2,13,143,11,16,3,9,9,2, +13,16,3,9,9,9,144,39,20,121,145,2,1,39,16,1,11,16,0,20,27, +15,56,9,2,2,2,2,29,11,11,11,11,11,11,11,9,9,11,11,11,33, +16,39,80,143,39,39,20,121,145,2,1,39,16,0,16,0,40,42,39,16,0, +39,16,0,39,11,11,11,16,0,16,0,16,0,39,39,40,12,11,11,16,0, +16,0,16,0,39,39,11,12,11,11,16,0,16,0,16,0,39,39,16,0,104, +2,4,2,5,29,94,2,3,71,35,37,102,111,114,101,105,103,110,11,29,94, +2,3,70,35,37,117,110,115,97,102,101,11,29,94,2,3,71,35,37,102,108, +102,120,110,117,109,11,2,6,2,7,2,8,2,9,2,10,29,94,2,3,69, +35,37,112,108,97,99,101,11,29,94,2,3,71,35,37,102,117,116,117,114,101, +115,11,9,9,9,39,9,0}; + EVAL_ONE_SIZED_STR((char *)expr, 532); } diff --git a/racket/src/racket/src/env.c b/racket/src/racket/src/env.c index 41e72ccfaa..4d4f541641 100644 --- a/racket/src/racket/src/env.c +++ b/racket/src/racket/src/env.c @@ -999,6 +999,7 @@ scheme_new_module_env(Scheme_Env *env, Scheme_Module *m, menv->module = m; menv->instance_env = env; + menv->reader_env = (env->reader_env ? env->reader_env : env); if (new_exp_module_tree) { /* It would be nice to share the label env with `env`, but we need @@ -1065,6 +1066,7 @@ void scheme_prepare_exp_env(Scheme_Env *env) eenv->template_env = env; eenv->label_env = env->label_env; eenv->instance_env = env->instance_env; + eenv->reader_env = (env->reader_env ? env->reader_env : env); scheme_prepare_env_stx_context(env); mc = scheme_module_context_at_phase(env->stx_context, scheme_env_phase(eenv)); @@ -1113,6 +1115,7 @@ void scheme_prepare_template_env(Scheme_Env *env) eenv->exp_env = env; eenv->label_env = env->label_env; eenv->instance_env = env->instance_env; + eenv->reader_env = (env->reader_env ? env->reader_env : env); if (env->disallow_unbound) eenv->disallow_unbound = env->disallow_unbound; @@ -1149,6 +1152,7 @@ void scheme_prepare_label_env(Scheme_Env *env) lenv->label_env = lenv; lenv->template_env = lenv; lenv->instance_env = env->instance_env; + lenv->reader_env = (env->reader_env ? env->reader_env : env); } } @@ -1276,6 +1280,7 @@ Scheme_Env *scheme_copy_module_env(Scheme_Env *menv, Scheme_Env *ns, Scheme_Obje scheme_prepare_label_env(ns); menv2->label_env = ns->label_env; + menv2->reader_env = (ns->reader_env ? ns->reader_env : ns); return menv2; } diff --git a/racket/src/racket/src/fun.c b/racket/src/racket/src/fun.c index a1f0002fe0..8e3a9123c0 100644 --- a/racket/src/racket/src/fun.c +++ b/racket/src/racket/src/fun.c @@ -331,7 +331,6 @@ scheme_init_fun (Scheme_Env *env) 1, 1, 0, -1); scheme_add_global_constant("call-with-escape-continuation", o, env); - scheme_add_global_constant("call/ec", o, env); REGISTER_SO(internal_call_cc_prim); internal_call_cc_prim = scheme_make_prim_w_arity2(internal_call_cc, @@ -351,7 +350,6 @@ scheme_init_fun (Scheme_Env *env) 0, -1); scheme_add_global_constant("call-with-current-continuation", o, env); - scheme_add_global_constant("call/cc", o, env); scheme_add_global_constant("continuation?", scheme_make_folding_prim(continuation_p, diff --git a/racket/src/racket/src/list.c b/racket/src/racket/src/list.c index 1e9bb352d8..ded6ceac34 100644 --- a/racket/src/racket/src/list.c +++ b/racket/src/racket/src/list.c @@ -604,12 +604,12 @@ scheme_init_list (Scheme_Env *env) scheme_add_global_constant("hash-map", scheme_make_noncm_prim(hash_table_map, "hash-map", - 2, 2), + 2, 3), env); scheme_add_global_constant("hash-for-each", scheme_make_noncm_prim(hash_table_for_each, "hash-for-each", - 2, 2), + 2, 3), env); scheme_add_global_constant("hash-iterate-first", @@ -2552,10 +2552,11 @@ static void no_post_key(const char *name, Scheme_Object *key, int chap) static Scheme_Object *do_map_hash_table(int argc, Scheme_Object *argv[], char *name, - int keep) + int keep, + int try_sorted) { int i; - Scheme_Object *f; + Scheme_Object *f, **sorted_keys; Scheme_Object *first, *last = NULL, *v, *p[2], *obj, *chaperone; obj = argv[0]; @@ -2576,7 +2577,38 @@ static Scheme_Object *do_map_hash_table(int argc, else first = scheme_void; - if (SCHEME_BUCKTP(obj)) { + /* In simple cases, sort keys. This is useful for quasiquote + expansion over hash tables, for example. */ + if (try_sorted && !chaperone && (SCHEME_HASHTP(obj) || SCHEME_HASHTRP(obj))) + sorted_keys = scheme_extract_sorted_keys(obj); + else + sorted_keys = NULL; + + if (sorted_keys) { + if (sorted_keys) { + int i, count; + count = (SCHEME_HASHTP(obj) ? ((Scheme_Hash_Table *)obj)->count : ((Scheme_Hash_Tree *)obj)->count); + for (i = 0; i < count; i++) { + if (SCHEME_HASHTP(obj)) + v = scheme_hash_get((Scheme_Hash_Table *)obj, sorted_keys[i]); + else + v = scheme_hash_tree_get((Scheme_Hash_Tree *)obj, sorted_keys[i]); + if (v) { + p[0] = sorted_keys[i]; + p[1] = v; + v = _scheme_apply(f, 2, p); + if (keep) { + v = lcons(v, scheme_null); + if (last) + SCHEME_CDR(last) = v; + else + first = v; + last = v; + } + } + } + } + } else if (SCHEME_BUCKTP(obj)) { Scheme_Bucket_Table *hash; Scheme_Bucket *bucket; @@ -2683,12 +2715,12 @@ static Scheme_Object *do_map_hash_table(int argc, static Scheme_Object *hash_table_map(int argc, Scheme_Object *argv[]) { - return do_map_hash_table(argc, argv, "hash-map", 1); + return do_map_hash_table(argc, argv, "hash-map", 1, (argc > 2) && SCHEME_TRUEP(argv[2])); } static Scheme_Object *hash_table_for_each(int argc, Scheme_Object *argv[]) { - return do_map_hash_table(argc, argv, "hash-for-each", 0); + return do_map_hash_table(argc, argv, "hash-for-each", 0, (argc > 2) && SCHEME_TRUEP(argv[2])); } static Scheme_Object *hash_table_next(const char *name, mzlonglong start, int argc, Scheme_Object *argv[]) diff --git a/racket/src/racket/src/marshal.c b/racket/src/racket/src/marshal.c index 60ef95c1f6..1b5050e07d 100644 --- a/racket/src/racket/src/marshal.c +++ b/racket/src/racket/src/marshal.c @@ -792,7 +792,6 @@ static Scheme_Object *write_compiled_closure(Scheme_Object *obj) case scheme_toplevel_type: case scheme_local_type: case scheme_local_unbox_type: - case scheme_integer_type: case scheme_true_type: case scheme_false_type: case scheme_void_type: @@ -800,7 +799,10 @@ static Scheme_Object *write_compiled_closure(Scheme_Object *obj) ds = code; break; default: - ds = NULL; + if (SCHEME_NUMBERP(code)) + ds = code; + else + ds = NULL; break; } @@ -850,9 +852,9 @@ static Scheme_Object *write_compiled_closure(Scheme_Object *obj) if (!ds) { if (mt->pass) scheme_signal_error("broken closure-data table\n"); - + code = scheme_protect_quote(data->code); - + ds = scheme_alloc_small_object(); ds->type = scheme_delay_syntax_type; SCHEME_PTR_VAL(ds) = code; @@ -1122,7 +1124,7 @@ static Scheme_Object *make_delayed_syntax(Scheme_Object *stx) { Scheme_Object *ds; Scheme_Marshal_Tables *mt; - + mt = scheme_current_thread->current_mt; if (mt->pass < 0) return stx; @@ -1255,6 +1257,7 @@ static Scheme_Object *ht_to_vector(Scheme_Object *ht) /* recurs for values in hash table; we assume that such nesting is shallow */ { intptr_t i, j, c; + Scheme_Object **sorted_keys; Scheme_Object *k, *val, *vec; if (!ht) @@ -1280,11 +1283,14 @@ static Scheme_Object *ht_to_vector(Scheme_Object *ht) vec = scheme_make_vector(2 * c, NULL); j = 0; - + + sorted_keys = scheme_extract_sorted_keys(ht); + if (SCHEME_HASHTRP(ht)) { Scheme_Hash_Tree *t = (Scheme_Hash_Tree *)ht; - for (i = scheme_hash_tree_next(t, -1); i != -1; i = scheme_hash_tree_next(t, i)) { - scheme_hash_tree_index(t, i, &k, &val); + for (i = 0; i < c; i++) { + k = sorted_keys[i]; + val = scheme_hash_tree_get(t, k); if (SCHEME_HASHTRP(val) || SCHEME_HASHTP(val)) val = ht_to_vector(val); else if (!SAME_OBJ(val, scheme_true)) @@ -1294,16 +1300,15 @@ static Scheme_Object *ht_to_vector(Scheme_Object *ht) } } else { Scheme_Hash_Table *t = (Scheme_Hash_Table *)ht; - for (i = t->size; i--; ) { - if (t->vals[i]) { - val = t->vals[i]; - if (SCHEME_HASHTRP(val) || SCHEME_HASHTP(val)) - val = ht_to_vector(val); - else if (!SAME_OBJ(val, scheme_true)) - val = make_delayed_syntax(val); - SCHEME_VEC_ELS(vec)[j++] = t->keys[i]; - SCHEME_VEC_ELS(vec)[j++] = val; - } + for (i = 0; i < c; i++) { + k = sorted_keys[i]; + val = scheme_hash_get(t, k); + if (SCHEME_HASHTRP(val) || SCHEME_HASHTP(val)) + val = ht_to_vector(val); + else if (!SAME_OBJ(val, scheme_true)) + val = make_delayed_syntax(val); + SCHEME_VEC_ELS(vec)[j++] = k; + SCHEME_VEC_ELS(vec)[j++] = val; } } @@ -1316,17 +1321,18 @@ static Scheme_Object *write_module(Scheme_Object *obj) Scheme_Module_Phase_Exports *pt; Scheme_Object *l, *v, *phase; int i, j, k, count, cnt; + Scheme_Object **sorted_keys; l = scheme_null; cnt = 0; if (m->other_requires) { - for (i = 0; i < m->other_requires->size; i++) { - if (m->other_requires->vals[i]) { - cnt++; - l = scheme_make_pair(m->other_requires->keys[i], - scheme_make_pair(m->other_requires->vals[i], - l)); - } + sorted_keys = scheme_extract_sorted_keys((Scheme_Object *)m->other_requires); + cnt = m->other_requires->count; + for (i = 0; i < cnt; i++) { + l = scheme_make_pair(sorted_keys[i], + scheme_make_pair(scheme_hash_get(m->other_requires, + sorted_keys[i]), + l)); } } l = cons(scheme_make_integer(cnt), l); @@ -1341,7 +1347,11 @@ static Scheme_Object *write_module(Scheme_Object *obj) } cnt = 0; - for (k = -3; k < (m->me->other_phases ? m->me->other_phases->size : 0); k++) { + if (m->me->other_phases) + sorted_keys = scheme_extract_sorted_keys((Scheme_Object *)m->me->other_phases); + else + sorted_keys = NULL; + for (k = -3; k < (m->me->other_phases ? m->me->other_phases->count : 0); k++) { switch (k) { case -3: phase = scheme_make_integer(-1); @@ -1356,8 +1366,8 @@ static Scheme_Object *write_module(Scheme_Object *obj) pt = m->me->rt; break; default: - phase = m->me->other_phases->keys[k]; - pt = (Scheme_Module_Phase_Exports *)m->me->other_phases->vals[k]; + phase = sorted_keys[k]; + pt = (Scheme_Module_Phase_Exports *)scheme_hash_get(m->me->other_phases, phase); } if (pt) { diff --git a/racket/src/racket/src/module.c b/racket/src/racket/src/module.c index 6df3c0f974..bf6cc7b660 100644 --- a/racket/src/racket/src/module.c +++ b/racket/src/racket/src/module.c @@ -10617,6 +10617,9 @@ void compute_provide_arrays(Scheme_Hash_Table *all_provided, Scheme_Hash_Table * having a consistent provide arrays. */ qsort_provides(exs, exsns, exss, exps, exets, exsnoms, 0, exvcount, 1); + /* Sort syntax, too, for deterministic output */ + qsort_provides(exs, exsns, exss, exps, exets, exsnoms, exvcount, excount-exvcount, 0); + pt->num_provides = excount; pt->num_var_provides = exvcount; pt->provides = exs; @@ -11888,7 +11891,8 @@ void scheme_do_module_context_unmarshal(Scheme_Object *modidx, Scheme_Object *re Scheme_Object *bind_phase, Scheme_Object *pt_phase, Scheme_Object *src_phase, Scheme_Object *prefix, /* a sybmol; not included in `excepts` keys */ Scheme_Hash_Tree *excepts, /* NULL => empty */ - Scheme_Hash_Table *export_registry, Scheme_Object *insp_desc, + Scheme_Hash_Table *export_registry, + Scheme_Object *insp_desc, Scheme_Object *req_insp_desc, Scheme_Object *replace_at) { Scheme_Object *name; @@ -11935,7 +11939,7 @@ void scheme_do_module_context_unmarshal(Scheme_Object *modidx, Scheme_Object *re if (pt) { if (!pt->src_modidx && me->src_modidx) pt->src_modidx = me->src_modidx; - scheme_extend_module_context_with_shared(scheme_make_pair(bind_phase, insp_desc), + scheme_extend_module_context_with_shared(scheme_make_pair(bind_phase, req_insp_desc), req_modidx, pt, prefix, excepts, src_phase, context, diff --git a/racket/src/racket/src/mzmark_print.inc b/racket/src/racket/src/mzmark_print.inc index ff4420170e..fa8abafb46 100644 --- a/racket/src/racket/src/mzmark_print.inc +++ b/racket/src/racket/src/mzmark_print.inc @@ -44,6 +44,7 @@ static int mark_marshal_tables_MARK(void *p, struct NewGC *gc) { gcMARK2(mt->reachable_scopes, gc); gcMARK2(mt->reachable_scope_stack, gc); gcMARK2(mt->pending_reachable_ids, gc); + gcMARK2(mt->conditionally_reachable_scopes, gc); gcMARK2(mt->intern_map, gc); gcMARK2(mt->identity_map, gc); gcMARK2(mt->top_map, gc); @@ -65,6 +66,7 @@ static int mark_marshal_tables_FIXUP(void *p, struct NewGC *gc) { gcFIXUP2(mt->reachable_scopes, gc); gcFIXUP2(mt->reachable_scope_stack, gc); gcFIXUP2(mt->pending_reachable_ids, gc); + gcFIXUP2(mt->conditionally_reachable_scopes, gc); gcFIXUP2(mt->intern_map, gc); gcFIXUP2(mt->identity_map, gc); gcFIXUP2(mt->top_map, gc); diff --git a/racket/src/racket/src/mzmark_type.inc b/racket/src/racket/src/mzmark_type.inc index a5006620d3..1e35671a42 100644 --- a/racket/src/racket/src/mzmark_type.inc +++ b/racket/src/racket/src/mzmark_type.inc @@ -2297,6 +2297,7 @@ static int namespace_val_MARK(void *p, struct NewGC *gc) { gcMARK2(e->template_env, gc); gcMARK2(e->label_env, gc); gcMARK2(e->instance_env, gc); + gcMARK2(e->reader_env, gc); gcMARK2(e->shadowed_syntax, gc); @@ -2342,6 +2343,7 @@ static int namespace_val_FIXUP(void *p, struct NewGC *gc) { gcFIXUP2(e->template_env, gc); gcFIXUP2(e->label_env, gc); gcFIXUP2(e->instance_env, gc); + gcFIXUP2(e->reader_env, gc); gcFIXUP2(e->shadowed_syntax, gc); diff --git a/racket/src/racket/src/mzmarksrc.c b/racket/src/racket/src/mzmarksrc.c index 477e05a0d3..bcacc22f6a 100644 --- a/racket/src/racket/src/mzmarksrc.c +++ b/racket/src/racket/src/mzmarksrc.c @@ -928,6 +928,7 @@ namespace_val { gcMARK2(e->template_env, gc); gcMARK2(e->label_env, gc); gcMARK2(e->instance_env, gc); + gcMARK2(e->reader_env, gc); gcMARK2(e->shadowed_syntax, gc); @@ -1803,6 +1804,7 @@ mark_marshal_tables { gcMARK2(mt->reachable_scopes, gc); gcMARK2(mt->reachable_scope_stack, gc); gcMARK2(mt->pending_reachable_ids, gc); + gcMARK2(mt->conditionally_reachable_scopes, gc); gcMARK2(mt->intern_map, gc); gcMARK2(mt->identity_map, gc); gcMARK2(mt->top_map, gc); diff --git a/racket/src/racket/src/number.c b/racket/src/racket/src/number.c index f0eb6c7083..88f58afdb4 100644 --- a/racket/src/racket/src/number.c +++ b/racket/src/racket/src/number.c @@ -4175,7 +4175,7 @@ scheme_bitwise_shift(int argc, Scheme_Object *argv[]) v = scheme_make_bignum(i); } - if (scheme_current_thread->constant_folding) + if (scheme_current_thread->constant_folding && (shift > 100)) scheme_signal_error("too big"); return scheme_bignum_shift(v, shift); diff --git a/racket/src/racket/src/print.c b/racket/src/racket/src/print.c index bf89561d01..5228663ab4 100644 --- a/racket/src/racket/src/print.c +++ b/racket/src/racket/src/print.c @@ -182,6 +182,8 @@ static Scheme_Object *writable_struct_subs(Scheme_Object *s, int for_write, Prin #define ssQUICKp(x, isbox) (pp ? x : isbox) #define ssALLp(x, isbox) isbox +#define make_hash_table_symtab() scheme_make_hash_table_eqv() + void scheme_init_print(Scheme_Env *env) { int i; @@ -1438,7 +1440,7 @@ static int compare_keys(const void *a, const void *b) Scheme_Object *av, *bv; /* Atomic things first, because they could be used by - marshaled syntax. This cuts donw on recursive reads + marshaled syntax. Sorting cuts down on recursive reads at load time. */ # define SCHEME_FIRSTP(v) (SCHEME_SYMBOLP(v) \ || SCHEME_PATHP(v) \ @@ -1699,7 +1701,7 @@ void scheme_marshal_push_refs(Scheme_Marshal_Tables *mt) mt->st_ref_stack); mt->st_ref_stack = p; - st_refs = scheme_make_hash_table(SCHEME_hash_ptr); + st_refs = make_hash_table_symtab(); mt->st_refs = st_refs; } @@ -1739,6 +1741,39 @@ Scheme_Object *scheme_make_marshal_shared(Scheme_Object *v) return b; } +static Scheme_Object *intern_modidx(Scheme_Hash_Table *interned, Scheme_Object *modidx) +{ + Scheme_Object *l = scheme_null; + Scheme_Modidx *midx; + + while (SAME_TYPE(SCHEME_TYPE(modidx), scheme_module_index_type)) { + midx = (Scheme_Modidx *)modidx; + modidx = scheme_hash_get(interned, modidx); + if (!modidx) { + modidx = (Scheme_Object *)midx; + if (SCHEME_FALSEP(midx->path)) { + scheme_hash_set(interned, modidx, modidx); + break; + } else { + l = scheme_make_pair(modidx, l); + modidx = midx->base; + } + } else + break; + } + + while (!SCHEME_NULLP(l)) { + midx = (Scheme_Modidx *)SCHEME_CAR(l); + modidx = scheme_make_modidx(midx->path, + modidx, + midx->resolved); + scheme_hash_set(interned, modidx, modidx); + l = SCHEME_CDR(l); + } + + return modidx; +} + static void print_escaped(PrintParams *pp, int notdisplay, Scheme_Object *obj, Scheme_Hash_Table *ht, Scheme_Marshal_Tables *mt, int shared) @@ -2321,8 +2356,8 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht, { Scheme_Hash_Table *t; Scheme_Hash_Tree *tr; - Scheme_Object **keys, **vals, *val, *key, *orig; - intptr_t i, size; + Scheme_Object **keys, **vals, *val, *key, *orig, **sorted_keys; + intptr_t i, size, count; int did_one = 0; mzlonglong pos; @@ -2373,22 +2408,39 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht, tr = (Scheme_Hash_Tree *)obj; } - if (compact) - print_compact_number(pp, t ? t->count : tr->count); - if (t) { keys = t->keys; vals = t->vals; size = t->size; + count = t->count; } else { keys = NULL; vals = NULL; size = tr->count; + count = size; } + + if (compact) + print_compact_number(pp, count); + + /* For determinism, get sorted keys if possible: */ + if (SAME_OBJ(obj, orig)) { + sorted_keys = scheme_extract_sorted_keys(obj); + if (sorted_keys) + size = count; + } else + sorted_keys = NULL; + pos = -1; for (i = 0; i < size; i++) { - if (!vals || vals[i]) { - if (!vals) { + if (!vals || vals[i] || sorted_keys) { + if (sorted_keys) { + key = sorted_keys[i]; + if (t) + val = scheme_hash_get(t, key); + else + val = scheme_hash_tree_get(tr, key); + } else if (!vals) { pos = scheme_hash_tree_next(tr, pos); scheme_hash_tree_index(tr, pos, &key, &val); if (!SAME_OBJ(obj, orig)) @@ -2400,7 +2452,7 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht, if (!SAME_OBJ(obj, orig)) val = scheme_chaperone_hash_traversal_get(orig, key, &key); } else - val = 0; + val = NULL; } if (val) { @@ -2986,6 +3038,13 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht, print_compact(pp, CPT_SCOPE); print_symtab_set(pp, mt, obj); idx = get_symtab_idx(mt, obj); + if (mt->reachable_scopes) { + idx = scheme_hash_get(mt->reachable_scopes, obj); + if (!idx) + scheme_signal_error("internal error: found supposedly unreachable scope"); + } else + idx = scheme_make_integer(0); + print_compact_number(pp, SCHEME_INT_VAL(idx)); print(scheme_scope_marshal_content(obj, mt), notdisplay, 1, ht, mt, pp); } } @@ -3009,6 +3068,7 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht, Scheme_Object *idx; if (compact) { + obj = intern_modidx(mt->intern_map, obj); idx = get_symtab_idx(mt, obj); if (idx) { print_symtab_ref(pp, idx); @@ -3263,7 +3323,7 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht, } else if (!mt->pass) { if (!mt->delay_map) { Scheme_Hash_Table *delay_map; - delay_map = scheme_make_hash_table(SCHEME_hash_ptr); + delay_map = make_hash_table_symtab(); mt->delay_map = delay_map; } scheme_hash_set(mt->delay_map, key, obj); @@ -3352,7 +3412,7 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht, /* "D" means "directory": */ print_this_string(pp, "D", 0, 1); - print_number(pp, count); + print_number(pp, count); /* Write the module directory as a binary search tree. */ (void)write_module_tree(pp, a, subtrees, 0, count, init_offset); @@ -3400,21 +3460,28 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht, if (compact) closed = print(v, notdisplay, 1, NULL, mt, pp); else { - Scheme_Hash_Table *st_refs, *symtab, *reachable_scopes; + Scheme_Hash_Table *st_refs, *symtab, *reachable_scopes, *intern_map; intptr_t *shared_offsets; intptr_t st_len, j, shared_offset, start_offset; mt = MALLOC_ONE_RT(Scheme_Marshal_Tables); SET_REQUIRED_TAG(mt->type = scheme_rt_marshal_info); scheme_current_thread->current_mt = mt; + + /* We need to compare a modidx using `eq?`, because shifting + is based on `eq`ness. */ + intern_map = scheme_make_hash_table_equal_modix_eq(); + mt->intern_map = intern_map; /* "Print" the string once to find out which scopes are reachable; dropping unreachable scopes drops potentialy large binding tables. */ mt->pass = -1; reachable_scopes = scheme_make_hash_table(SCHEME_hash_ptr); + mt->conditionally_reachable_scopes = reachable_scopes; + reachable_scopes = scheme_make_hash_table(SCHEME_hash_ptr); mt->reachable_scopes = reachable_scopes; mt->reachable_scope_stack = scheme_null; - symtab = scheme_make_hash_table(SCHEME_hash_ptr); + symtab = make_hash_table_symtab(); mt->symtab = symtab; print_substring(v, notdisplay, 1, NULL, mt, pp, NULL, &slen, 0, NULL); scheme_iterate_reachable_scopes(mt); @@ -3425,9 +3492,10 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht, SET_REQUIRED_TAG(mt->type = scheme_rt_marshal_info); scheme_current_thread->current_mt = mt; mt->reachable_scopes = reachable_scopes; + mt->intern_map = intern_map; /* Track which shared values are referenced: */ - st_refs = scheme_make_hash_table(SCHEME_hash_ptr); + st_refs = make_hash_table_symtab(); mt->st_refs = st_refs; mt->st_ref_stack = scheme_null; @@ -3436,7 +3504,7 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht, keys, but we also keep track of which things are actually shared; we'll map the original keys to a compacted set of keys for the later passes. */ - symtab = scheme_make_hash_table(SCHEME_hash_ptr); + symtab = make_hash_table_symtab(); mt->symtab = symtab; mt->pass = 0; scheme_hash_set(symtab, scheme_void, scheme_true); /* indicates registration phase */ @@ -3450,7 +3518,7 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht, are re-computed with the compacted keys. */ shared_offsets = MALLOC_N_ATOMIC(intptr_t, mt->st_refs->count); mt->shared_offsets = shared_offsets; - symtab = scheme_make_hash_table(SCHEME_hash_ptr); + symtab = make_hash_table_symtab(); mt->symtab = symtab; mt->top_map = NULL; mt->pass = 1; @@ -3458,7 +3526,7 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht, 1, &st_len); /* "Print" the string again to get a measurement and symtab size. */ - symtab = scheme_make_hash_table(SCHEME_hash_ptr); + symtab = make_hash_table_symtab(); mt->symtab = symtab; mt->top_map = NULL; mt->pass = 2; @@ -3498,7 +3566,7 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht, /* Make symtab again to ensure the same results for the final print: */ - symtab = scheme_make_hash_table(SCHEME_hash_ptr); + symtab = make_hash_table_symtab(); mt->symtab = symtab; mt->top_map = NULL; mt->pass = 3; diff --git a/racket/src/racket/src/read.c b/racket/src/racket/src/read.c index 9d3323c25f..30409ebd00 100644 --- a/racket/src/racket/src/read.c +++ b/racket/src/racket/src/read.c @@ -1,4 +1,4 @@ -/* + /* Racket Copyright (c) 2004-2014 PLT Design Inc. Copyright (c) 1995-2001 Matthew Flatt @@ -4366,6 +4366,7 @@ typedef struct Scheme_Load_Delay { struct Scheme_Load_Delay *clear_bytes_prev; struct Scheme_Load_Delay *clear_bytes_next; int unsafe_ok; + mzlonglong bytecode_hash; } Scheme_Load_Delay; #define ZO_CHECK(x) if (!(x)) scheme_ill_formed_code(port); @@ -4389,6 +4390,7 @@ typedef struct CPort { Scheme_Object *relto; intptr_t *shared_offsets; Scheme_Load_Delay *delay_info; + mzlonglong bytecode_hash; } CPort; #define CP_GETC(cp) ((int)(cp->start[cp->pos++])) #define CP_TELL(port) (port->pos + port->base) @@ -4436,6 +4438,8 @@ static void make_ut(CPort *port) memset(decoded, 0, port->symtab_size); ut->decoded = decoded; + ut->bytecode_hash = port->bytecode_hash; + rht = scheme_make_hash_table(SCHEME_hash_ptr); port->ut->rns = rht; } @@ -5238,8 +5242,11 @@ static Scheme_Object *read_compact(CPort *port, int use_stack) RANGE_POS_CHECK(l, < port->symtab_size); port->symtab[l] = v; } + + l = read_compact_number(port); v2 = read_compact(port, 0); + v2 = scheme_make_pair(scheme_make_integer(l), v2); SCHEME_BOX_VAL(v) = v2; return v; @@ -5380,6 +5387,25 @@ static intptr_t read_simple_number_from_port(Scheme_Object *port) + (d << 24)); } +static void install_byecode_hash_code(CPort *rp, char *hash_code) +{ + mzlonglong l = 0; + int i; + + for (i = 0; i < 20; i++) { + l ^= ((mzlonglong)(hash_code[i]) << ((i % 8) * 8)); + } + + /* Make sure the hash code leaves lots of room for + run-time generated indices: */ +# define LARGE_SPAN ((mzlonglong)1 << 40) + + if (!l) l = LARGE_SPAN; + if (l > 0) l = -l; + if (l > (-LARGE_SPAN)) l -= LARGE_SPAN; + rp->bytecode_hash = l; +} + char *scheme_submodule_path_to_string(Scheme_Object *p, intptr_t *_len) { Scheme_Object *pr; @@ -5661,6 +5687,8 @@ static Scheme_Object *read_compiled(Scheme_Object *port, rp->magic_sym = params->magic_sym; rp->magic_val = params->magic_val; + install_byecode_hash_code(rp, hash_code); + rp->shared_offsets = so; rp->delay_info = delay_info; @@ -5693,6 +5721,7 @@ static Scheme_Object *read_compiled(Scheme_Object *port, delay_info->shared_offsets = rp->shared_offsets; delay_info->relto = rp->relto; delay_info->unsafe_ok = rp->unsafe_ok; + delay_info->bytecode_hash = rp->bytecode_hash; if (SAME_OBJ(delay_info->path, scheme_true)) perma_cache = 1; @@ -5934,6 +5963,7 @@ Scheme_Object *scheme_load_delayed_code(int _which, Scheme_Load_Delay *_delay_in rp->size = size; rp->ut = delay_info->ut; rp->unsafe_ok = delay_info->unsafe_ok; + rp->bytecode_hash = delay_info->bytecode_hash; if (delay_info->ut) delay_info->ut->rp = rp; @@ -6494,6 +6524,10 @@ static Scheme_Object *do_reader(Scheme_Object *try_modpath, { Scheme_Object *modpath, *name, *a[3], *proc, *v, *no_val; int num_a; + Scheme_Env *env; + Scheme_Cont_Frame_Data cframe; + Scheme_Config *config; + int pop_frame; if (stxsrc) modpath = scheme_syntax_to_datum(modpath_stx, 0, NULL); @@ -6534,38 +6568,59 @@ static Scheme_Object *do_reader(Scheme_Object *try_modpath, num_a = 2; } + if (get_info) + pop_frame = 0; + else { + config = scheme_current_config(); + env = scheme_get_env(config); + + if (env->reader_env) { + config = scheme_extend_config(config, + MZCONFIG_ENV, + (Scheme_Object *)env->reader_env); + scheme_push_continuation_frame(&cframe); + scheme_set_cont_mark(scheme_parameterization_key, (Scheme_Object *)config); + pop_frame = 1; + } else + pop_frame = 0; + } + proc = scheme_dynamic_require(num_a, a); if (get_info) { proc = scheme_force_value(proc); } - if (get_info && SAME_OBJ(proc, no_val)) - return scheme_false; - - a[0] = proc; - if (scheme_check_proc_arity(NULL, stxsrc ? 6 : 5, 0, 1, a)) { - /* provide modpath_stx to reader */ - } else if (!get_info && scheme_check_proc_arity(NULL, stxsrc ? 2 : 1, 0, 1, a)) { - /* don't provide modpath_stx to reader */ - modpath_stx = NULL; + if (get_info && SAME_OBJ(proc, no_val)) { + v = scheme_false; } else { - scheme_wrong_contract("#reader", - (stxsrc ? "(or/c (any/c any/c . -> . any) (procedure-arity-includes/c 6))" - : (get_info - ? "(procedure-arity-includes/c 5)" - : "(or/c (any/c . -> . any) (procedure-arity-includes/c 5))")), - -1, -1, a); - return NULL; + a[0] = proc; + if (scheme_check_proc_arity(NULL, stxsrc ? 6 : 5, 0, 1, a)) { + /* provide modpath_stx to reader */ + } else if (!get_info && scheme_check_proc_arity(NULL, stxsrc ? 2 : 1, 0, 1, a)) { + /* don't provide modpath_stx to reader */ + modpath_stx = NULL; + } else { + scheme_wrong_contract("#reader", + (stxsrc ? "(or/c (any/c any/c . -> . any) (procedure-arity-includes/c 6))" + : (get_info + ? "(procedure-arity-includes/c 5)" + : "(or/c (any/c . -> . any) (procedure-arity-includes/c 5))")), + -1, -1, a); + return NULL; + } + + v = readtable_call(0, 0, proc, params, + port, stxsrc, line, col, pos, + get_info, ht, modpath_stx); + + if (!get_info && scheme_special_comment_value(v)) + v = NULL; } - v = readtable_call(0, 0, proc, params, - port, stxsrc, line, col, pos, - get_info, ht, modpath_stx); + if (pop_frame) + scheme_pop_continuation_frame(&cframe); - if (!get_info && scheme_special_comment_value(v)) - return NULL; - else - return v; + return v; } /* "#reader" has been read */ diff --git a/racket/src/racket/src/schminc.h b/racket/src/racket/src/schminc.h index 1427fad91f..2ed38ebc30 100644 --- a/racket/src/racket/src/schminc.h +++ b/racket/src/racket/src/schminc.h @@ -12,9 +12,9 @@ finally, set EXPECTED_PRIM_COUNT to the right value and USE_COMPILED_STARTUP to 1 and `make' again. */ -#define USE_COMPILED_STARTUP 0 +#define USE_COMPILED_STARTUP 1 -#define EXPECTED_PRIM_COUNT 1134 +#define EXPECTED_PRIM_COUNT 1132 #define EXPECTED_UNSAFE_COUNT 106 #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 94c66c80b7..6335f1501c 100644 --- a/racket/src/racket/src/schpriv.h +++ b/racket/src/racket/src/schpriv.h @@ -1235,7 +1235,8 @@ void scheme_do_module_context_unmarshal(Scheme_Object *modidx, Scheme_Object *re Scheme_Object *bind_phase, Scheme_Object *pt_phase, Scheme_Object *src_phase, Scheme_Object *prefix, Scheme_Hash_Tree *excepts, - Scheme_Hash_Table *export_registry, Scheme_Object *insp, + Scheme_Hash_Table *export_registry, + Scheme_Object *insp, Scheme_Object *req_insp, Scheme_Object *replace_at); int scheme_stx_equal_module_context(Scheme_Object *stx, Scheme_Object *mc_as_stx); @@ -3327,6 +3328,7 @@ typedef struct Scheme_Marshal_Tables { Scheme_Hash_Table *reachable_scopes; /* filled on -1 pass */ Scheme_Object *reachable_scope_stack; /* used on -1 pass */ Scheme_Hash_Table *pending_reachable_ids; /* use on -1 pass */ + Scheme_Hash_Table *conditionally_reachable_scopes; /* filled/used on -1 pass */ Scheme_Hash_Table *intern_map; /* filled on first pass */ Scheme_Hash_Table *identity_map; /* filled on first pass */ Scheme_Hash_Table *top_map; /* used on every pass */ @@ -3352,6 +3354,7 @@ typedef struct Scheme_Unmarshal_Tables { Scheme_Hash_Table *rns; struct CPort *rp; char *decoded; + mzlonglong bytecode_hash; } Scheme_Unmarshal_Tables; Scheme_Object *scheme_unmarshal_wrap_get(Scheme_Unmarshal_Tables *ut, @@ -3407,6 +3410,7 @@ struct Scheme_Env { struct Scheme_Env *template_env; struct Scheme_Env *label_env; struct Scheme_Env *instance_env; /* shortcut to env where module is instantiated */ + struct Scheme_Env *reader_env; /* namespace to use for #reader or #lang */ Scheme_Hash_Table *shadowed_syntax; /* top level only */ @@ -4370,6 +4374,8 @@ void scheme_place_set_memory_use(intptr_t amt); void scheme_place_check_memory_use(); void scheme_clear_place_ifs_stack(); +Scheme_Object **scheme_extract_sorted_keys(Scheme_Object *ht); + #ifdef MZ_USE_PLACES Scheme_Object *scheme_place_make_async_channel(); void scheme_place_async_channel_send(Scheme_Object *ch, Scheme_Object *uo); diff --git a/racket/src/racket/src/schvers.h b/racket/src/racket/src/schvers.h index 1e2fb67314..391dba2975 100644 --- a/racket/src/racket/src/schvers.h +++ b/racket/src/racket/src/schvers.h @@ -13,12 +13,12 @@ consistently.) */ -#define MZSCHEME_VERSION "6.2.900.7" +#define MZSCHEME_VERSION "6.2.900.8" #define MZSCHEME_VERSION_X 6 #define MZSCHEME_VERSION_Y 2 #define MZSCHEME_VERSION_Z 900 -#define MZSCHEME_VERSION_W 7 +#define MZSCHEME_VERSION_W 8 #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 7feeb86c6d..a8da4cf8ae 100644 --- a/racket/src/racket/src/startup.inc +++ b/racket/src/racket/src/startup.inc @@ -527,7 +527,7 @@ "(not(car a)))))" "(define-values(get-linked-collections)" "(lambda(links-path)" -"(call/ec(lambda(esc)" +"(call-with-escape-continuation (lambda(esc)" "(define-values(make-handler)" "(lambda(ts)" "(lambda(exn)" diff --git a/racket/src/racket/src/startup.rktl b/racket/src/racket/src/startup.rktl index 58eada16bc..d830a9998c 100644 --- a/racket/src/racket/src/startup.rktl +++ b/racket/src/racket/src/startup.rktl @@ -629,7 +629,8 @@ (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) + (call-with-escape-continuation + (lambda (esc) (define-values (make-handler) (lambda (ts) (lambda (exn) diff --git a/racket/src/racket/src/syntax.c b/racket/src/racket/src/syntax.c index 60a03d9cea..0a986c1d3f 100644 --- a/racket/src/racket/src/syntax.c +++ b/racket/src/racket/src/syntax.c @@ -58,7 +58,7 @@ typedef struct Scheme_Scope { Scheme_Inclhash_Object iso; /* 0x1 => Scheme_Scope_With_Owner */ mzlonglong id; /* low SCHEME_STX_SCOPE_KIND_SHIFT bits indicate kind */ Scheme_Object *bindings; /* NULL, vector for one binding, hash table for multiple bindings, - or (rcons hash-table (rcons pes-info ... NULL)); + or (rcons hash-table (rcons (cons scope-set pes-info) ... NULL)); each hash table maps symbols to (cons scope-set binding) or (mlist (cons scope-set binding) ...) */ } Scheme_Scope; @@ -165,6 +165,10 @@ static Scheme_Object *scope_unmarshal_content(Scheme_Object *c, struct Scheme_Un static Scheme_Object *scopes_to_sorted_list(Scheme_Scope_Set *scopes); static void sort_vector_symbols(Scheme_Object *vec); +static void sort_scope_array(Scheme_Object **a, intptr_t count); +static void sort_symbol_array(Scheme_Object **a, intptr_t count); +static void sort_number_array(Scheme_Object **a, intptr_t count); + XFORM_NONGCING static void extract_module_binding_parts(Scheme_Object *l, Scheme_Object *phase, Scheme_Object **_insp_desc, @@ -203,6 +207,10 @@ XFORM_NONGCING static void clear_binding_cache_stx(Scheme_Stx *stx); #define SCHEME_TL_MULTI_SCOPEP(o) (MZ_OPT_HASH_KEY(&(((Scheme_Hash_Table *)o)->iso)) & 0x2) +/* A hash tabel for a multi scope has meta information mapped from void: */ +#define MULTI_SCOPE_METAP(v) SCHEME_VOIDP(v) +#define MULTI_SCOPE_META_HASHEDP(v) SCHEME_MPAIRP(v) + /* Represent fallback as vectors, either of size 2 (for normal scope sets) or size 4 (for sets of propagation instructions, because adding a fallback layer is an action): */ @@ -774,6 +782,7 @@ Scheme_Object *scheme_scope_printed_form(Scheme_Object *m) if (multi_scope) { name = scheme_eq_hash_get((Scheme_Hash_Table *)multi_scope, scheme_void); if (!name) name = scheme_false; + if (MULTI_SCOPE_META_HASHEDP(name)) name = SCHEME_CAR(name); if (SCHEME_TL_MULTI_SCOPEP(multi_scope)) kind_sym = top_symbol; @@ -866,6 +875,14 @@ Scheme_Object *extract_simple_scope(Scheme_Object *multi_scope, Scheme_Object *p ((Scheme_Scope_With_Owner *)m)->owner_multi_scope = (Scheme_Object *)ht; ((Scheme_Scope_With_Owner *)m)->phase = phase; scheme_hash_set(ht, phase, m); + + if (SCHEME_MPAIRP(scheme_hash_get(ht, scheme_void))) { + /* pair indicates loading from bytecode; + zero out id, so that ordering is based on the owner plus the phase; + this approach helps ensure determinstic ordering independent of + the time at which simple scopes are generated */ + ((Scheme_Scope *)m)->id &= SCHEME_STX_SCOPE_KIND_MASK; + } } return m; @@ -4645,18 +4662,21 @@ static Scheme_Object *unmarshal_key_adjust(Scheme_Object *sym, Scheme_Object *pe static void unmarshal_module_context_additions(Scheme_Stx *stx, Scheme_Object *vec, Scheme_Scope_Set *scopes, Scheme_Object *replace_at) { - Scheme_Object *req_modidx, *modidx, *unmarshal_info, *context, *src_phase, *pt_phase, *bind_phase, *insp; + Scheme_Object *req_modidx, *modidx, *unmarshal_info, *context, *src_phase, *pt_phase, *bind_phase; + Scheme_Object *insp, *req_insp; Scheme_Hash_Table *export_registry; req_modidx = SCHEME_VEC_ELS(vec)[0]; insp = SCHEME_VEC_ELS(vec)[3]; - + req_insp = insp; + if (stx) { modidx = apply_modidx_shifts(stx->shifts, req_modidx, &insp, &export_registry); } else { modidx = req_modidx; export_registry = NULL; insp = scheme_false; + req_insp = scheme_false; } src_phase = SCHEME_VEC_ELS(vec)[1]; @@ -4679,7 +4699,7 @@ static void unmarshal_module_context_additions(Scheme_Stx *stx, Scheme_Object *v bind_phase, pt_phase, src_phase, extract_unmarshal_prefix(unmarshal_info), extract_unmarshal_excepts(unmarshal_info), - export_registry, insp, + export_registry, insp, req_insp, replace_at); } @@ -5177,40 +5197,104 @@ Scheme_Object *scheme_flatten_syntax_list(Scheme_Object *lst, int *islist) /* wraps->datum */ /*========================================================================*/ +static void sort_added_scopes(Scheme_Object *scopes, int added) +{ + Scheme_Object **a, *l; + int i; + + if (!added) + return; + + a = MALLOC_N(Scheme_Object *, added); + for (i = 0, l = scopes; i < added; i++, l = SCHEME_CDR(l)) { + a[i] = SCHEME_CAR(l); + } + + sort_scope_array(a, added); + + for (i = 0, l = scopes; i < added; i++, l = SCHEME_CDR(l)) { + SCHEME_CAR(l) = a[i]; + } +} + static void add_reachable_scopes(Scheme_Scope_Set *scopes, Scheme_Marshal_Tables *mt) { - intptr_t i; + intptr_t i, added = 0; Scheme_Object *key, *val; i = -1; while ((i = scope_set_next(scopes, i)) != -1) { scope_set_index(scopes, i, &key, &val); if (!scheme_eq_hash_get(mt->reachable_scopes, key)) { + scheme_hash_set(mt->conditionally_reachable_scopes, key, NULL); scheme_hash_set(mt->reachable_scopes, key, scheme_true); val = scheme_make_pair(key, mt->reachable_scope_stack); mt->reachable_scope_stack = val; + added++; } } + + sort_added_scopes(mt->reachable_scope_stack, added); +} + +static void add_conditional_as_reachable(Scheme_Scope_Set *scopes, Scheme_Marshal_Tables *mt) +{ + int added = 0; + intptr_t i; + Scheme_Object *key, *val; + + STX_ASSERT(SCHEME_SCOPE_SETP(scopes)); + + i = -1; + while ((i = scope_set_next(scopes, i)) != -1) { + scope_set_index(scopes, i, &key, &val); + if (SCHEME_SCOPE_HAS_OWNER((Scheme_Scope *)key) + && scheme_eq_hash_get(mt->conditionally_reachable_scopes, key) + && !scheme_eq_hash_get(mt->reachable_scopes, key)) { + scheme_hash_set(mt->conditionally_reachable_scopes, key, NULL); + scheme_hash_set(mt->reachable_scopes, key, scheme_true); + val = scheme_make_pair(key, mt->reachable_scope_stack); + mt->reachable_scope_stack = val; + added++; + } + } + + sort_added_scopes(mt->reachable_scope_stack, added); } static void add_reachable_multi_scope(Scheme_Object *ms, Scheme_Marshal_Tables *mt) { Scheme_Hash_Table *ht = (Scheme_Hash_Table *)ms; + Scheme_Scope_Set *binding_scopes = empty_scope_set; Scheme_Object *scope; int j; for (j = ht->size; j--; ) { scope = ht->vals[j]; if (scope) { - if (!SCHEME_VOIDP(ht->keys[j])) { - if (!scheme_eq_hash_get(mt->reachable_scopes, scope)) { - scheme_hash_set(mt->reachable_scopes, scope, scheme_true); - scope = scheme_make_pair(scope, mt->reachable_scope_stack); - mt->reachable_scope_stack = scope; + if (!MULTI_SCOPE_METAP(ht->keys[j])) { + if (!scheme_eq_hash_get(mt->reachable_scopes, scope) + && !scheme_eq_hash_get(mt->conditionally_reachable_scopes, scope)) { + /* This scope is reachable via its multi-scope, but it only + matters if it's reachable through a binding (otherwise it + can be re-generated later). We don't want to keep a scope + that can be re-generated, because pruning it makes + compilation more deterministic relative to other + compilations that involve a shared module. If the scope + itself has any bindings, then we count it as reachable + through a binding (which is an approxmation, because other scopes + in the binding may be unreachable, but it seems good enough for + determinism). */ + scheme_hash_set(mt->conditionally_reachable_scopes, scope, scheme_true); + if (((Scheme_Scope *)scope)->bindings) + binding_scopes = scope_set_set(binding_scopes, scope, scheme_true); } } } } + + if (!SAME_OBJ(binding_scopes, empty_scope_set)) + add_conditional_as_reachable(binding_scopes, mt); } static void add_reachable_multi_scopes(Scheme_Object *multi_scopes, Scheme_Marshal_Tables *mt) @@ -5233,16 +5317,27 @@ static void add_reachable_multi_scopes(Scheme_Object *multi_scopes, Scheme_Marsh } } -static Scheme_Object *any_unreachable_scope(Scheme_Scope_Set *scopes, Scheme_Marshal_Tables *mt) +static Scheme_Object *any_unreachable_scope(Scheme_Scope_Set *scopes, Scheme_Marshal_Tables *mt, + int check_conditionals) { intptr_t i; + int saw_conditional = 0; Scheme_Object *key, *val; i = -1; while ((i = scope_set_next(scopes, i)) != -1) { scope_set_index(scopes, i, &key, &val); - if (!scheme_eq_hash_get(mt->reachable_scopes, key)) - return key; + if (!scheme_eq_hash_get(mt->reachable_scopes, key)) { + if (check_conditionals && scheme_eq_hash_get(mt->conditionally_reachable_scopes, key)) + saw_conditional = 1; + else + return key; + } + } + + if (saw_conditional) { + /* since this binding is reachable, move any conditional to reachable */ + add_conditional_as_reachable(scopes, mt); } return NULL; @@ -5263,7 +5358,7 @@ static void possiblly_reachable_free_id(Scheme_Object *val, /* mpair or stx */ STX_ASSERT(SCHEME_STXP((Scheme_Object *)free_id)); - unreachable_scope = any_unreachable_scope(scopes, mt); + unreachable_scope = any_unreachable_scope(scopes, mt, 1); if (!unreachable_scope) { /* causes the free-id mapping's scopes to be reachable: */ @@ -5283,13 +5378,85 @@ static void possiblly_reachable_free_id(Scheme_Object *val, /* mpair or stx */ } } +static int all_symbols(Scheme_Object **a, int c) +{ + while (c--) { + if (!SCHEME_SYMBOLP(a[c])) + return 0; + } + return 1; +} + +static int all_reals(Scheme_Object **a, int c) +{ + while (c--) { + if (!SCHEME_REALP(a[c])) + return 0; + } + return 1; +} + +Scheme_Object **scheme_extract_sorted_keys(Scheme_Object *tree) +{ + intptr_t j, i, count; + Scheme_Object **a, *key; + + if (SCHEME_HASHTRP(tree)) { + Scheme_Hash_Tree *ht = (Scheme_Hash_Tree *)tree; + + count = ht->count; + if (!count) + return NULL; + + a = MALLOC_N(Scheme_Object *, count); + + j = -1; + i = 0; + while ((j = scheme_hash_tree_next(ht, j)) != -1) { + scheme_hash_tree_index(ht, j, &key, NULL); + a[i++] = key; + } + + STX_ASSERT(i == count); + } else { + Scheme_Hash_Table *t = (Scheme_Hash_Table *)tree; + + count = t->count; + + if (!count) + return NULL; + + a = MALLOC_N(Scheme_Object *, count); + j = 0; + + for (i = t->size; i--; ) { + if (t->vals[i]) { + a[j++] = t->keys[i]; + } + } + + STX_ASSERT(j == count); + } + + if (SCHEME_SYMBOLP(a[0]) && all_symbols(a, count)) + sort_symbol_array(a, count); + else if (SCHEME_SCOPEP(a[0])) + sort_scope_array(a, count); + else if (all_reals(a, count)) + sort_number_array(a, count); + else + return NULL; + + return a; +} + void scheme_iterate_reachable_scopes(Scheme_Marshal_Tables *mt) { Scheme_Scope *scope; - Scheme_Object *l, *val, *key; + Scheme_Object *l, *val, *key, **sorted_keys, *pesl; Scheme_Hash_Tree *ht; - int j; - + intptr_t j, count; + /* For each scope, recur on `free-identifier=?` mappings */ while (!SCHEME_NULLP(mt->reachable_scope_stack)) { scope = (Scheme_Scope *)SCHEME_CAR(mt->reachable_scope_stack); @@ -5298,23 +5465,29 @@ void scheme_iterate_reachable_scopes(Scheme_Marshal_Tables *mt) if (scope->bindings) { val = scope->bindings; if (SCHEME_VECTORP(val)) { + add_conditional_as_reachable(SCHEME_VEC_BINDING_SCOPES(val), mt); l = SCHEME_VEC_BINDING_VAL(val); if (SCHEME_MPAIRP(l)) { /* It's a free-id mapping: */ possiblly_reachable_free_id(l, SCHEME_VEC_BINDING_SCOPES(val), mt); } } else { - if (SCHEME_RPAIRP(val)) + if (SCHEME_RPAIRP(val)) { ht = (Scheme_Hash_Tree *)SCHEME_CAR(val); - else { + pesl = SCHEME_CDR(val); + } else { STX_ASSERT(SCHEME_HASHTRP(val)); ht = (Scheme_Hash_Tree *)val; + pesl = NULL; } - j = -1; - while ((j = scheme_hash_tree_next(ht, j)) != -1) { - scheme_hash_tree_index(ht, j, &key, &val); + sorted_keys = scheme_extract_sorted_keys((Scheme_Object *)ht); + count = ht->count; + for (j = 0; j < count; j++) { + key = sorted_keys[j]; + val = scheme_hash_tree_get(ht, key); l = val; if (SCHEME_PAIRP(l)) { + add_conditional_as_reachable(SCHEME_BINDING_SCOPES(l), mt); val = SCHEME_BINDING_VAL(l); if (SCHEME_MPAIRP(val)) { /* It's a free-id mapping: */ @@ -5323,6 +5496,7 @@ void scheme_iterate_reachable_scopes(Scheme_Marshal_Tables *mt) } else { STX_ASSERT(SCHEME_MPAIRP(l)); for (; !SCHEME_NULLP(l); l = SCHEME_CDR(l)) { + add_conditional_as_reachable(SCHEME_BINDING_SCOPES(SCHEME_CAR(l)), mt); val = SCHEME_BINDING_VAL(SCHEME_CAR(l)); if (SCHEME_MPAIRP(val)) { /* It's a free-id mapping: */ @@ -5331,6 +5505,13 @@ void scheme_iterate_reachable_scopes(Scheme_Marshal_Tables *mt) } } } + while (pesl) { + STX_ASSERT(SCHEME_RPAIRP(pesl)); + val = SCHEME_CAR(pesl); + STX_ASSERT(SCHEME_PAIRP(val)); + add_conditional_as_reachable((Scheme_Scope_Set *)SCHEME_CAR(val), mt); + pesl = SCHEME_CDR(pesl); + } } } @@ -5347,6 +5528,16 @@ void scheme_iterate_reachable_scopes(Scheme_Marshal_Tables *mt) } } } + + /* Adjust mapping so that each scope maps to its relative position: */ + { + int i; + sorted_keys = scheme_extract_sorted_keys((Scheme_Object *)mt->reachable_scopes); + for (j = mt->reachable_scopes->count, i = 0; j--; i++) { + STX_ASSERT(SCHEME_SCOPEP(sorted_keys[j])); + scheme_hash_set(mt->reachable_scopes, sorted_keys[j], scheme_make_integer(i)); + } + } } static Scheme_Object *intern_one(Scheme_Object *v, Scheme_Hash_Table *ht) @@ -5424,16 +5615,74 @@ START_XFORM_SKIP; END_XFORM_SKIP; #endif -typedef int (*compar_t)(const void *, const void *); - -static int compare_scopes(const void *a, const void *b) +static int compare_scopes_from_multi(Scheme_Scope *a, Scheme_Scope *b) { - if (*(void **)a == *(void **)b) - return 0; - else if ((*(Scheme_Scope **)a)->id > (*(Scheme_Scope **)b)->id) + Scheme_Scope_With_Owner *ao, *bo; + + ao = (Scheme_Scope_With_Owner *)a; + bo = (Scheme_Scope_With_Owner *)b; + + if (SAME_OBJ(ao->owner_multi_scope, bo->owner_multi_scope)) { + if (SCHEME_FALSEP(ao->phase)) + return 1; + else if (SCHEME_FALSEP(bo->phase)) + return 1; + else if (scheme_bin_lt(ao->phase, bo->phase)) + return 1; + else + return -1; + } else { + Scheme_Object *na, *nb; + na = scheme_hash_get((Scheme_Hash_Table *)ao->owner_multi_scope, scheme_void); + nb = scheme_hash_get((Scheme_Hash_Table *)bo->owner_multi_scope, scheme_void); + STX_ASSERT(MULTI_SCOPE_META_HASHEDP(na)); + STX_ASSERT(MULTI_SCOPE_META_HASHEDP(nb)); + na = SCHEME_CDR(na); + nb = SCHEME_CDR(nb); + STX_ASSERT(SCHEME_REALP(na)); + STX_ASSERT(SCHEME_REALP(nb)); + if (scheme_bin_lt(na, nb)) + return 1; + else if (scheme_bin_lt(nb, na)) + return -1; + else + return 0; + } +} + +static int compare_scopes(const void *_a, const void *_b) +{ + Scheme_Scope *a = *(Scheme_Scope **)_a; + Scheme_Scope *b = *(Scheme_Scope **)_b; + + STX_ASSERT(SCHEME_SCOPEP(a)); + STX_ASSERT(SCHEME_SCOPEP(b)); + + /* Scopes for multi-scopes that were generated late are + ordered before everything else: */ + if (!(a->id >> SCHEME_STX_SCOPE_KIND_SHIFT)) { + STX_ASSERT(SCHEME_SCOPE_HAS_OWNER(a)); + if (b->id >> SCHEME_STX_SCOPE_KIND_SHIFT) + return 1; + STX_ASSERT(SCHEME_SCOPE_HAS_OWNER(b)); + + return compare_scopes_from_multi(a, b); + } else if (!(b->id >> SCHEME_STX_SCOPE_KIND_SHIFT)) { + STX_ASSERT(SCHEME_SCOPE_HAS_OWNER(b)); return -1; - else + } + + if (a->id > b->id) + return -1; + else if (a->id < b->id) return 1; + else + return 0; +} + +static void sort_scope_array(Scheme_Object **a, intptr_t count) +{ + my_qsort(a, count, sizeof(Scheme_Object *), compare_scopes); } static Scheme_Object *scopes_to_sorted_list(Scheme_Scope_Set *scopes) @@ -5450,8 +5699,8 @@ static Scheme_Object *scopes_to_sorted_list(Scheme_Scope_Set *scopes) a[j++] = key; i = scope_set_next(scopes, i); } - - my_qsort(a, j, sizeof(Scheme_Object *), compare_scopes); + + sort_scope_array(a, j); r = scheme_null; for (i = j; i--; ) { @@ -5463,10 +5712,13 @@ static Scheme_Object *scopes_to_sorted_list(Scheme_Scope_Set *scopes) static int compare_syms(const void *_a, const void *_b) { - Scheme_Object *a = (Scheme_Object *)_a; - Scheme_Object *b = (Scheme_Object *)_b; + Scheme_Object *a = *(Scheme_Object **)_a; + Scheme_Object *b = *(Scheme_Object **)_b; intptr_t l = SCHEME_SYM_LEN(a), i; + STX_ASSERT(SCHEME_SYMBOLP(a)); + STX_ASSERT(SCHEME_SYMBOLP(b)); + if (SCHEME_SYM_LEN(b) < l) l = SCHEME_SYM_LEN(b); @@ -5483,6 +5735,38 @@ static void sort_vector_symbols(Scheme_Object *vec) my_qsort(SCHEME_VEC_ELS(vec), SCHEME_VEC_SIZE(vec), sizeof(Scheme_Object *), compare_syms); } +static void sort_symbol_array(Scheme_Object **a, intptr_t count) +{ + my_qsort(a, count, sizeof(Scheme_Object *), compare_syms); +} + +static int compare_nums(const void *_a, const void *_b) +/* also allow #fs */ +{ + Scheme_Object *a = *(Scheme_Object **)_a; + Scheme_Object *b = *(Scheme_Object **)_b; + + if (SCHEME_FALSEP(a)) + return -1; + else if (SCHEME_FALSEP(b)) + return 1; + + STX_ASSERT(SCHEME_REALP(a)); + STX_ASSERT(SCHEME_REALP(b)); + + if (scheme_bin_lt(a, b)) + return -1; + else if (scheme_bin_lt(b, a)) + return 1; + else + return 0; +} + +static void sort_number_array(Scheme_Object **a, intptr_t count) +{ + my_qsort(a, count, sizeof(Scheme_Object *), compare_nums); +} + static Scheme_Object *drop_export_registries(Scheme_Object *shifts) { Scheme_Object *l, *a, *vec, *p, *first = scheme_null, *last = NULL; @@ -5528,11 +5812,30 @@ static void init_identity_map(Scheme_Marshal_Tables *mt) mt->identity_map = id_map; } +static int compare_phased_scopes(const void *_a, const void *_b) +{ + Scheme_Object *a = *(Scheme_Object **)_a; + Scheme_Object *b = *(Scheme_Object **)_b; + + if (SCHEME_FALSEP(a)) + return -1; + else if (SCHEME_FALSEP(b)) + return 1; + else { + STX_ASSERT(SCHEME_REALP(a)); + STX_ASSERT(SCHEME_REALP(b)); + if (scheme_bin_lt(a, b)) + return -1; + else + return 1; + } +} + static Scheme_Object *multi_scope_to_vector(Scheme_Object *multi_scope, Scheme_Marshal_Tables *mt) { Scheme_Object *vec; Scheme_Hash_Table *scopes = (Scheme_Hash_Table *)multi_scope; - intptr_t i, j; + intptr_t i, j, count; if (!mt->identity_map) init_identity_map(mt); @@ -5541,19 +5844,37 @@ static Scheme_Object *multi_scope_to_vector(Scheme_Object *multi_scope, Scheme_M if (vec) return vec; - vec = scheme_make_vector((2 * scopes->count) - 1, scheme_void); + /* only keep reachable scopes: */ + count = 0; + for (i = scopes->size; i--; ) { + if (scopes->vals[i]) { + if (!MULTI_SCOPE_METAP(scopes->keys[i])) { + if (scheme_hash_get(mt->reachable_scopes, scopes->vals[i])) + count++; + } + } + } + + vec = scheme_make_vector((2 * count) + 1, scheme_void); j = 0; for (i = scopes->size; i--; ) { if (scopes->vals[i]) { - if (!SCHEME_VOIDP(scopes->keys[i])) { - SCHEME_VEC_ELS(vec)[j++] = scopes->keys[i]; /* a phase */ - SCHEME_VEC_ELS(vec)[j++] = scopes->vals[i]; /* a scope */ + if (!MULTI_SCOPE_METAP(scopes->keys[i])) { + if (scheme_hash_get(mt->reachable_scopes, scopes->vals[i])) { + SCHEME_VEC_ELS(vec)[j++] = scopes->keys[i]; /* a phase */ + SCHEME_VEC_ELS(vec)[j++] = scopes->vals[i]; /* a scope */ + } } else { - SCHEME_VEC_ELS(vec)[SCHEME_VEC_SIZE(vec)-1] = scopes->vals[i]; /* debug name */ + /* debug name */ + SCHEME_VEC_ELS(vec)[2 * count] = (MULTI_SCOPE_META_HASHEDP(scopes->vals[i]) + ? SCHEME_CAR(scopes->vals[i]) + : scopes->vals[i]); } } } + my_qsort(SCHEME_VEC_ELS(vec), count, 2 * sizeof(Scheme_Object *), compare_phased_scopes); + vec = scheme_make_marshal_shared(vec); scheme_hash_set(mt->identity_map, multi_scope, vec); @@ -5622,12 +5943,6 @@ static Scheme_Object *wraps_to_datum(Scheme_Stx *stx, Scheme_Marshal_Tables *mt) } ht = mt->intern_map; - if (!ht) { - /* We need to compare a modidx using `eq?`, because shifting - is based on `eq`ness. */ - ht = scheme_make_hash_table_equal_modix_eq(); - mt->intern_map = ht; - } shifts = intern_tails(drop_export_registries(stx->shifts), ht); simples = intern_tails(scopes_to_sorted_list(stx->scopes->simple_scopes), ht); @@ -5670,7 +5985,7 @@ static Scheme_Object *marshal_bindings(Scheme_Object *l, Scheme_Marshal_Tables * scopes = (Scheme_Object *)SCHEME_BINDING_SCOPES(SCHEME_CAR(l)); } - if (!any_unreachable_scope((Scheme_Scope_Set *)scopes, mt)) { + if (!any_unreachable_scope((Scheme_Scope_Set *)scopes, mt, 0)) { if (SCHEME_PAIRP(l)) v = SCHEME_BINDING_VAL(l); else @@ -5703,7 +6018,7 @@ static Scheme_Object *marshal_bindings(Scheme_Object *l, Scheme_Marshal_Tables * Scheme_Object *scheme_scope_marshal_content(Scheme_Object *m, Scheme_Marshal_Tables *mt) { Scheme_Hash_Tree *ht; - Scheme_Object *v, *l, *r, *l2, *tab, *scopes, *key, *val; + Scheme_Object *v, *l, *r, *l2, *tab, *scopes, *val, **sorted_keys; intptr_t i, j; if (!mt->identity_map) @@ -5749,16 +6064,17 @@ Scheme_Object *scheme_scope_marshal_content(Scheme_Object *m, Scheme_Marshal_Tab SCHEME_VEC_ELS(tab)[j++] = r; } } else { - i = -1; - while ((i = scheme_hash_tree_next(ht, i)) != -1) { - scheme_hash_tree_index(ht, i, &key, &val); + intptr_t count = ht->count; + sorted_keys = scheme_extract_sorted_keys((Scheme_Object *)ht); + for (i = 0; i < count; i++) { + val = scheme_hash_tree_get(ht, sorted_keys[i]); r = marshal_bindings(val, mt); if (SCHEME_NULLP(r)) { /* no reachable bindings */ } else { STX_ASSERT(j < (2 * count)); - SCHEME_VEC_ELS(tab)[j++] = key; + SCHEME_VEC_ELS(tab)[j++] = sorted_keys[i]; SCHEME_VEC_ELS(tab)[j++] = r; } } @@ -5775,7 +6091,10 @@ Scheme_Object *scheme_scope_marshal_content(Scheme_Object *m, Scheme_Marshal_Tab for (l = l2; l; l = SCHEME_CDR(l)) { STX_ASSERT(SCHEME_RPAIRP(l)); v = SCHEME_CDR(SCHEME_CAR(l)); - if (PES_BINDINGP(v)) { + if (any_unreachable_scope((Scheme_Scope_Set *)SCHEME_CAR(SCHEME_CAR(l)), mt, 0)) { + /* drop unreachable bindings */ + v = NULL; + } else if (PES_BINDINGP(v)) { l2 = scheme_make_vector(4, NULL); SCHEME_VEC_ELS(l2)[0] = SCHEME_VEC_ELS(v)[0]; SCHEME_VEC_ELS(l2)[1] = SCHEME_VEC_ELS(v)[2]; @@ -6156,8 +6475,16 @@ static Scheme_Hash_Table *vector_to_multi_scope(Scheme_Object *mht, Scheme_Unmar len = SCHEME_VEC_SIZE(mht); if (!(len & 1)) return_NULL; + + STX_ASSERT(ut->bytecode_hash); multi_scope = (Scheme_Hash_Table *)new_multi_scope(SCHEME_VEC_ELS(mht)[len-1]); + scheme_hash_set(multi_scope, + scheme_void, + /* record bytecode hash for making fresh scopes for other phases: */ + scheme_make_mutable_pair(scheme_hash_get(multi_scope, scheme_void), + scheme_make_integer_value_from_long_long(ut->bytecode_hash + >> SCHEME_STX_SCOPE_KIND_SHIFT))); len -= 1; /* A multi-scope can refer back to itself via free-id=? info: */ @@ -6201,6 +6528,7 @@ Scheme_Object *unmarshal_multi_scopes(Scheme_Object *multi_scopes, multi_scope = vector_to_multi_scope(SCHEME_CAR(SCHEME_CAR(l)), ut); if (!multi_scope) return_NULL; SCHEME_CAR(SCHEME_CAR(l)) = (Scheme_Object *)multi_scope; + if (!SCHEME_PHASE_SHIFTP(SCHEME_CDR(SCHEME_CAR(l)))) return_NULL; } else { /* rest of list must be converted already, too */ break; @@ -6351,7 +6679,7 @@ Scheme_Object *scope_unmarshal_content(Scheme_Object *box, Scheme_Unmarshal_Tabl Scheme_Object *l = NULL, *l2, *r, *b, *m, *c, *free_id; Scheme_Hash_Tree *ht; Scheme_Scope_Set *scopes; - intptr_t i, len; + intptr_t i, len, relative_id; if (SAME_OBJ(box, root_scope)) return root_scope; @@ -6363,6 +6691,11 @@ Scheme_Object *scope_unmarshal_content(Scheme_Object *box, Scheme_Unmarshal_Tabl if (!SCHEME_BOXP(box)) return_NULL; c = SCHEME_BOX_VAL(box); + if (!SCHEME_PAIRP(c)) return_NULL; + + relative_id = SCHEME_INT_VAL(SCHEME_CAR(c)); + c = SCHEME_CDR(c); + if (SCHEME_INTP(c)) { m = scheme_new_scope(SCHEME_INT_VAL(c)); c = NULL; @@ -6375,6 +6708,19 @@ Scheme_Object *scope_unmarshal_content(Scheme_Object *box, Scheme_Unmarshal_Tabl /* Since we've created the scope before unmarshaling its content, cycles among scopes are ok. */ + /* Reset the scope's id to a hash from the bytecode plus a relative + offset. The only use of a scope's id is for debugging and + ordering, and using the bytecode's hash as part of the number is + intended to make ordering deterministic even across modules, + independent of the order that modules are loaded or delay-loaded. + Hashes are not gauarnteed to be distinct or far enough apart, but + they're likely to be. */ + STX_ASSERT(ut->bytecode_hash); + ((Scheme_Scope *)m)->id = ((SCHEME_STX_SCOPE_KIND_MASK & ((Scheme_Scope*)m)->id) + | ((umzlonglong)((relative_id << SCHEME_STX_SCOPE_KIND_SHIFT) + + ut->bytecode_hash) + & (~(umzlonglong)SCHEME_STX_SCOPE_KIND_MASK))); + if (!c) return m; while (SCHEME_PAIRP(c)) {