From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp0.migadu.com ([2001:41d0:303:e16b::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms13.migadu.com with LMTPS id IKuGMEPDh2cF9QAAqHPOHw:P1 (envelope-from ) for ; Wed, 15 Jan 2025 14:16:35 +0000 Received: from aspmx1.migadu.com ([2001:41d0:303:e16b::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp0.migadu.com with LMTPS id IKuGMEPDh2cF9QAAqHPOHw (envelope-from ) for ; Wed, 15 Jan 2025 15:16:35 +0100 X-Envelope-To: larch@yhetil.org Authentication-Results: aspmx1.migadu.com; dkim=pass header.d=chen-becker.org header.s=google header.b=XJISp2dm; spf=pass (aspmx1.migadu.com: domain of "emacs-orgmode-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="emacs-orgmode-bounces+larch=yhetil.org@gnu.org"; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1736950595; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc: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=yBUDdSR6msvWqAOYjKCmsHecpAoF2vSI4XNVew3QUEQ=; b=IT15CGOvxfCdhLSBhN0u6a7+ri2bJBSEoOGzWpc8urbjkUbHO1AvaAEpKWvUCpP+8CuDrP 21RhB8tSX7Ul27A923UVYKua2E9ipPZsoxLHEz/CWNPZ1L0kTlIzCGw81Bhe//3suNAHZO BrQJcf+w0IZJ9DHioLuk6uR+Bjdo2Q4cDgXNAAhk1fUo2SEoXQXnQdNV0uMZ2qxS2RMzBG v9rPM3SiSS1nMRKIaZAQ9Eh+YZJHxgEKzBqEZHMEqjndDtWlhWlIoeanXpQR3N2SOX+XVP mW8Ol68sSv9BunXVHw8tv+NHyMiWG0BahHK/dx+BtfF72KneQoHJPRhT8ogi8w== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=pass header.d=chen-becker.org header.s=google header.b=XJISp2dm; spf=pass (aspmx1.migadu.com: domain of "emacs-orgmode-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="emacs-orgmode-bounces+larch=yhetil.org@gnu.org"; dmarc=none ARC-Seal: i=1; s=key1; d=yhetil.org; t=1736950595; a=rsa-sha256; cv=none; b=j7UdPBguMdBea4KoG4jmMnImsOHydXJ+Wz+86TSWNK7Nx1CIR+BgnQ1P8QUSGWIXLXPHCC dN13BUT/nnxhINwl+nil4nru254yZ5TD6bj6FvdXnoLiRVP8v5f6G3TN7jo/ZRMjRTC/H1 MM6MRo7YOXU/KOWIvbmRm4N8voiU2hpcuZQEl6Oq7+P6I2QOhfWqvjXCoDC2X12bHM1EjZ mffVRzmbW94irgMQKkot1ZlBikWlrCwIrnSbPiZ9Y84BN3/URcvGga64eYfRjJ4forinX2 uaL0uN7s3ogmwxvmpMs5bVwDdEcsfgL7Rm6SpKPuxW+mM7+Ysq968TlYeOETRg== 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 814BE4B3B for ; Wed, 15 Jan 2025 15:16:35 +0100 (CET) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tY4BA-0003CU-6L; Wed, 15 Jan 2025 09:15:32 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tY4Az-0003CE-T8 for emacs-orgmode@gnu.org; Wed, 15 Jan 2025 09:15:22 -0500 Received: from mail-vs1-xe33.google.com ([2607:f8b0:4864:20::e33]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1tY4Aw-0003hM-H4 for emacs-orgmode@gnu.org; Wed, 15 Jan 2025 09:15:21 -0500 Received: by mail-vs1-xe33.google.com with SMTP id ada2fe7eead31-4aff620b232so2243698137.0 for ; Wed, 15 Jan 2025 06:15:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chen-becker.org; s=google; t=1736950517; x=1737555317; darn=gnu.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=yBUDdSR6msvWqAOYjKCmsHecpAoF2vSI4XNVew3QUEQ=; b=XJISp2dmb0vpZnegJHqwMdEUOS5VeNDUeBCyuQhW2vXeoJzntqYuac9dPvRLAYKu3Y W1i0kKHKvPqbcoz34wa/hrsfvIbMuHl29R4dBqVu+DY9JG3ovoo7rcDqp86YHkLUgdBZ VZfTCxvc4b5uOmLMqULhU4hXwxGjv0X+VZEvOlyh8PakcMzQWZYu0G2h022P8ZkOAbvQ TwBN9Ddgu1FIoBjodLNF49T7Ex6vsDihorAkpRUPnq+rOEvKrK4y8uPREqDi6Cg51trx u6Ez0XQPi75QorHusIx82SqT+PtpasfmW1Syux0zl7X9BUfZZx1slDmELj7f1E6G3dJT TN3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736950517; x=1737555317; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=yBUDdSR6msvWqAOYjKCmsHecpAoF2vSI4XNVew3QUEQ=; b=JwZQtB6ePq0/CGqF5PWzBoteGn1Qg5y/yPAAQPy0BWObicgwPpw7lL63IIl0VXLqOF /uWA5HqNXgOXr6WsYa55sI3pxRy4ahUoFaGOGlXPYaleyK43PnJoeb2NvPAfbtPCFEwI o80W/Oo41t0oQ11m39Jje96py1mdRp3sDTqamVL6eHVJCI2qSaqSgLhgSRHTtovaxoII sZn/SGR6H6gVGV5+czZTxO9dLEEcUhjarTe7jz1CVrNslumU9wRoWw0ebAnjyneszIuI 8+JoMgOKdCpG9ZztwUgm2cqtKjkAM67ntos1s4GGmHkXzE6phN/l9SVrPwRjzNMSx4DW /7nQ== X-Gm-Message-State: AOJu0YwV9HcP3hYaNmZuo86Ss07zn9POvWXJ4BhR0zwQcw9pzRdQKc67 1bOR7oNHQOPa/OsbsXxP5e5hHePfnNg/2onth3VtSKZZheNbOX9Z9GzMneSlJspHhjRbgoCoKiC S37Jz0IkoO/V+h+FUhOB71KzLzJm3Q5gIXSrh0w== X-Gm-Gg: ASbGncu885do5xHWnpsol3FFapuOEaFh8XfRrRTduP9TVH8ekSojwUaFZZN7pbgYUxU 0IcqUX1N6h4gt2slRXAsPp80xiiAwrcRxY60= X-Google-Smtp-Source: AGHT+IHGPelqmOxdf4bGiH/AsYsyAWaV9pCgyD83XYN43isCIiHijI/6i8yHwA7xWWbqotwl5/5RU7WLOIOHki1qoL4= X-Received: by 2002:a05:6102:50a3:b0:4b2:9e8b:54c with SMTP id ada2fe7eead31-4b3d106e36emr25886236137.24.1736950515540; Wed, 15 Jan 2025 06:15:15 -0800 (PST) MIME-Version: 1.0 References: <2dijBN1CGUPtmZzcNXZAe54y8u0pC8V_DYIBCL4rSR1eh2s8TFJGW5V3q7pkiCRFtEHYXy66CU7F6kK3NN_VAX-R_RbAXptG0b5vOlUQsi8=@protonmail.com> <87y15bcbi1.fsf@localhost> <877c7zede2.fsf@localhost> <874j2z7a8u.fsf@localhost> <87ttatigrx.fsf@localhost> <87msfxd81c.fsf@localhost> <87sepox9oy.fsf@localhost> <87wmey7hmb.fsf@localhost> <87v7uhe0tg.fsf@localhost> In-Reply-To: From: Derek Chen-Becker Date: Wed, 15 Jan 2025 07:15:04 -0700 X-Gm-Features: AbW1kvb--VYJU4IiTvRjT7dtMj8FWurJcejGxwUEQsKOq2H5gLQuFY4KyIYANPw Message-ID: Subject: Re: [BUG] Cannot tangle src block in capture buffer [9.7.6] To: Ihor Radchenko Cc: emacs-orgmode@gnu.org Content-Type: multipart/alternative; boundary="00000000000078bbe3062bbf4e59" Received-SPF: pass client-ip=2607:f8b0:4864:20::e33; envelope-from=derek@chen-becker.org; helo=mail-vs1-xe33.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-orgmode@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+larch=yhetil.org@gnu.org Sender: emacs-orgmode-bounces+larch=yhetil.org@gnu.org X-Migadu-Country: US X-Migadu-Flow: FLOW_IN X-Migadu-Queue-Id: 814BE4B3B X-Migadu-Scanner: mx13.migadu.com X-Migadu-Spam-Score: -0.34 X-Spam-Score: -0.34 X-TUID: H9SIGuSZ8Phv --00000000000078bbe3062bbf4e59 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Before I submit the updated patch, does this look like a better approach? In the test for `org-base-buffer-file-name' I changed it to explicitly find the current buffer file name and use that: (ert-deftest test-org-base-buffer-file-name () "Test `org-base-buffer-file-name'." (should (org-test-with-temp-text-in-file "File" (let ((base-filename (buffer-file-name))) (and ;; Confirm that we get the same answer whether we provide the buffer or use the default (equal base-filename (org-base-buffer-file-name)) (equal base-filename (org-base-buffer-file-name (current-buffer))))))) (should (org-test-with-temp-text-in-file "File with capture buffer" (let ((org-capture-templates '(("t" "Test" entry (here) "* Test Header\n\n"))) (base-filename (buffer-file-name))) (org-capture nil "t") (and ;; Confirm that we get the same answer whether we provide the buffer or use the default (equal base-filename (org-base-buffer-file-name)) (equal base-filename (org-base-buffer-file-name (current-buffer))) (equal base-filename (org-base-buffer-file-name (buffer-base-buffer (current-buffer)))) )))) (should-not (org-test-with-temp-text "Buffer without file" (org-base-buffer-file-name)))) For the tangle test, I also capture the base buffer filename, use an explicit tangle filename, and ensure that the call to `org-babel-tangle' returns the expected list of tangled files: ;; See https://list.orgmode.org/87msfxd81c.fsf@localhost/T/#t (ert-deftest ob-tangle/tangle-from-capture-buffer () "Test tangling of source blocks from within a capture buffer. This is to ensure that we properly resolve the buffer name." (org-test-with-temp-text-in-file "* Header\n\nCapture after this point:\n" (let ((tangle-filename (format "%s.el" (buffer-file-name)))) (should (unwind-protect (progn (let ((org-capture-templates '(("t" "Test" entry (here) "* Test Header\n\n")))) (org-capture nil "t") (goto-char (point-max)) (insert (format " #+begin_src elisp :tangle \"%s\" :comments org (message \"FOO\") #+end_src" tangle-filename)) (search-backward "message") ;; Confirm that we tangled to the right file (equal (org-babel-tangle 4) (list tangle-filename)))) ;; Clean up the tangled file with the filename from org-test-with-temp-text-in-file (delete-file tangle-filename)))))) On Tue, Jan 14, 2025 at 12:26=E2=80=AFPM Derek Chen-Becker wrote: > Thanks for the comments! This is my first real foray into non-trivial > elisp so I really appreciate your patience and help. Let me try and get > these addressed. > > Cheers, > > derek > > On Tue, Jan 14, 2025 at 10:54=E2=80=AFAM Ihor Radchenko > wrote: > >> Derek Chen-Becker writes: >> >> > Thanks for the help on this! I've reworked the changes into two patche= s >> > (one for the README and one for tangle) and I think I've covered your >> > concerns. I also added a unit test for the org-base-buffer-file-name >> > function to cover the miss on provided buffers. Please let me know if >> you >> > have any questions. >> >> Thanks! >> Although, I am afraid that the second set of unit tests is a bit much >> - they no longer fit within TINYCHANGE (15-20 significant LOC). >> We have a legal limit on how much code we can accept without requiring >> copyright assignment. See >> https://orgmode.org/worg/org-contribute.html#copyright >> >> More comments below. >> >> > * lisp/ob-tangle.el (org-babel-tangle): Update to utilize the new >> > org-base-buffer-file-name function. >> >> Our convention is to quote Elisp symbols in commit messages like `this'. >> >> > The previous use of buffer-file-name would fail inside of a capture >> buffer >> > because it is indirect and does not have an associated filename. This >> >> Another convention is double space between sentences. >> >> > +(defun org-base-buffer-file-name (&optional BUFFER) >> >> Elisp convention is to use lower case for function arguments. >> Upper case in the docstring is used to highlight the function arguments; >> it does not mean that the arguments themselves need to be in upper case. >> >> > + (if (buffer-base-buffer BUFFER) >> > + (buffer-file-name (buffer-base-buffer BUFFER)) >> > + (buffer-file-name BUFFER))) >> >> Nit: Can also use `if-let*' to avoid calling `buffer-base-buffer' twice. >> >> > +;; See https://list.orgmode.org/87msfxd81c.fsf@localhost/T/#t >> > +(ert-deftest ob-tangle/tangle-from-capture-buffer () >> > + "Test tangling of source blocks from within a capture buffer. >> > +This is to ensure that we properly resolve the buffer name." >> > + (org-test-with-temp-text-in-file >> > + "* Header\n\nCapture after this point:\n" >> > + (should >> > + (unwind-protect >> > + (progn >> > + (let ((org-capture-templates '(("t" "Test" entry (here) "* >> Test Header\n\n")))) >> > + (org-capture nil "t") >> > + (goto-char (point-max)) >> > + (insert " >> > +#+begin_src elisp :tangle yes :comments org >> > + (message \"FOO\") >> > +#+end_src") >> > + (search-backward "message") >> > + (org-babel-tangle 4))) >> > + ;; Clean up the tangled file with the filename from >> org-test-with-temp-text-in-file >> > + (delete-file (format "%s.el" file)))))) >> >> This is not the best style. >> While technically `file' variable will be let-bound within the >> `org-test-with-temp-text-in-file' body, it is an internal implementation >> detail that we should not rely upon. Instead, it is a good idea to >> examine `buffer-file-name' inside the macro body to get the file name. >> >> Also, what if "%s.el" file does not exist? Say, tangling does happen, >> but to a wrong file. Note that `delete-file' does not throw any error >> when there is nothing to delete. >> >> -- >> Ihor Radchenko // yantar92, >> Org mode maintainer, >> Learn more about Org mode at . >> Support Org development at , >> or support my work at >> > > > -- > +---------------------------------------------------------------+ > | Derek Chen-Becker | > | GPG Key available at https://keybase.io/dchenbecker and | > | https://pgp.mit.edu/pks/lookup?search=3Dderek%40chen-becker.org | > | Fngrprnt: EB8A 6480 F0A3 C8EB C1E7 7F42 AFC5 AFEE 96E4 6ACC | > +---------------------------------------------------------------+ > > --=20 +---------------------------------------------------------------+ | Derek Chen-Becker | | GPG Key available at https://keybase.io/dchenbecker and | | https://pgp.mit.edu/pks/lookup?search=3Dderek%40chen-becker.org | | Fngrprnt: EB8A 6480 F0A3 C8EB C1E7 7F42 AFC5 AFEE 96E4 6ACC | +---------------------------------------------------------------+ --00000000000078bbe3062bbf4e59 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PGRpdiBjbGFzcz0iZ21haWxfZGVmYXVsdCIgc3R5bGU9ImZvbnQtZmFt aWx5OmFyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmO2ZvbnQtc2l6ZTpzbWFsbCI+QmVmb3JlIEkg c3VibWl0IHRoZSB1cGRhdGVkIHBhdGNoLCBkb2VzIHRoaXMgbG9vayBsaWtlIGEgYmV0dGVyIGFw cHJvYWNoPzwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2RlZmF1bHQiIHN0eWxlPSJmb250LWZhbWls eTphcmlhbCxoZWx2ZXRpY2Esc2Fucy1zZXJpZjtmb250LXNpemU6c21hbGwiPjxicj48L2Rpdj48 ZGl2IGNsYXNzPSJnbWFpbF9kZWZhdWx0IiBzdHlsZT0iZm9udC1mYW1pbHk6YXJpYWwsaGVsdmV0 aWNhLHNhbnMtc2VyaWY7Zm9udC1zaXplOnNtYWxsIj5JbiB0aGUgdGVzdMKgZm9yIGBvcmctYmFz ZS1idWZmZXItZmlsZS1uYW1lJiMzOTsgSSBjaGFuZ2VkIGl0IHRvIGV4cGxpY2l0bHkgZmluZCB0 aGUgY3VycmVudCBidWZmZXIgZmlsZSBuYW1lIGFuZCB1c2UgdGhhdDo8L2Rpdj48ZGl2IGNsYXNz PSJnbWFpbF9kZWZhdWx0IiBzdHlsZT0iZm9udC1mYW1pbHk6YXJpYWwsaGVsdmV0aWNhLHNhbnMt c2VyaWY7Zm9udC1zaXplOnNtYWxsIj48YnI+PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZGVmYXVs dCIgc3R5bGU9ImZvbnQtZmFtaWx5OmFyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmO2ZvbnQtc2l6 ZTpzbWFsbCI+KGVydC1kZWZ0ZXN0IHRlc3Qtb3JnLWJhc2UtYnVmZmVyLWZpbGUtbmFtZSAoKSDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCA8YnI+wqAgJnF1b3Q7VGVzdCBgb3JnLWJhc2UtYnVmZmVyLWZpbGUtbmFt ZSYjMzk7LiZxdW90OyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDxicj7CoCAoc2hvdWxk IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgPGJyPsKgIMKgKG9yZy10ZXN0LXdpdGgtdGVtcC10ZXh0LWluLWZpbGUg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA8YnI+wqAgwqAgJnF1b3Q7RmlsZSZxdW90 OyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCA8YnI+wqAgwqAgKGxldCAoKGJhc2UtZmlsZW5hbWUgKGJ1ZmZlci1maWxl LW5hbWUpKSkgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA8YnI+wqAgwqAgwqAgKGFuZCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA8 YnI+wqAgwqAgwqAgwqA7OyBDb25maXJtIHRoYXQgd2UgZ2V0IHRoZSBzYW1lIGFuc3dlciB3aGV0 aGVyIHdlIHByb3ZpZGUgdGhlIGJ1ZmZlciBvciB1c2UgdGhlIGRlZmF1bHQgPGJyPsKgIMKgIMKg IMKgKGVxdWFsIGJhc2UtZmlsZW5hbWUgKG9yZy1iYXNlLWJ1ZmZlci1maWxlLW5hbWUpKSDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA8YnI+ wqAgwqAgwqAgwqAoZXF1YWwgYmFzZS1maWxlbmFtZSAob3JnLWJhc2UtYnVmZmVyLWZpbGUtbmFt ZSAoY3VycmVudC1idWZmZXIpKSkpKSkpIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgPGJyPsKg IChzaG91bGQgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA8YnI+wqAgwqAob3JnLXRlc3Qtd2l0aC10ZW1wLXRleHQt aW4tZmlsZSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDxicj7CoCDCoCAmcXVvdDtG aWxlIHdpdGggY2FwdHVyZSBidWZmZXImcXVvdDsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgPGJyPsKgIMKgIChsZXQgKChvcmctY2FwdHVyZS10ZW1wbGF0ZXMgJiMzOTso KCZxdW90O3QmcXVvdDsgJnF1b3Q7VGVzdCZxdW90OyBlbnRyeSAoaGVyZSkgJnF1b3Q7KiBUZXN0 IEhlYWRlclxuXG4mcXVvdDspKSkgwqAgwqAgwqAgwqAgwqAgwqAgPGJyPsKgIMKgIMKgIMKgIMKg IChiYXNlLWZpbGVuYW1lIChidWZmZXItZmlsZS1uYW1lKSkpIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgPGJy PsKgIMKgIMKgIChvcmctY2FwdHVyZSBuaWwgJnF1b3Q7dCZxdW90OykgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA8YnI+wqAgwqAgwqAgKGFuZCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCA8YnI+wqAgwqAgwqAgwqA7OyBDb25maXJtIHRoYXQgd2UgZ2V0IHRoZSBzYW1lIGFuc3dlciB3 aGV0aGVyIHdlIHByb3ZpZGUgdGhlIGJ1ZmZlciBvciB1c2UgdGhlIGRlZmF1bHQgPGJyPsKgIMKg IMKgIMKgKGVxdWFsIGJhc2UtZmlsZW5hbWUgKG9yZy1iYXNlLWJ1ZmZlci1maWxlLW5hbWUpKSDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA8 YnI+wqAgwqAgwqAgwqAoZXF1YWwgYmFzZS1maWxlbmFtZSAob3JnLWJhc2UtYnVmZmVyLWZpbGUt bmFtZSAoY3VycmVudC1idWZmZXIpKSkgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA8 YnI+wqAgwqAgwqAgwqAoZXF1YWwgYmFzZS1maWxlbmFtZSAob3JnLWJhc2UtYnVmZmVyLWZpbGUt bmFtZSAoYnVmZmVyLWJhc2UtYnVmZmVyIChjdXJyZW50LWJ1ZmZlcikpKSkgPGJyPsKgIMKgIMKg IMKgKSkpKSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoDxicj7CoCAoc2hvdWxkLW5vdCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDxicj7CoCDCoChv cmctdGVzdC13aXRoLXRlbXAtdGV4dCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoDxicj7CoCDCoCAmcXVvdDtCdWZmZXIgd2l0aG91dCBmaWxlJnF1b3Q7IMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgPGJyPsKgIMKgIChvcmct YmFzZS1idWZmZXItZmlsZS1uYW1lKSkpKcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg wqA8L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9kZWZhdWx0IiBzdHlsZT0iZm9udC1mYW1pbHk6YXJp YWwsaGVsdmV0aWNhLHNhbnMtc2VyaWY7Zm9udC1zaXplOnNtYWxsIj48YnI+PC9kaXY+PGRpdiBj bGFzcz0iZ21haWxfZGVmYXVsdCIgc3R5bGU9ImZvbnQtZmFtaWx5OmFyaWFsLGhlbHZldGljYSxz YW5zLXNlcmlmO2ZvbnQtc2l6ZTpzbWFsbCI+Rm9yIHRoZSB0YW5nbGUgdGVzdCwgSSBhbHNvIGNh cHR1cmUgdGhlIGJhc2UgYnVmZmVyIGZpbGVuYW1lLCB1c2UgYW4gZXhwbGljaXQgdGFuZ2xlIGZp bGVuYW1lLCBhbmQgZW5zdXJlIHRoYXQgdGhlIGNhbGwgdG8gYG9yZy1iYWJlbC10YW5nbGUmIzM5 OyByZXR1cm5zIHRoZSBleHBlY3RlZCBsaXN0IG9mIHRhbmdsZWQgZmlsZXM6PC9kaXY+PGRpdiBj bGFzcz0iZ21haWxfZGVmYXVsdCIgc3R5bGU9ImZvbnQtZmFtaWx5OmFyaWFsLGhlbHZldGljYSxz YW5zLXNlcmlmO2ZvbnQtc2l6ZTpzbWFsbCI+PGJyPjwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2Rl ZmF1bHQiIHN0eWxlPSJmb250LWZhbWlseTphcmlhbCxoZWx2ZXRpY2Esc2Fucy1zZXJpZjtmb250 LXNpemU6c21hbGwiPjs7IFNlZSA8YSBocmVmPSJodHRwczovL2xpc3Qub3JnbW9kZS5vcmcvODdt c2Z4ZDgxYy5mc2ZAbG9jYWxob3N0L1QvI3QiPmh0dHBzOi8vbGlzdC5vcmdtb2RlLm9yZy84N21z ZnhkODFjLmZzZkBsb2NhbGhvc3QvVC8jdDwvYT4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqA8YnI+KGVydC1kZWZ0ZXN0IG9iLXRhbmdsZS90YW5nbGUtZnJvbS1j YXB0dXJlLWJ1ZmZlciAoKSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCA8YnI+wqAgJnF1b3Q7VGVzdCB0YW5nbGluZyBvZiBzb3VyY2UgYmxv Y2tzIGZyb20gd2l0aGluIGEgY2FwdHVyZSBidWZmZXIuIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgPGJyPlRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgd2UgcHJvcGVybHkg cmVzb2x2ZSB0aGUgYnVmZmVyIG5hbWUuJnF1b3Q7IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIDxicj7CoCAob3JnLXRlc3Qtd2l0aC10ZW1wLXRleHQtaW4tZmls ZSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA8YnI+wqAgwqAmcXVvdDsqIEhlYWRlclxuXG5D YXB0dXJlIGFmdGVyIHRoaXMgcG9pbnQ6XG4mbHQ7cG9pbnQmZ3Q7JnF1b3Q7IMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgPGJyPsKgIMKg KGxldCAoKHRhbmdsZS1maWxlbmFtZSAoZm9ybWF0ICZxdW90OyVzLmVsJnF1b3Q7IChidWZmZXIt ZmlsZS1uYW1lKSkpKSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDxi cj7CoCDCoCDCoChzaG91bGQgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgPGJyPsKgIMKgIMKgICh1bndpbmQtcHJvdGVjdCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDxicj7CoCDCoCDCoCDCoCDC oCAocHJvZ24gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgPGJyPsKgIMKgIMKgIMKgIMKgIMKgIChsZXQgKChvcmctY2FwdHVyZS10ZW1wbGF0ZXMg JiMzOTsoKCZxdW90O3QmcXVvdDsgJnF1b3Q7VGVzdCZxdW90OyBlbnRyeSAoaGVyZSkgJnF1b3Q7 KiBUZXN0IEhlYWRlclxuXG4mcXVvdDspKSkpPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIChvcmct Y2FwdHVyZSBuaWwgJnF1b3Q7dCZxdW90OykgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA8YnI+ wqAgwqAgwqAgwqAgwqAgwqAgwqAgKGdvdG8tY2hhciAocG9pbnQtbWF4KSkgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqA8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgKGluc2VydCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDxicj7CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoChmb3JtYXQgJnF1b3Q7IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIDxicj4jK2JlZ2luX3NyYyBlbGlzcCA6dGFuZ2xlIFwmcXVvdDslc1wmcXVvdDsgOmNvbW1l bnRzIG9yZyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCA8YnI+wqAgKG1lc3NhZ2UgXCZxdW90O0ZPT1wmcXVvdDspIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgPGJyPiMrZW5kX3Ny YyZxdW90OyB0YW5nbGUtZmlsZW5hbWUpKSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCA8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgKHNlYXJjaC1iYWNrd2FyZCAmcXVvdDttZXNz YWdlJnF1b3Q7KSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCA7OyBD b25maXJtIHRoYXQgd2UgdGFuZ2xlZCB0byB0aGUgcmlnaHQgZmlsZSDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAg KGVxdWFsIChvcmctYmFiZWwtdGFuZ2xlIDQpIChsaXN0IHRhbmdsZS1maWxlbmFtZSkpKSkgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA8YnI+wqAgwqAgwqAgwqAgOzsgQ2xlYW4g dXAgdGhlIHRhbmdsZWQgZmlsZSB3aXRoIHRoZSBmaWxlbmFtZSBmcm9tIG9yZy10ZXN0LXdpdGgt dGVtcC10ZXh0LWluLWZpbGU8YnI+wqAgwqAgwqAgwqAgKGRlbGV0ZS1maWxlIHRhbmdsZS1maWxl bmFtZSkpKSkpKcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgPC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZGVmYXVs dCIgc3R5bGU9ImZvbnQtZmFtaWx5OmFyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmO2ZvbnQtc2l6 ZTpzbWFsbCI+wqA8L2Rpdj48L2Rpdj48YnI+PGRpdiBjbGFzcz0iZ21haWxfcXVvdGUgZ21haWxf cXVvdGVfY29udGFpbmVyIj48ZGl2IGRpcj0ibHRyIiBjbGFzcz0iZ21haWxfYXR0ciI+T24gVHVl LCBKYW4gMTQsIDIwMjUgYXQgMTI6MjbigK9QTSBEZXJlayBDaGVuLUJlY2tlciAmbHQ7PGEgaHJl Zj0ibWFpbHRvOmRlcmVrQGNoZW4tYmVja2VyLm9yZyI+ZGVyZWtAY2hlbi1iZWNrZXIub3JnPC9h PiZndDsgd3JvdGU6PGJyPjwvZGl2PjxibG9ja3F1b3RlIGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5 bGU9Im1hcmdpbjowcHggMHB4IDBweCAwLjhleDtib3JkZXItbGVmdDoxcHggc29saWQgcmdiKDIw NCwyMDQsMjA0KTtwYWRkaW5nLWxlZnQ6MWV4Ij48ZGl2IGRpcj0ibHRyIj48ZGl2IGNsYXNzPSJn bWFpbF9kZWZhdWx0IiBzdHlsZT0iZm9udC1mYW1pbHk6YXJpYWwsaGVsdmV0aWNhLHNhbnMtc2Vy aWY7Zm9udC1zaXplOnNtYWxsIj5UaGFua3MgZm9yIHRoZSBjb21tZW50cyEgVGhpcyBpcyBteSBm aXJzdCByZWFsIGZvcmF5IGludG8gbm9uLXRyaXZpYWwgZWxpc3Agc28gSSByZWFsbHkgYXBwcmVj aWF0ZSB5b3VyIHBhdGllbmNlIGFuZCBoZWxwLiBMZXQgbWUgdHJ5IGFuZCBnZXQgdGhlc2UgYWRk cmVzc2VkLjwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2RlZmF1bHQiIHN0eWxlPSJmb250LWZhbWls eTphcmlhbCxoZWx2ZXRpY2Esc2Fucy1zZXJpZjtmb250LXNpemU6c21hbGwiPjxicj48L2Rpdj48 ZGl2IGNsYXNzPSJnbWFpbF9kZWZhdWx0IiBzdHlsZT0iZm9udC1mYW1pbHk6YXJpYWwsaGVsdmV0 aWNhLHNhbnMtc2VyaWY7Zm9udC1zaXplOnNtYWxsIj5DaGVlcnMsPC9kaXY+PGRpdiBjbGFzcz0i Z21haWxfZGVmYXVsdCIgc3R5bGU9ImZvbnQtZmFtaWx5OmFyaWFsLGhlbHZldGljYSxzYW5zLXNl cmlmO2ZvbnQtc2l6ZTpzbWFsbCI+PGJyPjwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2RlZmF1bHQi IHN0eWxlPSJmb250LWZhbWlseTphcmlhbCxoZWx2ZXRpY2Esc2Fucy1zZXJpZjtmb250LXNpemU6 c21hbGwiPmRlcmVrPC9kaXY+PC9kaXY+PGJyPjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj48ZGl2 IGRpcj0ibHRyIiBjbGFzcz0iZ21haWxfYXR0ciI+T24gVHVlLCBKYW4gMTQsIDIwMjUgYXQgMTA6 NTTigK9BTSBJaG9yIFJhZGNoZW5rbyAmbHQ7PGEgaHJlZj0ibWFpbHRvOnlhbnRhcjkyQHBvc3Rl by5uZXQiIHRhcmdldD0iX2JsYW5rIj55YW50YXI5MkBwb3N0ZW8ubmV0PC9hPiZndDsgd3JvdGU6 PGJyPjwvZGl2PjxibG9ja3F1b3RlIGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5bGU9Im1hcmdpbjow cHggMHB4IDBweCAwLjhleDtib3JkZXItbGVmdDoxcHggc29saWQgcmdiKDIwNCwyMDQsMjA0KTtw YWRkaW5nLWxlZnQ6MWV4Ij5EZXJlayBDaGVuLUJlY2tlciAmbHQ7PGEgaHJlZj0ibWFpbHRvOmRl cmVrQGNoZW4tYmVja2VyLm9yZyIgdGFyZ2V0PSJfYmxhbmsiPmRlcmVrQGNoZW4tYmVja2VyLm9y ZzwvYT4mZ3Q7IHdyaXRlczo8YnI+DQo8YnI+DQomZ3Q7IFRoYW5rcyBmb3IgdGhlIGhlbHAgb24g dGhpcyEgSSYjMzk7dmUgcmV3b3JrZWQgdGhlIGNoYW5nZXMgaW50byB0d28gcGF0Y2hlczxicj4N CiZndDsgKG9uZSBmb3IgdGhlIFJFQURNRSBhbmQgb25lIGZvciB0YW5nbGUpIGFuZCBJIHRoaW5r IEkmIzM5O3ZlIGNvdmVyZWQgeW91cjxicj4NCiZndDsgY29uY2VybnMuIEkgYWxzbyBhZGRlZCBh IHVuaXQgdGVzdCBmb3IgdGhlIG9yZy1iYXNlLWJ1ZmZlci1maWxlLW5hbWU8YnI+DQomZ3Q7IGZ1 bmN0aW9uIHRvIGNvdmVyIHRoZSBtaXNzIG9uIHByb3ZpZGVkIGJ1ZmZlcnMuIFBsZWFzZSBsZXQg bWUga25vdyBpZiB5b3U8YnI+DQomZ3Q7IGhhdmUgYW55IHF1ZXN0aW9ucy48YnI+DQo8YnI+DQpU aGFua3MhPGJyPg0KQWx0aG91Z2gsIEkgYW0gYWZyYWlkIHRoYXQgdGhlIHNlY29uZCBzZXQgb2Yg dW5pdCB0ZXN0cyBpcyBhIGJpdCBtdWNoPGJyPg0KLSB0aGV5IG5vIGxvbmdlciBmaXQgd2l0aGlu IFRJTllDSEFOR0UgKDE1LTIwIHNpZ25pZmljYW50IExPQykuPGJyPg0KV2UgaGF2ZSBhIGxlZ2Fs IGxpbWl0IG9uIGhvdyBtdWNoIGNvZGUgd2UgY2FuIGFjY2VwdCB3aXRob3V0IHJlcXVpcmluZzxi cj4NCmNvcHlyaWdodCBhc3NpZ25tZW50LiBTZWUgPGEgaHJlZj0iaHR0cHM6Ly9vcmdtb2RlLm9y Zy93b3JnL29yZy1jb250cmlidXRlLmh0bWwjY29weXJpZ2h0IiByZWw9Im5vcmVmZXJyZXIiIHRh cmdldD0iX2JsYW5rIj5odHRwczovL29yZ21vZGUub3JnL3dvcmcvb3JnLWNvbnRyaWJ1dGUuaHRt bCNjb3B5cmlnaHQ8L2E+PGJyPg0KPGJyPg0KTW9yZSBjb21tZW50cyBiZWxvdy48YnI+DQo8YnI+ DQomZ3Q7ICogbGlzcC9vYi10YW5nbGUuZWwgKG9yZy1iYWJlbC10YW5nbGUpOiBVcGRhdGUgdG8g dXRpbGl6ZSB0aGUgbmV3PGJyPg0KJmd0OyBvcmctYmFzZS1idWZmZXItZmlsZS1uYW1lIGZ1bmN0 aW9uLjxicj4NCjxicj4NCk91ciBjb252ZW50aW9uIGlzIHRvIHF1b3RlIEVsaXNwIHN5bWJvbHMg aW4gY29tbWl0IG1lc3NhZ2VzIGxpa2UgYHRoaXMmIzM5Oy48YnI+DQo8YnI+DQomZ3Q7IFRoZSBw cmV2aW91cyB1c2Ugb2YgYnVmZmVyLWZpbGUtbmFtZSB3b3VsZCBmYWlsIGluc2lkZSBvZiBhIGNh cHR1cmUgYnVmZmVyPGJyPg0KJmd0OyBiZWNhdXNlIGl0IGlzIGluZGlyZWN0IGFuZCBkb2VzIG5v dCBoYXZlIGFuIGFzc29jaWF0ZWQgZmlsZW5hbWUuIFRoaXM8YnI+DQo8YnI+DQpBbm90aGVyIGNv bnZlbnRpb24gaXMgZG91YmxlIHNwYWNlIGJldHdlZW4gc2VudGVuY2VzLjxicj4NCjxicj4NCiZn dDsgKyhkZWZ1biBvcmctYmFzZS1idWZmZXItZmlsZS1uYW1lICgmYW1wO29wdGlvbmFsIEJVRkZF Uik8YnI+DQo8YnI+DQpFbGlzcCBjb252ZW50aW9uIGlzIHRvIHVzZSBsb3dlciBjYXNlIGZvciBm dW5jdGlvbiBhcmd1bWVudHMuPGJyPg0KVXBwZXIgY2FzZSBpbiB0aGUgZG9jc3RyaW5nIGlzIHVz ZWQgdG8gaGlnaGxpZ2h0IHRoZSBmdW5jdGlvbiBhcmd1bWVudHM7PGJyPg0KaXQgZG9lcyBub3Qg bWVhbiB0aGF0IHRoZSBhcmd1bWVudHMgdGhlbXNlbHZlcyBuZWVkIHRvIGJlIGluIHVwcGVyIGNh c2UuPGJyPg0KPGJyPg0KJmd0OyArwqAgKGlmIChidWZmZXItYmFzZS1idWZmZXIgQlVGRkVSKTxi cj4NCiZndDsgK8KgIMKgIMKgIChidWZmZXItZmlsZS1uYW1lIChidWZmZXItYmFzZS1idWZmZXIg QlVGRkVSKSk8YnI+DQomZ3Q7ICvCoCDCoCAoYnVmZmVyLWZpbGUtbmFtZSBCVUZGRVIpKSk8YnI+ DQo8YnI+DQpOaXQ6IENhbiBhbHNvIHVzZSBgaWYtbGV0KiYjMzk7IHRvIGF2b2lkIGNhbGxpbmcg YGJ1ZmZlci1iYXNlLWJ1ZmZlciYjMzk7IHR3aWNlLjxicj4NCjxicj4NCiZndDsgKzs7IFNlZSA8 YSBocmVmPSJodHRwczovL2xpc3Qub3JnbW9kZS5vcmcvODdtc2Z4ZDgxYy5mc2ZAbG9jYWxob3N0 L1QvI3QiIHJlbD0ibm9yZWZlcnJlciIgdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vbGlzdC5vcmdt b2RlLm9yZy84N21zZnhkODFjLmZzZkBsb2NhbGhvc3QvVC8jdDwvYT48YnI+DQomZ3Q7ICsoZXJ0 LWRlZnRlc3Qgb2ItdGFuZ2xlL3RhbmdsZS1mcm9tLWNhcHR1cmUtYnVmZmVyICgpPGJyPg0KJmd0 OyArwqAgJnF1b3Q7VGVzdCB0YW5nbGluZyBvZiBzb3VyY2UgYmxvY2tzIGZyb20gd2l0aGluIGEg Y2FwdHVyZSBidWZmZXIuPGJyPg0KJmd0OyArVGhpcyBpcyB0byBlbnN1cmUgdGhhdCB3ZSBwcm9w ZXJseSByZXNvbHZlIHRoZSBidWZmZXIgbmFtZS4mcXVvdDs8YnI+DQomZ3Q7ICvCoCAob3JnLXRl c3Qtd2l0aC10ZW1wLXRleHQtaW4tZmlsZTxicj4NCiZndDsgK8KgIMKgJnF1b3Q7KiBIZWFkZXJc blxuQ2FwdHVyZSBhZnRlciB0aGlzIHBvaW50OlxuJmx0O3BvaW50Jmd0OyZxdW90Ozxicj4NCiZn dDsgK8KgIMKgKHNob3VsZDxicj4NCiZndDsgK8KgIMKgICh1bndpbmQtcHJvdGVjdDxicj4NCiZn dDsgK8KgIMKgIMKgIMKgIChwcm9nbjxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIChsZXQgKChv cmctY2FwdHVyZS10ZW1wbGF0ZXMgJiMzOTsoKCZxdW90O3QmcXVvdDsgJnF1b3Q7VGVzdCZxdW90 OyBlbnRyeSAoaGVyZSkgJnF1b3Q7KiBUZXN0IEhlYWRlclxuXG4mcXVvdDspKSkpPGJyPg0KJmd0 OyArwqAgwqAgwqAgwqAgwqAgwqAgKG9yZy1jYXB0dXJlIG5pbCAmcXVvdDt0JnF1b3Q7KTxicj4N CiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIChnb3RvLWNoYXIgKHBvaW50LW1heCkpPGJyPg0KJmd0 OyArwqAgwqAgwqAgwqAgwqAgwqAgKGluc2VydCAmcXVvdDs8YnI+DQomZ3Q7ICsjK2JlZ2luX3Ny YyBlbGlzcCA6dGFuZ2xlIHllcyA6Y29tbWVudHMgb3JnPGJyPg0KJmd0OyArwqAgKG1lc3NhZ2Ug XCZxdW90O0ZPT1wmcXVvdDspPGJyPg0KJmd0OyArIytlbmRfc3JjJnF1b3Q7KTxicj4NCiZndDsg K8KgIMKgIMKgIMKgIMKgIMKgIChzZWFyY2gtYmFja3dhcmQgJnF1b3Q7bWVzc2FnZSZxdW90Oyk8 YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCAob3JnLWJhYmVsLXRhbmdsZSA0KSkpPGJyPg0K Jmd0OyArwqAgwqAgwqAgOzsgQ2xlYW4gdXAgdGhlIHRhbmdsZWQgZmlsZSB3aXRoIHRoZSBmaWxl bmFtZSBmcm9tIG9yZy10ZXN0LXdpdGgtdGVtcC10ZXh0LWluLWZpbGU8YnI+DQomZ3Q7ICvCoCDC oCDCoCAoZGVsZXRlLWZpbGUgKGZvcm1hdCAmcXVvdDslcy5lbCZxdW90OyBmaWxlKSkpKSkpPGJy Pg0KPGJyPg0KVGhpcyBpcyBub3QgdGhlIGJlc3Qgc3R5bGUuPGJyPg0KV2hpbGUgdGVjaG5pY2Fs bHkgYGZpbGUmIzM5OyB2YXJpYWJsZSB3aWxsIGJlIGxldC1ib3VuZCB3aXRoaW4gdGhlPGJyPg0K YG9yZy10ZXN0LXdpdGgtdGVtcC10ZXh0LWluLWZpbGUmIzM5OyBib2R5LCBpdCBpcyBhbiBpbnRl cm5hbCBpbXBsZW1lbnRhdGlvbjxicj4NCmRldGFpbCB0aGF0IHdlIHNob3VsZCBub3QgcmVseSB1 cG9uLiBJbnN0ZWFkLCBpdCBpcyBhIGdvb2QgaWRlYSB0bzxicj4NCmV4YW1pbmUgYGJ1ZmZlci1m aWxlLW5hbWUmIzM5OyBpbnNpZGUgdGhlIG1hY3JvIGJvZHkgdG8gZ2V0IHRoZSBmaWxlIG5hbWUu PGJyPg0KPGJyPg0KQWxzbywgd2hhdCBpZiAmcXVvdDslcy5lbCZxdW90OyBmaWxlIGRvZXMgbm90 IGV4aXN0PyBTYXksIHRhbmdsaW5nIGRvZXMgaGFwcGVuLDxicj4NCmJ1dCB0byBhIHdyb25nIGZp bGUuIE5vdGUgdGhhdCBgZGVsZXRlLWZpbGUmIzM5OyBkb2VzIG5vdCB0aHJvdyBhbnkgZXJyb3I8 YnI+DQp3aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gZGVsZXRlLjxicj4NCjxicj4NCi0tIDxicj4N Cklob3IgUmFkY2hlbmtvIC8vIHlhbnRhcjkyLDxicj4NCk9yZyBtb2RlIG1haW50YWluZXIsPGJy Pg0KTGVhcm4gbW9yZSBhYm91dCBPcmcgbW9kZSBhdCAmbHQ7PGEgaHJlZj0iaHR0cHM6Ly9vcmdt b2RlLm9yZy8iIHJlbD0ibm9yZWZlcnJlciIgdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vb3JnbW9k ZS5vcmcvPC9hPiZndDsuPGJyPg0KU3VwcG9ydCBPcmcgZGV2ZWxvcG1lbnQgYXQgJmx0OzxhIGhy ZWY9Imh0dHBzOi8vbGliZXJhcGF5LmNvbS9vcmctbW9kZSIgcmVsPSJub3JlZmVycmVyIiB0YXJn ZXQ9Il9ibGFuayI+aHR0cHM6Ly9saWJlcmFwYXkuY29tL29yZy1tb2RlPC9hPiZndDssPGJyPg0K b3Igc3VwcG9ydCBteSB3b3JrIGF0ICZsdDs8YSBocmVmPSJodHRwczovL2xpYmVyYXBheS5jb20v eWFudGFyOTIiIHJlbD0ibm9yZWZlcnJlciIgdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vbGliZXJh cGF5LmNvbS95YW50YXI5MjwvYT4mZ3Q7PGJyPg0KPC9ibG9ja3F1b3RlPjwvZGl2PjxkaXY+PGJy IGNsZWFyPSJhbGwiPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxzcGFuIGNsYXNzPSJnbWFpbF9zaWdu YXR1cmVfcHJlZml4Ij4tLSA8L3NwYW4+PGJyPjxkaXYgZGlyPSJsdHIiIGNsYXNzPSJnbWFpbF9z aWduYXR1cmUiPjxkaXYgZGlyPSJsdHIiPjxkaXY+PGRpdiBkaXI9Imx0ciI+PGRpdj48Zm9udCBm YWNlPSJtb25vc3BhY2UsIG1vbm9zcGFjZSI+Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSs8L2ZvbnQ+PC9kaXY+PGRpdj48Zm9u dCBmYWNlPSJtb25vc3BhY2UsIG1vbm9zcGFjZSI+fCBEZXJlayBDaGVuLUJlY2tlcsKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgfDwvZm9udD48L2Rpdj48ZGl2PjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTptb25vc3BhY2Us bW9ub3NwYWNlIj58IEdQRyBLZXkgYXZhaWxhYmxlIGF0IDwvc3Bhbj48YSBocmVmPSJodHRwczov L2tleWJhc2UuaW8vZGNoZW5iZWNrZXIiIHN0eWxlPSJmb250LWZhbWlseTptb25vc3BhY2UsbW9u b3NwYWNlIiB0YXJnZXQ9Il9ibGFuayI+aHR0cHM6Ly9rZXliYXNlLmlvL2RjaGVuYmVja2VyPC9h PjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTptb25vc3BhY2UsbW9ub3NwYWNlIj4gYW5kwqAgwqAg wqAgwqB8PC9zcGFuPjxicj48L2Rpdj48ZGl2Pjxmb250IGZhY2U9Im1vbm9zcGFjZSwgbW9ub3Nw YWNlIj58IDxhIGhyZWY9Imh0dHBzOi8vcGdwLm1pdC5lZHUvcGtzL2xvb2t1cD9zZWFyY2g9ZGVy ZWslNDBjaGVuLWJlY2tlci5vcmciIHRhcmdldD0iX2JsYW5rIj5odHRwczovL3BncC5taXQuZWR1 L3Brcy9sb29rdXA/c2VhcmNoPWRlcmVrJTQwY2hlbi1iZWNrZXIub3JnPC9hPiB8PC9mb250Pjwv ZGl2PjxkaXY+PGZvbnQgZmFjZT0ibW9ub3NwYWNlLCBtb25vc3BhY2UiPnwgRm5ncnBybnQ6IEVC OEEgNjQ4MCBGMEEzIEM4RUIgQzFFN8KgIDdGNDIgQUZDNSBBRkVFIDk2RTQgNkFDQ8KgIHw8L2Zv bnQ+PC9kaXY+PGRpdj48Zm9udCBmYWNlPSJtb25vc3BhY2UsIG1vbm9zcGFjZSI+Ky0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSs8 L2ZvbnQ+PC9kaXY+PGRpdj48YnI+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+DQo8L2Js b2NrcXVvdGU+PC9kaXY+PGRpdj48YnIgY2xlYXI9ImFsbCI+PC9kaXY+PGRpdj48YnI+PC9kaXY+ PHNwYW4gY2xhc3M9ImdtYWlsX3NpZ25hdHVyZV9wcmVmaXgiPi0tIDwvc3Bhbj48YnI+PGRpdiBk aXI9Imx0ciIgY2xhc3M9ImdtYWlsX3NpZ25hdHVyZSI+PGRpdiBkaXI9Imx0ciI+PGRpdj48ZGl2 IGRpcj0ibHRyIj48ZGl2Pjxmb250IGZhY2U9Im1vbm9zcGFjZSwgbW9ub3NwYWNlIj4rLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t KzwvZm9udD48L2Rpdj48ZGl2Pjxmb250IGZhY2U9Im1vbm9zcGFjZSwgbW9ub3NwYWNlIj58IERl cmVrIENoZW4tQmVja2VywqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB8PC9mb250PjwvZGl2PjxkaXY+PHNwYW4gc3R5bGU9 ImZvbnQtZmFtaWx5Om1vbm9zcGFjZSxtb25vc3BhY2UiPnwgR1BHIEtleSBhdmFpbGFibGUgYXQg PC9zcGFuPjxhIGhyZWY9Imh0dHBzOi8va2V5YmFzZS5pby9kY2hlbmJlY2tlciIgc3R5bGU9ImZv bnQtZmFtaWx5Om1vbm9zcGFjZSxtb25vc3BhY2UiIHRhcmdldD0iX2JsYW5rIj5odHRwczovL2tl eWJhc2UuaW8vZGNoZW5iZWNrZXI8L2E+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5Om1vbm9zcGFj ZSxtb25vc3BhY2UiPiBhbmTCoCDCoCDCoCDCoHw8L3NwYW4+PGJyPjwvZGl2PjxkaXY+PGZvbnQg ZmFjZT0ibW9ub3NwYWNlLCBtb25vc3BhY2UiPnwgPGEgaHJlZj0iaHR0cHM6Ly9wZ3AubWl0LmVk dS9wa3MvbG9va3VwP3NlYXJjaD1kZXJlayU0MGNoZW4tYmVja2VyLm9yZyIgdGFyZ2V0PSJfYmxh bmsiPmh0dHBzOi8vcGdwLm1pdC5lZHUvcGtzL2xvb2t1cD9zZWFyY2g9ZGVyZWslNDBjaGVuLWJl Y2tlci5vcmc8L2E+IHw8L2ZvbnQ+PC9kaXY+PGRpdj48Zm9udCBmYWNlPSJtb25vc3BhY2UsIG1v bm9zcGFjZSI+fCBGbmdycHJudDogRUI4QSA2NDgwIEYwQTMgQzhFQiBDMUU3wqAgN0Y0MiBBRkM1 IEFGRUUgOTZFNCA2QUNDwqAgfDwvZm9udD48L2Rpdj48ZGl2Pjxmb250IGZhY2U9Im1vbm9zcGFj ZSwgbW9ub3NwYWNlIj4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tKzwvZm9udD48L2Rpdj48ZGl2Pjxicj48L2Rpdj48L2Rpdj48 L2Rpdj48L2Rpdj48L2Rpdj4NCg== --00000000000078bbe3062bbf4e59--