From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp10.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms0.migadu.com with LMTPS id 8A3DIEcHIWJIGgAAgWs5BA (envelope-from ) for ; Thu, 03 Mar 2022 19:21:59 +0100 Received: from aspmx1.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp10.migadu.com with LMTPS id UEt4GUcHIWKE4gAAG6o9tA (envelope-from ) for ; Thu, 03 Mar 2022 19:21:59 +0100 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id CF941D4BC for ; Thu, 3 Mar 2022 19:21:58 +0100 (CET) Received: from localhost ([::1]:32980 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nPq5N-0001As-IO for larch@yhetil.org; Thu, 03 Mar 2022 13:21:57 -0500 Received: from eggs.gnu.org ([209.51.188.92]:41484) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nPq48-0007zo-7x for guix-devel@gnu.org; Thu, 03 Mar 2022 13:20:40 -0500 Received: from [2607:f8b0:4864:20::d2b] (port=37625 helo=mail-io1-xd2b.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nPq44-0002zn-47 for guix-devel@gnu.org; Thu, 03 Mar 2022 13:20:38 -0500 Received: by mail-io1-xd2b.google.com with SMTP id c23so6834958ioi.4 for ; Thu, 03 Mar 2022 10:20:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=beadling-co-uk.20210112.gappssmtp.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to; bh=8StqCEX25Jds6Fi7VQv/KfFIbIVcEpMM9N+L73Q7GfY=; b=LjGu7RQy0I5h1UA6Oswse7h9l+z38Ek2zieTa8PVHmnf4GEAtaK5orpETWrrQrpiQ+ 889ME4bMLCt3Aw9NYd/MprR+dr6WQUMEpiN3CcWI7ezMJvFC/XT6IhJ+FGt1m00yTrFf 9cgFfxAR46102eiNscTriuQPWcQhtr8UtFW22Lg+PMeuyjuKsj/kaxVb44OEVsvNgzYw 3E/Z3mTVFKls8/0pi+k1c3DaMuDNpclfwib80r488nnthJs5AYEsd69MSKoCkcJc2Fk7 le32wY+ERp3KM7I6/VPzTpl59iYnvhXfntCUd2JAjyxOf4fZ2sI49+PZ3BC3DxCEoVR2 K3DQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=8StqCEX25Jds6Fi7VQv/KfFIbIVcEpMM9N+L73Q7GfY=; b=keu/hxPX/Depgx8ypFbmNWFqd4gDT2g6cq/nQX63iaf/cpuBkFbXCAvqJ5K6Xb6dwz fVy33yxUeYupi88Szfu77eh6MP/GjeQo9iB138FHfO09QeDBpV31ukIg1TtRNIof/Lja zZkYYZmCV6kEFL+4UZONa5e0pnLmbLdBCzuKPBVhkwvoTY4LbzTp+b7AvruPqmryt9HU 6+DlJxxo1QXTBENqE2G5Oi+4lKYUejLjS8GzD2hf96jW/WEv7nJI7VP4EMxJR2XliaOs BXrV2+2ODYKfG2oG0GA/k4QWRAbnz6xZNLSAAlHirNCpIWiqafcrXM3Xh8jI3PmWOvNi q7Vg== X-Gm-Message-State: AOAM532l7UF9FgXTIFmvOdMGTtovPSI8cyg7oBnglJIY9NEzRDXpgfhO AzucZbDuw77fwKDcttmMCzCY21fUUFvugco0hXDjRA== X-Google-Smtp-Source: ABdhPJxm2GN6c3tTRi5Cp7jD1JdqtTMloqFmBSAHUH0vK206nwMt987uknxa9x7eayfJnlWL5RRBfRi2aezLVwafMNo= X-Received: by 2002:a05:6638:4093:b0:30d:e19a:af6 with SMTP id m19-20020a056638409300b0030de19a0af6mr30600730jam.4.1646331634528; Thu, 03 Mar 2022 10:20:34 -0800 (PST) MIME-Version: 1.0 References: <62b594e94117bc98c9edf0e3f8f067ccc46b10a3.camel@gmail.com> In-Reply-To: <62b594e94117bc98c9edf0e3f8f067ccc46b10a3.camel@gmail.com> From: Phil Date: Thu, 3 Mar 2022 18:20:23 +0000 Message-ID: Subject: Re: Help to workaround libgit2 fetch refs issue To: Liliana Marie Prikler , Guix Devel Content-Type: multipart/alternative; boundary="00000000000042548005d954747d" X-Host-Lookup-Failed: Reverse DNS lookup failed for 2607:f8b0:4864:20::d2b (failed) Received-SPF: none client-ip=2607:f8b0:4864:20::d2b; envelope-from=phil@beadling.co.uk; helo=mail-io1-xd2b.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, HTML_MESSAGE=0.001, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_NONE=0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: guix-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+larch=yhetil.org@gnu.org Sender: "Guix-devel" X-Migadu-Flow: FLOW_IN X-Migadu-Country: US ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1646331719; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type:in-reply-to:in-reply-to: references:references:list-id:list-help:list-unsubscribe: list-subscribe:list-post:dkim-signature; bh=8StqCEX25Jds6Fi7VQv/KfFIbIVcEpMM9N+L73Q7GfY=; b=AKF1Mhj6eK/F9TlSsbNLK2UuB2T7jUMraIRPJnfq6FDcjp3bAH0Ag9nlCWOp13tTTTrGmg YcpRr/yAfx+NLynrmewrEOcppmpypqW9y0x4o3OAmxTfgQdLwn/Yzr/59rHcAGUImje+c3 UdJa98FaJrr4QXMMz0wN9lSINdYlRD5629wxwFS4b0spLbS7mFaYL9rNjFvaJSbyqB6fws pC3z9hlg18ie4A801ZK6K1mLwdt3g2dFASXe6nur9ZQEuCfiPHxEGYsRLZNoYUSVL/evo5 769mMYWp8PeUaKDfylCriYG/rfVwXcssfc+/f83OjRnxRNrAzxgfU5Foj+YFFQ== ARC-Seal: i=1; s=key1; d=yhetil.org; t=1646331719; a=rsa-sha256; cv=none; b=I2abU1Y85ey4xmmDzIANTY41WgrD1VDcfTX4ryBrYaHbBE0KdHiLAA1Yc7SuibWQirRlmR /ZfR2yJPeuNURsf03l/chYcy+UJuN2RmkfUG3PylMrB6JhB8TERYruiJGoUMkV8AhFv/HO 8hUHakeHsuCxKbWCGLwNmJegKhbt0qt05VwG8BEHzFUTM2AiHFGUGqOnRrEJMx0vNLLyX6 J1EYmj6D2EnUHvay4eR/4M216UWBtw/TT9y+7vGVU4vcGuIxfY0I2e04P31eCyPA40xMWS TxxOedX9X/eLadQ08JpEA1m8c1JZGKVRLzJvlRTzL2WiZMqQ7GhvjXUZOJTjPw== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=pass header.d=beadling-co-uk.20210112.gappssmtp.com header.s=20210112 header.b=LjGu7RQy; dmarc=none; spf=pass (aspmx1.migadu.com: domain of "guix-devel-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-devel-bounces+larch=yhetil.org@gnu.org" X-Migadu-Spam-Score: -8.46 Authentication-Results: aspmx1.migadu.com; dkim=pass header.d=beadling-co-uk.20210112.gappssmtp.com header.s=20210112 header.b=LjGu7RQy; dmarc=none; spf=pass (aspmx1.migadu.com: domain of "guix-devel-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-devel-bounces+larch=yhetil.org@gnu.org" X-Migadu-Queue-Id: CF941D4BC X-Spam-Score: -8.46 X-Migadu-Scanner: scn0.migadu.com X-TUID: //i6hdMvlQUP --00000000000042548005d954747d Content-Type: text/plain; charset="UTF-8" Thanks for the reply Liliana, On Wed, 2 Mar 2022 at 21:06, Liliana Marie Prikler < liliana.prikler@gmail.com> wrote: > > >> In Guix this means that the first time I build a PR it fails, and I > >> have to do something like "guix build foo | guix build foo" which is > >> at best a clumsy hack, but it works! > >Note that you could alternatively just use the requesting repo URL in > >the git-reference. Ah, but that would be too boring, wouldn't it? > Ha ha - indeed far too boring :-) If you're suggesting I use an HTTP(S)/URL to access the repository, then annoingly in my specific case the repo is password protected - this is why I turned to SSH in the first place so I could use keys to authenticate. Or I'm missing the point? > >> I was wondering if anyway could confirm this and/or give me a pointer > >> of where the compliation occurs (where the record in the source is > >> handled and compiled into a git clone) - even if my approach is > >>(quite possibly) unviable, I'd like to understand why! > >The source field of a package is not thunked, so it is compiled in the > >package definition itself, rather than handed off. Note that every > >hack of doing something fancyful usually invokes at least a delay form, > >see e.g. the computed-origin-method used by linux-libre. Hope that > >helps. > > Yes - thanks for the hints, I got there in the end. Just to confirm that although perhaps not the most elegant workaround, I eventually got the idea to work. My original effort lacked the exports for the below, and a few other missing items private to (guix git). update-cached-checkout-x-ref latest-repository-commit-x-ref Having dug a bit deeper into how the hash table for %gexp-compilers is setup as a mapping of to record type descriptior to gexp-compiler, I've got a better understanding now of how package compilation works so it was a worthy if experiment :-) I've included what I think is a true minimal implementation, borrowing from (guix git) where possible to minimize duplication - in case anyone else ever stumbles into the same issue (although it's pretty niche, I admit!). Now to go and fix it properly in libgit2.... ;; -*- mode: scheme; eval: (guix-devel-mode 1); geiser-scheme-implementation: guile -*- ;; This is an alternative to guix-checkout record type, which always does a fetch ;; even after the initial clone. ;; This is required because of a bug in libgit2 which means that fresh clones ;; don't pull down any additional refs from the git config: ;; https://github.com/libgit2/libgit2/issues/6183 ;; Once this is fixed and Guix builds against the fixed version this should ;; be removed. (define-module (my-tools git) #:use-module (git) ;; openable-repository #:use-module (guix git) ;; avoid duplication - use all public members from here #:use-module (guix cache) ;; maybe-remove-expired-cache-entries #:use-module (guix store) ;; add-to-store #:use-module (guix records) #:use-module (guix gexp) #:use-module (ice-9 match) #:use-module (ice-9 ftw) ;; scandir #:use-module (srfi srfi-1) ;; filter-map #:use-module (srfi srfi-11) ;; let*-values #:export ( update-cached-checkout-x-ref latest-repository-commit-x-ref git-checkout-x-refs git-checkout-x-refs? git-checkout-x-refs-url git-checkout-x-refs-branch git-checkout-x-refs-commit git-checkout-x-refs-recursive?)) ;; Avoid duplicating required private functions (define make-default-fetch-options (@@ (guix git) make-default-fetch-options)) (define resolve-reference (@@ (guix git) resolve-reference)) (define clone/swh-fallback (@@ (guix git) clone/swh-fallback)) (define switch-to-ref (@@ (guix git) switch-to-ref)) (define update-submodules (@@ (guix git) update-submodules)) (define reference-available? (@@ (guix git) reference-available?)) (define cached-checkout-expiration (@@ (guix git) cached-checkout-expiration)) (define %checkout-cache-cleanup-period (@@ (guix git) %checkout-cache-cleanup-period)) (define delete-checkout (@@ (guix git) delete-checkout)) (define print-git-error (@@ (guix git) print-git-error)) (define* (update-cached-checkout-x-ref url #:key (ref '()) recursive? (check-out? #t) starting-commit (log-port (%make-void-port "w")) (cache-directory (url-cache-directory url (%repository-cache-directory) #:recursive? recursive?))) "Update the cached checkout of URL to REF in CACHE-DIRECTORY. Return three values: the cache directory name, and the SHA1 commit (a string) corresponding to REF, and the relation of the new commit relative to STARTING-COMMIT (if provided) as returned by 'commit-relation'. REF is pair whose key is [branch | commit | tag | tag-or-commit ] and value the associated data: [ | | | ]. If REF is the empty list, the remote HEAD is used. When RECURSIVE? is true, check out submodules as well, if any. When CHECK-OUT? is true, reset the cached working tree to REF; otherwise leave it unchanged." (define (cache-entries directory) (filter-map (match-lambda ((or "." "..") #f) (file (string-append directory "/" file))) (or (scandir directory) '()))) (define canonical-ref ;; We used to require callers to specify "origin/" for each branch, which ;; made little sense since the cache should be transparent to them. So ;; here we append "origin/" if it's missing and otherwise keep it. (match ref (() '(symref . "refs/remotes/origin/HEAD")) (('branch . branch) `(branch . ,(if (string-prefix? "origin/" branch) branch (string-append "origin/" branch)))) (_ ref))) ((@@ (guix git) with-libgit2) (let* ((cache-exists? (openable-repository? cache-directory)) (repository (if cache-exists? (repository-open cache-directory) (clone/swh-fallback url ref cache-directory)))) ;; Always fetch remote, even if it has been cloned just before. (when ;; <---- THIS IS WHERE THE CHANGE IS FROM DEFAULT BEHAVIOR (not (reference-available? repository ref)) (remote-fetch (remote-lookup repository "origin") #:fetch-options (make-default-fetch-options))) (when recursive? (update-submodules repository #:log-port log-port #:fetch-options (make-default-fetch-options))) ;; Note: call 'commit-relation' from here because it's more efficient ;; than letting users re-open the checkout later on. (let* ((oid (if check-out? (switch-to-ref repository canonical-ref) (object-id (resolve-reference repository canonical-ref)))) (new (and starting-commit (commit-lookup repository oid))) (old (and starting-commit (false-if-git-not-found (commit-lookup repository (string->oid starting-commit))))) (relation (and starting-commit (if old (commit-relation old new) 'unrelated)))) ;; Reclaim file descriptors and memory mappings associated with ;; REPOSITORY as soon as possible. (repository-close! repository) ;; Update CACHE-DIRECTORY's mtime to so the cache logic sees it. (match (gettimeofday) ((seconds . microseconds) (let ((nanoseconds (* 1000 microseconds))) (utime cache-directory seconds seconds nanoseconds nanoseconds)))) ;; When CACHE-DIRECTORY is a sub-directory of the default cache ;; directory, remove expired checkouts that are next to it. (let ((parent (dirname cache-directory))) (when (string=? parent (%repository-cache-directory)) (maybe-remove-expired-cache-entries parent cache-entries #:entry-expiration cached-checkout-expiration #:delete-entry delete-checkout #:cleanup-period %checkout-cache-cleanup-period))) (values cache-directory (oid->string oid) relation))))) (define* (latest-repository-commit-x-ref store url #:key recursive? (log-port (%make-void-port "w")) (cache-directory (%repository-cache-directory)) (ref '())) "Return two values: the content of the git repository at URL copied into a store directory and the sha1 of the top level commit in this directory. The reference to be checkout, once the repository is fetched, is specified by REF. REF is pair whose key is [branch | commit | tag] and value the associated data, respectively [ | | ]. If REF is the empty list, the remote HEAD is used. When RECURSIVE? is true, check out submodules as well, if any. Git repositories are kept in the cache directory specified by %repository-cache-directory parameter. Log progress and checkout info to LOG-PORT." (define (dot-git? file stat) (and (string=? (basename file) ".git") (or (eq? 'directory (stat:type stat)) ;; Submodule checkouts end up with a '.git' regular file that ;; contains metadata about where their actual '.git' directory ;; lives. (and recursive? (eq? 'regular (stat:type stat)))))) (format log-port "updating checkout of '~a'...~%" url) (let*-values (((checkout commit _) (update-cached-checkout-x-ref url #:recursive? recursive? #:ref ref #:cache-directory (url-cache-directory url cache-directory #:recursive? recursive?) #:log-port log-port)) ((name) (url+commit->name url commit))) (format log-port "retrieved commit ~a~%" commit) (values (add-to-store store name #t "sha256" checkout #:select? (negate dot-git?)) commit))) (set-exception-printer! 'git-error print-git-error) ;;; ;;; Checkouts. ;;; ;; Representation of the "latest" checkout of a branch or a specific commit. (define-record-type* git-checkout-x-refs make-git-checkout-x-refs git-checkout-x-refs? (url git-checkout-x-refs-url) (branch git-checkout-x-refs-branch (default #f)) (commit git-checkout-x-refs-commit (default #f)) ;#f | tag | commit (recursive? git-checkout-x-refs-recursive? (default #f))) (define* (latest-repository-commit* url #:key ref recursive? log-port) ;; Monadic variant of 'latest-repository-commit'. (lambda (store) ;; The caller--e.g., (guix scripts build)--may not handle 'git-error' so ;; translate it into '&message' conditions that we know will be properly ;; handled. (catch 'git-error (lambda () (values (latest-repository-commit-x-ref store url #:ref ref #:recursive? recursive? #:log-port log-port) store)) (lambda (key error . _) (raise (condition (&message (message (match ref (('commit . commit) (format #f (G_ "cannot fetch commit ~a from ~a: ~a") commit url (git-error-message error))) (('branch . branch) (format #f (G_ "cannot fetch branch '~a' from ~a: ~a") branch url (git-error-message error))) (_ (format #f (G_ "Git failure while fetching ~a: ~a") url (git-error-message error)))))))))))) (define-gexp-compiler (git-checkout-x-refs-compiler (checkout ) system target) ;; "Compile" CHECKOUT by updating the local checkout and adding it to the ;; store. (match checkout (($ url branch commit recursive?) (latest-repository-commit* url #:ref (cond (commit `(tag-or-commit . ,commit)) (branch `(branch . ,branch)) (else '())) #:recursive? recursive? #:log-port (current-error-port))))) --00000000000042548005d954747d Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PGRpdj5UaGFua3MgZm9yIHRoZSByZXBseSBMaWxpYW5hLDxicj48L2Rp dj48YnI+PGRpdiBjbGFzcz0iZ21haWxfcXVvdGUiPjxkaXYgZGlyPSJsdHIiIGNsYXNzPSJnbWFp bF9hdHRyIj5PbiBXZWQsIDIgTWFyIDIwMjIgYXQgMjE6MDYsIExpbGlhbmEgTWFyaWUgUHJpa2xl ciAmbHQ7PGEgaHJlZj0ibWFpbHRvOmxpbGlhbmEucHJpa2xlckBnbWFpbC5jb20iPmxpbGlhbmEu cHJpa2xlckBnbWFpbC5jb208L2E+Jmd0OyB3cm90ZTo8YnI+PC9kaXY+PGJsb2NrcXVvdGUgY2xh c3M9ImdtYWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2luOjBweCAwcHggMHB4IDAuOGV4O2JvcmRlci1s ZWZ0OjFweCBzb2xpZCByZ2IoMjA0LDIwNCwyMDQpO3BhZGRpbmctbGVmdDoxZXgiPjxicj4NCiZn dDsmZ3Q7IEluIEd1aXggdGhpcyBtZWFucyB0aGF0IHRoZSBmaXJzdCB0aW1lIEkgYnVpbGQgYSBQ UiBpdCBmYWlscywgYW5kIEk8YnI+DQomZ3Q7Jmd0OyBoYXZlIHRvIGRvIHNvbWV0aGluZyBsaWtl ICZxdW90O2d1aXggYnVpbGTCoCBmb28gfCBndWl4IGJ1aWxkIGZvbyZxdW90OyB3aGljaCBpczxi cj4NCiZndDsmZ3Q7IGF0IGJlc3QgYSBjbHVtc3kgaGFjaywgYnV0IGl0IHdvcmtzITxicj4NCiZn dDtOb3RlIHRoYXQgeW91IGNvdWxkIGFsdGVybmF0aXZlbHkganVzdCB1c2UgdGhlIHJlcXVlc3Rp bmcgcmVwbyBVUkwgaW48YnI+DQomZ3Q7dGhlIGdpdC1yZWZlcmVuY2UuwqAgQWgsIGJ1dCB0aGF0 IHdvdWxkIGJlIHRvbyBib3JpbmcsIHdvdWxkbiYjMzk7dCBpdD88YnI+DQo8L2Jsb2NrcXVvdGU+ PGRpdj48YnI+PC9kaXY+PGRpdj5IYSBoYSAtIGluZGVlZCBmYXIgdG9vIGJvcmluZyA6LSkgSWYg eW91JiMzOTtyZSBzdWdnZXN0aW5nIEkgdXNlIGFuIA0KSFRUUChTKS9VUkwgdG8gYWNjZXNzIHRo ZSByZXBvc2l0b3J5LCB0aGVuIGFubm9pbmdseSBpbiBteSBzcGVjaWZpYyBjYXNlDQogdGhlIHJl cG8gaXMgcGFzc3dvcmQgcHJvdGVjdGVkIC0gdGhpcyBpcyB3aHkgSSB0dXJuZWQgdG8gU1NIIGlu IHRoZSANCmZpcnN0IHBsYWNlIHNvIEkgY291bGQgdXNlIGtleXMgdG8gYXV0aGVudGljYXRlLsKg IE9yIEkmIzM5O20gbWlzc2luZyB0aGUgDQpwb2ludD8NCg0KPGJyPjwvZGl2PjxkaXY+PGJyPjwv ZGl2PjxkaXY+wqA8L2Rpdj48YmxvY2txdW90ZSBjbGFzcz0iZ21haWxfcXVvdGUiIHN0eWxlPSJt YXJnaW46MHB4IDBweCAwcHggMC44ZXg7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkIHJnYigyMDQsMjA0 LDIwNCk7cGFkZGluZy1sZWZ0OjFleCI+DQomZ3Q7Jmd0OyBJIHdhcyB3b25kZXJpbmcgaWYgYW55 d2F5IGNvdWxkIGNvbmZpcm0gdGhpcyBhbmQvb3IgZ2l2ZSBtZSBhIHBvaW50ZXI8YnI+DQomZ3Q7 Jmd0OyBvZiB3aGVyZSB0aGUgY29tcGxpYXRpb24gb2NjdXJzICh3aGVyZSB0aGUgcmVjb3JkIGlu IHRoZSBzb3VyY2UgaXM8YnI+DQomZ3Q7Jmd0OyBoYW5kbGVkIGFuZCBjb21waWxlZCBpbnRvIGEg Z2l0IGNsb25lKSAtIGV2ZW4gaWYgbXkgYXBwcm9hY2ggaXM8YnI+DQomZ3Q7Jmd0OyhxdWl0ZSBw b3NzaWJseSkgdW52aWFibGUsIEkmIzM5O2QgbGlrZSB0byB1bmRlcnN0YW5kIHdoeSE8YnI+DQom Z3Q7VGhlIHNvdXJjZSBmaWVsZCBvZiBhIHBhY2thZ2UgaXMgbm90IHRodW5rZWQsIHNvIGl0IGlz IGNvbXBpbGVkIGluIHRoZTxicj4NCiZndDtwYWNrYWdlIGRlZmluaXRpb24gaXRzZWxmLCByYXRo ZXIgdGhhbiBoYW5kZWQgb2ZmLsKgIE5vdGUgdGhhdCBldmVyeTxicj4NCiZndDtoYWNrIG9mIGRv aW5nIHNvbWV0aGluZyBmYW5jeWZ1bCB1c3VhbGx5IGludm9rZXMgYXQgbGVhc3QgYSBkZWxheSBm b3JtLDxicj4NCiZndDtzZWUgZS5nLiB0aGUgY29tcHV0ZWQtb3JpZ2luLW1ldGhvZCB1c2VkIGJ5 IGxpbnV4LWxpYnJlLsKgIEhvcGUgdGhhdDxicj4NCiZndDtoZWxwcy48YnI+DQo8YnI+PC9ibG9j a3F1b3RlPjxkaXY+wqA8L2Rpdj48ZGl2Pg0KPGRpdj5ZZXMgLSB0aGFua3MgZm9yIHRoZSBoaW50 cywgSSBnb3QgdGhlcmUgaW4gdGhlIGVuZC7CoCBKdXN0IHRvIA0KY29uZmlybSB0aGF0IGFsdGhv dWdoIHBlcmhhcHMgbm90IHRoZSBtb3N0IGVsZWdhbnQgd29ya2Fyb3VuZCwgSSANCmV2ZW50dWFs bHkgZ290IHRoZSBpZGVhIHRvIHdvcmsuPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5NeSBvcmln aW5hbCBlZmZvcnQgbGFja2VkIHRoZSBleHBvcnRzIGZvciB0aGUgYmVsb3csIGFuZCBhIGZldyBv dGhlciBtaXNzaW5nIGl0ZW1zIHByaXZhdGUgdG8gKGd1aXggZ2l0KS48YnI+PC9kaXY+PGRpdj51 cGRhdGUtY2FjaGVkLWNoZWNrb3V0LXgtcmVmPC9kaXY+PGRpdj5sYXRlc3QtcmVwb3NpdG9yeS1j b21taXQteC1yZWYNCg0KPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5IYXZpbmcgZHVnIGEgYml0 IGRlZXBlciBpbnRvIGhvdyB0aGUgaGFzaCANCnRhYmxlIGZvciAlZ2V4cC1jb21waWxlcnMgaXMg c2V0dXAgYXMgYSBtYXBwaW5nIG9mIHRvIHJlY29yZCB0eXBlIA0KZGVzY3JpcHRpb3IgdG8gZ2V4 cC1jb21waWxlciwgSSYjMzk7dmUgZ290IGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgbm93IG9mIGhv dw0KIHBhY2thZ2UgY29tcGlsYXRpb24gd29ya3Mgc28gaXQgd2FzIGEgd29ydGh5IGlmIGV4cGVy aW1lbnQgOi0pPGJyPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+SSYjMzk7dmUNCiBpbmNsdWRl ZCB3aGF0IEkgdGhpbmsgaXMgYSB0cnVlIG1pbmltYWwgaW1wbGVtZW50YXRpb24sIGJvcnJvd2lu ZyBmcm9tIA0KKGd1aXggZ2l0KSB3aGVyZSBwb3NzaWJsZSB0byBtaW5pbWl6ZSBkdXBsaWNhdGlv biAtIGluIGNhc2UgYW55b25lIGVsc2UgDQpldmVyIHN0dW1ibGVzIGludG8gdGhlIHNhbWUgaXNz dWUgKGFsdGhvdWdoIGl0JiMzOTtzIHByZXR0eSBuaWNoZSwgSSANCmFkbWl0ISkuPC9kaXY+PGRp dj48YnI+PC9kaXY+PGRpdj5Ob3cgdG8gZ28gYW5kIGZpeCBpdCBwcm9wZXJseSBpbiBsaWJnaXQy Li4uLjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+OzsgLSotIG1vZGU6 IHNjaGVtZTsgZXZhbDogKGd1aXgtZGV2ZWwtbW9kZSAxKTsgZ2Vpc2VyLXNjaGVtZS1pbXBsZW1l bnRhdGlvbjogZ3VpbGUgLSotPGJyPjxicj48YnI+OzsgVGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSB0 byBndWl4LWNoZWNrb3V0IHJlY29yZCB0eXBlLCB3aGljaCBhbHdheXMgZG9lcyBhIGZldGNoPGJy Pjs7IGV2ZW4gYWZ0ZXIgdGhlIGluaXRpYWwgY2xvbmUuPGJyPjs7IFRoaXMgaXMgcmVxdWlyZWQg YmVjYXVzZSBvZiBhIGJ1ZyBpbiBsaWJnaXQyIHdoaWNoIG1lYW5zIHRoYXQgZnJlc2ggY2xvbmVz PGJyPjs7IGRvbiYjMzk7dCBwdWxsIGRvd24gYW55IGFkZGl0aW9uYWwgcmVmcyBmcm9tIHRoZSBn aXQgY29uZmlnOjxicj47OyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbGliZ2l0Mi9saWJn aXQyL2lzc3Vlcy82MTgzIj5odHRwczovL2dpdGh1Yi5jb20vbGliZ2l0Mi9saWJnaXQyL2lzc3Vl cy82MTgzPC9hPjxicj48YnI+OzsgT25jZSB0aGlzIGlzIGZpeGVkIGFuZCBHdWl4IGJ1aWxkcyBh Z2FpbnN0IHRoZSBmaXhlZCB2ZXJzaW9uIHRoaXMgc2hvdWxkPGJyPjs7IGJlIHJlbW92ZWQuPGJy Pjxicj4oZGVmaW5lLW1vZHVsZSAobXktdG9vbHMgZ2l0KTxicj7CoCAjOnVzZS1tb2R1bGUgKGdp dCkgOzsgb3BlbmFibGUtcmVwb3NpdG9yeTxicj7CoCAjOnVzZS1tb2R1bGUgKGd1aXggZ2l0KSA7 OyBhdm9pZCBkdXBsaWNhdGlvbiAtIHVzZSBhbGwgcHVibGljIG1lbWJlcnMgZnJvbSBoZXJlPGJy PsKgICM6dXNlLW1vZHVsZSAoZ3VpeCBjYWNoZSkgOzsgbWF5YmUtcmVtb3ZlLWV4cGlyZWQtY2Fj aGUtZW50cmllczxicj7CoCAjOnVzZS1tb2R1bGUgKGd1aXggc3RvcmUpIDs7IGFkZC10by1zdG9y ZTxicj7CoCAjOnVzZS1tb2R1bGUgKGd1aXggcmVjb3Jkcyk8YnI+wqAgIzp1c2UtbW9kdWxlIChn dWl4IGdleHApPGJyPsKgICM6dXNlLW1vZHVsZSAoaWNlLTkgbWF0Y2gpPGJyPsKgICM6dXNlLW1v ZHVsZSAoaWNlLTkgZnR3KSA7OyBzY2FuZGlyPGJyPsKgICM6dXNlLW1vZHVsZSAoc3JmaSBzcmZp LTEpIDs7IGZpbHRlci1tYXA8YnI+wqAgIzp1c2UtbW9kdWxlIChzcmZpIHNyZmktMTEpIDs7IGxl dCotdmFsdWVzPGJyPsKgICM6ZXhwb3J0ICg8YnI+wqAgwqAgwqAgwqAgwqAgwqAgdXBkYXRlLWNh Y2hlZC1jaGVja291dC14LXJlZjxicj7CoCDCoCDCoCDCoCDCoCDCoCBsYXRlc3QtcmVwb3NpdG9y eS1jb21taXQteC1yZWY8YnI+PGJyPsKgIMKgIMKgIMKgIMKgIMKgIGdpdC1jaGVja291dC14LXJl ZnM8YnI+wqAgwqAgwqAgwqAgwqAgwqAgZ2l0LWNoZWNrb3V0LXgtcmVmcz88YnI+wqAgwqAgwqAg wqAgwqAgwqAgZ2l0LWNoZWNrb3V0LXgtcmVmcy11cmw8YnI+wqAgwqAgwqAgwqAgwqAgwqAgZ2l0 LWNoZWNrb3V0LXgtcmVmcy1icmFuY2g8YnI+wqAgwqAgwqAgwqAgwqAgwqAgZ2l0LWNoZWNrb3V0 LXgtcmVmcy1jb21taXQ8YnI+wqAgwqAgwqAgwqAgwqAgwqAgZ2l0LWNoZWNrb3V0LXgtcmVmcy1y ZWN1cnNpdmU/KSk8YnI+PGJyPjxicj47OyBBdm9pZCBkdXBsaWNhdGluZyByZXF1aXJlZCBwcml2 YXRlIGZ1bmN0aW9uczxicj4oZGVmaW5lIG1ha2UtZGVmYXVsdC1mZXRjaC1vcHRpb25zIChAQCAo Z3VpeCBnaXQpIG1ha2UtZGVmYXVsdC1mZXRjaC1vcHRpb25zKSk8YnI+KGRlZmluZSByZXNvbHZl LXJlZmVyZW5jZSAoQEAgKGd1aXggZ2l0KSByZXNvbHZlLXJlZmVyZW5jZSkpPGJyPihkZWZpbmUg Y2xvbmUvc3doLWZhbGxiYWNrIChAQCAoZ3VpeCBnaXQpIGNsb25lL3N3aC1mYWxsYmFjaykpPGJy PihkZWZpbmUgc3dpdGNoLXRvLXJlZiAoQEAgKGd1aXggZ2l0KSBzd2l0Y2gtdG8tcmVmKSk8YnI+ KGRlZmluZSB1cGRhdGUtc3VibW9kdWxlcyAoQEAgKGd1aXggZ2l0KSB1cGRhdGUtc3VibW9kdWxl cykpPGJyPihkZWZpbmUgcmVmZXJlbmNlLWF2YWlsYWJsZT8gKEBAIChndWl4IGdpdCkgcmVmZXJl bmNlLWF2YWlsYWJsZT8pKTxicj4oZGVmaW5lIGNhY2hlZC1jaGVja291dC1leHBpcmF0aW9uIChA QCAoZ3VpeCBnaXQpIGNhY2hlZC1jaGVja291dC1leHBpcmF0aW9uKSk8YnI+KGRlZmluZSAlY2hl Y2tvdXQtY2FjaGUtY2xlYW51cC1wZXJpb2QgKEBAIChndWl4IGdpdCkgJWNoZWNrb3V0LWNhY2hl LWNsZWFudXAtcGVyaW9kKSk8YnI+KGRlZmluZSBkZWxldGUtY2hlY2tvdXQgKEBAIChndWl4IGdp dCkgZGVsZXRlLWNoZWNrb3V0KSk8YnI+KGRlZmluZSBwcmludC1naXQtZXJyb3IgKEBAIChndWl4 IGdpdCkgcHJpbnQtZ2l0LWVycm9yKSk8YnI+PGJyPjxicj4oZGVmaW5lKiAodXBkYXRlLWNhY2hl ZC1jaGVja291dC14LXJlZiB1cmw8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAjOmtleTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoChyZWYgJiMzOTsoKSk8YnI+wqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBy ZWN1cnNpdmU/PGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgKGNoZWNrLW91dD8gI3QpPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgc3RhcnRpbmctY29tbWl0PGJyPsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg KGxvZy1wb3J0ICglbWFrZS12b2lkLXBvcnQgJnF1b3Q7dyZxdW90OykpPGJyPsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKGNhY2hlLWRp cmVjdG9yeTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCAodXJsLWNhY2hlLWRpcmVjdG9yeTxicj7CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHVybCAoJXJlcG9zaXRv cnktY2FjaGUtZGlyZWN0b3J5KTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCM6cmVjdXJzaXZlPyByZWN1cnNpdmU/KSkpPGJy PsKgICZxdW90O1VwZGF0ZSB0aGUgY2FjaGVkIGNoZWNrb3V0IG9mIFVSTCB0byBSRUYgaW4gQ0FD SEUtRElSRUNUT1JZLsKgIFJldHVybiB0aHJlZTxicj52YWx1ZXM6IHRoZSBjYWNoZSBkaXJlY3Rv cnkgbmFtZSwgYW5kIHRoZSBTSEExIGNvbW1pdCAoYSBzdHJpbmcpIGNvcnJlc3BvbmRpbmc8YnI+ dG8gUkVGLCBhbmQgdGhlIHJlbGF0aW9uIG9mIHRoZSBuZXcgY29tbWl0IHJlbGF0aXZlIHRvIFNU QVJUSU5HLUNPTU1JVCAoaWY8YnI+cHJvdmlkZWQpIGFzIHJldHVybmVkIGJ5ICYjMzk7Y29tbWl0 LXJlbGF0aW9uJiMzOTsuPGJyPjxicj5SRUYgaXMgcGFpciB3aG9zZSBrZXkgaXMgW2JyYW5jaCB8 IGNvbW1pdCB8IHRhZyB8IHRhZy1vci1jb21taXQgXSBhbmQgdmFsdWU8YnI+dGhlIGFzc29jaWF0 ZWQgZGF0YTogWyZsdDticmFuY2ggbmFtZSZndDsgfCAmbHQ7c2hhMSZndDsgfCAmbHQ7dGFnIG5h bWUmZ3Q7IHwgJmx0O3N0cmluZyZndDtdLjxicj5JZiBSRUYgaXMgdGhlIGVtcHR5IGxpc3QsIHRo ZSByZW1vdGUgSEVBRCBpcyB1c2VkLjxicj48YnI+V2hlbiBSRUNVUlNJVkU/IGlzIHRydWUsIGNo ZWNrIG91dCBzdWJtb2R1bGVzIGFzIHdlbGwsIGlmIGFueS48YnI+PGJyPldoZW4gQ0hFQ0stT1VU PyBpcyB0cnVlLCByZXNldCB0aGUgY2FjaGVkIHdvcmtpbmcgdHJlZSB0byBSRUY7IG90aGVyd2lz ZSBsZWF2ZTxicj5pdCB1bmNoYW5nZWQuJnF1b3Q7PGJyPsKgIChkZWZpbmUgKGNhY2hlLWVudHJp ZXMgZGlyZWN0b3J5KTxicj7CoCDCoCAoZmlsdGVyLW1hcCAobWF0Y2gtbGFtYmRhPGJyPsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgICgob3IgJnF1b3Q7LiZxdW90OyAmcXVvdDsuLiZxdW90Oyk8 YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAjZik8YnI+wqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgKGZpbGU8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAoc3RyaW5nLWFw cGVuZCBkaXJlY3RvcnkgJnF1b3Q7LyZxdW90OyBmaWxlKSkpPGJyPsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIChvciAoc2NhbmRpciBkaXJlY3RvcnkpICYjMzk7KCkpKSk8YnI+PGJyPsKgIChkZWZp bmUgY2Fub25pY2FsLXJlZjxicj7CoCDCoCA7OyBXZSB1c2VkIHRvIHJlcXVpcmUgY2FsbGVycyB0 byBzcGVjaWZ5ICZxdW90O29yaWdpbi8mcXVvdDsgZm9yIGVhY2ggYnJhbmNoLCB3aGljaDxicj7C oCDCoCA7OyBtYWRlIGxpdHRsZSBzZW5zZSBzaW5jZSB0aGUgY2FjaGUgc2hvdWxkIGJlIHRyYW5z cGFyZW50IHRvIHRoZW0uwqAgU288YnI+wqAgwqAgOzsgaGVyZSB3ZSBhcHBlbmQgJnF1b3Q7b3Jp Z2luLyZxdW90OyBpZiBpdCYjMzk7cyBtaXNzaW5nIGFuZCBvdGhlcndpc2Uga2VlcCBpdC48YnI+ wqAgwqAgKG1hdGNoIHJlZjxicj7CoCDCoCDCoCAoKCkgJiMzOTsoc3ltcmVmIC4gJnF1b3Q7cmVm cy9yZW1vdGVzL29yaWdpbi9IRUFEJnF1b3Q7KSk8YnI+wqAgwqAgwqAgKCgmIzM5O2JyYW5jaCAu IGJyYW5jaCk8YnI+wqAgwqAgwqAgwqBgKGJyYW5jaCAuICwoaWYgKHN0cmluZy1wcmVmaXg/ICZx dW90O29yaWdpbi8mcXVvdDsgYnJhbmNoKTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoGJyYW5jaDxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoChzdHJp bmctYXBwZW5kICZxdW90O29yaWdpbi8mcXVvdDsgYnJhbmNoKSkpKTxicj7CoCDCoCDCoCAoXyBy ZWYpKSk8YnI+PGJyPsKgICgoQEAgKGd1aXggZ2l0KSB3aXRoLWxpYmdpdDIpPGJyPsKgIMKgKGxl dCogKChjYWNoZS1leGlzdHM/IChvcGVuYWJsZS1yZXBvc2l0b3J5PyBjYWNoZS1kaXJlY3Rvcnkp KTxicj7CoCDCoCDCoCDCoCDCoCAocmVwb3NpdG9yeSDCoCDCoChpZiBjYWNoZS1leGlzdHM/PGJy PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKHJlcG9zaXRvcnkt b3BlbiBjYWNoZS1kaXJlY3RvcnkpPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgKGNsb25lL3N3aC1mYWxsYmFjayB1cmwgcmVmIGNhY2hlLWRpcmVjdG9yeSkp KSk8YnI+wqAgwqAgwqA7OyBBbHdheXMgZmV0Y2ggcmVtb3RlLCBldmVuIGlmIGl0IGhhcyBiZWVu IGNsb25lZCBqdXN0IGJlZm9yZS48YnI+wqAgwqAgwqAod2hlbiA7OyAmbHQ7LS0tLSBUSElTIElT IFdIRVJFIFRIRSBDSEFOR0UgSVMgRlJPTSBERUZBVUxUIEJFSEFWSU9SPGJyPsKgIMKgIMKgIMKg IMKgKG5vdCAocmVmZXJlbmNlLWF2YWlsYWJsZT8gcmVwb3NpdG9yeSByZWYpKTxicj7CoCDCoCDC oCDCoChyZW1vdGUtZmV0Y2ggKHJlbW90ZS1sb29rdXAgcmVwb3NpdG9yeSAmcXVvdDtvcmlnaW4m cXVvdDspPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIzpmZXRjaC1vcHRpb25z IChtYWtlLWRlZmF1bHQtZmV0Y2gtb3B0aW9ucykpKTxicj7CoCDCoCDCoCh3aGVuIHJlY3Vyc2l2 ZT88YnI+wqAgwqAgwqAgwqAodXBkYXRlLXN1Ym1vZHVsZXMgcmVwb3NpdG9yeSAjOmxvZy1wb3J0 IGxvZy1wb3J0PGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICM6ZmV0 Y2gtb3B0aW9ucyAobWFrZS1kZWZhdWx0LWZldGNoLW9wdGlvbnMpKSk8YnI+PGJyPsKgIMKgIMKg OzsgTm90ZTogY2FsbCAmIzM5O2NvbW1pdC1yZWxhdGlvbiYjMzk7IGZyb20gaGVyZSBiZWNhdXNl IGl0JiMzOTtzIG1vcmUgZWZmaWNpZW50PGJyPsKgIMKgIMKgOzsgdGhhbiBsZXR0aW5nIHVzZXJz IHJlLW9wZW4gdGhlIGNoZWNrb3V0IGxhdGVyIG9uLjxicj7CoCDCoCDCoChsZXQqICgob2lkIMKg IMKgIMKgKGlmIGNoZWNrLW91dD88YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgKHN3aXRjaC10by1yZWYgcmVwb3NpdG9yeSBjYW5vbmljYWwtcmVmKTxicj7CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAob2JqZWN0LWlkPGJyPsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKHJlc29sdmUtcmVmZXJlbmNlIHJlcG9zaXRv cnkgY2Fub25pY2FsLXJlZikpKSk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgKG5ldyDCoCDCoCDCoChh bmQgc3RhcnRpbmctY29tbWl0PGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgKGNvbW1pdC1sb29rdXAgcmVwb3NpdG9yeSBvaWQpKSk8YnI+wqAgwqAgwqAgwqAgwqAg wqAgKG9sZCDCoCDCoCDCoChhbmQgc3RhcnRpbmctY29tbWl0PGJyPsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKGZhbHNlLWlmLWdpdC1ub3QtZm91bmQ8YnI+wqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKGNvbW1pdC1sb29rdXAgcmVwb3Np dG9yeTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoChzdHJpbmctJmd0O29pZCBzdGFydGluZy1jb21taXQpKSkpKTxicj7C oCDCoCDCoCDCoCDCoCDCoCAocmVsYXRpb24gKGFuZCBzdGFydGluZy1jb21taXQ8YnI+wqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAoaWYgb2xkPGJyPsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKGNvbW1pdC1yZWxhdGlvbiBvbGQg bmV3KTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCYj Mzk7dW5yZWxhdGVkKSkpKTxicj48YnI+wqAgwqAgwqAgwqA7OyBSZWNsYWltIGZpbGUgZGVzY3Jp cHRvcnMgYW5kIG1lbW9yeSBtYXBwaW5ncyBhc3NvY2lhdGVkIHdpdGg8YnI+wqAgwqAgwqAgwqA7 OyBSRVBPU0lUT1JZIGFzIHNvb24gYXMgcG9zc2libGUuPGJyPsKgIMKgIMKgIMKgKHJlcG9zaXRv cnktY2xvc2UhIHJlcG9zaXRvcnkpPGJyPjxicj7CoCDCoCDCoCDCoDs7IFVwZGF0ZSBDQUNIRS1E SVJFQ1RPUlkmIzM5O3MgbXRpbWUgdG8gc28gdGhlIGNhY2hlIGxvZ2ljIHNlZXMgaXQuPGJyPsKg IMKgIMKgIMKgKG1hdGNoIChnZXR0aW1lb2ZkYXkpPGJyPsKgIMKgIMKgIMKgIMKgKChzZWNvbmRz IC4gbWljcm9zZWNvbmRzKTxicj7CoCDCoCDCoCDCoCDCoCAobGV0ICgobmFub3NlY29uZHMgKCog MTAwMCBtaWNyb3NlY29uZHMpKSk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgKHV0aW1lIGNhY2hlLWRp cmVjdG9yeTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHNlY29uZHMgc2Vjb25kczxi cj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG5hbm9zZWNvbmRzIG5hbm9zZWNvbmRzKSkp KTxicj48YnI+wqAgwqAgwqAgwqA7OyBXaGVuIENBQ0hFLURJUkVDVE9SWSBpcyBhIHN1Yi1kaXJl Y3Rvcnkgb2YgdGhlIGRlZmF1bHQgY2FjaGU8YnI+wqAgwqAgwqAgwqA7OyBkaXJlY3RvcnksIHJl bW92ZSBleHBpcmVkIGNoZWNrb3V0cyB0aGF0IGFyZSBuZXh0IHRvIGl0Ljxicj7CoCDCoCDCoCDC oChsZXQgKChwYXJlbnQgKGRpcm5hbWUgY2FjaGUtZGlyZWN0b3J5KSkpPGJyPsKgIMKgIMKgIMKg IMKgKHdoZW4gKHN0cmluZz0/IHBhcmVudCAoJXJlcG9zaXRvcnktY2FjaGUtZGlyZWN0b3J5KSk8 YnI+wqAgwqAgwqAgwqAgwqAgwqAobWF5YmUtcmVtb3ZlLWV4cGlyZWQtY2FjaGUtZW50cmllcyBw YXJlbnQgY2FjaGUtZW50cmllczxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCM6ZW50cnktZXhwaXJhdGlvbjxi cj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGNhY2hlZC1jaGVja291dC1leHBpcmF0aW9uPGJyPsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIzpkZWxldGUtZW50cnkgZGVsZXRlLWNoZWNrb3V0PGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIzpjbGVh bnVwLXBlcmlvZDxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCVjaGVja291dC1jYWNoZS1jbGVhbnVwLXBlcmlv ZCkpKTxicj48YnI+wqAgwqAgwqAgwqAodmFsdWVzIGNhY2hlLWRpcmVjdG9yeSAob2lkLSZndDtz dHJpbmcgb2lkKSByZWxhdGlvbikpKSkpPGJyPjxicj48YnI+PGJyPihkZWZpbmUqIChsYXRlc3Qt cmVwb3NpdG9yeS1jb21taXQteC1yZWYgc3RvcmUgdXJsPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIzprZXk8YnI+wqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBy ZWN1cnNpdmU/PGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgKGxvZy1wb3J0ICglbWFrZS12b2lkLXBvcnQgJnF1b3Q7dyZxdW90 OykpPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgKGNhY2hlLWRpcmVjdG9yeTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAoJXJlcG9zaXRvcnktY2FjaGUt ZGlyZWN0b3J5KSk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAocmVmICYjMzk7KCkpKTxicj7CoCAmcXVvdDtSZXR1cm4gdHdv IHZhbHVlczogdGhlIGNvbnRlbnQgb2YgdGhlIGdpdCByZXBvc2l0b3J5IGF0IFVSTCBjb3BpZWQg aW50byBhPGJyPnN0b3JlIGRpcmVjdG9yeSBhbmQgdGhlIHNoYTEgb2YgdGhlIHRvcCBsZXZlbCBj b21taXQgaW4gdGhpcyBkaXJlY3RvcnkuwqAgVGhlPGJyPnJlZmVyZW5jZSB0byBiZSBjaGVja291 dCwgb25jZSB0aGUgcmVwb3NpdG9yeSBpcyBmZXRjaGVkLCBpcyBzcGVjaWZpZWQgYnkgUkVGLjxi cj5SRUYgaXMgcGFpciB3aG9zZSBrZXkgaXMgW2JyYW5jaCB8IGNvbW1pdCB8IHRhZ10gYW5kIHZh bHVlIHRoZSBhc3NvY2lhdGVkPGJyPmRhdGEsIHJlc3BlY3RpdmVseSBbJmx0O2JyYW5jaCBuYW1l Jmd0OyB8ICZsdDtzaGExJmd0OyB8ICZsdDt0YWcgbmFtZSZndDtdLsKgIElmIFJFRiBpcyB0aGUg ZW1wdHk8YnI+bGlzdCwgdGhlIHJlbW90ZSBIRUFEIGlzIHVzZWQuPGJyPjxicj5XaGVuIFJFQ1VS U0lWRT8gaXMgdHJ1ZSwgY2hlY2sgb3V0IHN1Ym1vZHVsZXMgYXMgd2VsbCwgaWYgYW55Ljxicj48 YnI+R2l0IHJlcG9zaXRvcmllcyBhcmUga2VwdCBpbiB0aGUgY2FjaGUgZGlyZWN0b3J5IHNwZWNp ZmllZCBieTxicj4lcmVwb3NpdG9yeS1jYWNoZS1kaXJlY3RvcnkgcGFyYW1ldGVyLjxicj48YnI+ TG9nIHByb2dyZXNzIGFuZCBjaGVja291dCBpbmZvIHRvIExPRy1QT1JULiZxdW90Ozxicj7CoCAo ZGVmaW5lIChkb3QtZ2l0PyBmaWxlIHN0YXQpPGJyPsKgIMKgIChhbmQgKHN0cmluZz0/IChiYXNl bmFtZSBmaWxlKSAmcXVvdDsuZ2l0JnF1b3Q7KTxicj7CoCDCoCDCoCDCoCDCoChvciAoZXE/ICYj Mzk7ZGlyZWN0b3J5IChzdGF0OnR5cGUgc3RhdCkpPGJyPjxicj7CoCDCoCDCoCDCoCDCoCDCoCDC oDs7IFN1Ym1vZHVsZSBjaGVja291dHMgZW5kIHVwIHdpdGggYSAmIzM5Oy5naXQmIzM5OyByZWd1 bGFyIGZpbGUgdGhhdDxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoDs7IGNvbnRhaW5zIG1ldGFkYXRh IGFib3V0IHdoZXJlIHRoZWlyIGFjdHVhbCAmIzM5Oy5naXQmIzM5OyBkaXJlY3Rvcnk8YnI+wqAg wqAgwqAgwqAgwqAgwqAgwqA7OyBsaXZlcy48YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAoYW5kIHJl Y3Vyc2l2ZT88YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKGVxPyAmIzM5O3JlZ3VsYXIg KHN0YXQ6dHlwZSBzdGF0KSkpKSkpPGJyPjxicj7CoCAoZm9ybWF0IGxvZy1wb3J0ICZxdW90O3Vw ZGF0aW5nIGNoZWNrb3V0IG9mICYjMzk7fmEmIzM5Oy4uLn4lJnF1b3Q7IHVybCk8YnI+wqAgKGxl dCotdmFsdWVzPGJyPsKgIMKgIMKgICgoKGNoZWNrb3V0IGNvbW1pdCBfKTxicj7CoCDCoCDCoCDC oCAodXBkYXRlLWNhY2hlZC1jaGVja291dC14LXJlZiB1cmw8YnI+wqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgIzpyZWN1cnNpdmU/IHJlY3Vy c2l2ZT88YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgIzpyZWYgcmVmPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgICM6Y2FjaGUtZGlyZWN0b3J5PGJyPsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICh1cmwtY2FjaGUtZGly ZWN0b3J5IHVybCBjYWNoZS1kaXJlY3Rvcnk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAjOnJlY3Vyc2l2ZT88YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqByZWN1 cnNpdmU/KTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCAjOmxvZy1wb3J0IGxvZy1wb3J0KSk8YnI+wqAgwqAgwqAgwqAoKG5hbWUpPGJy PsKgIMKgIMKgIMKgICh1cmwrY29tbWl0LSZndDtuYW1lIHVybCBjb21taXQpKSk8YnI+wqAgwqAg KGZvcm1hdCBsb2ctcG9ydCAmcXVvdDtyZXRyaWV2ZWQgY29tbWl0IH5hfiUmcXVvdDsgY29tbWl0 KTxicj7CoCDCoCAodmFsdWVzIChhZGQtdG8tc3RvcmUgc3RvcmUgbmFtZSAjdCAmcXVvdDtzaGEy NTYmcXVvdDsgY2hlY2tvdXQ8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgIzpzZWxlY3Q/IChuZWdhdGUgZG90LWdpdD8pKTxicj7CoCDCoCDCoCDCoCDCoCDCoCBjb21t aXQpKSk8YnI+PGJyPjxicj4oc2V0LWV4Y2VwdGlvbi1wcmludGVyISAmIzM5O2dpdC1lcnJvciBw cmludC1naXQtZXJyb3IpPGJyPjxicj48YnI+Ozs7PGJyPjs7OyBDaGVja291dHMuPGJyPjs7Ozxi cj48YnI+PGJyPjxicj47OyBSZXByZXNlbnRhdGlvbiBvZiB0aGUgJnF1b3Q7bGF0ZXN0JnF1b3Q7 IGNoZWNrb3V0IG9mIGEgYnJhbmNoIG9yIGEgc3BlY2lmaWMgY29tbWl0Ljxicj4oZGVmaW5lLXJl Y29yZC10eXBlKiAmbHQ7Z2l0LWNoZWNrb3V0LXgtcmVmcyZndDs8YnI+wqAgZ2l0LWNoZWNrb3V0 LXgtcmVmcyBtYWtlLWdpdC1jaGVja291dC14LXJlZnM8YnI+wqAgZ2l0LWNoZWNrb3V0LXgtcmVm cz88YnI+wqAgKHVybCDCoCDCoCBnaXQtY2hlY2tvdXQteC1yZWZzLXVybCk8YnI+wqAgKGJyYW5j aCDCoGdpdC1jaGVja291dC14LXJlZnMtYnJhbmNoIChkZWZhdWx0ICNmKSk8YnI+wqAgKGNvbW1p dCDCoGdpdC1jaGVja291dC14LXJlZnMtY29tbWl0IChkZWZhdWx0ICNmKSkgwqAgwqAgwqA7I2Yg fCB0YWcgfCBjb21taXQ8YnI+wqAgKHJlY3Vyc2l2ZT8gZ2l0LWNoZWNrb3V0LXgtcmVmcy1yZWN1 cnNpdmU/IChkZWZhdWx0ICNmKSkpPGJyPjxicj48YnI+PGJyPihkZWZpbmUqIChsYXRlc3QtcmVw b3NpdG9yeS1jb21taXQqIHVybCAjOmtleSByZWYgcmVjdXJzaXZlPyBsb2ctcG9ydCk8YnI+wqAg OzsgTW9uYWRpYyB2YXJpYW50IG9mICYjMzk7bGF0ZXN0LXJlcG9zaXRvcnktY29tbWl0JiMzOTsu PGJyPsKgIChsYW1iZGEgKHN0b3JlKTxicj7CoCDCoCA7OyBUaGUgY2FsbGVyLS1lLmcuLCAoZ3Vp eCBzY3JpcHRzIGJ1aWxkKS0tbWF5IG5vdCBoYW5kbGUgJiMzOTtnaXQtZXJyb3ImIzM5OyBzbzxi cj7CoCDCoCA7OyB0cmFuc2xhdGUgaXQgaW50byAmIzM5OyZhbXA7bWVzc2FnZSYjMzk7IGNvbmRp dGlvbnMgdGhhdCB3ZSBrbm93IHdpbGwgYmUgcHJvcGVybHk8YnI+wqAgwqAgOzsgaGFuZGxlZC48 YnI+wqAgwqAgKGNhdGNoICYjMzk7Z2l0LWVycm9yPGJyPsKgIMKgIMKgIChsYW1iZGEgKCk8YnI+ wqAgwqAgwqAgwqAgKHZhbHVlcyAobGF0ZXN0LXJlcG9zaXRvcnktY29tbWl0LXgtcmVmIHN0b3Jl IHVybDxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAjOnJlZiByZWY8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgIzpyZWN1 cnNpdmU/IHJlY3Vyc2l2ZT88YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgIzpsb2ctcG9ydCBsb2ctcG9ydCk8 YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgc3RvcmUpKTxicj7CoCDCoCDCoCAobGFtYmRhIChr ZXkgZXJyb3IgLiBfKTxicj7CoCDCoCDCoCDCoCAocmFpc2UgKGNvbmRpdGlvbjxicj7CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCAoJmFtcDttZXNzYWdlPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgKG1lc3NhZ2U8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKG1hdGNoIHJlZjxicj7C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAoKCYjMzk7Y29tbWl0IC4gY29tbWl0KTxicj7C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoChmb3JtYXQgI2YgKEdfICZxdW90O2Nhbm5v dCBmZXRjaCBjb21taXQgfmEgZnJvbSB+YTogfmEmcXVvdDspPGJyPsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgY29tbWl0IHVybCAoZ2l0LWVycm9yLW1lc3NhZ2Ug ZXJyb3IpKSk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKCgmIzM5O2JyYW5jaCAu IGJyYW5jaCk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAoZm9ybWF0ICNmIChH XyAmcXVvdDtjYW5ub3QgZmV0Y2ggYnJhbmNoICYjMzk7fmEmIzM5OyBmcm9tIH5hOiB+YSZxdW90 Oyk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBicmFuY2gg dXJsIChnaXQtZXJyb3ItbWVzc2FnZSBlcnJvcikpKTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCAoXzxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoChmb3JtYXQgI2Yg KEdfICZxdW90O0dpdCBmYWlsdXJlIHdoaWxlIGZldGNoaW5nIH5hOiB+YSZxdW90Oyk8YnI+wqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB1cmwgKGdpdC1lcnJvci1t ZXNzYWdlIGVycm9yKSkpKSkpKSkpKSkpPGJyPjxicj48YnI+PGJyPihkZWZpbmUtZ2V4cC1jb21w aWxlciAoZ2l0LWNoZWNrb3V0LXgtcmVmcy1jb21waWxlciAoY2hlY2tvdXQgJmx0O2dpdC1jaGVj a291dC14LXJlZnMmZ3Q7KTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzeXN0ZW0gdGFyZ2V0KTxi cj7CoCA7OyAmcXVvdDtDb21waWxlJnF1b3Q7IENIRUNLT1VUIGJ5IHVwZGF0aW5nIHRoZSBsb2Nh bCBjaGVja291dCBhbmQgYWRkaW5nIGl0IHRvIHRoZTxicj7CoCA7OyBzdG9yZS48YnI+wqAgKG1h dGNoIGNoZWNrb3V0PGJyPsKgIMKgICgoJCAmbHQ7Z2l0LWNoZWNrb3V0LXgtcmVmcyZndDsgdXJs IGJyYW5jaCBjb21taXQgcmVjdXJzaXZlPyk8YnI+wqAgwqAgwqAobGF0ZXN0LXJlcG9zaXRvcnkt Y29tbWl0KiB1cmw8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgIzpyZWYgKGNvbmQgKGNvbW1pdDxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGAodGFnLW9yLWNvbW1pdCAu ICxjb21taXQpKTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAoYnJhbmNoPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgYChicmFuY2ggLiAs YnJhbmNoKSk8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgKGVsc2UgJiMzOTsoKSkpPGJyPsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICM6cmVjdXJzaXZlPyByZWN1cnNpdmU/PGJy PsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICM6bG9nLXBv cnQgKGN1cnJlbnQtZXJyb3ItcG9ydCkpKSkpPGJyPjwvZGl2Pg0KDQo8L2Rpdj48L2Rpdj48L2Rp dj4NCg== --00000000000042548005d954747d--