summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustOff <Off.Just.Off@gmail.com>2020-10-15 18:21:34 +0300
committerJustOff <Off.Just.Off@gmail.com>2020-10-15 18:21:34 +0300
commit71807b9cfe98fdd5ee841f2f576339df53a6fb7d (patch)
treee31a6803495bc3431121086d00a610e5c383a0f4
downloadgithub-wc-polyfill-71807b9cfe98fdd5ee841f2f576339df53a6fb7d.tar.gz
Initial commit1.0.1
-rw-r--r--.gitignore2
-rw-r--r--LICENSE373
-rw-r--r--README.md1
-rw-r--r--bootstrap.js65
-rw-r--r--icon.pngbin0 -> 773 bytes
-rw-r--r--install.rdf22
-rw-r--r--release.cmd9
-rw-r--r--update.xml22
8 files changed, 494 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..a2e2dd0
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+*.xpi
+*.exe
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..14e2f77
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,373 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+ means each individual or legal entity that creates, contributes to
+ the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+ means the combination of the Contributions of others (if any) used
+ by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+ means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+ means Source Code Form to which the initial Contributor has attached
+ the notice in Exhibit A, the Executable Form of such Source Code
+ Form, and Modifications of such Source Code Form, in each case
+ including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+ means
+
+ (a) that the initial Contributor has attached the notice described
+ in Exhibit B to the Covered Software; or
+
+ (b) that the Covered Software was made available under the terms of
+ version 1.1 or earlier of the License, but not also under the
+ terms of a Secondary License.
+
+1.6. "Executable Form"
+ means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+ means a work that combines Covered Software with other material, in
+ a separate file or files, that is not Covered Software.
+
+1.8. "License"
+ means this document.
+
+1.9. "Licensable"
+ means having the right to grant, to the maximum extent possible,
+ whether at the time of the initial grant or subsequently, any and
+ all of the rights conveyed by this License.
+
+1.10. "Modifications"
+ means any of the following:
+
+ (a) any file in Source Code Form that results from an addition to,
+ deletion from, or modification of the contents of Covered
+ Software; or
+
+ (b) any new file in Source Code Form that contains any Covered
+ Software.
+
+1.11. "Patent Claims" of a Contributor
+ means any patent claim(s), including without limitation, method,
+ process, and apparatus claims, in any patent Licensable by such
+ Contributor that would be infringed, but for the grant of the
+ License, by the making, using, selling, offering for sale, having
+ made, import, or transfer of either its Contributions or its
+ Contributor Version.
+
+1.12. "Secondary License"
+ means either the GNU General Public License, Version 2.0, the GNU
+ Lesser General Public License, Version 2.1, the GNU Affero General
+ Public License, Version 3.0, or any later versions of those
+ licenses.
+
+1.13. "Source Code Form"
+ means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+ means an individual or a legal entity exercising rights under this
+ License. For legal entities, "You" includes any entity that
+ controls, is controlled by, or is under common control with You. For
+ purposes of this definition, "control" means (a) the power, direct
+ or indirect, to cause the direction or management of such entity,
+ whether by contract or otherwise, or (b) ownership of more than
+ fifty percent (50%) of the outstanding shares or beneficial
+ ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+ Licensable by such Contributor to use, reproduce, make available,
+ modify, display, perform, distribute, and otherwise exploit its
+ Contributions, either on an unmodified basis, with Modifications, or
+ as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+ for sale, have made, import, and otherwise transfer either its
+ Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+ or
+
+(b) for infringements caused by: (i) Your and any other third party's
+ modifications of Covered Software, or (ii) the combination of its
+ Contributions with other software (except as part of its Contributor
+ Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+ its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+ Form, as described in Section 3.1, and You must inform recipients of
+ the Executable Form how they can obtain a copy of such Source Code
+ Form by reasonable means in a timely manner, at a charge no more
+ than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+ License, or sublicense it under different terms, provided that the
+ license for the Executable Form does not attempt to limit or alter
+ the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+* *
+* 6. Disclaimer of Warranty *
+* ------------------------- *
+* *
+* Covered Software is provided under this License on an "as is" *
+* basis, without warranty of any kind, either expressed, implied, or *
+* statutory, including, without limitation, warranties that the *
+* Covered Software is free of defects, merchantable, fit for a *
+* particular purpose or non-infringing. The entire risk as to the *
+* quality and performance of the Covered Software is with You. *
+* Should any Covered Software prove defective in any respect, You *
+* (not any Contributor) assume the cost of any necessary servicing, *
+* repair, or correction. This disclaimer of warranty constitutes an *
+* essential part of this License. No use of any Covered Software is *
+* authorized under this License except under this disclaimer. *
+* *
+************************************************************************
+
+************************************************************************
+* *
+* 7. Limitation of Liability *
+* -------------------------- *
+* *
+* Under no circumstances and under no legal theory, whether tort *
+* (including negligence), contract, or otherwise, shall any *
+* Contributor, or anyone who distributes Covered Software as *
+* permitted above, be liable to You for any direct, indirect, *
+* special, incidental, or consequential damages of any character *
+* including, without limitation, damages for lost profits, loss of *
+* goodwill, work stoppage, computer failure or malfunction, or any *
+* and all other commercial damages or losses, even if such party *
+* shall have been informed of the possibility of such damages. This *
+* limitation of liability shall not apply to liability for death or *
+* personal injury resulting from such party's negligence to the *
+* extent applicable law prohibits such limitation. Some *
+* jurisdictions do not allow the exclusion or limitation of *
+* incidental or consequential damages, so this exclusion and *
+* limitation may not apply to You. *
+* *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+ This Source Code Form is subject to the terms of the Mozilla Public
+ License, v. 2.0. If a copy of the MPL was not distributed with this
+ file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+ This Source Code Form is "Incompatible With Secondary Licenses", as
+ defined by the Mozilla Public License, v. 2.0.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..31bef68
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+**GitHub Web Components Polyfill** provides a Web Components Polyfill for GitHub using [Web Components Polyfills](https://github.com/webcomponents/polyfills). \ No newline at end of file
diff --git a/bootstrap.js b/bootstrap.js
new file mode 100644
index 0000000..5c6afd6
--- /dev/null
+++ b/bootstrap.js
@@ -0,0 +1,65 @@
+"use strict";
+
+var Ci = Components.interfaces, Cu = Components.utils;
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+const polyfill = "KGZ1bmN0aW9uKCl7Cid1c2Ugc3RyaWN0Jzt2YXIgdztmdW5jdGlvbiBhYShhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX12YXIgYmE9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7YSE9QXJyYXkucHJvdG90eXBlJiZhIT1PYmplY3QucHJvdG90eXBlJiYoYVtiXT1jLnZhbHVlKX0sY2E9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdz09PXRoaXM/dGhpczoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbCYmbnVsbCE9Z2xvYmFsP2dsb2JhbDp0aGlzO2Z1bmN0aW9uIGRhKCl7ZGE9ZnVuY3Rpb24oKXt9O2NhLlN5bWJvbHx8KGNhLlN5bWJvbD1mYSl9CmZ1bmN0aW9uIGhhKGEsYil7dGhpcy5hPWE7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6Yn0pfWhhLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9O3ZhciBmYT1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoYyl7aWYodGhpcyBpbnN0YW5jZW9mIGEpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yIik7cmV0dXJuIG5ldyBoYSgianNjb21wX3N5bWJvbF8iKyhjfHwiIikrIl8iK2IrKyxjKX12YXIgYj0wO3JldHVybiBhfSgpOwpmdW5jdGlvbiBpYSgpe2RhKCk7dmFyIGE9Y2EuU3ltYm9sLml0ZXJhdG9yO2F8fChhPWNhLlN5bWJvbC5pdGVyYXRvcj1jYS5TeW1ib2woIlN5bWJvbC5pdGVyYXRvciIpKTsiZnVuY3Rpb24iIT10eXBlb2YgQXJyYXkucHJvdG90eXBlW2FdJiZiYShBcnJheS5wcm90b3R5cGUsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGxhKGFhKHRoaXMpKX19KTtpYT1mdW5jdGlvbigpe319ZnVuY3Rpb24gbGEoYSl7aWEoKTthPXtuZXh0OmF9O2FbY2EuU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTtyZXR1cm4gYX1mdW5jdGlvbiBtYShhKXt2YXIgYj0idW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yJiZhW1N5bWJvbC5pdGVyYXRvcl07cmV0dXJuIGI/Yi5jYWxsKGEpOntuZXh0OmFhKGEpfX0KZnVuY3Rpb24gbmEoYSl7Zm9yKHZhciBiLGM9W107IShiPWEubmV4dCgpKS5kb25lOyljLnB1c2goYi52YWx1ZSk7cmV0dXJuIGN9dmFyIG9hO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3Quc2V0UHJvdG90eXBlT2Ypb2E9T2JqZWN0LnNldFByb3RvdHlwZU9mO2Vsc2V7dmFyIHBhO2E6e3ZhciBxYT17UGE6ITB9LHJhPXt9O3RyeXtyYS5fX3Byb3RvX189cWE7cGE9cmEuUGE7YnJlYWsgYX1jYXRjaChhKXt9cGE9ITF9b2E9cGE/ZnVuY3Rpb24oYSxiKXthLl9fcHJvdG9fXz1iO2lmKGEuX19wcm90b19fIT09Yil0aHJvdyBuZXcgVHlwZUVycm9yKGErIiBpcyBub3QgZXh0ZW5zaWJsZSIpO3JldHVybiBhfTpudWxsfXZhciBzYT1vYTtmdW5jdGlvbiB3YSgpe3RoaXMubD0hMTt0aGlzLmI9bnVsbDt0aGlzLkVhPXZvaWQgMDt0aGlzLmE9MTt0aGlzLlk9MDt0aGlzLmM9bnVsbH0KZnVuY3Rpb24geWEoYSl7aWYoYS5sKXRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmciKTthLmw9ITB9d2EucHJvdG90eXBlLko9ZnVuY3Rpb24oYSl7dGhpcy5FYT1hfTtmdW5jdGlvbiB6YShhLGIpe2EuYz17U2E6YixXYTohMH07YS5hPWEuWX13YS5wcm90b3R5cGUucmV0dXJuPWZ1bmN0aW9uKGEpe3RoaXMuYz17cmV0dXJuOmF9O3RoaXMuYT10aGlzLll9O2Z1bmN0aW9uIEFhKGEsYil7YS5hPTM7cmV0dXJue3ZhbHVlOmJ9fWZ1bmN0aW9uIEJhKGEpe3RoaXMuYT1uZXcgd2E7dGhpcy5iPWF9ZnVuY3Rpb24gQ2EoYSxiKXt5YShhLmEpO3ZhciBjPWEuYS5iO2lmKGMpcmV0dXJuIERhKGEsInJldHVybiJpbiBjP2NbInJldHVybiJdOmZ1bmN0aW9uKGQpe3JldHVybnt2YWx1ZTpkLGRvbmU6ITB9fSxiLGEuYS5yZXR1cm4pO2EuYS5yZXR1cm4oYik7cmV0dXJuIEVhKGEpfQpmdW5jdGlvbiBEYShhLGIsYyxkKXt0cnl7dmFyIGU9Yi5jYWxsKGEuYS5iLGMpO2lmKCEoZSBpbnN0YW5jZW9mIE9iamVjdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiSXRlcmF0b3IgcmVzdWx0ICIrZSsiIGlzIG5vdCBhbiBvYmplY3QiKTtpZighZS5kb25lKXJldHVybiBhLmEubD0hMSxlO3ZhciBmPWUudmFsdWV9Y2F0Y2goZyl7cmV0dXJuIGEuYS5iPW51bGwsemEoYS5hLGcpLEVhKGEpfWEuYS5iPW51bGw7ZC5jYWxsKGEuYSxmKTtyZXR1cm4gRWEoYSl9ZnVuY3Rpb24gRWEoYSl7Zm9yKDthLmEuYTspdHJ5e3ZhciBiPWEuYihhLmEpO2lmKGIpcmV0dXJuIGEuYS5sPSExLHt2YWx1ZTpiLnZhbHVlLGRvbmU6ITF9fWNhdGNoKGMpe2EuYS5FYT12b2lkIDAsemEoYS5hLGMpfWEuYS5sPSExO2lmKGEuYS5jKXtiPWEuYS5jO2EuYS5jPW51bGw7aWYoYi5XYSl0aHJvdyBiLlNhO3JldHVybnt2YWx1ZTpiLnJldHVybixkb25lOiEwfX1yZXR1cm57dmFsdWU6dm9pZCAwLGRvbmU6ITB9fQpmdW5jdGlvbiBGYShhKXt0aGlzLm5leHQ9ZnVuY3Rpb24oYil7eWEoYS5hKTthLmEuYj9iPURhKGEsYS5hLmIubmV4dCxiLGEuYS5KKTooYS5hLkooYiksYj1FYShhKSk7cmV0dXJuIGJ9O3RoaXMudGhyb3c9ZnVuY3Rpb24oYil7eWEoYS5hKTthLmEuYj9iPURhKGEsYS5hLmJbInRocm93Il0sYixhLmEuSik6KHphKGEuYSxiKSxiPUVhKGEpKTtyZXR1cm4gYn07dGhpcy5yZXR1cm49ZnVuY3Rpb24oYil7cmV0dXJuIENhKGEsYil9O2lhKCk7dGhpc1tTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fWZ1bmN0aW9uIEdhKGEsYil7Yj1uZXcgRmEobmV3IEJhKGIpKTtzYSYmc2EoYixhLnByb3RvdHlwZSk7cmV0dXJuIGJ9QXJyYXkuZnJvbXx8KEFycmF5LmZyb209ZnVuY3Rpb24oYSl7cmV0dXJuW10uc2xpY2UuY2FsbChhKX0pOwpPYmplY3QuYXNzaWdufHwoT2JqZWN0LmFzc2lnbj1mdW5jdGlvbihhKXtmb3IodmFyIGI9W10uc2xpY2UuY2FsbChhcmd1bWVudHMsMSksYz0wLGQ7YzxiLmxlbmd0aDtjKyspaWYoZD1iW2NdKWZvcih2YXIgZT1hLGY9T2JqZWN0LmtleXMoZCksZz0wO2c8Zi5sZW5ndGg7ZysrKXt2YXIgaD1mW2ddO2VbaF09ZFtoXX1yZXR1cm4gYX0pO3ZhciBIYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTtIYS5pbml0RXZlbnQoImZvbyIsITAsITApO0hhLnByZXZlbnREZWZhdWx0KCk7aWYoIUhhLmRlZmF1bHRQcmV2ZW50ZWQpe3ZhciBJYT1FdmVudC5wcm90b3R5cGUucHJldmVudERlZmF1bHQ7RXZlbnQucHJvdG90eXBlLnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxhYmxlJiYoSWEuY2FsbCh0aGlzKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZGVmYXVsdFByZXZlbnRlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiEwfSxjb25maWd1cmFibGU6ITB9KSl9fXZhciBKYT0vVHJpZGVudC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKaWYoIXdpbmRvdy5FdmVudHx8SmEmJiJmdW5jdGlvbiIhPT10eXBlb2Ygd2luZG93LkV2ZW50KXt2YXIgS2E9d2luZG93LkV2ZW50O3dpbmRvdy5FdmVudD1mdW5jdGlvbihhLGIpe2I9Ynx8e307dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50Iik7Yy5pbml0RXZlbnQoYSwhIWIuYnViYmxlcywhIWIuY2FuY2VsYWJsZSk7cmV0dXJuIGN9O2lmKEthKXtmb3IodmFyIExhIGluIEthKXdpbmRvdy5FdmVudFtMYV09S2FbTGFdO3dpbmRvdy5FdmVudC5wcm90b3R5cGU9S2EucHJvdG90eXBlfX0KaWYoIXdpbmRvdy5DdXN0b21FdmVudHx8SmEmJiJmdW5jdGlvbiIhPT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50KXdpbmRvdy5DdXN0b21FdmVudD1mdW5jdGlvbihhLGIpe2I9Ynx8e307dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50Iik7Yy5pbml0Q3VzdG9tRXZlbnQoYSwhIWIuYnViYmxlcywhIWIuY2FuY2VsYWJsZSxiLmRldGFpbCk7cmV0dXJuIGN9LHdpbmRvdy5DdXN0b21FdmVudC5wcm90b3R5cGU9d2luZG93LkV2ZW50LnByb3RvdHlwZTsKaWYoIXdpbmRvdy5Nb3VzZUV2ZW50fHxKYSYmImZ1bmN0aW9uIiE9PXR5cGVvZiB3aW5kb3cuTW91c2VFdmVudCl7dmFyIE1hPXdpbmRvdy5Nb3VzZUV2ZW50O3dpbmRvdy5Nb3VzZUV2ZW50PWZ1bmN0aW9uKGEsYil7Yj1ifHx7fTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudCIpO2MuaW5pdE1vdXNlRXZlbnQoYSwhIWIuYnViYmxlcywhIWIuY2FuY2VsYWJsZSxiLnZpZXd8fHdpbmRvdyxiLmRldGFpbCxiLnNjcmVlblgsYi5zY3JlZW5ZLGIuY2xpZW50WCxiLmNsaWVudFksYi5jdHJsS2V5LGIuYWx0S2V5LGIuc2hpZnRLZXksYi5tZXRhS2V5LGIuYnV0dG9uLGIucmVsYXRlZFRhcmdldCk7cmV0dXJuIGN9O2lmKE1hKWZvcih2YXIgTmEgaW4gTWEpd2luZG93Lk1vdXNlRXZlbnRbTmFdPU1hW05hXTt3aW5kb3cuTW91c2VFdmVudC5wcm90b3R5cGU9TWEucHJvdG90eXBlfTsKKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe31mdW5jdGlvbiBiKHAscil7aWYoIXAuY2hpbGROb2Rlcy5sZW5ndGgpcmV0dXJuW107c3dpdGNoKHAubm9kZVR5cGUpe2Nhc2UgTm9kZS5ET0NVTUVOVF9OT0RFOnJldHVybiBGLmNhbGwocCxyKTtjYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERTpyZXR1cm4gRS5jYWxsKHAscik7ZGVmYXVsdDpyZXR1cm4gdC5jYWxsKHAscil9fXZhciBjPSJ1bmRlZmluZWQiPT09dHlwZW9mIEhUTUxUZW1wbGF0ZUVsZW1lbnQsZD0hKGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKS5jbG9uZU5vZGUoKWluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCksZT0hMTsvVHJpZGVudC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmZnVuY3Rpb24oKXtmdW5jdGlvbiBwKHosUil7aWYoeiBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpZm9yKHZhciBmYjtmYj16LmZpcnN0Q2hpbGQ7KUIuY2FsbCh0aGlzLGZiLFIpO2Vsc2UgQi5jYWxsKHRoaXMsCnosUik7cmV0dXJuIHp9ZT0hMDt2YXIgcj1Ob2RlLnByb3RvdHlwZS5jbG9uZU5vZGU7Tm9kZS5wcm90b3R5cGUuY2xvbmVOb2RlPWZ1bmN0aW9uKHope3o9ci5jYWxsKHRoaXMseik7dGhpcyBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQmJih6Ll9fcHJvdG9fXz1Eb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZSk7cmV0dXJuIHp9O0RvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGw9SFRNTEVsZW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGw7RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3Rvcj1IVE1MRWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvcjtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZSx7bm9kZVR5cGU6e2dldDpmdW5jdGlvbigpe3JldHVybiBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREV9LGNvbmZpZ3VyYWJsZTohMH0sbG9jYWxOYW1lOntnZXQ6ZnVuY3Rpb24oKXt9LApjb25maWd1cmFibGU6ITB9LG5vZGVOYW1lOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iI2RvY3VtZW50LWZyYWdtZW50In0sY29uZmlndXJhYmxlOiEwfX0pO3ZhciBCPU5vZGUucHJvdG90eXBlLmluc2VydEJlZm9yZTtOb2RlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmU9cDt2YXIgSz1Ob2RlLnByb3RvdHlwZS5hcHBlbmRDaGlsZDtOb2RlLnByb3RvdHlwZS5hcHBlbmRDaGlsZD1mdW5jdGlvbih6KXt6IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudD9wLmNhbGwodGhpcyx6LG51bGwpOksuY2FsbCh0aGlzLHopO3JldHVybiB6fTt2YXIgWj1Ob2RlLnByb3RvdHlwZS5yZW1vdmVDaGlsZCxqYT1Ob2RlLnByb3RvdHlwZS5yZXBsYWNlQ2hpbGQ7Tm9kZS5wcm90b3R5cGUucmVwbGFjZUNoaWxkPWZ1bmN0aW9uKHosUil7eiBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQ/KHAuY2FsbCh0aGlzLHosUiksWi5jYWxsKHRoaXMsUikpOmphLmNhbGwodGhpcyx6LFIpO3JldHVybiBSfTtEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudD0KZnVuY3Rpb24oKXt2YXIgej10aGlzLmNyZWF0ZUVsZW1lbnQoImRmIik7ei5fX3Byb3RvX189RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGU7cmV0dXJuIHp9O3ZhciB0YT1Eb2N1bWVudC5wcm90b3R5cGUuaW1wb3J0Tm9kZTtEb2N1bWVudC5wcm90b3R5cGUuaW1wb3J0Tm9kZT1mdW5jdGlvbih6LFIpe1I9dGEuY2FsbCh0aGlzLHosUnx8ITEpO3ogaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50JiYoUi5fX3Byb3RvX189RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUpO3JldHVybiBSfX0oKTt2YXIgZj1Ob2RlLnByb3RvdHlwZS5jbG9uZU5vZGUsZz1Eb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlRWxlbWVudCxoPURvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlLGs9Tm9kZS5wcm90b3R5cGUucmVtb3ZlQ2hpbGQsbD1Ob2RlLnByb3RvdHlwZS5hcHBlbmRDaGlsZCxtPU5vZGUucHJvdG90eXBlLnJlcGxhY2VDaGlsZCxxPURPTVBhcnNlci5wcm90b3R5cGUucGFyc2VGcm9tU3RyaW5nLApIPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LkhUTUxFbGVtZW50LnByb3RvdHlwZSwiaW5uZXJIVE1MIil8fHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbm5lckhUTUx9LHNldDpmdW5jdGlvbihwKXt0aGlzLmlubmVySFRNTD1wfX0sQz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdy5Ob2RlLnByb3RvdHlwZSwiY2hpbGROb2RlcyIpfHx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGROb2Rlc319LHQ9RWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbCxGPURvY3VtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsLEU9RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbCxNPWZ1bmN0aW9uKCl7aWYoIWMpe3ZhciBwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIikscj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpO3IuY29udGVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSk7CnAuY29udGVudC5hcHBlbmRDaGlsZChyKTtwPXAuY2xvbmVOb2RlKCEwKTtyZXR1cm4gMD09PXAuY29udGVudC5jaGlsZE5vZGVzLmxlbmd0aHx8MD09PXAuY29udGVudC5maXJzdENoaWxkLmNvbnRlbnQuY2hpbGROb2Rlcy5sZW5ndGh8fGR9fSgpO2lmKGMpe3ZhciB5PWRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgidGVtcGxhdGUiKSxXPSEwLHY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTt2LnRleHRDb250ZW50PSJ0ZW1wbGF0ZXtkaXNwbGF5Om5vbmU7fSI7dmFyIHVhPWRvY3VtZW50LmhlYWQ7dWEuaW5zZXJ0QmVmb3JlKHYsdWEuZmlyc3RFbGVtZW50Q2hpbGQpO2EucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoSFRNTEVsZW1lbnQucHJvdG90eXBlKTt2YXIgZWE9IWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLmhhc093blByb3BlcnR5KCJpbm5lckhUTUwiKTthLlU9ZnVuY3Rpb24ocCl7aWYoIXAuY29udGVudCYmcC5uYW1lc3BhY2VVUkk9PT0KZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSl7cC5jb250ZW50PXkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2Zvcih2YXIgcjtyPXAuZmlyc3RDaGlsZDspbC5jYWxsKHAuY29udGVudCxyKTtpZihlYSlwLl9fcHJvdG9fXz1hLnByb3RvdHlwZTtlbHNlIGlmKHAuY2xvbmVOb2RlPWZ1bmN0aW9uKEIpe3JldHVybiBhLmIodGhpcyxCKX0sVyl0cnl7bihwKSxJKHApfWNhdGNoKEIpe1c9ITF9YS5hKHAuY29udGVudCl9fTt2YXIgdmE9e29wdGlvbjpbInNlbGVjdCJdLHRoZWFkOlsidGFibGUiXSxjb2w6WyJjb2xncm91cCIsInRhYmxlIl0sdHI6WyJ0Ym9keSIsInRhYmxlIl0sdGg6WyJ0ciIsInRib2R5IiwidGFibGUiXSx0ZDpbInRyIiwidGJvZHkiLCJ0YWJsZSJdfSxuPWZ1bmN0aW9uKHApe09iamVjdC5kZWZpbmVQcm9wZXJ0eShwLCJpbm5lckhUTUwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geGEodGhpcyl9LHNldDpmdW5jdGlvbihyKXt2YXIgQj12YVsoLzwoW2Etel1bXi9cMD5ceDIwXHRcclxuXGZdKykvaS5leGVjKHIpfHwKWyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV07aWYoQilmb3IodmFyIEs9MDtLPEIubGVuZ3RoO0srKylyPSI8IitCW0tdKyI+IityKyI8LyIrQltLXSsiPiI7eS5ib2R5LmlubmVySFRNTD1yO2ZvcihhLmEoeSk7dGhpcy5jb250ZW50LmZpcnN0Q2hpbGQ7KWsuY2FsbCh0aGlzLmNvbnRlbnQsdGhpcy5jb250ZW50LmZpcnN0Q2hpbGQpO3I9eS5ib2R5O2lmKEIpZm9yKEs9MDtLPEIubGVuZ3RoO0srKylyPXIubGFzdENoaWxkO2Zvcig7ci5maXJzdENoaWxkOylsLmNhbGwodGhpcy5jb250ZW50LHIuZmlyc3RDaGlsZCl9LGNvbmZpZ3VyYWJsZTohMH0pfSxJPWZ1bmN0aW9uKHApe09iamVjdC5kZWZpbmVQcm9wZXJ0eShwLCJvdXRlckhUTUwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iPHRlbXBsYXRlPiIrdGhpcy5pbm5lckhUTUwrIjwvdGVtcGxhdGU+In0sc2V0OmZ1bmN0aW9uKHIpe2lmKHRoaXMucGFyZW50Tm9kZSl7eS5ib2R5LmlubmVySFRNTD1yO2ZvcihyPXRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7eS5ib2R5LmZpcnN0Q2hpbGQ7KWwuY2FsbChyLAp5LmJvZHkuZmlyc3RDaGlsZCk7bS5jYWxsKHRoaXMucGFyZW50Tm9kZSxyLHRoaXMpfWVsc2UgdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBzZXQgdGhlICdvdXRlckhUTUwnIHByb3BlcnR5IG9uICdFbGVtZW50JzogVGhpcyBlbGVtZW50IGhhcyBubyBwYXJlbnQgbm9kZS4iKTt9LGNvbmZpZ3VyYWJsZTohMH0pfTtuKGEucHJvdG90eXBlKTtJKGEucHJvdG90eXBlKTthLmE9ZnVuY3Rpb24ocCl7cD1iKHAsInRlbXBsYXRlIik7Zm9yKHZhciByPTAsQj1wLmxlbmd0aCxLO3I8QiYmKEs9cFtyXSk7cisrKWEuVShLKX07ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsZnVuY3Rpb24oKXthLmEoZG9jdW1lbnQpfSk7RG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oKXt2YXIgcD1nLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsidGVtcGxhdGUiPT09cC5sb2NhbE5hbWUmJmEuVShwKTtyZXR1cm4gcH07RE9NUGFyc2VyLnByb3RvdHlwZS5wYXJzZUZyb21TdHJpbmc9CmZ1bmN0aW9uKCl7dmFyIHA9cS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7YS5hKHApO3JldHVybiBwfTtPYmplY3QuZGVmaW5lUHJvcGVydHkoSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geGEodGhpcyl9LHNldDpmdW5jdGlvbihwKXtILnNldC5jYWxsKHRoaXMscCk7YS5hKHRoaXMpfSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0pO3ZhciBrYT0vWyZcdTAwQTAiXS9nLGJjPS9bJlx1MDBBMDw+XS9nLGdiPWZ1bmN0aW9uKHApe3N3aXRjaChwKXtjYXNlICImIjpyZXR1cm4iJmFtcDsiO2Nhc2UgIjwiOnJldHVybiImbHQ7IjtjYXNlICI+IjpyZXR1cm4iJmd0OyI7Y2FzZSAnIic6cmV0dXJuIiZxdW90OyI7Y2FzZSAiXHUwMGEwIjpyZXR1cm4iJm5ic3A7In19O3Y9ZnVuY3Rpb24ocCl7Zm9yKHZhciByPXt9LEI9MDtCPHAubGVuZ3RoO0IrKylyW3BbQl1dPSEwO3JldHVybiByfTt2YXIgU2E9digiYXJlYSBiYXNlIGJyIGNvbCBjb21tYW5kIGVtYmVkIGhyIGltZyBpbnB1dCBrZXlnZW4gbGluayBtZXRhIHBhcmFtIHNvdXJjZSB0cmFjayB3YnIiLnNwbGl0KCIgIikpLApoYj12KCJzdHlsZSBzY3JpcHQgeG1wIGlmcmFtZSBub2VtYmVkIG5vZnJhbWVzIHBsYWludGV4dCBub3NjcmlwdCIuc3BsaXQoIiAiKSkseGE9ZnVuY3Rpb24ocCxyKXsidGVtcGxhdGUiPT09cC5sb2NhbE5hbWUmJihwPXAuY29udGVudCk7Zm9yKHZhciBCPSIiLEs9cj9yKHApOkMuZ2V0LmNhbGwocCksWj0wLGphPUsubGVuZ3RoLHRhO1o8amEmJih0YT1LW1pdKTtaKyspe2E6e3ZhciB6PXRhO3ZhciBSPXA7dmFyIGZiPXI7c3dpdGNoKHoubm9kZVR5cGUpe2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6Zm9yKHZhciBjYz16LmxvY2FsTmFtZSxpYj0iPCIrY2Mscmc9ei5hdHRyaWJ1dGVzLEJkPTA7Uj1yZ1tCZF07QmQrKylpYis9IiAiK1IubmFtZSsnPSInK1IudmFsdWUucmVwbGFjZShrYSxnYikrJyInO2liKz0iPiI7ej1TYVtjY10/aWI6aWIreGEoeixmYikrIjwvIitjYysiPiI7YnJlYWsgYTtjYXNlIE5vZGUuVEVYVF9OT0RFOno9ei5kYXRhO3o9UiYmaGJbUi5sb2NhbE5hbWVdP3o6CnoucmVwbGFjZShiYyxnYik7YnJlYWsgYTtjYXNlIE5vZGUuQ09NTUVOVF9OT0RFOno9Ilx4M2MhLS0iK3ouZGF0YSsiLS1ceDNlIjticmVhayBhO2RlZmF1bHQ6dGhyb3cgd2luZG93LmNvbnNvbGUuZXJyb3IoeiksRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpO319Qis9en1yZXR1cm4gQn19aWYoY3x8TSl7YS5iPWZ1bmN0aW9uKHAscil7dmFyIEI9Zi5jYWxsKHAsITEpO3RoaXMuVSYmdGhpcy5VKEIpO3ImJihsLmNhbGwoQi5jb250ZW50LGYuY2FsbChwLmNvbnRlbnQsITApKSxKKEIuY29udGVudCxwLmNvbnRlbnQpKTtyZXR1cm4gQn07dmFyIEo9ZnVuY3Rpb24ocCxyKXtpZihyLnF1ZXJ5U2VsZWN0b3JBbGwmJihyPWIociwidGVtcGxhdGUiKSwwIT09ci5sZW5ndGgpKXtwPWIocCwidGVtcGxhdGUiKTtmb3IodmFyIEI9MCxLPXAubGVuZ3RoLFosamE7QjxLO0IrKylqYT1yW0JdLFo9cFtCXSxhJiZhLlUmJmEuVShqYSksbS5jYWxsKFoucGFyZW50Tm9kZSx1LmNhbGwoamEsITApLApaKX19LHU9Tm9kZS5wcm90b3R5cGUuY2xvbmVOb2RlPWZ1bmN0aW9uKHApe2lmKCFlJiZkJiZ0aGlzIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudClpZihwKXZhciByPUcuY2FsbCh0aGlzLm93bmVyRG9jdW1lbnQsdGhpcywhMCk7ZWxzZSByZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtlbHNlIHRoaXMubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmInRlbXBsYXRlIj09PXRoaXMubG9jYWxOYW1lJiZ0aGlzLm5hbWVzcGFjZVVSST09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSST9yPWEuYih0aGlzLHApOnI9Zi5jYWxsKHRoaXMscCk7cCYmSihyLHRoaXMpO3JldHVybiByfSxHPURvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlPWZ1bmN0aW9uKHAscil7cj1yfHwhMTtpZigidGVtcGxhdGUiPT09cC5sb2NhbE5hbWUpcmV0dXJuIGEuYihwLHIpO3ZhciBCPWguY2FsbCh0aGlzLHAscik7aWYocil7SihCLHApOwpwPWIoQiwnc2NyaXB0Om5vdChbdHlwZV0pLHNjcmlwdFt0eXBlPSJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Il0sc2NyaXB0W3R5cGU9InRleHQvamF2YXNjcmlwdCJdJyk7Zm9yKHZhciBLLFo9MDtaPHAubGVuZ3RoO1orKyl7Sz1wW1pdO3I9Zy5jYWxsKGRvY3VtZW50LCJzY3JpcHQiKTtyLnRleHRDb250ZW50PUsudGV4dENvbnRlbnQ7Zm9yKHZhciBqYT1LLmF0dHJpYnV0ZXMsdGE9MCx6O3RhPGphLmxlbmd0aDt0YSsrKXo9amFbdGFdLHIuc2V0QXR0cmlidXRlKHoubmFtZSx6LnZhbHVlKTttLmNhbGwoSy5wYXJlbnROb2RlLHIsSyl9fXJldHVybiBCfX1jJiYod2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQ9YSl9KSgpO3ZhciBPYT1zZXRUaW1lb3V0O2Z1bmN0aW9uIFBhKCl7fWZ1bmN0aW9uIFFhKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7YS5hcHBseShiLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIHgoYSl7aWYoISh0aGlzIGluc3RhbmNlb2YgeCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiUHJvbWlzZXMgbXVzdCBiZSBjb25zdHJ1Y3RlZCB2aWEgbmV3Iik7aWYoImZ1bmN0aW9uIiE9PXR5cGVvZiBhKXRocm93IG5ldyBUeXBlRXJyb3IoIm5vdCBhIGZ1bmN0aW9uIik7dGhpcy5JPTA7dGhpcy56YT0hMTt0aGlzLkM9dm9pZCAwO3RoaXMuVz1bXTtSYShhLHRoaXMpfQpmdW5jdGlvbiBUYShhLGIpe2Zvcig7Mz09PWEuSTspYT1hLkM7MD09PWEuST9hLlcucHVzaChiKTooYS56YT0hMCxVYShmdW5jdGlvbigpe3ZhciBjPTE9PT1hLkk/Yi5ZYTpiLlphO2lmKG51bGw9PT1jKSgxPT09YS5JP1ZhOldhKShiLnZhLGEuQyk7ZWxzZXt0cnl7dmFyIGQ9YyhhLkMpfWNhdGNoKGUpe1dhKGIudmEsZSk7cmV0dXJufVZhKGIudmEsZCl9fSkpfWZ1bmN0aW9uIFZhKGEsYil7dHJ5e2lmKGI9PT1hKXRocm93IG5ldyBUeXBlRXJyb3IoIkEgcHJvbWlzZSBjYW5ub3QgYmUgcmVzb2x2ZWQgd2l0aCBpdHNlbGYuIik7aWYoYiYmKCJvYmplY3QiPT09dHlwZW9mIGJ8fCJmdW5jdGlvbiI9PT10eXBlb2YgYikpe3ZhciBjPWIudGhlbjtpZihiIGluc3RhbmNlb2YgeCl7YS5JPTM7YS5DPWI7WGEoYSk7cmV0dXJufWlmKCJmdW5jdGlvbiI9PT10eXBlb2YgYyl7UmEoUWEoYyxiKSxhKTtyZXR1cm59fWEuST0xO2EuQz1iO1hhKGEpfWNhdGNoKGQpe1dhKGEsZCl9fQpmdW5jdGlvbiBXYShhLGIpe2EuST0yO2EuQz1iO1hhKGEpfWZ1bmN0aW9uIFhhKGEpezI9PT1hLkkmJjA9PT1hLlcubGVuZ3RoJiZVYShmdW5jdGlvbigpe2EuemF8fCJ1bmRlZmluZWQiIT09dHlwZW9mIGNvbnNvbGUmJmNvbnNvbGUmJmNvbnNvbGUud2FybigiUG9zc2libGUgVW5oYW5kbGVkIFByb21pc2UgUmVqZWN0aW9uOiIsYS5DKX0pO2Zvcih2YXIgYj0wLGM9YS5XLmxlbmd0aDtiPGM7YisrKVRhKGEsYS5XW2JdKTthLlc9bnVsbH1mdW5jdGlvbiBZYShhLGIsYyl7dGhpcy5ZYT0iZnVuY3Rpb24iPT09dHlwZW9mIGE/YTpudWxsO3RoaXMuWmE9ImZ1bmN0aW9uIj09PXR5cGVvZiBiP2I6bnVsbDt0aGlzLnZhPWN9ZnVuY3Rpb24gUmEoYSxiKXt2YXIgYz0hMTt0cnl7YShmdW5jdGlvbihkKXtjfHwoYz0hMCxWYShiLGQpKX0sZnVuY3Rpb24oZCl7Y3x8KGM9ITAsV2EoYixkKSl9KX1jYXRjaChkKXtjfHwoYz0hMCxXYShiLGQpKX19CngucHJvdG90eXBlWyJjYXRjaCJdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnRoZW4obnVsbCxhKX07eC5wcm90b3R5cGUudGhlbj1mdW5jdGlvbihhLGIpe3ZhciBjPW5ldyB0aGlzLmNvbnN0cnVjdG9yKFBhKTtUYSh0aGlzLG5ldyBZYShhLGIsYykpO3JldHVybiBjfTt4LnByb3RvdHlwZVsiZmluYWxseSJdPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uc3RydWN0b3I7cmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbihjKXtyZXR1cm4gYi5yZXNvbHZlKGEoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBjfSl9LGZ1bmN0aW9uKGMpe3JldHVybiBiLnJlc29sdmUoYSgpKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGIucmVqZWN0KGMpfSl9KX07CmZ1bmN0aW9uIFphKGEpe3JldHVybiBuZXcgeChmdW5jdGlvbihiLGMpe2Z1bmN0aW9uIGQoaCxrKXt0cnl7aWYoayYmKCJvYmplY3QiPT09dHlwZW9mIGt8fCJmdW5jdGlvbiI9PT10eXBlb2Ygaykpe3ZhciBsPWsudGhlbjtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGwpe2wuY2FsbChrLGZ1bmN0aW9uKG0pe2QoaCxtKX0sYyk7cmV0dXJufX1lW2hdPWs7MD09PS0tZiYmYihlKX1jYXRjaChtKXtjKG0pfX1pZighYXx8InVuZGVmaW5lZCI9PT10eXBlb2YgYS5sZW5ndGgpcmV0dXJuIGMobmV3IFR5cGVFcnJvcigiUHJvbWlzZS5hbGwgYWNjZXB0cyBhbiBhcnJheSIpKTt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhKTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIGIoW10pO2Zvcih2YXIgZj1lLmxlbmd0aCxnPTA7ZzxlLmxlbmd0aDtnKyspZChnLGVbZ10pfSl9CmZ1bmN0aW9uICRhKGEpe3JldHVybiBhJiYib2JqZWN0Ij09PXR5cGVvZiBhJiZhLmNvbnN0cnVjdG9yPT09eD9hOm5ldyB4KGZ1bmN0aW9uKGIpe2IoYSl9KX1mdW5jdGlvbiBhYihhKXtyZXR1cm4gbmV3IHgoZnVuY3Rpb24oYixjKXtjKGEpfSl9ZnVuY3Rpb24gYmIoYSl7cmV0dXJuIG5ldyB4KGZ1bmN0aW9uKGIsYyl7aWYoIWF8fCJ1bmRlZmluZWQiPT09dHlwZW9mIGEubGVuZ3RoKXJldHVybiBjKG5ldyBUeXBlRXJyb3IoIlByb21pc2UucmFjZSBhY2NlcHRzIGFuIGFycmF5IikpO2Zvcih2YXIgZD0wLGU9YS5sZW5ndGg7ZDxlO2QrKykkYShhW2RdKS50aGVuKGIsYyl9KX12YXIgVWE9ImZ1bmN0aW9uIj09PXR5cGVvZiBzZXRJbW1lZGlhdGUmJmZ1bmN0aW9uKGEpe3NldEltbWVkaWF0ZShhKX18fGZ1bmN0aW9uKGEpe09hKGEsMCl9OwppZighd2luZG93LlByb21pc2Upe3dpbmRvdy5Qcm9taXNlPXg7eC5wcm90b3R5cGUudGhlbj14LnByb3RvdHlwZS50aGVuO3guYWxsPVphO3gucmFjZT1iYjt4LnJlc29sdmU9JGE7eC5yZWplY3Q9YWI7dmFyIGNiPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKSxkYj1bXTsobmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oKXtmb3IodmFyIGE9ZGIubGVuZ3RoLGI9MDtiPGE7YisrKWRiW2JdKCk7ZGIuc3BsaWNlKDAsYSl9KSkub2JzZXJ2ZShjYix7Y2hhcmFjdGVyRGF0YTohMH0pO1VhPWZ1bmN0aW9uKGEpe2RiLnB1c2goYSk7Y2IudGV4dENvbnRlbnQ9MDxjYi50ZXh0Q29udGVudC5sZW5ndGg/IiI6ImEifX07CihmdW5jdGlvbihhLGIpe2lmKCEoYiBpbiBhKSl7dmFyIGM9dHlwZW9mIGdsb2JhbD09PXR5cGVvZiBjP3dpbmRvdzpnbG9iYWwsZD0wLGU9IiIrTWF0aC5yYW5kb20oKSxmPSJfX1x1MDAwMXN5bWJvbEBAIitlLGc9YS5nZXRPd25Qcm9wZXJ0eU5hbWVzLGg9YS5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Isaz1hLmNyZWF0ZSxsPWEua2V5cyxtPWEuZnJlZXplfHxhLHE9YS5kZWZpbmVQcm9wZXJ0eSxIPWEuZGVmaW5lUHJvcGVydGllcyxDPWgoYSwiZ2V0T3duUHJvcGVydHlOYW1lcyIpLHQ9YS5wcm90b3R5cGUsRj10Lmhhc093blByb3BlcnR5LEU9dC5wcm9wZXJ0eUlzRW51bWVyYWJsZSxNPXQudG9TdHJpbmcseT1mdW5jdGlvbihKLHUsRyl7Ri5jYWxsKEosZil8fHEoSixmLHtlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMSx3cml0YWJsZTohMSx2YWx1ZTp7fX0pO0pbZl1bIkBAIit1XT1HfSxXPWZ1bmN0aW9uKEosdSl7dmFyIEc9ayhKKTtnKHUpLmZvckVhY2goZnVuY3Rpb24ocCl7dmEuY2FsbCh1LApwKSYmU2EoRyxwLHVbcF0pfSk7cmV0dXJuIEd9LHY9ZnVuY3Rpb24oKXt9LHVhPWZ1bmN0aW9uKEope3JldHVybiBKIT1mJiYhRi5jYWxsKGthLEopfSxlYT1mdW5jdGlvbihKKXtyZXR1cm4gSiE9ZiYmRi5jYWxsKGthLEopfSx2YT1mdW5jdGlvbihKKXt2YXIgdT0iIitKO3JldHVybiBlYSh1KT9GLmNhbGwodGhpcyx1KSYmdGhpc1tmXVsiQEAiK3VdOkUuY2FsbCh0aGlzLEopfSxuPWZ1bmN0aW9uKEope3EodCxKLHtlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMCxnZXQ6dixzZXQ6ZnVuY3Rpb24odSl7eGEodGhpcyxKLHtlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp1fSk7eSh0aGlzLEosITApfX0pO3JldHVybiBtKGthW0pdPXEoYShKKSwiY29uc3RydWN0b3IiLGJjKSl9LEk9ZnVuY3Rpb24gRyh1KXtpZih0aGlzIGluc3RhbmNlb2YgRyl0aHJvdyBuZXcgVHlwZUVycm9yKCJTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3IiKTtyZXR1cm4gbigiX19cdTAwMDFzeW1ib2w6Ii5jb25jYXQodXx8CiIiLGUsKytkKSl9LGthPWsobnVsbCksYmM9e3ZhbHVlOkl9LGdiPWZ1bmN0aW9uKHUpe3JldHVybiBrYVt1XX0sU2E9ZnVuY3Rpb24odSxHLHApe3ZhciByPSIiK0c7aWYoZWEocikpe0c9eGE7aWYocC5lbnVtZXJhYmxlKXt2YXIgQj1rKHApO0IuZW51bWVyYWJsZT0hMX1lbHNlIEI9cDtHKHUscixCKTt5KHUsciwhIXAuZW51bWVyYWJsZSl9ZWxzZSBxKHUsRyxwKTtyZXR1cm4gdX0saGI9ZnVuY3Rpb24odSl7cmV0dXJuIGcodSkuZmlsdGVyKGVhKS5tYXAoZ2IpfTtDLnZhbHVlPVNhO3EoYSwiZGVmaW5lUHJvcGVydHkiLEMpO0MudmFsdWU9aGI7cShhLGIsQyk7Qy52YWx1ZT1mdW5jdGlvbih1KXtyZXR1cm4gZyh1KS5maWx0ZXIodWEpfTtxKGEsImdldE93blByb3BlcnR5TmFtZXMiLEMpO0MudmFsdWU9ZnVuY3Rpb24odSxHKXt2YXIgcD1oYihHKTtwLmxlbmd0aD9sKEcpLmNvbmNhdChwKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3ZhLmNhbGwoRyxyKSYmU2EodSxyLEdbcl0pfSk6SCh1LApHKTtyZXR1cm4gdX07cShhLCJkZWZpbmVQcm9wZXJ0aWVzIixDKTtDLnZhbHVlPXZhO3EodCwicHJvcGVydHlJc0VudW1lcmFibGUiLEMpO0MudmFsdWU9STtxKGMsIlN5bWJvbCIsQyk7Qy52YWx1ZT1mdW5jdGlvbih1KXt1PSJfX1x1MDAwMXN5bWJvbDoiLmNvbmNhdCgiX19cdTAwMDFzeW1ib2w6Iix1LGUpO3JldHVybiB1IGluIHQ/a2FbdV06bih1KX07cShJLCJmb3IiLEMpO0MudmFsdWU9ZnVuY3Rpb24odSl7aWYodWEodSkpdGhyb3cgbmV3IFR5cGVFcnJvcih1KyIgaXMgbm90IGEgc3ltYm9sIik7aWYoRi5jYWxsKGthLHUpJiYodT11LnNsaWNlKDEwKSwiX19cdTAwMDFzeW1ib2w6Ij09PXUuc2xpY2UoMCwxMCkmJih1PXUuc2xpY2UoMTApLHUhPT1lKSkpcmV0dXJuIHU9dS5zbGljZSgwLHUubGVuZ3RoLWUubGVuZ3RoKSwwPHUubGVuZ3RoP3U6dm9pZCAwfTtxKEksImtleUZvciIsQyk7Qy52YWx1ZT1mdW5jdGlvbih1LEcpe3ZhciBwPWgodSxHKTtwJiZlYShHKSYmKHAuZW51bWVyYWJsZT0KdmEuY2FsbCh1LEcpKTtyZXR1cm4gcH07cShhLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLEMpO0MudmFsdWU9ZnVuY3Rpb24odSxHKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGh8fCJ1bmRlZmluZWQiPT09dHlwZW9mIEc/ayh1KTpXKHUsRyl9O3EoYSwiY3JlYXRlIixDKTtDLnZhbHVlPWZ1bmN0aW9uKCl7dmFyIHU9TS5jYWxsKHRoaXMpO3JldHVybiJbb2JqZWN0IFN0cmluZ10iPT09dSYmZWEodGhpcyk/IltvYmplY3QgU3ltYm9sXSI6dX07cSh0LCJ0b1N0cmluZyIsQyk7dHJ5e2lmKCEwPT09ayhxKHt9LCJfX1x1MDAwMXN5bWJvbDoiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcSh0aGlzLCJfX1x1MDAwMXN5bWJvbDoiLHt2YWx1ZTohMH0pWyJfX1x1MDAwMXN5bWJvbDoiXX19KSlbIl9fXHUwMDAxc3ltYm9sOiJdKXZhciB4YT1xO2Vsc2UgdGhyb3ciSUUxMSI7fWNhdGNoKHUpe3hhPWZ1bmN0aW9uKEcscCxyKXt2YXIgQj1oKHQscCk7ZGVsZXRlIHRbcF07cShHLHAsCnIpO3EodCxwLEIpfX19fSkoT2JqZWN0LCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiKTsKKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS5kZWZpbmVQcm9wZXJ0eSxkPWEucHJvdG90eXBlLGU9ZC50b1N0cmluZyxmOyJpdGVyYXRvciBtYXRjaCByZXBsYWNlIHNlYXJjaCBzcGxpdCBoYXNJbnN0YW5jZSBpc0NvbmNhdFNwcmVhZGFibGUgdW5zY29wYWJsZXMgc3BlY2llcyB0b1ByaW1pdGl2ZSB0b1N0cmluZ1RhZyIuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKGcpe2lmKCEoZyBpbiBiKSlzd2l0Y2goYyhiLGcse3ZhbHVlOmIoZyl9KSxnKXtjYXNlICJ0b1N0cmluZ1RhZyI6Zj1hLmdldE93blByb3BlcnR5RGVzY3JpcHRvcihkLCJ0b1N0cmluZyIpLGYudmFsdWU9ZnVuY3Rpb24oKXt2YXIgaD1lLmNhbGwodGhpcyksaz1udWxsIT10aGlzP3RoaXNbYi50b1N0cmluZ1RhZ106dGhpcztyZXR1cm4gbnVsbD09az9oOiJbb2JqZWN0ICIraysiXSJ9LGMoZCwidG9TdHJpbmciLGYpfX0pfSkoT2JqZWN0LFN5bWJvbCk7CihmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZCgpe3JldHVybiB0aGlzfWJbYV18fChiW2FdPWZ1bmN0aW9uKCl7dmFyIGU9MCxmPXRoaXMsZz17bmV4dDpmdW5jdGlvbigpe3ZhciBoPWYubGVuZ3RoPD1lO3JldHVybiBoP3tkb25lOmh9Ontkb25lOmgsdmFsdWU6ZltlKytdfX19O2dbYV09ZDtyZXR1cm4gZ30pO2NbYV18fChjW2FdPWZ1bmN0aW9uKCl7dmFyIGU9U3RyaW5nLmZyb21Db2RlUG9pbnQsZj10aGlzLGc9MCxoPWYubGVuZ3RoLGs9e25leHQ6ZnVuY3Rpb24oKXt2YXIgbD1oPD1nLG09bD8iIjplKGYuY29kZVBvaW50QXQoZykpO2crPW0ubGVuZ3RoO3JldHVybiBsP3tkb25lOmx9Ontkb25lOmwsdmFsdWU6bX19fTtrW2FdPWQ7cmV0dXJuIGt9KX0pKFN5bWJvbC5pdGVyYXRvcixBcnJheS5wcm90b3R5cGUsU3RyaW5nLnByb3RvdHlwZSk7CnZhciBlYj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO09iamVjdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09dGhpcz8iW29iamVjdCBVbmRlZmluZWRdIjpudWxsPT09dGhpcz8iW29iamVjdCBOdWxsXSI6ZWIuY2FsbCh0aGlzKX07T2JqZWN0LmtleXM9ZnVuY3Rpb24oYSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGEpLmZpbHRlcihmdW5jdGlvbihiKXtyZXR1cm4oYj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGEsYikpJiZiLmVudW1lcmFibGV9KX07ZGEoKTtpYSgpOwpTdHJpbmcucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0mJlN0cmluZy5wcm90b3R5cGUuY29kZVBvaW50QXR8fChkYSgpLGlhKCksU3RyaW5nLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uIGIoKXt2YXIgYyxkPXRoaXM7cmV0dXJuIEdhKGIsZnVuY3Rpb24oZSl7MT09ZS5hJiYoYz0wKTtpZigzIT1lLmEpcmV0dXJuIGM8ZC5sZW5ndGg/ZT1BYShlLGRbY10pOihlLmE9MCxlPXZvaWQgMCksZTtjKys7ZS5hPTJ9KX0pO2RhKCk7aWEoKTsKU2V0LnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdfHwoZGEoKSxpYSgpLFNldC5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbiBiKCl7dmFyIGMsZD10aGlzLGU7cmV0dXJuIEdhKGIsZnVuY3Rpb24oZil7MT09Zi5hJiYoYz1bXSxkLmZvckVhY2goZnVuY3Rpb24oZyl7Yy5wdXNoKGcpfSksZT0wKTtpZigzIT1mLmEpcmV0dXJuIGU8Yy5sZW5ndGg/Zj1BYShmLGNbZV0pOihmLmE9MCxmPXZvaWQgMCksZjtlKys7Zi5hPTJ9KX0pO2RhKCk7aWEoKTsKTWFwLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdfHwoZGEoKSxpYSgpLE1hcC5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbiBiKCl7dmFyIGMsZD10aGlzLGU7cmV0dXJuIEdhKGIsZnVuY3Rpb24oZil7MT09Zi5hJiYoYz1bXSxkLmZvckVhY2goZnVuY3Rpb24oZyxoKXtjLnB1c2goW2gsZ10pfSksZT0wKTtpZigzIT1mLmEpcmV0dXJuIGU8Yy5sZW5ndGg/Zj1BYShmLGNbZV0pOihmLmE9MCxmPXZvaWQgMCksZjtlKys7Zi5hPTJ9KX0pOwp2YXIgamI9d2luZG93O2piLldlYkNvbXBvbmVudHM9amIuV2ViQ29tcG9uZW50c3x8e2ZsYWdzOnt9fTt2YXIga2I9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3NyYyo9IndlYmNvbXBvbmVudHMtYnVuZGxlIl0nKSxsYj0vd2MtKC4rKS8sbWI9e307aWYoIW1iLm5vT3B0cyl7bG9jYXRpb24uc2VhcmNoLnNsaWNlKDEpLnNwbGl0KCImIikuZm9yRWFjaChmdW5jdGlvbihhKXthPWEuc3BsaXQoIj0iKTt2YXIgYjthWzBdJiYoYj1hWzBdLm1hdGNoKGxiKSkmJihtYltiWzFdXT1hWzFdfHwhMCl9KTtpZihrYilmb3IodmFyIG5iPTAsb2I9dm9pZCAwO29iPWtiLmF0dHJpYnV0ZXNbbmJdO25iKyspInNyYyIhPT1vYi5uYW1lJiYobWJbb2IubmFtZV09b2IudmFsdWV8fCEwKTt2YXIgcGI9e307bWIubG9nJiZtYi5sb2cuc3BsaXQmJm1iLmxvZy5zcGxpdCgiLCIpLmZvckVhY2goZnVuY3Rpb24oYSl7cGJbYV09ITB9KTttYi5sb2c9cGJ9CmpiLldlYkNvbXBvbmVudHMuZmxhZ3M9bWI7dmFyIHFiPW1iLnNoYWR5ZG9tO2lmKHFiKXtqYi5TaGFkeURPTT1qYi5TaGFkeURPTXx8e307amIuU2hhZHlET00uZm9yY2U9cWI7dmFyIHJiPW1iLm5vUGF0Y2g7amIuU2hhZHlET00ubm9QYXRjaD0idHJ1ZSI9PT1yYj8hMDpyYn12YXIgc2I9bWIucmVnaXN0ZXJ8fG1iLmNlO3NiJiZ3aW5kb3cuY3VzdG9tRWxlbWVudHMmJihqYi5jdXN0b21FbGVtZW50cy5mb3JjZVBvbHlmaWxsPXNiKTsKZnVuY3Rpb24gdGIoKXt9dGIucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt9fTtmdW5jdGlvbiBBKGEpe2EuX19zaGFkeXx8KGEuX19zaGFkeT1uZXcgdGIpO3JldHVybiBhLl9fc2hhZHl9ZnVuY3Rpb24gRChhKXtyZXR1cm4gYSYmYS5fX3NoYWR5fTt2YXIgTD13aW5kb3cuU2hhZHlET018fHt9O0wuVWE9ISghRWxlbWVudC5wcm90b3R5cGUuYXR0YWNoU2hhZG93fHwhTm9kZS5wcm90b3R5cGUuZ2V0Um9vdE5vZGUpO3ZhciB1Yj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5vZGUucHJvdG90eXBlLCJmaXJzdENoaWxkIik7TC5CPSEhKHViJiZ1Yi5jb25maWd1cmFibGUmJnViLmdldCk7TC5zYT1MLmZvcmNlfHwhTC5VYTtMLkQ9TC5ub1BhdGNofHwhMTtMLmFhPUwucHJlZmVyUGVyZm9ybWFuY2U7TC51YT0ib24tZGVtYW5kIj09PUwuRDtMLklhPW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goIlRyaWRlbnQiKTtmdW5jdGlvbiB2YihhKXtyZXR1cm4oYT1EKGEpKSYmdm9pZCAwIT09YS5maXJzdENoaWxkfWZ1bmN0aW9uIE4oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTaGFkb3dSb290fWZ1bmN0aW9uIHdiKGEpe3JldHVybihhPShhPUQoYSkpJiZhLnJvb3QpJiZ4YihhKX0KdmFyIHliPUVsZW1lbnQucHJvdG90eXBlLHpiPXliLm1hdGNoZXN8fHliLm1hdGNoZXNTZWxlY3Rvcnx8eWIubW96TWF0Y2hlc1NlbGVjdG9yfHx5Yi5tc01hdGNoZXNTZWxlY3Rvcnx8eWIub01hdGNoZXNTZWxlY3Rvcnx8eWIud2Via2l0TWF0Y2hlc1NlbGVjdG9yLEFiPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKSxCYj0wLENiPVtdOyhuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbigpe2Zvcig7Q2IubGVuZ3RoOyl0cnl7Q2Iuc2hpZnQoKSgpfWNhdGNoKGEpe3Rocm93IEFiLnRleHRDb250ZW50PUJiKyssYTt9fSkpLm9ic2VydmUoQWIse2NoYXJhY3RlckRhdGE6ITB9KTtmdW5jdGlvbiBEYihhKXtDYi5wdXNoKGEpO0FiLnRleHRDb250ZW50PUJiKyt9CnZhciBFYj1kb2N1bWVudC5jb250YWlucz9mdW5jdGlvbihhLGIpe3JldHVybiBhLl9fc2hhZHlfbmF0aXZlX2NvbnRhaW5zKGIpfTpmdW5jdGlvbihhLGIpe3JldHVybiBhPT09Ynx8YS5kb2N1bWVudEVsZW1lbnQmJmEuZG9jdW1lbnRFbGVtZW50Ll9fc2hhZHlfbmF0aXZlX2NvbnRhaW5zKGIpfTtmdW5jdGlvbiBGYihhLGIpe2Zvcig7Yjspe2lmKGI9PWEpcmV0dXJuITA7Yj1iLl9fc2hhZHlfcGFyZW50Tm9kZX1yZXR1cm4hMX0KZnVuY3Rpb24gR2IoYSl7Zm9yKHZhciBiPWEubGVuZ3RoLTE7MDw9YjtiLS0pe3ZhciBjPWFbYl0sZD1jLmdldEF0dHJpYnV0ZSgiaWQiKXx8Yy5nZXRBdHRyaWJ1dGUoIm5hbWUiKTtkJiYibGVuZ3RoIiE9PWQmJmlzTmFOKGQpJiYoYVtkXT1jKX1hLml0ZW09ZnVuY3Rpb24oZSl7cmV0dXJuIGFbZV19O2EubmFtZWRJdGVtPWZ1bmN0aW9uKGUpe2lmKCJsZW5ndGgiIT09ZSYmaXNOYU4oZSkmJmFbZV0pcmV0dXJuIGFbZV07Zm9yKHZhciBmPW1hKGEpLGc9Zi5uZXh0KCk7IWcuZG9uZTtnPWYubmV4dCgpKWlmKGc9Zy52YWx1ZSwoZy5nZXRBdHRyaWJ1dGUoImlkIil8fGcuZ2V0QXR0cmlidXRlKCJuYW1lIikpPT1lKXJldHVybiBnO3JldHVybiBudWxsfTtyZXR1cm4gYX1mdW5jdGlvbiBIYihhKXt2YXIgYj1bXTtmb3IoYT1hLl9fc2hhZHlfbmF0aXZlX2ZpcnN0Q2hpbGQ7YTthPWEuX19zaGFkeV9uYXRpdmVfbmV4dFNpYmxpbmcpYi5wdXNoKGEpO3JldHVybiBifQpmdW5jdGlvbiBJYihhKXt2YXIgYj1bXTtmb3IoYT1hLl9fc2hhZHlfZmlyc3RDaGlsZDthO2E9YS5fX3NoYWR5X25leHRTaWJsaW5nKWIucHVzaChhKTtyZXR1cm4gYn1mdW5jdGlvbiBKYihhLGIsYyl7Yy5jb25maWd1cmFibGU9ITA7aWYoYy52YWx1ZSlhW2JdPWMudmFsdWU7ZWxzZSB0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsYixjKX1jYXRjaChkKXt9fWZ1bmN0aW9uIE8oYSxiLGMsZCl7Yz12b2lkIDA9PT1jPyIiOmM7Zm9yKHZhciBlIGluIGIpZCYmMDw9ZC5pbmRleE9mKGUpfHxKYihhLGMrZSxiW2VdKX1mdW5jdGlvbiBLYihhLGIpe2Zvcih2YXIgYyBpbiBiKWMgaW4gYSYmSmIoYSxjLGJbY10pfWZ1bmN0aW9uIFAoYSl7dmFyIGI9e307T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYSkuZm9yRWFjaChmdW5jdGlvbihjKXtiW2NdPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYSxjKX0pO3JldHVybiBifQpmdW5jdGlvbiBMYihhLGIpe2Zvcih2YXIgYz1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhiKSxkPTAsZTtkPGMubGVuZ3RoO2QrKyllPWNbZF0sYVtlXT1iW2VdfTt2YXIgTWI9W10sTmI7ZnVuY3Rpb24gT2IoYSl7TmJ8fChOYj0hMCxEYihQYikpO01iLnB1c2goYSl9ZnVuY3Rpb24gUGIoKXtOYj0hMTtmb3IodmFyIGE9ISFNYi5sZW5ndGg7TWIubGVuZ3RoOylNYi5zaGlmdCgpKCk7cmV0dXJuIGF9UGIubGlzdD1NYjtmdW5jdGlvbiBRYigpe3RoaXMuYT0hMTt0aGlzLmFkZGVkTm9kZXM9W107dGhpcy5yZW1vdmVkTm9kZXM9W107dGhpcy5qYT1uZXcgU2V0fWZ1bmN0aW9uIFJiKGEpe2EuYXx8KGEuYT0hMCxEYihmdW5jdGlvbigpe2EuZmx1c2goKX0pKX1RYi5wcm90b3R5cGUuZmx1c2g9ZnVuY3Rpb24oKXtpZih0aGlzLmEpe3RoaXMuYT0hMTt2YXIgYT10aGlzLnRha2VSZWNvcmRzKCk7YS5sZW5ndGgmJnRoaXMuamEuZm9yRWFjaChmdW5jdGlvbihiKXtiKGEpfSl9fTtRYi5wcm90b3R5cGUudGFrZVJlY29yZHM9ZnVuY3Rpb24oKXtpZih0aGlzLmFkZGVkTm9kZXMubGVuZ3RofHx0aGlzLnJlbW92ZWROb2Rlcy5sZW5ndGgpe3ZhciBhPVt7YWRkZWROb2Rlczp0aGlzLmFkZGVkTm9kZXMscmVtb3ZlZE5vZGVzOnRoaXMucmVtb3ZlZE5vZGVzfV07dGhpcy5hZGRlZE5vZGVzPVtdO3RoaXMucmVtb3ZlZE5vZGVzPVtdO3JldHVybiBhfXJldHVybltdfTsKZnVuY3Rpb24gU2IoYSxiKXt2YXIgYz1BKGEpO2MuWnx8KGMuWj1uZXcgUWIpO2MuWi5qYS5hZGQoYik7dmFyIGQ9Yy5aO3JldHVybntNYTpiLFM6ZCxOYTphLHRha2VSZWNvcmRzOmZ1bmN0aW9uKCl7cmV0dXJuIGQudGFrZVJlY29yZHMoKX19fWZ1bmN0aW9uIFRiKGEpe3ZhciBiPWEmJmEuUztiJiYoYi5qYS5kZWxldGUoYS5NYSksYi5qYS5zaXplfHwoQShhLk5hKS5aPW51bGwpKX0KZnVuY3Rpb24gVWIoYSxiKXt2YXIgYz1iLmdldFJvb3ROb2RlKCk7cmV0dXJuIGEubWFwKGZ1bmN0aW9uKGQpe3ZhciBlPWM9PT1kLnRhcmdldC5nZXRSb290Tm9kZSgpO2lmKGUmJmQuYWRkZWROb2Rlcyl7aWYoZT1bXS5zbGljZS5jYWxsKGQuYWRkZWROb2RlcykuZmlsdGVyKGZ1bmN0aW9uKGYpe3JldHVybiBjPT09Zi5nZXRSb290Tm9kZSgpfSksZS5sZW5ndGgpcmV0dXJuIGQ9T2JqZWN0LmNyZWF0ZShkKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZCwiYWRkZWROb2RlcyIse3ZhbHVlOmUsY29uZmlndXJhYmxlOiEwfSksZH1lbHNlIGlmKGUpcmV0dXJuIGR9KS5maWx0ZXIoZnVuY3Rpb24oZCl7cmV0dXJuIGR9KX07dmFyIFZiPS9bJlx1MDBBMCJdL2csV2I9L1smXHUwMEEwPD5dL2c7ZnVuY3Rpb24gWGIoYSl7c3dpdGNoKGEpe2Nhc2UgIiYiOnJldHVybiImYW1wOyI7Y2FzZSAiPCI6cmV0dXJuIiZsdDsiO2Nhc2UgIj4iOnJldHVybiImZ3Q7IjtjYXNlICciJzpyZXR1cm4iJnF1b3Q7IjtjYXNlICJcdTAwYTAiOnJldHVybiImbmJzcDsifX1mdW5jdGlvbiBZYihhKXtmb3IodmFyIGI9e30sYz0wO2M8YS5sZW5ndGg7YysrKWJbYVtjXV09ITA7cmV0dXJuIGJ9dmFyIFpiPVliKCJhcmVhIGJhc2UgYnIgY29sIGNvbW1hbmQgZW1iZWQgaHIgaW1nIGlucHV0IGtleWdlbiBsaW5rIG1ldGEgcGFyYW0gc291cmNlIHRyYWNrIHdiciIuc3BsaXQoIiAiKSksJGI9WWIoInN0eWxlIHNjcmlwdCB4bXAgaWZyYW1lIG5vZW1iZWQgbm9mcmFtZXMgcGxhaW50ZXh0IG5vc2NyaXB0Ii5zcGxpdCgiICIpKTsKZnVuY3Rpb24gYWMoYSxiKXsidGVtcGxhdGUiPT09YS5sb2NhbE5hbWUmJihhPWEuY29udGVudCk7Zm9yKHZhciBjPSIiLGQ9Yj9iKGEpOmEuY2hpbGROb2RlcyxlPTAsZj1kLmxlbmd0aCxnPXZvaWQgMDtlPGYmJihnPWRbZV0pO2UrKyl7YTp7dmFyIGg9Zzt2YXIgaz1hLGw9Yjtzd2l0Y2goaC5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTprPWgubG9jYWxOYW1lO2Zvcih2YXIgbT0iPCIrayxxPWguYXR0cmlidXRlcyxIPTAsQztDPXFbSF07SCsrKW0rPSIgIitDLm5hbWUrJz0iJytDLnZhbHVlLnJlcGxhY2UoVmIsWGIpKyciJzttKz0iPiI7aD1aYltrXT9tOm0rYWMoaCxsKSsiPC8iK2srIj4iO2JyZWFrIGE7Y2FzZSBOb2RlLlRFWFRfTk9ERTpoPWguZGF0YTtoPWsmJiRiW2subG9jYWxOYW1lXT9oOmgucmVwbGFjZShXYixYYik7YnJlYWsgYTtjYXNlIE5vZGUuQ09NTUVOVF9OT0RFOmg9Ilx4M2MhLS0iK2guZGF0YSsiLS1ceDNlIjticmVhayBhO2RlZmF1bHQ6dGhyb3cgd2luZG93LmNvbnNvbGUuZXJyb3IoaCksCkVycm9yKCJub3QgaW1wbGVtZW50ZWQiKTt9fWMrPWh9cmV0dXJuIGN9O3ZhciBkYz1MLkIsZWM9e3F1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfcXVlcnlTZWxlY3RvcihhKX0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9xdWVyeVNlbGVjdG9yQWxsKGEpfX0sZmM9e307ZnVuY3Rpb24gZ2MoYSl7ZmNbYV09ZnVuY3Rpb24oYil7cmV0dXJuIGJbIl9fc2hhZHlfbmF0aXZlXyIrYV19fWZ1bmN0aW9uIGhjKGEsYil7TyhhLGIsIl9fc2hhZHlfbmF0aXZlXyIpO2Zvcih2YXIgYyBpbiBiKWdjKGMpfWZ1bmN0aW9uIFEoYSxiKXtiPXZvaWQgMD09PWI/W106Yjtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXSxlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYSxkKTtlJiYoT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIl9fc2hhZHlfbmF0aXZlXyIrZCxlKSxlLnZhbHVlP2VjW2RdfHwoZWNbZF09ZS52YWx1ZSk6Z2MoZCkpfX0KdmFyIGljPWRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZG9jdW1lbnQsTm9kZUZpbHRlci5TSE9XX0FMTCxudWxsLCExKSxqYz1kb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKGRvY3VtZW50LE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5ULG51bGwsITEpLGtjPWRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiaW5lcnQiKTtmdW5jdGlvbiBsYyhhKXtmb3IodmFyIGI7Yj1hLl9fc2hhZHlfbmF0aXZlX2ZpcnN0Q2hpbGQ7KWEuX19zaGFkeV9uYXRpdmVfcmVtb3ZlQ2hpbGQoYil9dmFyIG1jPVsiZmlyc3RFbGVtZW50Q2hpbGQiLCJsYXN0RWxlbWVudENoaWxkIiwiY2hpbGRyZW4iLCJjaGlsZEVsZW1lbnRDb3VudCJdLG5jPVsicXVlcnlTZWxlY3RvciIsInF1ZXJ5U2VsZWN0b3JBbGwiXTsKZnVuY3Rpb24gb2MoKXt2YXIgYT1bImRpc3BhdGNoRXZlbnQiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciJdO3dpbmRvdy5FdmVudFRhcmdldD9RKHdpbmRvdy5FdmVudFRhcmdldC5wcm90b3R5cGUsYSk6KFEoTm9kZS5wcm90b3R5cGUsYSksUShXaW5kb3cucHJvdG90eXBlLGEpKTtkYz9RKE5vZGUucHJvdG90eXBlLCJwYXJlbnROb2RlIGZpcnN0Q2hpbGQgbGFzdENoaWxkIHByZXZpb3VzU2libGluZyBuZXh0U2libGluZyBjaGlsZE5vZGVzIHBhcmVudEVsZW1lbnQgdGV4dENvbnRlbnQiLnNwbGl0KCIgIikpOmhjKE5vZGUucHJvdG90eXBlLHtwYXJlbnROb2RlOntnZXQ6ZnVuY3Rpb24oKXtpYy5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBpYy5wYXJlbnROb2RlKCl9fSxmaXJzdENoaWxkOntnZXQ6ZnVuY3Rpb24oKXtpYy5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBpYy5maXJzdENoaWxkKCl9fSxsYXN0Q2hpbGQ6e2dldDpmdW5jdGlvbigpe2ljLmN1cnJlbnROb2RlPQp0aGlzO3JldHVybiBpYy5sYXN0Q2hpbGQoKX19LHByZXZpb3VzU2libGluZzp7Z2V0OmZ1bmN0aW9uKCl7aWMuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gaWMucHJldmlvdXNTaWJsaW5nKCl9fSxuZXh0U2libGluZzp7Z2V0OmZ1bmN0aW9uKCl7aWMuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gaWMubmV4dFNpYmxpbmcoKX19LGNoaWxkTm9kZXM6e2dldDpmdW5jdGlvbigpe3ZhciBiPVtdO2ljLmN1cnJlbnROb2RlPXRoaXM7Zm9yKHZhciBjPWljLmZpcnN0Q2hpbGQoKTtjOyliLnB1c2goYyksYz1pYy5uZXh0U2libGluZygpO3JldHVybiBifX0scGFyZW50RWxlbWVudDp7Z2V0OmZ1bmN0aW9uKCl7amMuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gamMucGFyZW50Tm9kZSgpfX0sdGV4dENvbnRlbnQ6e2dldDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLm5vZGVUeXBlKXtjYXNlIE5vZGUuRUxFTUVOVF9OT0RFOmNhc2UgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFOmZvcih2YXIgYj0KZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcih0aGlzLE5vZGVGaWx0ZXIuU0hPV19URVhULG51bGwsITEpLGM9IiIsZDtkPWIubmV4dE5vZGUoKTspYys9ZC5ub2RlVmFsdWU7cmV0dXJuIGM7ZGVmYXVsdDpyZXR1cm4gdGhpcy5ub2RlVmFsdWV9fSxzZXQ6ZnVuY3Rpb24oYil7aWYoInVuZGVmaW5lZCI9PT10eXBlb2YgYnx8bnVsbD09PWIpYj0iIjtzd2l0Y2godGhpcy5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpjYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERTpsYyh0aGlzKTsoMDxiLmxlbmd0aHx8dGhpcy5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKSYmdGhpcy5fX3NoYWR5X25hdGl2ZV9pbnNlcnRCZWZvcmUoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYiksdm9pZCAwKTticmVhaztkZWZhdWx0OnRoaXMubm9kZVZhbHVlPWJ9fX19KTtRKE5vZGUucHJvdG90eXBlLCJhcHBlbmRDaGlsZCBpbnNlcnRCZWZvcmUgcmVtb3ZlQ2hpbGQgcmVwbGFjZUNoaWxkIGNsb25lTm9kZSBjb250YWlucyIuc3BsaXQoIiAiKSk7ClEoSFRNTEVsZW1lbnQucHJvdG90eXBlLFsicGFyZW50RWxlbWVudCIsImNvbnRhaW5zIl0pO2E9e2ZpcnN0RWxlbWVudENoaWxkOntnZXQ6ZnVuY3Rpb24oKXtqYy5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBqYy5maXJzdENoaWxkKCl9fSxsYXN0RWxlbWVudENoaWxkOntnZXQ6ZnVuY3Rpb24oKXtqYy5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBqYy5sYXN0Q2hpbGQoKX19LGNoaWxkcmVuOntnZXQ6ZnVuY3Rpb24oKXt2YXIgYj1bXTtqYy5jdXJyZW50Tm9kZT10aGlzO2Zvcih2YXIgYz1qYy5maXJzdENoaWxkKCk7YzspYi5wdXNoKGMpLGM9amMubmV4dFNpYmxpbmcoKTtyZXR1cm4gR2IoYil9fSxjaGlsZEVsZW1lbnRDb3VudDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4/dGhpcy5jaGlsZHJlbi5sZW5ndGg6MH19fTtkYz8oUShFbGVtZW50LnByb3RvdHlwZSxtYyksUShFbGVtZW50LnByb3RvdHlwZSxbInByZXZpb3VzRWxlbWVudFNpYmxpbmciLCJuZXh0RWxlbWVudFNpYmxpbmciLAoiaW5uZXJIVE1MIiwiY2xhc3NOYW1lIl0pLFEoSFRNTEVsZW1lbnQucHJvdG90eXBlLFsiY2hpbGRyZW4iLCJpbm5lckhUTUwiLCJjbGFzc05hbWUiXSkpOihoYyhFbGVtZW50LnByb3RvdHlwZSxhKSxoYyhFbGVtZW50LnByb3RvdHlwZSx7cHJldmlvdXNFbGVtZW50U2libGluZzp7Z2V0OmZ1bmN0aW9uKCl7amMuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gamMucHJldmlvdXNTaWJsaW5nKCl9fSxuZXh0RWxlbWVudFNpYmxpbmc6e2dldDpmdW5jdGlvbigpe2pjLmN1cnJlbnROb2RlPXRoaXM7cmV0dXJuIGpjLm5leHRTaWJsaW5nKCl9fSxpbm5lckhUTUw6e2dldDpmdW5jdGlvbigpe3JldHVybiBhYyh0aGlzLEhiKX0sc2V0OmZ1bmN0aW9uKGIpe3ZhciBjPSJ0ZW1wbGF0ZSI9PT10aGlzLmxvY2FsTmFtZT90aGlzLmNvbnRlbnQ6dGhpcztsYyhjKTt2YXIgZD10aGlzLmxvY2FsTmFtZXx8ImRpdiI7ZD10aGlzLm5hbWVzcGFjZVVSSSYmdGhpcy5uYW1lc3BhY2VVUkkhPT1rYy5uYW1lc3BhY2VVUkk/CmtjLmNyZWF0ZUVsZW1lbnROUyh0aGlzLm5hbWVzcGFjZVVSSSxkKTprYy5jcmVhdGVFbGVtZW50KGQpO2QuaW5uZXJIVE1MPWI7Zm9yKGI9InRlbXBsYXRlIj09PXRoaXMubG9jYWxOYW1lP2QuY29udGVudDpkO2Q9Yi5fX3NoYWR5X25hdGl2ZV9maXJzdENoaWxkOyljLl9fc2hhZHlfbmF0aXZlX2luc2VydEJlZm9yZShkLHZvaWQgMCl9fSxjbGFzc05hbWU6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiJ9LHNldDpmdW5jdGlvbihiKXt0aGlzLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfX19KSk7UShFbGVtZW50LnByb3RvdHlwZSwic2V0QXR0cmlidXRlIGdldEF0dHJpYnV0ZSBoYXNBdHRyaWJ1dGUgcmVtb3ZlQXR0cmlidXRlIGZvY3VzIGJsdXIiLnNwbGl0KCIgIikpO1EoRWxlbWVudC5wcm90b3R5cGUsbmMpO1EoSFRNTEVsZW1lbnQucHJvdG90eXBlLFsiZm9jdXMiLCJibHVyIl0pO3dpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50JiYKUSh3aW5kb3cuSFRNTFRlbXBsYXRlRWxlbWVudC5wcm90b3R5cGUsWyJpbm5lckhUTUwiXSk7ZGM/UShEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZSxtYyk6aGMoRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUsYSk7UShEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZSxuYyk7ZGM/KFEoRG9jdW1lbnQucHJvdG90eXBlLG1jKSxRKERvY3VtZW50LnByb3RvdHlwZSxbImFjdGl2ZUVsZW1lbnQiXSkpOmhjKERvY3VtZW50LnByb3RvdHlwZSxhKTtRKERvY3VtZW50LnByb3RvdHlwZSxbImltcG9ydE5vZGUiLCJnZXRFbGVtZW50QnlJZCJdKTtRKERvY3VtZW50LnByb3RvdHlwZSxuYyl9O3ZhciBwYz1QKHtnZXQgY2hpbGROb2Rlcygpe3JldHVybiB0aGlzLl9fc2hhZHlfY2hpbGROb2Rlc30sZ2V0IGZpcnN0Q2hpbGQoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2ZpcnN0Q2hpbGR9LGdldCBsYXN0Q2hpbGQoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2xhc3RDaGlsZH0sZ2V0IGNoaWxkRWxlbWVudENvdW50KCl7cmV0dXJuIHRoaXMuX19zaGFkeV9jaGlsZEVsZW1lbnRDb3VudH0sZ2V0IGNoaWxkcmVuKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9jaGlsZHJlbn0sZ2V0IGZpcnN0RWxlbWVudENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9maXJzdEVsZW1lbnRDaGlsZH0sZ2V0IGxhc3RFbGVtZW50Q2hpbGQoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2xhc3RFbGVtZW50Q2hpbGR9LGdldCBzaGFkb3dSb290KCl7cmV0dXJuIHRoaXMuX19zaGFkeV9zaGFkb3dSb290fX0pLHFjPVAoe2dldCB0ZXh0Q29udGVudCgpe3JldHVybiB0aGlzLl9fc2hhZHlfdGV4dENvbnRlbnR9LHNldCB0ZXh0Q29udGVudChhKXt0aGlzLl9fc2hhZHlfdGV4dENvbnRlbnQ9CmF9LGdldCBpbm5lckhUTUwoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2lubmVySFRNTH0sc2V0IGlubmVySFRNTChhKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2lubmVySFRNTD1hfX0pLHJjPVAoe2dldCBwYXJlbnRFbGVtZW50KCl7cmV0dXJuIHRoaXMuX19zaGFkeV9wYXJlbnRFbGVtZW50fSxnZXQgcGFyZW50Tm9kZSgpe3JldHVybiB0aGlzLl9fc2hhZHlfcGFyZW50Tm9kZX0sZ2V0IG5leHRTaWJsaW5nKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9uZXh0U2libGluZ30sZ2V0IHByZXZpb3VzU2libGluZygpe3JldHVybiB0aGlzLl9fc2hhZHlfcHJldmlvdXNTaWJsaW5nfSxnZXQgbmV4dEVsZW1lbnRTaWJsaW5nKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9uZXh0RWxlbWVudFNpYmxpbmd9LGdldCBwcmV2aW91c0VsZW1lbnRTaWJsaW5nKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9wcmV2aW91c0VsZW1lbnRTaWJsaW5nfSxnZXQgY2xhc3NOYW1lKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9jbGFzc05hbWV9LApzZXQgY2xhc3NOYW1lKGEpe3JldHVybiB0aGlzLl9fc2hhZHlfY2xhc3NOYW1lPWF9fSk7ZnVuY3Rpb24gc2MoYSl7Zm9yKHZhciBiIGluIGEpe3ZhciBjPWFbYl07YyYmKGMuZW51bWVyYWJsZT0hMSl9fXNjKHBjKTtzYyhxYyk7c2MocmMpO3ZhciB0Yz1MLkJ8fCEwPT09TC5ELHVjPXRjP2Z1bmN0aW9uKCl7fTpmdW5jdGlvbihhKXt2YXIgYj1BKGEpO2IuS2F8fChiLkthPSEwLEtiKGEscmMpKX0sdmM9dGM/ZnVuY3Rpb24oKXt9OmZ1bmN0aW9uKGEpe3ZhciBiPUEoYSk7Yi5KYXx8KGIuSmE9ITAsS2IoYSxwYyksd2luZG93LmN1c3RvbUVsZW1lbnRzJiZ3aW5kb3cuY3VzdG9tRWxlbWVudHMucG9seWZpbGxXcmFwRmx1c2hDYWxsYmFjayYmIUwuRHx8S2IoYSxxYykpfTt2YXIgd2M9Il9fZXZlbnRXcmFwcGVycyIrRGF0ZS5ub3coKSx4Yz1mdW5jdGlvbigpe3ZhciBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRXZlbnQucHJvdG90eXBlLCJjb21wb3NlZCIpO3JldHVybiBhP2Z1bmN0aW9uKGIpe3JldHVybiBhLmdldC5jYWxsKGIpfTpudWxsfSgpLHljPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe312YXIgYj0hMSxjPXtnZXQgY2FwdHVyZSgpe2I9ITA7cmV0dXJuITF9fTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsYSxjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGVzdCIsYSxjKTtyZXR1cm4gYn0oKTtmdW5jdGlvbiB6YyhhKXtpZihhJiYib2JqZWN0Ij09PXR5cGVvZiBhKXt2YXIgYj0hIWEuY2FwdHVyZTt2YXIgYz0hIWEub25jZTt2YXIgZD0hIWEucGFzc2l2ZTt2YXIgZT1hLk99ZWxzZSBiPSEhYSxkPWM9ITE7cmV0dXJue0dhOmUsY2FwdHVyZTpiLG9uY2U6YyxwYXNzaXZlOmQsRmE6eWM/YTpifX0KdmFyIEFjPXtibHVyOiEwLGZvY3VzOiEwLGZvY3VzaW46ITAsZm9jdXNvdXQ6ITAsY2xpY2s6ITAsZGJsY2xpY2s6ITAsbW91c2Vkb3duOiEwLG1vdXNlZW50ZXI6ITAsbW91c2VsZWF2ZTohMCxtb3VzZW1vdmU6ITAsbW91c2VvdXQ6ITAsbW91c2VvdmVyOiEwLG1vdXNldXA6ITAsd2hlZWw6ITAsYmVmb3JlaW5wdXQ6ITAsaW5wdXQ6ITAsa2V5ZG93bjohMCxrZXl1cDohMCxjb21wb3NpdGlvbnN0YXJ0OiEwLGNvbXBvc2l0aW9udXBkYXRlOiEwLGNvbXBvc2l0aW9uZW5kOiEwLHRvdWNoc3RhcnQ6ITAsdG91Y2hlbmQ6ITAsdG91Y2htb3ZlOiEwLHRvdWNoY2FuY2VsOiEwLHBvaW50ZXJvdmVyOiEwLHBvaW50ZXJlbnRlcjohMCxwb2ludGVyZG93bjohMCxwb2ludGVybW92ZTohMCxwb2ludGVydXA6ITAscG9pbnRlcmNhbmNlbDohMCxwb2ludGVyb3V0OiEwLHBvaW50ZXJsZWF2ZTohMCxnb3Rwb2ludGVyY2FwdHVyZTohMCxsb3N0cG9pbnRlcmNhcHR1cmU6ITAsZHJhZ3N0YXJ0OiEwLApkcmFnOiEwLGRyYWdlbnRlcjohMCxkcmFnbGVhdmU6ITAsZHJhZ292ZXI6ITAsZHJvcDohMCxkcmFnZW5kOiEwLERPTUFjdGl2YXRlOiEwLERPTUZvY3VzSW46ITAsRE9NRm9jdXNPdXQ6ITAsa2V5cHJlc3M6ITB9LEJjPXtET01BdHRyTW9kaWZpZWQ6ITAsRE9NQXR0cmlidXRlTmFtZUNoYW5nZWQ6ITAsRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkOiEwLERPTUVsZW1lbnROYW1lQ2hhbmdlZDohMCxET01Ob2RlSW5zZXJ0ZWQ6ITAsRE9NTm9kZUluc2VydGVkSW50b0RvY3VtZW50OiEwLERPTU5vZGVSZW1vdmVkOiEwLERPTU5vZGVSZW1vdmVkRnJvbURvY3VtZW50OiEwLERPTVN1YnRyZWVNb2RpZmllZDohMH07ZnVuY3Rpb24gQ2MoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBOb2RlP2EuX19zaGFkeV9nZXRSb290Tm9kZSgpOmF9CmZ1bmN0aW9uIERjKGEsYil7dmFyIGM9W10sZD1hO2ZvcihhPUNjKGEpO2Q7KWMucHVzaChkKSxkLl9fc2hhZHlfYXNzaWduZWRTbG90P2Q9ZC5fX3NoYWR5X2Fzc2lnbmVkU2xvdDpkLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFJiZkLmhvc3QmJihifHxkIT09YSk/ZD1kLmhvc3Q6ZD1kLl9fc2hhZHlfcGFyZW50Tm9kZTtjW2MubGVuZ3RoLTFdPT09ZG9jdW1lbnQmJmMucHVzaCh3aW5kb3cpO3JldHVybiBjfWZ1bmN0aW9uIEVjKGEpe2EuX19jb21wb3NlZFBhdGh8fChhLl9fY29tcG9zZWRQYXRoPURjKGEudGFyZ2V0LCEwKSk7cmV0dXJuIGEuX19jb21wb3NlZFBhdGh9ZnVuY3Rpb24gRmMoYSxiKXtpZighTilyZXR1cm4gYTthPURjKGEsITApO2Zvcih2YXIgYz0wLGQsZT12b2lkIDAsZixnPXZvaWQgMDtjPGIubGVuZ3RoO2MrKylpZihkPWJbY10sZj1DYyhkKSxmIT09ZSYmKGc9YS5pbmRleE9mKGYpLGU9ZiksIU4oZil8fC0xPGcpcmV0dXJuIGR9CmZ1bmN0aW9uIEdjKGEpe2Z1bmN0aW9uIGIoYyxkKXtjPW5ldyBhKGMsZCk7Yy5fX2NvbXBvc2VkPWQmJiEhZC5jb21wb3NlZDtyZXR1cm4gY31iLl9fcHJvdG9fXz1hO2IucHJvdG90eXBlPWEucHJvdG90eXBlO3JldHVybiBifXZhciBIYz17Zm9jdXM6ITAsYmx1cjohMH07ZnVuY3Rpb24gSWMoYSl7cmV0dXJuIGEuX190YXJnZXQhPT1hLnRhcmdldHx8YS5fX3JlbGF0ZWRUYXJnZXQhPT1hLnJlbGF0ZWRUYXJnZXR9ZnVuY3Rpb24gSmMoYSxiLGMpe2lmKGM9Yi5fX2hhbmRsZXJzJiZiLl9faGFuZGxlcnNbYS50eXBlXSYmYi5fX2hhbmRsZXJzW2EudHlwZV1bY10pZm9yKHZhciBkPTAsZTsoZT1jW2RdKSYmKCFJYyhhKXx8YS50YXJnZXQhPT1hLnJlbGF0ZWRUYXJnZXQpJiYoZS5jYWxsKGIsYSksIWEuX19pbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQpO2QrKyk7fQpmdW5jdGlvbiBLYyhhKXt2YXIgYj1hLmNvbXBvc2VkUGF0aCgpLGM9Yi5tYXAoZnVuY3Rpb24oayl7cmV0dXJuIEZjKGssYil9KSxkPWEuYnViYmxlcztPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiY3VycmVudFRhcmdldCIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBnfX0pO3ZhciBlPUV2ZW50LkNBUFRVUklOR19QSEFTRTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiZXZlbnRQaGFzZSIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBlfX0pO2Zvcih2YXIgZj1iLmxlbmd0aC0xOzA8PWY7Zi0tKXt2YXIgZz1iW2ZdO2U9Zz09PWNbZl0/RXZlbnQuQVRfVEFSR0VUOkV2ZW50LkNBUFRVUklOR19QSEFTRTtKYyhhLGcsImNhcHR1cmUiKTtpZihhLm1hKXJldHVybn1mb3IoZj0wO2Y8Yi5sZW5ndGg7ZisrKXtnPWJbZl07dmFyIGg9Zz09PWNbZl07aWYoaHx8ZClpZihlPWg/RXZlbnQuQVRfVEFSR0VUOgpFdmVudC5CVUJCTElOR19QSEFTRSxKYyhhLGcsImJ1YmJsZSIpLGEubWEpcmV0dXJufWU9MDtnPW51bGx9ZnVuY3Rpb24gTGMoYSxiLGMsZCxlLGYpe2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXt2YXIgaD1hW2ddLGs9aC50eXBlLGw9aC5jYXB0dXJlLG09aC5vbmNlLHE9aC5wYXNzaXZlO2lmKGI9PT1oLm5vZGUmJmM9PT1rJiZkPT09bCYmZT09PW0mJmY9PT1xKXJldHVybiBnfXJldHVybi0xfWZ1bmN0aW9uIE1jKGEpe1BiKCk7cmV0dXJuIUwuYWEmJnRoaXMgaW5zdGFuY2VvZiBOb2RlJiYhRWIoZG9jdW1lbnQsdGhpcyk/KGEuX190YXJnZXR8fE5jKGEsdGhpcyksS2MoYSkpOnRoaXMuX19zaGFkeV9uYXRpdmVfZGlzcGF0Y2hFdmVudChhKX0KZnVuY3Rpb24gT2MoYSxiLGMpe3ZhciBkPXpjKGMpLGU9ZC5jYXB0dXJlLGY9ZC5vbmNlLGc9ZC5wYXNzaXZlLGg9ZC5HYTtkPWQuRmE7aWYoYil7dmFyIGs9dHlwZW9mIGI7aWYoImZ1bmN0aW9uIj09PWt8fCJvYmplY3QiPT09aylpZigib2JqZWN0IiE9PWt8fGIuaGFuZGxlRXZlbnQmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5oYW5kbGVFdmVudCl7aWYoQmNbYV0pcmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfYWRkRXZlbnRMaXN0ZW5lcihhLGIsZCk7dmFyIGw9aHx8dGhpcztpZihoPWJbd2NdKXtpZigtMTxMYyhoLGwsYSxlLGYsZykpcmV0dXJufWVsc2UgYlt3Y109W107aD1mdW5jdGlvbihtKXtmJiZ0aGlzLl9fc2hhZHlfcmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGIsYyk7bS5fX3RhcmdldHx8TmMobSk7aWYobCE9PXRoaXMpe3ZhciBxPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwiY3VycmVudFRhcmdldCIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtLCJjdXJyZW50VGFyZ2V0IiwKe2dldDpmdW5jdGlvbigpe3JldHVybiBsfSxjb25maWd1cmFibGU6ITB9KTt2YXIgSD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sImV2ZW50UGhhc2UiKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobSwiZXZlbnRQaGFzZSIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBlP0V2ZW50LkNBUFRVUklOR19QSEFTRTpFdmVudC5CVUJCTElOR19QSEFTRX19KX1tLl9fcHJldmlvdXNDdXJyZW50VGFyZ2V0PW0uY3VycmVudFRhcmdldDtpZighTihsKSYmInNsb3QiIT09bC5sb2NhbE5hbWV8fC0xIT1tLmNvbXBvc2VkUGF0aCgpLmluZGV4T2YobCkpaWYobS5jb21wb3NlZHx8LTE8bS5jb21wb3NlZFBhdGgoKS5pbmRleE9mKGwpKWlmKEljKG0pJiZtLnRhcmdldD09PW0ucmVsYXRlZFRhcmdldCltLmV2ZW50UGhhc2U9PT1FdmVudC5CVUJCTElOR19QSEFTRSYmbS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtlbHNlIGlmKG0uZXZlbnRQaGFzZT09PQpFdmVudC5DQVBUVVJJTkdfUEhBU0V8fG0uYnViYmxlc3x8bS50YXJnZXQ9PT1sfHxsIGluc3RhbmNlb2YgV2luZG93KXt2YXIgQz0iZnVuY3Rpb24iPT09az9iLmNhbGwobCxtKTpiLmhhbmRsZUV2ZW50JiZiLmhhbmRsZUV2ZW50KG0pO2whPT10aGlzJiYocT8oT2JqZWN0LmRlZmluZVByb3BlcnR5KG0sImN1cnJlbnRUYXJnZXQiLHEpLHE9bnVsbCk6ZGVsZXRlIG0uY3VycmVudFRhcmdldCxIPyhPYmplY3QuZGVmaW5lUHJvcGVydHkobSwiZXZlbnRQaGFzZSIsSCksSD1udWxsKTpkZWxldGUgbS5ldmVudFBoYXNlKTtyZXR1cm4gQ319O2Jbd2NdLnB1c2goe25vZGU6bCx0eXBlOmEsY2FwdHVyZTplLG9uY2U6ZixwYXNzaXZlOmcsbGI6aH0pO3RoaXMuX19oYW5kbGVycz10aGlzLl9faGFuZGxlcnN8fHt9O3RoaXMuX19oYW5kbGVyc1thXT10aGlzLl9faGFuZGxlcnNbYV18fHtjYXB0dXJlOltdLGJ1YmJsZTpbXX07dGhpcy5fX2hhbmRsZXJzW2FdW2U/ImNhcHR1cmUiOiJidWJibGUiXS5wdXNoKGgpOwpIY1thXXx8dGhpcy5fX3NoYWR5X25hdGl2ZV9hZGRFdmVudExpc3RlbmVyKGEsaCxkKX19fQpmdW5jdGlvbiBQYyhhLGIsYyl7aWYoYil7dmFyIGQ9emMoYyk7Yz1kLmNhcHR1cmU7dmFyIGU9ZC5vbmNlLGY9ZC5wYXNzaXZlLGc9ZC5HYTtkPWQuRmE7aWYoQmNbYV0pcmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfcmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGIsZCk7dmFyIGg9Z3x8dGhpcztnPXZvaWQgMDt2YXIgaz1udWxsO3RyeXtrPWJbd2NdfWNhdGNoKGwpe31rJiYoZT1MYyhrLGgsYSxjLGUsZiksLTE8ZSYmKGc9ay5zcGxpY2UoZSwxKVswXS5sYixrLmxlbmd0aHx8KGJbd2NdPXZvaWQgMCkpKTt0aGlzLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxnfHxiLGQpO2cmJnRoaXMuX19oYW5kbGVycyYmdGhpcy5fX2hhbmRsZXJzW2FdJiYoYT10aGlzLl9faGFuZGxlcnNbYV1bYz8iY2FwdHVyZSI6ImJ1YmJsZSJdLGI9YS5pbmRleE9mKGcpLC0xPGImJmEuc3BsaWNlKGIsMSkpfX0KZnVuY3Rpb24gUWMoKXtmb3IodmFyIGEgaW4gSGMpd2luZG93Ll9fc2hhZHlfbmF0aXZlX2FkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtiLl9fdGFyZ2V0fHwoTmMoYiksS2MoYikpfSwhMCl9CnZhciBSYz1QKHtnZXQgY29tcG9zZWQoKXt2b2lkIDA9PT10aGlzLl9fY29tcG9zZWQmJih4Yz90aGlzLl9fY29tcG9zZWQ9ImZvY3VzaW4iPT09dGhpcy50eXBlfHwiZm9jdXNvdXQiPT09dGhpcy50eXBlfHx4Yyh0aGlzKTohMSE9PXRoaXMuaXNUcnVzdGVkJiYodGhpcy5fX2NvbXBvc2VkPUFjW3RoaXMudHlwZV0pKTtyZXR1cm4gdGhpcy5fX2NvbXBvc2VkfHwhMX0sY29tcG9zZWRQYXRoOmZ1bmN0aW9uKCl7dGhpcy5fX2NvbXBvc2VkUGF0aHx8KHRoaXMuX19jb21wb3NlZFBhdGg9RGModGhpcy5fX3RhcmdldCx0aGlzLmNvbXBvc2VkKSk7cmV0dXJuIHRoaXMuX19jb21wb3NlZFBhdGh9LGdldCB0YXJnZXQoKXtyZXR1cm4gRmModGhpcy5jdXJyZW50VGFyZ2V0fHx0aGlzLl9fcHJldmlvdXNDdXJyZW50VGFyZ2V0LHRoaXMuY29tcG9zZWRQYXRoKCkpfSxnZXQgcmVsYXRlZFRhcmdldCgpe2lmKCF0aGlzLl9fcmVsYXRlZFRhcmdldClyZXR1cm4gbnVsbDt0aGlzLl9fcmVsYXRlZFRhcmdldENvbXBvc2VkUGF0aHx8Cih0aGlzLl9fcmVsYXRlZFRhcmdldENvbXBvc2VkUGF0aD1EYyh0aGlzLl9fcmVsYXRlZFRhcmdldCwhMCkpO3JldHVybiBGYyh0aGlzLmN1cnJlbnRUYXJnZXR8fHRoaXMuX19wcmV2aW91c0N1cnJlbnRUYXJnZXQsdGhpcy5fX3JlbGF0ZWRUYXJnZXRDb21wb3NlZFBhdGgpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXtFdmVudC5wcm90b3R5cGUuc3RvcFByb3BhZ2F0aW9uLmNhbGwodGhpcyk7dGhpcy5tYT0hMH0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7RXZlbnQucHJvdG90eXBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbi5jYWxsKHRoaXMpO3RoaXMubWE9dGhpcy5fX2ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD0hMH19KTsKZnVuY3Rpb24gTmMoYSxiKXtiPXZvaWQgMD09PWI/YS50YXJnZXQ6YjthLl9fdGFyZ2V0PWI7YS5fX3JlbGF0ZWRUYXJnZXQ9YS5yZWxhdGVkVGFyZ2V0O2lmKEwuQil7Yj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYSk7aWYoIWIuaGFzT3duUHJvcGVydHkoIl9fc2hhZHlfcGF0Y2hlZFByb3RvIikpe3ZhciBjPU9iamVjdC5jcmVhdGUoYik7Yy5fX3NoYWR5X3NvdXJjZVByb3RvPWI7TyhjLFJjKTtiLl9fc2hhZHlfcGF0Y2hlZFByb3RvPWN9YS5fX3Byb3RvX189Yi5fX3NoYWR5X3BhdGNoZWRQcm90b31lbHNlIE8oYSxSYyl9dmFyIFNjPUdjKEV2ZW50KSxUYz1HYyhDdXN0b21FdmVudCksVWM9R2MoTW91c2VFdmVudCk7CmZ1bmN0aW9uIFZjKCl7aWYoIXhjJiZPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEV2ZW50LnByb3RvdHlwZSwiaXNUcnVzdGVkIikpe3ZhciBhPWZ1bmN0aW9uKCl7dmFyIGI9bmV3IE1vdXNlRXZlbnQoImNsaWNrIix7YnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNvbXBvc2VkOiEwfSk7dGhpcy5fX3NoYWR5X2Rpc3BhdGNoRXZlbnQoYil9O0VsZW1lbnQucHJvdG90eXBlLmNsaWNrP0VsZW1lbnQucHJvdG90eXBlLmNsaWNrPWE6SFRNTEVsZW1lbnQucHJvdG90eXBlLmNsaWNrJiYoSFRNTEVsZW1lbnQucHJvdG90eXBlLmNsaWNrPWEpfX0KdmFyIFdjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEVsZW1lbnQucHJvdG90eXBlKS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIm9uIj09PWEuc3Vic3RyaW5nKDAsMil9KSxYYz1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhIVE1MRWxlbWVudC5wcm90b3R5cGUpLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4ib24iPT09YS5zdWJzdHJpbmcoMCwyKX0pO2Z1bmN0aW9uIFljKGEpe3JldHVybntzZXQ6ZnVuY3Rpb24oYil7dmFyIGM9QSh0aGlzKSxkPWEuc3Vic3RyaW5nKDIpO2MuTnx8KGMuTj17fSk7Yy5OW2FdJiZ0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZCxjLk5bYV0pO3RoaXMuX19zaGFkeV9hZGRFdmVudExpc3RlbmVyKGQsYik7Yy5OW2FdPWJ9LGdldDpmdW5jdGlvbigpe3ZhciBiPUQodGhpcyk7cmV0dXJuIGImJmIuTiYmYi5OW2FdfSxjb25maWd1cmFibGU6ITB9fTtmdW5jdGlvbiBaYyhhLGIpe3JldHVybntpbmRleDphLGJhOltdLGlhOmJ9fQpmdW5jdGlvbiAkYyhhLGIsYyxkKXt2YXIgZT0wLGY9MCxnPTAsaD0wLGs9TWF0aC5taW4oYi1lLGQtZik7aWYoMD09ZSYmMD09ZilhOntmb3IoZz0wO2c8aztnKyspaWYoYVtnXSE9PWNbZ10pYnJlYWsgYTtnPWt9aWYoYj09YS5sZW5ndGgmJmQ9PWMubGVuZ3RoKXtoPWEubGVuZ3RoO2Zvcih2YXIgbD1jLmxlbmd0aCxtPTA7bTxrLWcmJmFkKGFbLS1oXSxjWy0tbF0pOyltKys7aD1tfWUrPWc7Zis9ZztiLT1oO2QtPWg7aWYoMD09Yi1lJiYwPT1kLWYpcmV0dXJuW107aWYoZT09Yil7Zm9yKGI9WmMoZSwwKTtmPGQ7KWIuYmEucHVzaChjW2YrK10pO3JldHVybltiXX1pZihmPT1kKXJldHVybltaYyhlLGItZSldO2s9ZTtnPWY7ZD1kLWcrMTtoPWItaysxO2I9QXJyYXkoZCk7Zm9yKGw9MDtsPGQ7bCsrKWJbbF09QXJyYXkoaCksYltsXVswXT1sO2ZvcihsPTA7bDxoO2wrKyliWzBdW2xdPWw7Zm9yKGw9MTtsPGQ7bCsrKWZvcihtPTE7bTxoO20rKylpZihhW2srbS0xXT09PWNbZytsLTFdKWJbbF1bbV09CmJbbC0xXVttLTFdO2Vsc2V7dmFyIHE9YltsLTFdW21dKzEsSD1iW2xdW20tMV0rMTtiW2xdW21dPXE8SD9xOkh9az1iLmxlbmd0aC0xO2c9YlswXS5sZW5ndGgtMTtkPWJba11bZ107Zm9yKGE9W107MDxrfHwwPGc7KTA9PWs/KGEucHVzaCgyKSxnLS0pOjA9PWc/KGEucHVzaCgzKSxrLS0pOihoPWJbay0xXVtnLTFdLGw9YltrLTFdW2ddLG09YltrXVtnLTFdLHE9bDxtP2w8aD9sOmg6bTxoP206aCxxPT1oPyhoPT1kP2EucHVzaCgwKTooYS5wdXNoKDEpLGQ9aCksay0tLGctLSk6cT09bD8oYS5wdXNoKDMpLGstLSxkPWwpOihhLnB1c2goMiksZy0tLGQ9bSkpO2EucmV2ZXJzZSgpO2I9dm9pZCAwO2s9W107Zm9yKGc9MDtnPGEubGVuZ3RoO2crKylzd2l0Y2goYVtnXSl7Y2FzZSAwOmImJihrLnB1c2goYiksYj12b2lkIDApO2UrKztmKys7YnJlYWs7Y2FzZSAxOmJ8fChiPVpjKGUsMCkpO2IuaWErKztlKys7Yi5iYS5wdXNoKGNbZl0pO2YrKzticmVhaztjYXNlIDI6Ynx8KGI9WmMoZSwKMCkpO2IuaWErKztlKys7YnJlYWs7Y2FzZSAzOmJ8fChiPVpjKGUsMCkpLGIuYmEucHVzaChjW2ZdKSxmKyt9YiYmay5wdXNoKGIpO3JldHVybiBrfWZ1bmN0aW9uIGFkKGEsYil7cmV0dXJuIGE9PT1ifTt2YXIgYmQ9UCh7ZGlzcGF0Y2hFdmVudDpNYyxhZGRFdmVudExpc3RlbmVyOk9jLHJlbW92ZUV2ZW50TGlzdGVuZXI6UGN9KTt2YXIgY2Q9bnVsbDtmdW5jdGlvbiBkZCgpe2NkfHwoY2Q9d2luZG93LlNoYWR5Q1NTJiZ3aW5kb3cuU2hhZHlDU1MuU2NvcGluZ1NoaW0pO3JldHVybiBjZHx8bnVsbH1mdW5jdGlvbiBlZChhLGIsYyl7dmFyIGQ9ZGQoKTtyZXR1cm4gZCYmImNsYXNzIj09PWI/KGQuc2V0RWxlbWVudENsYXNzKGEsYyksITApOiExfWZ1bmN0aW9uIGZkKGEsYil7dmFyIGM9ZGQoKTtjJiZjLnVuc2NvcGVOb2RlKGEsYil9ZnVuY3Rpb24gZ2QoYSxiKXt2YXIgYz1kZCgpO2lmKCFjKXJldHVybiEwO2lmKGEubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpe2M9ITA7Zm9yKGE9YS5fX3NoYWR5X2ZpcnN0Q2hpbGQ7YTthPWEuX19zaGFkeV9uZXh0U2libGluZyljPWMmJmdkKGEsYik7cmV0dXJuIGN9cmV0dXJuIGEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERT8hMDpjLmN1cnJlbnRTY29wZUZvck5vZGUoYSk9PT1ifQpmdW5jdGlvbiBoZChhKXtpZihhLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIiI7dmFyIGI9ZGQoKTtyZXR1cm4gYj9iLmN1cnJlbnRTY29wZUZvck5vZGUoYSk6IiJ9ZnVuY3Rpb24gaWQoYSxiKXtpZihhKWZvcihhLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJmIoYSksYT1hLl9fc2hhZHlfZmlyc3RDaGlsZDthO2E9YS5fX3NoYWR5X25leHRTaWJsaW5nKWEubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmaWQoYSxiKX07dmFyIGpkPXdpbmRvdy5kb2N1bWVudCxrZD1MLmFhLGxkPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTm9kZS5wcm90b3R5cGUsImlzQ29ubmVjdGVkIiksbWQ9bGQmJmxkLmdldDtmdW5jdGlvbiBuZChhKXtmb3IodmFyIGI7Yj1hLl9fc2hhZHlfZmlyc3RDaGlsZDspYS5fX3NoYWR5X3JlbW92ZUNoaWxkKGIpfWZ1bmN0aW9uIG9kKGEpe3ZhciBiPUQoYSk7aWYoYiYmdm9pZCAwIT09Yi5sYSlmb3IoYj1hLl9fc2hhZHlfZmlyc3RDaGlsZDtiO2I9Yi5fX3NoYWR5X25leHRTaWJsaW5nKW9kKGIpO2lmKGE9RChhKSlhLmxhPXZvaWQgMH1mdW5jdGlvbiBwZChhKXt2YXIgYj1hO2lmKGEmJiJzbG90Ij09PWEubG9jYWxOYW1lKXt2YXIgYz1EKGEpOyhjPWMmJmMuVikmJihiPWMubGVuZ3RoP2NbMF06cGQoYS5fX3NoYWR5X25leHRTaWJsaW5nKSl9cmV0dXJuIGJ9CmZ1bmN0aW9uIHFkKGEsYixjKXtpZihhPShhPUQoYSkpJiZhLlope2lmKGIpaWYoYi5ub2RlVHlwZT09PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSlmb3IodmFyIGQ9MCxlPWIuY2hpbGROb2Rlcy5sZW5ndGg7ZDxlO2QrKylhLmFkZGVkTm9kZXMucHVzaChiLmNoaWxkTm9kZXNbZF0pO2Vsc2UgYS5hZGRlZE5vZGVzLnB1c2goYik7YyYmYS5yZW1vdmVkTm9kZXMucHVzaChjKTtSYihhKX19CnZhciB4ZD1QKHtnZXQgcGFyZW50Tm9kZSgpe3ZhciBhPUQodGhpcyk7YT1hJiZhLnBhcmVudE5vZGU7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGV9LGdldCBmaXJzdENoaWxkKCl7dmFyIGE9RCh0aGlzKTthPWEmJmEuZmlyc3RDaGlsZDtyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfZmlyc3RDaGlsZH0sZ2V0IGxhc3RDaGlsZCgpe3ZhciBhPUQodGhpcyk7YT1hJiZhLmxhc3RDaGlsZDtyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfbGFzdENoaWxkfSxnZXQgbmV4dFNpYmxpbmcoKXt2YXIgYT1EKHRoaXMpO2E9YSYmYS5uZXh0U2libGluZztyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfbmV4dFNpYmxpbmd9LGdldCBwcmV2aW91c1NpYmxpbmcoKXt2YXIgYT1EKHRoaXMpO2E9YSYmYS5wcmV2aW91c1NpYmxpbmc7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX3ByZXZpb3VzU2libGluZ30sCmdldCBjaGlsZE5vZGVzKCl7aWYodmIodGhpcykpe3ZhciBhPUQodGhpcyk7aWYoIWEuY2hpbGROb2Rlcyl7YS5jaGlsZE5vZGVzPVtdO2Zvcih2YXIgYj10aGlzLl9fc2hhZHlfZmlyc3RDaGlsZDtiO2I9Yi5fX3NoYWR5X25leHRTaWJsaW5nKWEuY2hpbGROb2Rlcy5wdXNoKGIpfXZhciBjPWEuY2hpbGROb2Rlc31lbHNlIGM9dGhpcy5fX3NoYWR5X25hdGl2ZV9jaGlsZE5vZGVzO2MuaXRlbT1mdW5jdGlvbihkKXtyZXR1cm4gY1tkXX07cmV0dXJuIGN9LGdldCBwYXJlbnRFbGVtZW50KCl7dmFyIGE9RCh0aGlzKTsoYT1hJiZhLnBhcmVudE5vZGUpJiZhLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREUmJihhPW51bGwpO3JldHVybiB2b2lkIDAhPT1hP2E6dGhpcy5fX3NoYWR5X25hdGl2ZV9wYXJlbnRFbGVtZW50fSxnZXQgaXNDb25uZWN0ZWQoKXtpZihtZCYmbWQuY2FsbCh0aGlzKSlyZXR1cm4hMDtpZih0aGlzLm5vZGVUeXBlPT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpcmV0dXJuITE7CnZhciBhPXRoaXMub3duZXJEb2N1bWVudDtpZihudWxsPT09YXx8RWIoYSx0aGlzKSlyZXR1cm4hMDtmb3IoYT10aGlzO2EmJiEoYSBpbnN0YW5jZW9mIERvY3VtZW50KTspYT1hLl9fc2hhZHlfcGFyZW50Tm9kZXx8KE4oYSk/YS5ob3N0OnZvaWQgMCk7cmV0dXJuISEoYSYmYSBpbnN0YW5jZW9mIERvY3VtZW50KX0sZ2V0IHRleHRDb250ZW50KCl7aWYodmIodGhpcykpe2Zvcih2YXIgYT1bXSxiPXRoaXMuX19zaGFkeV9maXJzdENoaWxkO2I7Yj1iLl9fc2hhZHlfbmV4dFNpYmxpbmcpYi5ub2RlVHlwZSE9PU5vZGUuQ09NTUVOVF9OT0RFJiZhLnB1c2goYi5fX3NoYWR5X3RleHRDb250ZW50KTtyZXR1cm4gYS5qb2luKCIiKX1yZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV90ZXh0Q29udGVudH0sc2V0IHRleHRDb250ZW50KGEpe2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGF8fG51bGw9PT1hKWE9IiI7c3dpdGNoKHRoaXMubm9kZVR5cGUpe2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6Y2FzZSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6aWYoIXZiKHRoaXMpJiYKTC5CKXt2YXIgYj10aGlzLl9fc2hhZHlfZmlyc3RDaGlsZDsoYiE9dGhpcy5fX3NoYWR5X2xhc3RDaGlsZHx8YiYmYi5ub2RlVHlwZSE9Tm9kZS5URVhUX05PREUpJiZuZCh0aGlzKTt0aGlzLl9fc2hhZHlfbmF0aXZlX3RleHRDb250ZW50PWF9ZWxzZSBuZCh0aGlzKSwoMDxhLmxlbmd0aHx8dGhpcy5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKSYmdGhpcy5fX3NoYWR5X2luc2VydEJlZm9yZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhKSk7YnJlYWs7ZGVmYXVsdDp0aGlzLm5vZGVWYWx1ZT1hfX0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKGEsYil7aWYodGhpcy5vd25lckRvY3VtZW50IT09amQmJmEub3duZXJEb2N1bWVudCE9PWpkKXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX2luc2VydEJlZm9yZShhLGIpLGE7aWYoYT09PXRoaXMpdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBleGVjdXRlICdhcHBlbmRDaGlsZCcgb24gJ05vZGUnOiBUaGUgbmV3IGNoaWxkIGVsZW1lbnQgY29udGFpbnMgdGhlIHBhcmVudC4iKTsKaWYoYil7dmFyIGM9RChiKTtjPWMmJmMucGFyZW50Tm9kZTtpZih2b2lkIDAhPT1jJiZjIT09dGhpc3x8dm9pZCAwPT09YyYmYi5fX3NoYWR5X25hdGl2ZV9wYXJlbnROb2RlIT09dGhpcyl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGV4ZWN1dGUgJ2luc2VydEJlZm9yZScgb24gJ05vZGUnOiBUaGUgbm9kZSBiZWZvcmUgd2hpY2ggdGhlIG5ldyBub2RlIGlzIHRvIGJlIGluc2VydGVkIGlzIG5vdCBhIGNoaWxkIG9mIHRoaXMgbm9kZS4iKTt9aWYoYj09PWEpcmV0dXJuIGE7cWQodGhpcyxhKTt2YXIgZD1bXSxlPShjPXJkKHRoaXMpKT9jLmhvc3QubG9jYWxOYW1lOmhkKHRoaXMpLGY9YS5fX3NoYWR5X3BhcmVudE5vZGU7aWYoZil7dmFyIGc9aGQoYSk7dmFyIGg9ISFjfHwhcmQoYSl8fGtkJiZ2b2lkIDAhPT10aGlzLl9fbm9JbnNlcnRpb25Qb2ludDtmLl9fc2hhZHlfcmVtb3ZlQ2hpbGQoYSxoKX1mPSEwO3ZhciBrPSgha2R8fHZvaWQgMD09PWEuX19ub0luc2VydGlvblBvaW50JiZ2b2lkIDA9PT0KdGhpcy5fX25vSW5zZXJ0aW9uUG9pbnQpJiYhZ2QoYSxlKSxsPWMmJiFhLl9fbm9JbnNlcnRpb25Qb2ludCYmKCFrZHx8YS5ub2RlVHlwZT09PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSk7aWYobHx8aylrJiYoZz1nfHxoZChhKSksaWQoYSxmdW5jdGlvbihtKXtsJiYic2xvdCI9PT1tLmxvY2FsTmFtZSYmZC5wdXNoKG0pO2lmKGspe3ZhciBxPWc7ZGQoKSYmKHEmJmZkKG0scSksKHE9ZGQoKSkmJnEuc2NvcGVOb2RlKG0sZSkpfX0pO2QubGVuZ3RoJiYoc2QoYyksYy5jLnB1c2guYXBwbHkoYy5jLGQgaW5zdGFuY2VvZiBBcnJheT9kOm5hKG1hKGQpKSksdGQoYykpO3ZiKHRoaXMpJiYodWQoYSx0aGlzLGIpLGg9RCh0aGlzKSxoLnJvb3Q/KGY9ITEsd2IodGhpcykmJnRkKGgucm9vdCkpOmMmJiJzbG90Ij09PXRoaXMubG9jYWxOYW1lJiYoZj0hMSx0ZChjKSkpO2Y/KGM9Tih0aGlzKT90aGlzLmhvc3Q6dGhpcyxiPyhiPXBkKGIpLGMuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGEsCmIpKTpjLl9fc2hhZHlfbmF0aXZlX2FwcGVuZENoaWxkKGEpKTphLm93bmVyRG9jdW1lbnQhPT10aGlzLm93bmVyRG9jdW1lbnQmJnRoaXMub3duZXJEb2N1bWVudC5hZG9wdE5vZGUoYSk7cmV0dXJuIGF9LGFwcGVuZENoaWxkOmZ1bmN0aW9uKGEpe2lmKHRoaXMhPWF8fCFOKGEpKXJldHVybiB0aGlzLl9fc2hhZHlfaW5zZXJ0QmVmb3JlKGEpfSxyZW1vdmVDaGlsZDpmdW5jdGlvbihhLGIpe2I9dm9pZCAwPT09Yj8hMTpiO2lmKHRoaXMub3duZXJEb2N1bWVudCE9PWpkKXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGEpO2lmKGEuX19zaGFkeV9wYXJlbnROb2RlIT09dGhpcyl0aHJvdyBFcnJvcigiVGhlIG5vZGUgdG8gYmUgcmVtb3ZlZCBpcyBub3QgYSBjaGlsZCBvZiB0aGlzIG5vZGU6ICIrYSk7cWQodGhpcyxudWxsLGEpO3ZhciBjPXJkKGEpLGQ9YyYmdmQoYyxhKSxlPUQodGhpcyk7aWYodmIodGhpcykmJih3ZChhLHRoaXMpLHdiKHRoaXMpKSl7dGQoZS5yb290KTsKdmFyIGY9ITB9aWYoZGQoKSYmIWImJmMmJmEubm9kZVR5cGUhPT1Ob2RlLlRFWFRfTk9ERSl7dmFyIGc9aGQoYSk7aWQoYSxmdW5jdGlvbihoKXtmZChoLGcpfSl9b2QoYSk7YyYmKChiPSJzbG90Ij09PXRoaXMubG9jYWxOYW1lKSYmKGY9ITApLChkfHxiKSYmdGQoYykpO2Z8fChmPU4odGhpcyk/dGhpcy5ob3N0OnRoaXMsKCFlLnJvb3QmJiJzbG90IiE9PWEubG9jYWxOYW1lfHxmPT09YS5fX3NoYWR5X25hdGl2ZV9wYXJlbnROb2RlKSYmZi5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChhKSk7cmV0dXJuIGF9LHJlcGxhY2VDaGlsZDpmdW5jdGlvbihhLGIpe3RoaXMuX19zaGFkeV9pbnNlcnRCZWZvcmUoYSxiKTt0aGlzLl9fc2hhZHlfcmVtb3ZlQ2hpbGQoYik7cmV0dXJuIGF9LGNsb25lTm9kZTpmdW5jdGlvbihhKXtpZigidGVtcGxhdGUiPT10aGlzLmxvY2FsTmFtZSlyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9jbG9uZU5vZGUoYSk7dmFyIGI9dGhpcy5fX3NoYWR5X25hdGl2ZV9jbG9uZU5vZGUoITEpOwppZihhJiZiLm5vZGVUeXBlIT09Tm9kZS5BVFRSSUJVVEVfTk9ERSl7YT10aGlzLl9fc2hhZHlfZmlyc3RDaGlsZDtmb3IodmFyIGM7YTthPWEuX19zaGFkeV9uZXh0U2libGluZyljPWEuX19zaGFkeV9jbG9uZU5vZGUoITApLGIuX19zaGFkeV9hcHBlbmRDaGlsZChjKX1yZXR1cm4gYn0sZ2V0Um9vdE5vZGU6ZnVuY3Rpb24oYSl7aWYodGhpcyYmdGhpcy5ub2RlVHlwZSl7dmFyIGI9QSh0aGlzKSxjPWIubGE7dm9pZCAwPT09YyYmKE4odGhpcyk/KGM9dGhpcyxiLmxhPWMpOihjPShjPXRoaXMuX19zaGFkeV9wYXJlbnROb2RlKT9jLl9fc2hhZHlfZ2V0Um9vdE5vZGUoYSk6dGhpcyxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuX19zaGFkeV9uYXRpdmVfY29udGFpbnModGhpcykmJihiLmxhPWMpKSk7cmV0dXJuIGN9fSxjb250YWluczpmdW5jdGlvbihhKXtyZXR1cm4gRmIodGhpcyxhKX19KTt2YXIgemQ9UCh7Z2V0IGFzc2lnbmVkU2xvdCgpe3ZhciBhPXRoaXMuX19zaGFkeV9wYXJlbnROb2RlOyhhPWEmJmEuX19zaGFkeV9zaGFkb3dSb290KSYmeWQoYSk7cmV0dXJuKGE9RCh0aGlzKSkmJmEuYXNzaWduZWRTbG90fHxudWxsfX0pO2Z1bmN0aW9uIEFkKGEsYixjKXt2YXIgZD1bXTtDZChhLGIsYyxkKTtyZXR1cm4gZH1mdW5jdGlvbiBDZChhLGIsYyxkKXtmb3IoYT1hLl9fc2hhZHlfZmlyc3RDaGlsZDthO2E9YS5fX3NoYWR5X25leHRTaWJsaW5nKXt2YXIgZTtpZihlPWEubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSl7ZT1hO3ZhciBmPWIsZz1jLGg9ZCxrPWYoZSk7ayYmaC5wdXNoKGUpO2cmJmcoayk/ZT1rOihDZChlLGYsZyxoKSxlPXZvaWQgMCl9aWYoZSlicmVha319CnZhciBEZD1QKHtnZXQgZmlyc3RFbGVtZW50Q2hpbGQoKXt2YXIgYT1EKHRoaXMpO2lmKGEmJnZvaWQgMCE9PWEuZmlyc3RDaGlsZCl7Zm9yKGE9dGhpcy5fX3NoYWR5X2ZpcnN0Q2hpbGQ7YSYmYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFOylhPWEuX19zaGFkeV9uZXh0U2libGluZztyZXR1cm4gYX1yZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9maXJzdEVsZW1lbnRDaGlsZH0sZ2V0IGxhc3RFbGVtZW50Q2hpbGQoKXt2YXIgYT1EKHRoaXMpO2lmKGEmJnZvaWQgMCE9PWEubGFzdENoaWxkKXtmb3IoYT10aGlzLl9fc2hhZHlfbGFzdENoaWxkO2EmJmEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERTspYT1hLl9fc2hhZHlfcHJldmlvdXNTaWJsaW5nO3JldHVybiBhfXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX2xhc3RFbGVtZW50Q2hpbGR9LGdldCBjaGlsZHJlbigpe3JldHVybiB2Yih0aGlzKT9HYihBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoSWIodGhpcyksCmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREV9KSk6dGhpcy5fX3NoYWR5X25hdGl2ZV9jaGlsZHJlbn0sZ2V0IGNoaWxkRWxlbWVudENvdW50KCl7dmFyIGE9dGhpcy5fX3NoYWR5X2NoaWxkcmVuO3JldHVybiBhP2EubGVuZ3RoOjB9fSksRWQ9UCh7cXVlcnlTZWxlY3RvcjpmdW5jdGlvbihhKXtyZXR1cm4gQWQodGhpcyxmdW5jdGlvbihiKXtyZXR1cm4gemIuY2FsbChiLGEpfSxmdW5jdGlvbihiKXtyZXR1cm4hIWJ9KVswXXx8bnVsbH0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbihhLGIpe2lmKGIpe2I9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fX3NoYWR5X25hdGl2ZV9xdWVyeVNlbGVjdG9yQWxsKGEpKTt2YXIgYz10aGlzLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKTtyZXR1cm4gR2IoYi5maWx0ZXIoZnVuY3Rpb24oZCl7cmV0dXJuIGQuX19zaGFkeV9nZXRSb290Tm9kZSgpPT1jfSkpfXJldHVybiBHYihBZCh0aGlzLGZ1bmN0aW9uKGQpe3JldHVybiB6Yi5jYWxsKGQsCmEpfSkpfX0pLEZkPUwuYWEmJiFMLkQ/TGIoe30sRGQpOkRkO0xiKERkLEVkKTt2YXIgR2Q9d2luZG93LmRvY3VtZW50O2Z1bmN0aW9uIEhkKGEsYil7aWYoInNsb3QiPT09YilhPWEuX19zaGFkeV9wYXJlbnROb2RlLHdiKGEpJiZ0ZChEKGEpLnJvb3QpO2Vsc2UgaWYoInNsb3QiPT09YS5sb2NhbE5hbWUmJiJuYW1lIj09PWImJihiPXJkKGEpKSl7aWYoYi5hKXtJZChiKTt2YXIgYz1hLkxhLGQ9SmQoYSk7aWYoZCE9PWMpe2M9Yi5iW2NdO3ZhciBlPWMuaW5kZXhPZihhKTswPD1lJiZjLnNwbGljZShlLDEpO2M9Yi5iW2RdfHwoYi5iW2RdPVtdKTtjLnB1c2goYSk7MTxjLmxlbmd0aCYmKGIuYltkXT1LZChjKSl9fXRkKGIpfX0KdmFyIExkPVAoe2dldCBwcmV2aW91c0VsZW1lbnRTaWJsaW5nKCl7dmFyIGE9RCh0aGlzKTtpZihhJiZ2b2lkIDAhPT1hLnByZXZpb3VzU2libGluZyl7Zm9yKGE9dGhpcy5fX3NoYWR5X3ByZXZpb3VzU2libGluZzthJiZhLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREU7KWE9YS5fX3NoYWR5X3ByZXZpb3VzU2libGluZztyZXR1cm4gYX1yZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9wcmV2aW91c0VsZW1lbnRTaWJsaW5nfSxnZXQgbmV4dEVsZW1lbnRTaWJsaW5nKCl7dmFyIGE9RCh0aGlzKTtpZihhJiZ2b2lkIDAhPT1hLm5leHRTaWJsaW5nKXtmb3IoYT10aGlzLl9fc2hhZHlfbmV4dFNpYmxpbmc7YSYmYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFOylhPWEuX19zaGFkeV9uZXh0U2libGluZztyZXR1cm4gYX1yZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9uZXh0RWxlbWVudFNpYmxpbmd9LGdldCBzbG90KCl7cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCJzbG90Iil9LApzZXQgc2xvdChhKXt0aGlzLl9fc2hhZHlfc2V0QXR0cmlidXRlKCJzbG90IixhKX0sZ2V0IGNsYXNzTmFtZSgpe3JldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiJ9LHNldCBjbGFzc05hbWUoYSl7dGhpcy5fX3NoYWR5X3NldEF0dHJpYnV0ZSgiY2xhc3MiLGEpfSxzZXRBdHRyaWJ1dGU6ZnVuY3Rpb24oYSxiKXt0aGlzLm93bmVyRG9jdW1lbnQhPT1HZD90aGlzLl9fc2hhZHlfbmF0aXZlX3NldEF0dHJpYnV0ZShhLGIpOmVkKHRoaXMsYSxiKXx8KHRoaXMuX19zaGFkeV9uYXRpdmVfc2V0QXR0cmlidXRlKGEsYiksSGQodGhpcyxhKSl9LHJlbW92ZUF0dHJpYnV0ZTpmdW5jdGlvbihhKXt0aGlzLm93bmVyRG9jdW1lbnQhPT1HZD90aGlzLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUF0dHJpYnV0ZShhKTplZCh0aGlzLGEsIiIpPyIiPT09dGhpcy5nZXRBdHRyaWJ1dGUoYSkmJnRoaXMuX19zaGFkeV9uYXRpdmVfcmVtb3ZlQXR0cmlidXRlKGEpOih0aGlzLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUF0dHJpYnV0ZShhKSwKSGQodGhpcyxhKSl9fSk7TC5hYXx8V2MuZm9yRWFjaChmdW5jdGlvbihhKXtMZFthXT1ZYyhhKX0pOwp2YXIgUWQ9UCh7YXR0YWNoU2hhZG93OmZ1bmN0aW9uKGEpe2lmKCF0aGlzKXRocm93IEVycm9yKCJNdXN0IHByb3ZpZGUgYSBob3N0LiIpO2lmKCFhKXRocm93IEVycm9yKCJOb3QgZW5vdWdoIGFyZ3VtZW50cy4iKTtpZihhLnNoYWR5VXBncmFkZUZyYWdtZW50JiYhTC5JYSl7dmFyIGI9YS5zaGFkeVVwZ3JhZGVGcmFnbWVudDtiLl9fcHJvdG9fXz1TaGFkb3dSb290LnByb3RvdHlwZTtNZChiLHRoaXMsYSk7TmQoYixiKTthPWIuX19ub0luc2VydGlvblBvaW50P251bGw6Yi5xdWVyeVNlbGVjdG9yQWxsKCJzbG90Iik7Yi5fX25vSW5zZXJ0aW9uUG9pbnQ9dm9pZCAwO2lmKGEmJmEubGVuZ3RoKXt2YXIgYz1iO3NkKGMpO2MuYy5wdXNoLmFwcGx5KGMuYyxhIGluc3RhbmNlb2YgQXJyYXk/YTpuYShtYShhKSkpO3RkKGIpfWIuaG9zdC5fX3NoYWR5X25hdGl2ZV9hcHBlbmRDaGlsZChiKX1lbHNlIGI9bmV3IE9kKFBkLHRoaXMsYSk7cmV0dXJuIHRoaXMuX19DRV9zaGFkb3dSb290PWJ9LApnZXQgc2hhZG93Um9vdCgpe3ZhciBhPUQodGhpcyk7cmV0dXJuIGEmJmEuYmJ8fG51bGx9fSk7TGIoTGQsUWQpO3ZhciBSZD1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoImluZXJ0IiksU2Q9UCh7Z2V0IGlubmVySFRNTCgpe3JldHVybiB2Yih0aGlzKT9hYygidGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWU/dGhpcy5jb250ZW50OnRoaXMsSWIpOnRoaXMuX19zaGFkeV9uYXRpdmVfaW5uZXJIVE1MfSxzZXQgaW5uZXJIVE1MKGEpe2lmKCJ0ZW1wbGF0ZSI9PT10aGlzLmxvY2FsTmFtZSl0aGlzLl9fc2hhZHlfbmF0aXZlX2lubmVySFRNTD1hO2Vsc2V7bmQodGhpcyk7dmFyIGI9dGhpcy5sb2NhbE5hbWV8fCJkaXYiO2I9dGhpcy5uYW1lc3BhY2VVUkkmJnRoaXMubmFtZXNwYWNlVVJJIT09UmQubmFtZXNwYWNlVVJJP1JkLmNyZWF0ZUVsZW1lbnROUyh0aGlzLm5hbWVzcGFjZVVSSSxiKTpSZC5jcmVhdGVFbGVtZW50KGIpO2ZvcihMLkI/Yi5fX3NoYWR5X25hdGl2ZV9pbm5lckhUTUw9YTpiLmlubmVySFRNTD1hO2E9Yi5fX3NoYWR5X2ZpcnN0Q2hpbGQ7KXRoaXMuX19zaGFkeV9pbnNlcnRCZWZvcmUoYSl9fX0pO3ZhciBUZD1QKHtibHVyOmZ1bmN0aW9uKCl7dmFyIGE9RCh0aGlzKTsoYT0oYT1hJiZhLnJvb3QpJiZhLmFjdGl2ZUVsZW1lbnQpP2EuX19zaGFkeV9ibHVyKCk6dGhpcy5fX3NoYWR5X25hdGl2ZV9ibHVyKCl9fSk7TC5hYXx8WGMuZm9yRWFjaChmdW5jdGlvbihhKXtUZFthXT1ZYyhhKX0pO3ZhciBVZD1QKHthc3NpZ25lZE5vZGVzOmZ1bmN0aW9uKGEpe2lmKCJzbG90Ij09PXRoaXMubG9jYWxOYW1lKXt2YXIgYj10aGlzLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKTtiJiZOKGIpJiZ5ZChiKTtyZXR1cm4oYj1EKHRoaXMpKT8oYSYmYS5mbGF0dGVuP2IuVjpiLmFzc2lnbmVkTm9kZXMpfHxbXTpbXX19LGFkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiLGMpe2lmKCJzbG90IiE9PXRoaXMubG9jYWxOYW1lfHwic2xvdGNoYW5nZSI9PT1hKU9jLmNhbGwodGhpcyxhLGIsYyk7ZWxzZXsib2JqZWN0IiE9PXR5cGVvZiBjJiYoYz17Y2FwdHVyZTohIWN9KTt2YXIgZD10aGlzLl9fc2hhZHlfcGFyZW50Tm9kZTtpZighZCl0aHJvdyBFcnJvcigiU2hhZHlET00gY2Fubm90IGF0dGFjaCBldmVudCB0byBzbG90IHVubGVzcyBpdCBoYXMgYSBgcGFyZW50Tm9kZWAiKTtjLk89dGhpcztkLl9fc2hhZHlfYWRkRXZlbnRMaXN0ZW5lcihhLGIsYyl9fSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsCmIsYyl7aWYoInNsb3QiIT09dGhpcy5sb2NhbE5hbWV8fCJzbG90Y2hhbmdlIj09PWEpUGMuY2FsbCh0aGlzLGEsYixjKTtlbHNleyJvYmplY3QiIT09dHlwZW9mIGMmJihjPXtjYXB0dXJlOiEhY30pO3ZhciBkPXRoaXMuX19zaGFkeV9wYXJlbnROb2RlO2lmKCFkKXRocm93IEVycm9yKCJTaGFkeURPTSBjYW5ub3QgYXR0YWNoIGV2ZW50IHRvIHNsb3QgdW5sZXNzIGl0IGhhcyBhIGBwYXJlbnROb2RlYCIpO2MuTz10aGlzO2QuX19zaGFkeV9yZW1vdmVFdmVudExpc3RlbmVyKGEsYixjKX19fSk7dmFyIFZkPVAoe2dldEVsZW1lbnRCeUlkOmZ1bmN0aW9uKGEpe3JldHVybiIiPT09YT9udWxsOkFkKHRoaXMsZnVuY3Rpb24oYil7cmV0dXJuIGIuaWQ9PWF9LGZ1bmN0aW9uKGIpe3JldHVybiEhYn0pWzBdfHxudWxsfX0pO3ZhciBXZD1QKHtnZXQgYWN0aXZlRWxlbWVudCgpe3ZhciBhPUwuQj9kb2N1bWVudC5fX3NoYWR5X25hdGl2ZV9hY3RpdmVFbGVtZW50OmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7aWYoIWF8fCFhLm5vZGVUeXBlKXJldHVybiBudWxsO3ZhciBiPSEhTih0aGlzKTtpZighKHRoaXM9PT1kb2N1bWVudHx8YiYmdGhpcy5ob3N0IT09YSYmdGhpcy5ob3N0Ll9fc2hhZHlfbmF0aXZlX2NvbnRhaW5zKGEpKSlyZXR1cm4gbnVsbDtmb3IoYj1yZChhKTtiJiZiIT09dGhpczspYT1iLmhvc3QsYj1yZChhKTtyZXR1cm4gdGhpcz09PWRvY3VtZW50P2I/bnVsbDphOmI9PT10aGlzP2E6bnVsbH19KTt2YXIgWGQ9d2luZG93LmRvY3VtZW50LFlkPVAoe2ltcG9ydE5vZGU6ZnVuY3Rpb24oYSxiKXtpZihhLm93bmVyRG9jdW1lbnQhPT1YZHx8InRlbXBsYXRlIj09PWEubG9jYWxOYW1lKXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX2ltcG9ydE5vZGUoYSxiKTt2YXIgYz10aGlzLl9fc2hhZHlfbmF0aXZlX2ltcG9ydE5vZGUoYSwhMSk7aWYoYilmb3IoYT1hLl9fc2hhZHlfZmlyc3RDaGlsZDthO2E9YS5fX3NoYWR5X25leHRTaWJsaW5nKWI9dGhpcy5fX3NoYWR5X2ltcG9ydE5vZGUoYSwhMCksYy5fX3NoYWR5X2FwcGVuZENoaWxkKGIpO3JldHVybiBjfX0pO3ZhciBaZD1QKHtkaXNwYXRjaEV2ZW50Ok1jLGFkZEV2ZW50TGlzdGVuZXI6T2MuYmluZCh3aW5kb3cpLHJlbW92ZUV2ZW50TGlzdGVuZXI6UGMuYmluZCh3aW5kb3cpfSk7dmFyICRkPXt9O09iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSFRNTEVsZW1lbnQucHJvdG90eXBlLCJwYXJlbnRFbGVtZW50IikmJigkZC5wYXJlbnRFbGVtZW50PXhkLnBhcmVudEVsZW1lbnQpO09iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSFRNTEVsZW1lbnQucHJvdG90eXBlLCJjb250YWlucyIpJiYoJGQuY29udGFpbnM9eGQuY29udGFpbnMpO09iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSFRNTEVsZW1lbnQucHJvdG90eXBlLCJjaGlsZHJlbiIpJiYoJGQuY2hpbGRyZW49RGQuY2hpbGRyZW4pO09iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiKSYmKCRkLmlubmVySFRNTD1TZC5pbm5lckhUTUwpO09iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSFRNTEVsZW1lbnQucHJvdG90eXBlLCJjbGFzc05hbWUiKSYmKCRkLmNsYXNzTmFtZT1MZC5jbGFzc05hbWUpOwp2YXIgYWU9e0V2ZW50VGFyZ2V0OltiZF0sTm9kZTpbeGQsd2luZG93LkV2ZW50VGFyZ2V0P251bGw6YmRdLFRleHQ6W3pkXSxDb21tZW50Olt6ZF0sQ0RBVEFTZWN0aW9uOlt6ZF0sUHJvY2Vzc2luZ0luc3RydWN0aW9uOlt6ZF0sRWxlbWVudDpbTGQsRGQsemQsIUwuQnx8ImlubmVySFRNTCJpbiBFbGVtZW50LnByb3RvdHlwZT9TZDpudWxsLHdpbmRvdy5IVE1MU2xvdEVsZW1lbnQ/bnVsbDpVZF0sSFRNTEVsZW1lbnQ6W1RkLCRkXSxIVE1MU2xvdEVsZW1lbnQ6W1VkXSxEb2N1bWVudEZyYWdtZW50OltGZCxWZF0sRG9jdW1lbnQ6W1lkLEZkLFZkLFdkXSxXaW5kb3c6W1pkXX0sYmU9TC5CP251bGw6WyJpbm5lckhUTUwiLCJ0ZXh0Q29udGVudCJdO2Z1bmN0aW9uIGNlKGEsYixjLGQpe2IuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gYSYmZSYmTyhhLGUsYyxkKX0pfQpmdW5jdGlvbiBkZShhKXt2YXIgYj1hP251bGw6YmUsYztmb3IoYyBpbiBhZSljZSh3aW5kb3dbY10mJndpbmRvd1tjXS5wcm90b3R5cGUsYWVbY10sYSxiKX1bIlRleHQiLCJDb21tZW50IiwiQ0RBVEFTZWN0aW9uIiwiUHJvY2Vzc2luZ0luc3RydWN0aW9uIl0uZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj13aW5kb3dbYV0sYz1PYmplY3QuY3JlYXRlKGIucHJvdG90eXBlKTtjLl9fc2hhZHlfcHJvdG9Jc1BhdGNoZWQ9ITA7Y2UoYyxhZS5FdmVudFRhcmdldCk7Y2UoYyxhZS5Ob2RlKTthZVthXSYmY2UoYyxhZVthXSk7Yi5wcm90b3R5cGUuX19zaGFkeV9wYXRjaGVkUHJvdG89Y30pO2Z1bmN0aW9uIGVlKGEpe2EuX19zaGFkeV9wcm90b0lzUGF0Y2hlZD0hMDtjZShhLGFlLkV2ZW50VGFyZ2V0KTtjZShhLGFlLk5vZGUpO2NlKGEsYWUuRWxlbWVudCk7Y2UoYSxhZS5IVE1MRWxlbWVudCk7Y2UoYSxhZS5IVE1MU2xvdEVsZW1lbnQpO3JldHVybiBhfTt2YXIgZmU9TC51YSxnZT1MLkI7ZnVuY3Rpb24gaGUoYSxiKXtpZihmZSYmIWEuX19zaGFkeV9wcm90b0lzUGF0Y2hlZCYmIU4oYSkpe3ZhciBjPU9iamVjdC5nZXRQcm90b3R5cGVPZihhKSxkPWMuaGFzT3duUHJvcGVydHkoIl9fc2hhZHlfcGF0Y2hlZFByb3RvIikmJmMuX19zaGFkeV9wYXRjaGVkUHJvdG87ZHx8KGQ9T2JqZWN0LmNyZWF0ZShjKSxlZShkKSxjLl9fc2hhZHlfcGF0Y2hlZFByb3RvPWQpO09iamVjdC5zZXRQcm90b3R5cGVPZihhLGQpfWdlfHwoMT09PWI/dWMoYSk6Mj09PWImJnZjKGEpKX0KZnVuY3Rpb24gaWUoYSxiLGMsZCl7aGUoYSwxKTtkPWR8fG51bGw7dmFyIGU9QShhKSxmPWQ/QShkKTpudWxsO2UucHJldmlvdXNTaWJsaW5nPWQ/Zi5wcmV2aW91c1NpYmxpbmc6Yi5fX3NoYWR5X2xhc3RDaGlsZDtpZihmPUQoZS5wcmV2aW91c1NpYmxpbmcpKWYubmV4dFNpYmxpbmc9YTtpZihmPUQoZS5uZXh0U2libGluZz1kKSlmLnByZXZpb3VzU2libGluZz1hO2UucGFyZW50Tm9kZT1iO2Q/ZD09PWMuZmlyc3RDaGlsZCYmKGMuZmlyc3RDaGlsZD1hKTooYy5sYXN0Q2hpbGQ9YSxjLmZpcnN0Q2hpbGR8fChjLmZpcnN0Q2hpbGQ9YSkpO2MuY2hpbGROb2Rlcz1udWxsfQpmdW5jdGlvbiB1ZChhLGIsYyl7aGUoYiwyKTt2YXIgZD1BKGIpO3ZvaWQgMCE9PWQuZmlyc3RDaGlsZCYmKGQuY2hpbGROb2Rlcz1udWxsKTtpZihhLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFKWZvcihhPWEuX19zaGFkeV9uYXRpdmVfZmlyc3RDaGlsZDthO2E9YS5fX3NoYWR5X25hdGl2ZV9uZXh0U2libGluZylpZShhLGIsZCxjKTtlbHNlIGllKGEsYixkLGMpfQpmdW5jdGlvbiB3ZChhLGIpe3ZhciBjPUEoYSk7Yj1BKGIpO2E9PT1iLmZpcnN0Q2hpbGQmJihiLmZpcnN0Q2hpbGQ9Yy5uZXh0U2libGluZyk7YT09PWIubGFzdENoaWxkJiYoYi5sYXN0Q2hpbGQ9Yy5wcmV2aW91c1NpYmxpbmcpO2E9Yy5wcmV2aW91c1NpYmxpbmc7dmFyIGQ9Yy5uZXh0U2libGluZzthJiYoQShhKS5uZXh0U2libGluZz1kKTtkJiYoQShkKS5wcmV2aW91c1NpYmxpbmc9YSk7Yy5wYXJlbnROb2RlPWMucHJldmlvdXNTaWJsaW5nPWMubmV4dFNpYmxpbmc9dm9pZCAwO3ZvaWQgMCE9PWIuY2hpbGROb2RlcyYmKGIuY2hpbGROb2Rlcz1udWxsKX0KZnVuY3Rpb24gTmQoYSxiKXt2YXIgYz1BKGEpO2lmKGJ8fHZvaWQgMD09PWMuZmlyc3RDaGlsZCl7Yy5jaGlsZE5vZGVzPW51bGw7dmFyIGQ9Yy5maXJzdENoaWxkPWEuX19zaGFkeV9uYXRpdmVfZmlyc3RDaGlsZDtjLmxhc3RDaGlsZD1hLl9fc2hhZHlfbmF0aXZlX2xhc3RDaGlsZDtoZShhLDIpO2M9ZDtmb3IoZD12b2lkIDA7YztjPWMuX19zaGFkeV9uYXRpdmVfbmV4dFNpYmxpbmcpe3ZhciBlPUEoYyk7ZS5wYXJlbnROb2RlPWJ8fGE7ZS5uZXh0U2libGluZz1jLl9fc2hhZHlfbmF0aXZlX25leHRTaWJsaW5nO2UucHJldmlvdXNTaWJsaW5nPWR8fG51bGw7ZD1jO2hlKGMsMSl9fX07dmFyIGplPVAoe2FkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiLGMpeyJvYmplY3QiIT09dHlwZW9mIGMmJihjPXtjYXB0dXJlOiEhY30pO2MuTz1jLk98fHRoaXM7dGhpcy5ob3N0Ll9fc2hhZHlfYWRkRXZlbnRMaXN0ZW5lcihhLGIsYyl9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiLGMpeyJvYmplY3QiIT09dHlwZW9mIGMmJihjPXtjYXB0dXJlOiEhY30pO2MuTz1jLk98fHRoaXM7dGhpcy5ob3N0Ll9fc2hhZHlfcmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGIsYyl9fSk7ZnVuY3Rpb24ga2UoYSxiKXtPKGEsamUsYik7TyhhLFdkLGIpO08oYSxTZCxiKTtPKGEsRGQsYik7TC5EJiYhYj8oTyhhLHhkLGIpLE8oYSxWZCxiKSk6TC5CfHwoTyhhLHJjKSxPKGEscGMpLE8oYSxxYykpfTt2YXIgUGQ9e30sbGU9TC5kZWZlckNvbm5lY3Rpb25DYWxsYmFja3MmJiJsb2FkaW5nIj09PWRvY3VtZW50LnJlYWR5U3RhdGUsbWU7ZnVuY3Rpb24gbmUoYSl7dmFyIGI9W107ZG8gYi51bnNoaWZ0KGEpO3doaWxlKGE9YS5fX3NoYWR5X3BhcmVudE5vZGUpO3JldHVybiBifWZ1bmN0aW9uIE9kKGEsYixjKXtpZihhIT09UGQpdGhyb3cgbmV3IFR5cGVFcnJvcigiSWxsZWdhbCBjb25zdHJ1Y3RvciIpO3RoaXMuYT1udWxsO01kKHRoaXMsYixjKX0KZnVuY3Rpb24gTWQoYSxiLGMpe2EuaG9zdD1iO2EubW9kZT1jJiZjLm1vZGU7TmQoYS5ob3N0KTtiPUEoYS5ob3N0KTtiLnJvb3Q9YTtiLmJiPSJjbG9zZWQiIT09YS5tb2RlP2E6bnVsbDtiPUEoYSk7Yi5maXJzdENoaWxkPWIubGFzdENoaWxkPWIucGFyZW50Tm9kZT1iLm5leHRTaWJsaW5nPWIucHJldmlvdXNTaWJsaW5nPW51bGw7aWYoTC5wcmVmZXJQZXJmb3JtYW5jZSlmb3IoO2I9YS5ob3N0Ll9fc2hhZHlfbmF0aXZlX2ZpcnN0Q2hpbGQ7KWEuaG9zdC5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChiKTtlbHNlIHRkKGEpfWZ1bmN0aW9uIHRkKGEpe2EuVHx8KGEuVD0hMCxPYihmdW5jdGlvbigpe3JldHVybiB5ZChhKX0pKX0KZnVuY3Rpb24geWQoYSl7dmFyIGI7aWYoYj1hLlQpe2Zvcih2YXIgYzthOylhOnthLlQmJihjPWEpLGI9YTthPWIuaG9zdC5fX3NoYWR5X2dldFJvb3ROb2RlKCk7aWYoTihhKSYmKGI9RChiLmhvc3QpKSYmMDxiLmRhKWJyZWFrIGE7YT12b2lkIDB9Yj1jfShjPWIpJiZjLl9yZW5kZXJTZWxmKCl9Ck9kLnByb3RvdHlwZS5fcmVuZGVyU2VsZj1mdW5jdGlvbigpe3ZhciBhPWxlO2xlPSEwO3RoaXMuVD0hMTtpZih0aGlzLmEpe0lkKHRoaXMpO2Zvcih2YXIgYj0wLGM7Yjx0aGlzLmEubGVuZ3RoO2IrKyl7Yz10aGlzLmFbYl07dmFyIGQ9RChjKSxlPWQuYXNzaWduZWROb2RlcztkLmFzc2lnbmVkTm9kZXM9W107ZC5WPVtdO2lmKGQuQmE9ZSlmb3IoZD0wO2Q8ZS5sZW5ndGg7ZCsrKXt2YXIgZj1EKGVbZF0pO2Yub2E9Zi5hc3NpZ25lZFNsb3Q7Zi5hc3NpZ25lZFNsb3Q9PT1jJiYoZi5hc3NpZ25lZFNsb3Q9bnVsbCl9fWZvcihiPXRoaXMuaG9zdC5fX3NoYWR5X2ZpcnN0Q2hpbGQ7YjtiPWIuX19zaGFkeV9uZXh0U2libGluZylvZSh0aGlzLGIpO2ZvcihiPTA7Yjx0aGlzLmEubGVuZ3RoO2IrKyl7Yz10aGlzLmFbYl07ZT1EKGMpO2lmKCFlLmFzc2lnbmVkTm9kZXMubGVuZ3RoKWZvcihkPWMuX19zaGFkeV9maXJzdENoaWxkO2Q7ZD1kLl9fc2hhZHlfbmV4dFNpYmxpbmcpb2UodGhpcywKZCxjKTsoZD0oZD1EKGMuX19zaGFkeV9wYXJlbnROb2RlKSkmJmQucm9vdCkmJih4YihkKXx8ZC5UKSYmZC5fcmVuZGVyU2VsZigpO3BlKHRoaXMsZS5WLGUuYXNzaWduZWROb2Rlcyk7aWYoZD1lLkJhKXtmb3IoZj0wO2Y8ZC5sZW5ndGg7ZisrKUQoZFtmXSkub2E9bnVsbDtlLkJhPW51bGw7ZC5sZW5ndGg+ZS5hc3NpZ25lZE5vZGVzLmxlbmd0aCYmKGUucmE9ITApfWUucmEmJihlLnJhPSExLHFlKHRoaXMsYykpfWM9dGhpcy5hO2I9W107Zm9yKGU9MDtlPGMubGVuZ3RoO2UrKylkPWNbZV0uX19zaGFkeV9wYXJlbnROb2RlLChmPUQoZCkpJiZmLnJvb3R8fCEoMD5iLmluZGV4T2YoZCkpfHxiLnB1c2goZCk7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyl7Zj1iW2NdO2U9Zj09PXRoaXM/dGhpcy5ob3N0OmY7ZD1bXTtmb3IoZj1mLl9fc2hhZHlfZmlyc3RDaGlsZDtmO2Y9Zi5fX3NoYWR5X25leHRTaWJsaW5nKWlmKCJzbG90Ij09Zi5sb2NhbE5hbWUpZm9yKHZhciBnPUQoZikuVixoPTA7aDwKZy5sZW5ndGg7aCsrKWQucHVzaChnW2hdKTtlbHNlIGQucHVzaChmKTtmPUhiKGUpO2c9JGMoZCxkLmxlbmd0aCxmLGYubGVuZ3RoKTtmb3IodmFyIGs9aD0wLGw9dm9pZCAwO2g8Zy5sZW5ndGgmJihsPWdbaF0pO2grKyl7Zm9yKHZhciBtPTAscT12b2lkIDA7bTxsLmJhLmxlbmd0aCYmKHE9bC5iYVttXSk7bSsrKXEuX19zaGFkeV9uYXRpdmVfcGFyZW50Tm9kZT09PWUmJmUuX19zaGFkeV9uYXRpdmVfcmVtb3ZlQ2hpbGQocSksZi5zcGxpY2UobC5pbmRleCtrLDEpO2stPWwuaWF9az0wO2ZvcihsPXZvaWQgMDtrPGcubGVuZ3RoJiYobD1nW2tdKTtrKyspZm9yKGg9ZltsLmluZGV4XSxtPWwuaW5kZXg7bTxsLmluZGV4K2wuaWE7bSsrKXE9ZFttXSxlLl9fc2hhZHlfbmF0aXZlX2luc2VydEJlZm9yZShxLGgpLGYuc3BsaWNlKG0sMCxxKX19aWYoIUwucHJlZmVyUGVyZm9ybWFuY2UmJiF0aGlzLkFhKWZvcihiPXRoaXMuaG9zdC5fX3NoYWR5X2ZpcnN0Q2hpbGQ7YjtiPWIuX19zaGFkeV9uZXh0U2libGluZyljPQpEKGIpLGIuX19zaGFkeV9uYXRpdmVfcGFyZW50Tm9kZSE9PXRoaXMuaG9zdHx8InNsb3QiIT09Yi5sb2NhbE5hbWUmJmMuYXNzaWduZWRTbG90fHx0aGlzLmhvc3QuX19zaGFkeV9uYXRpdmVfcmVtb3ZlQ2hpbGQoYik7dGhpcy5BYT0hMDtsZT1hO21lJiZtZSgpfTtmdW5jdGlvbiBvZShhLGIsYyl7dmFyIGQ9QShiKSxlPWQub2E7ZC5vYT1udWxsO2N8fChjPShhPWEuYltiLl9fc2hhZHlfc2xvdHx8Il9fY2F0Y2hhbGwiXSkmJmFbMF0pO2M/KEEoYykuYXNzaWduZWROb2Rlcy5wdXNoKGIpLGQuYXNzaWduZWRTbG90PWMpOmQuYXNzaWduZWRTbG90PXZvaWQgMDtlIT09ZC5hc3NpZ25lZFNsb3QmJmQuYXNzaWduZWRTbG90JiYoQShkLmFzc2lnbmVkU2xvdCkucmE9ITApfQpmdW5jdGlvbiBwZShhLGIsYyl7Zm9yKHZhciBkPTAsZT12b2lkIDA7ZDxjLmxlbmd0aCYmKGU9Y1tkXSk7ZCsrKWlmKCJzbG90Ij09ZS5sb2NhbE5hbWUpe3ZhciBmPUQoZSkuYXNzaWduZWROb2RlcztmJiZmLmxlbmd0aCYmcGUoYSxiLGYpfWVsc2UgYi5wdXNoKGNbZF0pfWZ1bmN0aW9uIHFlKGEsYil7Yi5fX3NoYWR5X25hdGl2ZV9kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgic2xvdGNoYW5nZSIpKTtiPUQoYik7Yi5hc3NpZ25lZFNsb3QmJnFlKGEsYi5hc3NpZ25lZFNsb3QpfWZ1bmN0aW9uIHNkKGEpe2EuYz1hLmN8fFtdO2EuYT1hLmF8fFtdO2EuYj1hLmJ8fHt9fQpmdW5jdGlvbiBJZChhKXtpZihhLmMmJmEuYy5sZW5ndGgpe2Zvcih2YXIgYj1hLmMsYyxkPTA7ZDxiLmxlbmd0aDtkKyspe3ZhciBlPWJbZF07TmQoZSk7dmFyIGY9ZS5fX3NoYWR5X3BhcmVudE5vZGU7TmQoZik7Zj1EKGYpO2YuZGE9KGYuZGF8fDApKzE7Zj1KZChlKTthLmJbZl0/KGM9Y3x8e30sY1tmXT0hMCxhLmJbZl0ucHVzaChlKSk6YS5iW2ZdPVtlXTthLmEucHVzaChlKX1pZihjKWZvcih2YXIgZyBpbiBjKWEuYltnXT1LZChhLmJbZ10pO2EuYz1bXX19ZnVuY3Rpb24gSmQoYSl7dmFyIGI9YS5uYW1lfHxhLmdldEF0dHJpYnV0ZSgibmFtZSIpfHwiX19jYXRjaGFsbCI7cmV0dXJuIGEuTGE9Yn0KZnVuY3Rpb24gS2QoYSl7cmV0dXJuIGEuc29ydChmdW5jdGlvbihiLGMpe2I9bmUoYik7Zm9yKHZhciBkPW5lKGMpLGU9MDtlPGIubGVuZ3RoO2UrKyl7Yz1iW2VdO3ZhciBmPWRbZV07aWYoYyE9PWYpcmV0dXJuIGI9SWIoYy5fX3NoYWR5X3BhcmVudE5vZGUpLGIuaW5kZXhPZihjKS1iLmluZGV4T2YoZil9fSl9CmZ1bmN0aW9uIHZkKGEsYil7aWYoYS5hKXtJZChhKTt2YXIgYz1hLmIsZDtmb3IoZCBpbiBjKWZvcih2YXIgZT1jW2RdLGY9MDtmPGUubGVuZ3RoO2YrKyl7dmFyIGc9ZVtmXTtpZihGYihiLGcpKXtlLnNwbGljZShmLDEpO3ZhciBoPWEuYS5pbmRleE9mKGcpOzA8PWgmJihhLmEuc3BsaWNlKGgsMSksKGg9RChnLl9fc2hhZHlfcGFyZW50Tm9kZSkpJiZoLmRhJiZoLmRhLS0pO2YtLTtnPUQoZyk7aWYoaD1nLlYpZm9yKHZhciBrPTA7azxoLmxlbmd0aDtrKyspe3ZhciBsPWhba10sbT1sLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGU7bSYmbS5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChsKX1nLlY9W107Zy5hc3NpZ25lZE5vZGVzPVtdO2g9ITB9fXJldHVybiBofX1mdW5jdGlvbiB4YihhKXtJZChhKTtyZXR1cm4hKCFhLmF8fCFhLmEubGVuZ3RoKX0KKGZ1bmN0aW9uKGEpe2EuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlO2tlKGEsIl9fc2hhZHlfIik7a2UoYSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYSx7bm9kZVR5cGU6e3ZhbHVlOk5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSxjb25maWd1cmFibGU6ITB9LG5vZGVOYW1lOnt2YWx1ZToiI2RvY3VtZW50LWZyYWdtZW50Iixjb25maWd1cmFibGU6ITB9LG5vZGVWYWx1ZTp7dmFsdWU6bnVsbCxjb25maWd1cmFibGU6ITB9fSk7WyJsb2NhbE5hbWUiLCJuYW1lc3BhY2VVUkkiLCJwcmVmaXgiXS5mb3JFYWNoKGZ1bmN0aW9uKGIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse3ZhbHVlOnZvaWQgMCxjb25maWd1cmFibGU6ITB9KX0pO1sib3duZXJEb2N1bWVudCIsImJhc2VVUkkiLCJpc0Nvbm5lY3RlZCJdLmZvckVhY2goZnVuY3Rpb24oYil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsYix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaG9zdFtiXX0sCmNvbmZpZ3VyYWJsZTohMH0pfSl9KShPZC5wcm90b3R5cGUpOwppZih3aW5kb3cuY3VzdG9tRWxlbWVudHMmJndpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUmJkwuc2EmJiFMLnByZWZlclBlcmZvcm1hbmNlKXt2YXIgcmU9bmV3IE1hcDttZT1mdW5jdGlvbigpe3ZhciBhPVtdO3JlLmZvckVhY2goZnVuY3Rpb24oZCxlKXthLnB1c2goW2UsZF0pfSk7cmUuY2xlYXIoKTtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXVswXTthW2JdWzFdP2MuX19zaGFkeWRvbV9jb25uZWN0ZWRDYWxsYmFjaygpOmMuX19zaGFkeWRvbV9kaXNjb25uZWN0ZWRDYWxsYmFjaygpfX07bGUmJmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGZ1bmN0aW9uKCl7bGU9ITE7bWUoKX0se29uY2U6ITB9KTt2YXIgc2U9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPTAsZT0iX19pc0Nvbm5lY3RlZCIrZCsrO2lmKGJ8fGMpYS5wcm90b3R5cGUuY29ubmVjdGVkQ2FsbGJhY2s9YS5wcm90b3R5cGUuX19zaGFkeWRvbV9jb25uZWN0ZWRDYWxsYmFjaz0KZnVuY3Rpb24oKXtsZT9yZS5zZXQodGhpcywhMCk6dGhpc1tlXXx8KHRoaXNbZV09ITAsYiYmYi5jYWxsKHRoaXMpKX0sYS5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2s9YS5wcm90b3R5cGUuX19zaGFkeWRvbV9kaXNjb25uZWN0ZWRDYWxsYmFjaz1mdW5jdGlvbigpe2xlP3RoaXMuaXNDb25uZWN0ZWR8fHJlLnNldCh0aGlzLCExKTp0aGlzW2VdJiYodGhpc1tlXT0hMSxjJiZjLmNhbGwodGhpcykpfTtyZXR1cm4gYX0sdGU9d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSx1ZT1mdW5jdGlvbihhLGIpe3ZhciBjPWIucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrLGQ9Yi5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2s7dGUuY2FsbCh3aW5kb3cuY3VzdG9tRWxlbWVudHMsYSxzZShiLGMsZCkpO2IucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrPWM7Yi5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2s9ZH07d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZT0KdWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5DdXN0b21FbGVtZW50UmVnaXN0cnkucHJvdG90eXBlLCJkZWZpbmUiLHt2YWx1ZTp1ZSxjb25maWd1cmFibGU6ITB9KX1mdW5jdGlvbiByZChhKXthPWEuX19zaGFkeV9nZXRSb290Tm9kZSgpO2lmKE4oYSkpcmV0dXJuIGF9O2Z1bmN0aW9uIHZlKGEpe3RoaXMubm9kZT1hfXc9dmUucHJvdG90eXBlO3cuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2FkZEV2ZW50TGlzdGVuZXIoYSxiLGMpfTt3LnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVFdmVudExpc3RlbmVyKGEsYixjKX07dy5hcHBlbmRDaGlsZD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYXBwZW5kQ2hpbGQoYSl9O3cuaW5zZXJ0QmVmb3JlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2luc2VydEJlZm9yZShhLGIpfTt3LnJlbW92ZUNoaWxkPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVDaGlsZChhKX07dy5yZXBsYWNlQ2hpbGQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcmVwbGFjZUNoaWxkKGEsYil9Owp3LmNsb25lTm9kZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2xvbmVOb2RlKGEpfTt3LmdldFJvb3ROb2RlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9nZXRSb290Tm9kZShhKX07dy5jb250YWlucz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY29udGFpbnMoYSl9O3cuZGlzcGF0Y2hFdmVudD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZGlzcGF0Y2hFdmVudChhKX07dy5zZXRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxiKXt0aGlzLm5vZGUuX19zaGFkeV9zZXRBdHRyaWJ1dGUoYSxiKX07dy5nZXRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X25hdGl2ZV9nZXRBdHRyaWJ1dGUoYSl9O3cuaGFzQXR0cmlidXRlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9uYXRpdmVfaGFzQXR0cmlidXRlKGEpfTt3LnJlbW92ZUF0dHJpYnV0ZT1mdW5jdGlvbihhKXt0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVBdHRyaWJ1dGUoYSl9Owp3LmF0dGFjaFNoYWRvdz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYXR0YWNoU2hhZG93KGEpfTt3LmZvY3VzPWZ1bmN0aW9uKCl7dGhpcy5ub2RlLl9fc2hhZHlfbmF0aXZlX2ZvY3VzKCl9O3cuYmx1cj1mdW5jdGlvbigpe3RoaXMubm9kZS5fX3NoYWR5X2JsdXIoKX07dy5pbXBvcnROb2RlPWZ1bmN0aW9uKGEsYil7aWYodGhpcy5ub2RlLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9OT0RFKXJldHVybiB0aGlzLm5vZGUuX19zaGFkeV9pbXBvcnROb2RlKGEsYil9O3cuZ2V0RWxlbWVudEJ5SWQ9ZnVuY3Rpb24oYSl7aWYodGhpcy5ub2RlLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9OT0RFKXJldHVybiB0aGlzLm5vZGUuX19zaGFkeV9nZXRFbGVtZW50QnlJZChhKX07dy5xdWVyeVNlbGVjdG9yPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9xdWVyeVNlbGVjdG9yKGEpfTsKdy5xdWVyeVNlbGVjdG9yQWxsPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3F1ZXJ5U2VsZWN0b3JBbGwoYSxiKX07dy5hc3NpZ25lZE5vZGVzPWZ1bmN0aW9uKGEpe2lmKCJzbG90Ij09PXRoaXMubm9kZS5sb2NhbE5hbWUpcmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2Fzc2lnbmVkTm9kZXMoYSl9OwpjYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyh2ZS5wcm90b3R5cGUse2FjdGl2ZUVsZW1lbnQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2lmKE4odGhpcy5ub2RlKXx8dGhpcy5ub2RlLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9OT0RFKXJldHVybiB0aGlzLm5vZGUuX19zaGFkeV9hY3RpdmVFbGVtZW50fX0sX2FjdGl2ZUVsZW1lbnQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFjdGl2ZUVsZW1lbnR9fSxob3N0Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtpZihOKHRoaXMubm9kZSkpcmV0dXJuIHRoaXMubm9kZS5ob3N0fX0scGFyZW50Tm9kZTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3BhcmVudE5vZGV9fSxmaXJzdENoaWxkOntjb25maWd1cmFibGU6ITAsCmVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2ZpcnN0Q2hpbGR9fSxsYXN0Q2hpbGQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9sYXN0Q2hpbGR9fSxuZXh0U2libGluZzp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X25leHRTaWJsaW5nfX0scHJldmlvdXNTaWJsaW5nOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcHJldmlvdXNTaWJsaW5nfX0sY2hpbGROb2Rlczp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2NoaWxkTm9kZXN9fSxwYXJlbnRFbGVtZW50Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCwKZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3BhcmVudEVsZW1lbnR9fSxmaXJzdEVsZW1lbnRDaGlsZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2ZpcnN0RWxlbWVudENoaWxkfX0sbGFzdEVsZW1lbnRDaGlsZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2xhc3RFbGVtZW50Q2hpbGR9fSxuZXh0RWxlbWVudFNpYmxpbmc6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9uZXh0RWxlbWVudFNpYmxpbmd9fSxwcmV2aW91c0VsZW1lbnRTaWJsaW5nOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcHJldmlvdXNFbGVtZW50U2libGluZ319LApjaGlsZHJlbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2NoaWxkcmVufX0sY2hpbGRFbGVtZW50Q291bnQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9jaGlsZEVsZW1lbnRDb3VudH19LHNoYWRvd1Jvb3Q6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9zaGFkb3dSb290fX0sYXNzaWduZWRTbG90Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYXNzaWduZWRTbG90fX0saXNDb25uZWN0ZWQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9pc0Nvbm5lY3RlZH19LGlubmVySFRNTDp7Y29uZmlndXJhYmxlOiEwLAplbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9pbm5lckhUTUx9LHNldDpmdW5jdGlvbihhKXt0aGlzLm5vZGUuX19zaGFkeV9pbm5lckhUTUw9YX19LHRleHRDb250ZW50Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfdGV4dENvbnRlbnR9LHNldDpmdW5jdGlvbihhKXt0aGlzLm5vZGUuX19zaGFkeV90ZXh0Q29udGVudD1hfX0sc2xvdDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3Nsb3R9LHNldDpmdW5jdGlvbihhKXt0aGlzLm5vZGUuX19zaGFkeV9zbG90PWF9fSxjbGFzc05hbWU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9jbGFzc05hbWV9LHNldDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2xhc3NOYW1lPQphfX19KTtmdW5jdGlvbiB3ZShhKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodmUucHJvdG90eXBlLGEse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGVbIl9fc2hhZHlfIithXX0sc2V0OmZ1bmN0aW9uKGIpe3RoaXMubm9kZVsiX19zaGFkeV8iK2FdPWJ9LGNvbmZpZ3VyYWJsZTohMH0pfVdjLmZvckVhY2goZnVuY3Rpb24oYSl7cmV0dXJuIHdlKGEpfSk7WGMuZm9yRWFjaChmdW5jdGlvbihhKXtyZXR1cm4gd2UoYSl9KTt2YXIgeGU9bmV3IFdlYWtNYXA7ZnVuY3Rpb24geWUoYSl7aWYoTihhKXx8YSBpbnN0YW5jZW9mIHZlKXJldHVybiBhO3ZhciBiPXhlLmdldChhKTtifHwoYj1uZXcgdmUoYSkseGUuc2V0KGEsYikpO3JldHVybiBifTtpZihMLnNhKXt2YXIgemU9TC5CP2Z1bmN0aW9uKGEpe3JldHVybiBhfTpmdW5jdGlvbihhKXt2YyhhKTt1YyhhKTtyZXR1cm4gYX0sU2hhZHlET009e2luVXNlOkwuc2EscGF0Y2g6emUsaXNTaGFkeVJvb3Q6TixlbnF1ZXVlOk9iLGZsdXNoOlBiLGZsdXNoSW5pdGlhbDpmdW5jdGlvbihhKXshYS5BYSYmYS5UJiZ5ZChhKX0sc2V0dGluZ3M6TCxmaWx0ZXJNdXRhdGlvbnM6VWIsb2JzZXJ2ZUNoaWxkcmVuOlNiLHVub2JzZXJ2ZUNoaWxkcmVuOlRiLGRlZmVyQ29ubmVjdGlvbkNhbGxiYWNrczpMLmRlZmVyQ29ubmVjdGlvbkNhbGxiYWNrcyxwcmVmZXJQZXJmb3JtYW5jZTpMLnByZWZlclBlcmZvcm1hbmNlLGhhbmRsZXNEeW5hbWljU2NvcGluZzohMCx3cmFwOkwuRD95ZTp6ZSx3cmFwSWZOZWVkZWQ6ITA9PT1MLkQ/eWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LFdyYXBwZXI6dmUsY29tcG9zZWRQYXRoOkVjLG5vUGF0Y2g6TC5ELHBhdGNoT25EZW1hbmQ6TC51YSxuYXRpdmVNZXRob2RzOmVjLApuYXRpdmVUcmVlOmZjLHBhdGNoRWxlbWVudFByb3RvOmVlfTt3aW5kb3cuU2hhZHlET009U2hhZHlET007b2MoKTtkZSgiX19zaGFkeV8iKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZG9jdW1lbnQsIl9hY3RpdmVFbGVtZW50IixXZC5hY3RpdmVFbGVtZW50KTtPKFdpbmRvdy5wcm90b3R5cGUsWmQsIl9fc2hhZHlfIik7TC5EP0wudWEmJk8oRWxlbWVudC5wcm90b3R5cGUsUWQpOihkZSgpLFZjKCkpO1FjKCk7d2luZG93LkV2ZW50PVNjO3dpbmRvdy5DdXN0b21FdmVudD1UYzt3aW5kb3cuTW91c2VFdmVudD1VYzt3aW5kb3cuU2hhZG93Um9vdD1PZH07CnZhciBBZT13aW5kb3cuRG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQsQmU9d2luZG93LkRvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVFbGVtZW50TlMsQ2U9d2luZG93LkRvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlLERlPXdpbmRvdy5Eb2N1bWVudC5wcm90b3R5cGUucHJlcGVuZCxFZT13aW5kb3cuRG9jdW1lbnQucHJvdG90eXBlLmFwcGVuZCxGZT13aW5kb3cuRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucHJlcGVuZCxHZT13aW5kb3cuRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUuYXBwZW5kLEhlPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5jbG9uZU5vZGUsSWU9d2luZG93Lk5vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkLEplPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmUsS2U9d2luZG93Lk5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkLExlPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5yZXBsYWNlQ2hpbGQsTWU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuTm9kZS5wcm90b3R5cGUsCiJ0ZXh0Q29udGVudCIpLE5lPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hdHRhY2hTaGFkb3csT2U9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUsImlubmVySFRNTCIpLFBlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5nZXRBdHRyaWJ1dGUsUWU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnNldEF0dHJpYnV0ZSxSZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlLFNlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5nZXRBdHRyaWJ1dGVOUyxUZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuc2V0QXR0cmlidXRlTlMsVWU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZU5TLFZlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5pbnNlcnRBZGphY2VudEVsZW1lbnQsV2U9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50SFRNTCxYZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucHJlcGVuZCwKWWU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmFwcGVuZCxaZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYmVmb3JlLCRlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hZnRlcixhZj13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucmVwbGFjZVdpdGgsYmY9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnJlbW92ZSxjZj13aW5kb3cuSFRNTEVsZW1lbnQsZGY9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiKSxlZj13aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50RWxlbWVudCxmZj13aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50SFRNTDt2YXIgZ2Y9bmV3IFNldDsiYW5ub3RhdGlvbi14bWwgY29sb3ItcHJvZmlsZSBmb250LWZhY2UgZm9udC1mYWNlLXNyYyBmb250LWZhY2UtdXJpIGZvbnQtZmFjZS1mb3JtYXQgZm9udC1mYWNlLW5hbWUgbWlzc2luZy1nbHlwaCIuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBnZi5hZGQoYSl9KTtmdW5jdGlvbiBoZihhKXt2YXIgYj1nZi5oYXMoYSk7YT0vXlthLXpdWy4wLTlfYS16XSotWy0uMC05X2Etel0qJC8udGVzdChhKTtyZXR1cm4hYiYmYX12YXIgamY9ZG9jdW1lbnQuY29udGFpbnM/ZG9jdW1lbnQuY29udGFpbnMuYmluZChkb2N1bWVudCk6ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zLmJpbmQoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTsKZnVuY3Rpb24gUyhhKXt2YXIgYj1hLmlzQ29ubmVjdGVkO2lmKHZvaWQgMCE9PWIpcmV0dXJuIGI7aWYoamYoYSkpcmV0dXJuITA7Zm9yKDthJiYhKGEuX19DRV9pc0ltcG9ydERvY3VtZW50fHxhIGluc3RhbmNlb2YgRG9jdW1lbnQpOylhPWEucGFyZW50Tm9kZXx8KHdpbmRvdy5TaGFkb3dSb290JiZhIGluc3RhbmNlb2YgU2hhZG93Um9vdD9hLmhvc3Q6dm9pZCAwKTtyZXR1cm4hKCFhfHwhKGEuX19DRV9pc0ltcG9ydERvY3VtZW50fHxhIGluc3RhbmNlb2YgRG9jdW1lbnQpKX1mdW5jdGlvbiBrZihhKXt2YXIgYj1hLmNoaWxkcmVuO2lmKGIpcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGIpO2I9W107Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWEubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmYi5wdXNoKGEpO3JldHVybiBifQpmdW5jdGlvbiBsZihhLGIpe2Zvcig7YiYmYiE9PWEmJiFiLm5leHRTaWJsaW5nOyliPWIucGFyZW50Tm9kZTtyZXR1cm4gYiYmYiE9PWE/Yi5uZXh0U2libGluZzpudWxsfQpmdW5jdGlvbiBtZihhLGIsYyl7Zm9yKHZhciBkPWE7ZDspe2lmKGQubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSl7dmFyIGU9ZDtiKGUpO3ZhciBmPWUubG9jYWxOYW1lO2lmKCJsaW5rIj09PWYmJiJpbXBvcnQiPT09ZS5nZXRBdHRyaWJ1dGUoInJlbCIpKXtkPWUuaW1wb3J0O3ZvaWQgMD09PWMmJihjPW5ldyBTZXQpO2lmKGQgaW5zdGFuY2VvZiBOb2RlJiYhYy5oYXMoZCkpZm9yKGMuYWRkKGQpLGQ9ZC5maXJzdENoaWxkO2Q7ZD1kLm5leHRTaWJsaW5nKW1mKGQsYixjKTtkPWxmKGEsZSk7Y29udGludWV9ZWxzZSBpZigidGVtcGxhdGUiPT09Zil7ZD1sZihhLGUpO2NvbnRpbnVlfWlmKGU9ZS5fX0NFX3NoYWRvd1Jvb3QpZm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKW1mKGUsYixjKX1kPWQuZmlyc3RDaGlsZD9kLmZpcnN0Q2hpbGQ6bGYoYSxkKX19O2Z1bmN0aW9uIG5mKCl7dmFyIGE9IShudWxsPT09b2Z8fHZvaWQgMD09PW9mfHwhb2Yubm9Eb2N1bWVudENvbnN0cnVjdGlvbk9ic2VydmVyKSxiPSEobnVsbD09PW9mfHx2b2lkIDA9PT1vZnx8IW9mLnNoYWR5RG9tRmFzdFdhbGspO3RoaXMuWD1bXTt0aGlzLmE9W107dGhpcy5SPSExO3RoaXMuc2hhZHlEb21GYXN0V2Fsaz1iO3RoaXMuamI9IWF9ZnVuY3Rpb24gcGYoYSxiLGMsZCl7dmFyIGU9d2luZG93LlNoYWR5RG9tO2lmKGEuc2hhZHlEb21GYXN0V2FsayYmZSYmZS5pblVzZSl7aWYoYi5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiZjKGIpLGIucXVlcnlTZWxlY3RvckFsbClmb3IoYT1lLm5hdGl2ZU1ldGhvZHMucXVlcnlTZWxlY3RvckFsbC5jYWxsKGIsIioiKSxiPTA7YjxhLmxlbmd0aDtiKyspYyhhW2JdKX1lbHNlIG1mKGIsYyxkKX1mdW5jdGlvbiBxZihhLGIpe2EuUj0hMDthLlgucHVzaChiKX1mdW5jdGlvbiByZihhLGIpe2EuUj0hMDthLmEucHVzaChiKX0KZnVuY3Rpb24gc2YoYSxiKXthLlImJnBmKGEsYixmdW5jdGlvbihjKXtyZXR1cm4gdGYoYSxjKX0pfWZ1bmN0aW9uIHRmKGEsYil7aWYoYS5SJiYhYi5fX0NFX3BhdGNoZWQpe2IuX19DRV9wYXRjaGVkPSEwO2Zvcih2YXIgYz0wO2M8YS5YLmxlbmd0aDtjKyspYS5YW2NdKGIpO2ZvcihjPTA7YzxhLmEubGVuZ3RoO2MrKylhLmFbY10oYil9fWZ1bmN0aW9uIHVmKGEsYil7dmFyIGM9W107cGYoYSxiLGZ1bmN0aW9uKGUpe3JldHVybiBjLnB1c2goZSl9KTtmb3IoYj0wO2I8Yy5sZW5ndGg7YisrKXt2YXIgZD1jW2JdOzE9PT1kLl9fQ0Vfc3RhdGU/YS5jb25uZWN0ZWRDYWxsYmFjayhkKTp2ZihhLGQpfX1mdW5jdGlvbiB3ZihhLGIpe3ZhciBjPVtdO3BmKGEsYixmdW5jdGlvbihlKXtyZXR1cm4gYy5wdXNoKGUpfSk7Zm9yKGI9MDtiPGMubGVuZ3RoO2IrKyl7dmFyIGQ9Y1tiXTsxPT09ZC5fX0NFX3N0YXRlJiZhLmRpc2Nvbm5lY3RlZENhbGxiYWNrKGQpfX0KZnVuY3Rpb24geGYoYSxiLGMpe2M9dm9pZCAwPT09Yz97fTpjO3ZhciBkPWMua2IsZT1jLnVwZ3JhZGV8fGZ1bmN0aW9uKGcpe3JldHVybiB2ZihhLGcpfSxmPVtdO3BmKGEsYixmdW5jdGlvbihnKXthLlImJnRmKGEsZyk7aWYoImxpbmsiPT09Zy5sb2NhbE5hbWUmJiJpbXBvcnQiPT09Zy5nZXRBdHRyaWJ1dGUoInJlbCIpKXt2YXIgaD1nLmltcG9ydDtoIGluc3RhbmNlb2YgTm9kZSYmKGguX19DRV9pc0ltcG9ydERvY3VtZW50PSEwLGguX19DRV9yZWdpc3RyeT1kb2N1bWVudC5fX0NFX3JlZ2lzdHJ5KTtoJiYiY29tcGxldGUiPT09aC5yZWFkeVN0YXRlP2guX19DRV9kb2N1bWVudExvYWRIYW5kbGVkPSEwOmcuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZnVuY3Rpb24oKXt2YXIgaz1nLmltcG9ydDtpZighay5fX0NFX2RvY3VtZW50TG9hZEhhbmRsZWQpe2suX19DRV9kb2N1bWVudExvYWRIYW5kbGVkPSEwO3ZhciBsPW5ldyBTZXQ7ZCYmKGQuZm9yRWFjaChmdW5jdGlvbihtKXtyZXR1cm4gbC5hZGQobSl9KSwKbC5kZWxldGUoaykpO3hmKGEsayx7a2I6bCx1cGdyYWRlOmV9KX19KX1lbHNlIGYucHVzaChnKX0sZCk7Zm9yKGI9MDtiPGYubGVuZ3RoO2IrKyllKGZbYl0pfQpmdW5jdGlvbiB2ZihhLGIpe3RyeXt2YXIgYz1iLm93bmVyRG9jdW1lbnQsZD1jLl9fQ0VfcmVnaXN0cnk7dmFyIGU9ZCYmKGMuZGVmYXVsdFZpZXd8fGMuX19DRV9pc0ltcG9ydERvY3VtZW50KT95ZihkLGIubG9jYWxOYW1lKTp2b2lkIDA7aWYoZSYmdm9pZCAwPT09Yi5fX0NFX3N0YXRlKXtlLmNvbnN0cnVjdGlvblN0YWNrLnB1c2goYik7dHJ5e3RyeXtpZihuZXcgZS5jb25zdHJ1Y3RvckZ1bmN0aW9uIT09Yil0aHJvdyBFcnJvcigiVGhlIGN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9yIGRpZCBub3QgcHJvZHVjZSB0aGUgZWxlbWVudCBiZWluZyB1cGdyYWRlZC4iKTt9ZmluYWxseXtlLmNvbnN0cnVjdGlvblN0YWNrLnBvcCgpfX1jYXRjaChrKXt0aHJvdyBiLl9fQ0Vfc3RhdGU9MixrO31iLl9fQ0Vfc3RhdGU9MTtiLl9fQ0VfZGVmaW5pdGlvbj1lO2lmKGUuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrJiZiLmhhc0F0dHJpYnV0ZXMoKSl7dmFyIGY9ZS5vYnNlcnZlZEF0dHJpYnV0ZXM7CmZvcihlPTA7ZTxmLmxlbmd0aDtlKyspe3ZhciBnPWZbZV0saD1iLmdldEF0dHJpYnV0ZShnKTtudWxsIT09aCYmYS5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soYixnLG51bGwsaCxudWxsKX19UyhiKSYmYS5jb25uZWN0ZWRDYWxsYmFjayhiKX19Y2F0Y2goayl7emYoayl9fW5mLnByb3RvdHlwZS5jb25uZWN0ZWRDYWxsYmFjaz1mdW5jdGlvbihhKXt2YXIgYj1hLl9fQ0VfZGVmaW5pdGlvbjtpZihiLmNvbm5lY3RlZENhbGxiYWNrKXRyeXtiLmNvbm5lY3RlZENhbGxiYWNrLmNhbGwoYSl9Y2F0Y2goYyl7emYoYyl9fTtuZi5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2s9ZnVuY3Rpb24oYSl7dmFyIGI9YS5fX0NFX2RlZmluaXRpb247aWYoYi5kaXNjb25uZWN0ZWRDYWxsYmFjayl0cnl7Yi5kaXNjb25uZWN0ZWRDYWxsYmFjay5jYWxsKGEpfWNhdGNoKGMpe3pmKGMpfX07Cm5mLnByb3RvdHlwZS5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2s9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLl9fQ0VfZGVmaW5pdGlvbjtpZihmLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayYmLTE8Zi5vYnNlcnZlZEF0dHJpYnV0ZXMuaW5kZXhPZihiKSl0cnl7Zi5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2suY2FsbChhLGIsYyxkLGUpfWNhdGNoKGcpe3pmKGcpfX07CmZ1bmN0aW9uIEFmKGEsYixjLGQpe3ZhciBlPWIuX19DRV9yZWdpc3RyeTtpZihlJiYobnVsbD09PWR8fCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj09PWQpJiYoZT15ZihlLGMpKSl0cnl7dmFyIGY9bmV3IGUuY29uc3RydWN0b3JGdW5jdGlvbjtpZih2b2lkIDA9PT1mLl9fQ0Vfc3RhdGV8fHZvaWQgMD09PWYuX19DRV9kZWZpbml0aW9uKXRocm93IEVycm9yKCJGYWlsZWQgdG8gY29uc3RydWN0ICciK2MrIic6IFRoZSByZXR1cm5lZCB2YWx1ZSB3YXMgbm90IGNvbnN0cnVjdGVkIHdpdGggdGhlIEhUTUxFbGVtZW50IGNvbnN0cnVjdG9yLiIpO2lmKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiE9PWYubmFtZXNwYWNlVVJJKXRocm93IEVycm9yKCJGYWlsZWQgdG8gY29uc3RydWN0ICciK2MrIic6IFRoZSBjb25zdHJ1Y3RlZCBlbGVtZW50J3MgbmFtZXNwYWNlIG11c3QgYmUgdGhlIEhUTUwgbmFtZXNwYWNlLiIpO2lmKGYuaGFzQXR0cmlidXRlcygpKXRocm93IEVycm9yKCJGYWlsZWQgdG8gY29uc3RydWN0ICciKwpjKyInOiBUaGUgY29uc3RydWN0ZWQgZWxlbWVudCBtdXN0IG5vdCBoYXZlIGFueSBhdHRyaWJ1dGVzLiIpO2lmKG51bGwhPT1mLmZpcnN0Q2hpbGQpdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBjb25zdHJ1Y3QgJyIrYysiJzogVGhlIGNvbnN0cnVjdGVkIGVsZW1lbnQgbXVzdCBub3QgaGF2ZSBhbnkgY2hpbGRyZW4uIik7aWYobnVsbCE9PWYucGFyZW50Tm9kZSl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGNvbnN0cnVjdCAnIitjKyInOiBUaGUgY29uc3RydWN0ZWQgZWxlbWVudCBtdXN0IG5vdCBoYXZlIGEgcGFyZW50IG5vZGUuIik7aWYoZi5vd25lckRvY3VtZW50IT09Yil0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGNvbnN0cnVjdCAnIitjKyInOiBUaGUgY29uc3RydWN0ZWQgZWxlbWVudCdzIG93bmVyIGRvY3VtZW50IGlzIGluY29ycmVjdC4iKTtpZihmLmxvY2FsTmFtZSE9PWMpdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBjb25zdHJ1Y3QgJyIrYysiJzogVGhlIGNvbnN0cnVjdGVkIGVsZW1lbnQncyBsb2NhbCBuYW1lIGlzIGluY29ycmVjdC4iKTsKcmV0dXJuIGZ9Y2F0Y2goZyl7cmV0dXJuIHpmKGcpLGI9bnVsbD09PWQ/QWUuY2FsbChiLGMpOkJlLmNhbGwoYixkLGMpLE9iamVjdC5zZXRQcm90b3R5cGVPZihiLEhUTUxVbmtub3duRWxlbWVudC5wcm90b3R5cGUpLGIuX19DRV9zdGF0ZT0yLGIuX19DRV9kZWZpbml0aW9uPXZvaWQgMCx0ZihhLGIpLGJ9Yj1udWxsPT09ZD9BZS5jYWxsKGIsYyk6QmUuY2FsbChiLGQsYyk7dGYoYSxiKTtyZXR1cm4gYn0KZnVuY3Rpb24gemYoYSl7dmFyIGI9YS5tZXNzYWdlLGM9YS5zb3VyY2VVUkx8fGEuZmlsZU5hbWV8fCIiLGQ9YS5saW5lfHxhLmxpbmVOdW1iZXJ8fDAsZT1hLmNvbHVtbnx8YS5jb2x1bW5OdW1iZXJ8fDAsZj12b2lkIDA7dm9pZCAwPT09RXJyb3JFdmVudC5wcm90b3R5cGUuaW5pdEVycm9yRXZlbnQ/Zj1uZXcgRXJyb3JFdmVudCgiZXJyb3IiLHtjYW5jZWxhYmxlOiEwLG1lc3NhZ2U6YixmaWxlbmFtZTpjLGxpbmVubzpkLGNvbG5vOmUsZXJyb3I6YX0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFcnJvckV2ZW50IiksZi5pbml0RXJyb3JFdmVudCgiZXJyb3IiLCExLCEwLGIsYyxkKSxmLnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImRlZmF1bHRQcmV2ZW50ZWQiLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KTt2b2lkIDA9PT1mLmVycm9yJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiZXJyb3IiLAp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGF9fSk7d2luZG93LmRpc3BhdGNoRXZlbnQoZik7Zi5kZWZhdWx0UHJldmVudGVkfHxjb25zb2xlLmVycm9yKGEpfTtmdW5jdGlvbiBCZigpe3ZhciBhPXRoaXM7dGhpcy5DPXZvaWQgMDt0aGlzLkNhPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGIpe2EuYT1ifSl9QmYucHJvdG90eXBlLnJlc29sdmU9ZnVuY3Rpb24oYSl7aWYodGhpcy5DKXRocm93IEVycm9yKCJBbHJlYWR5IHJlc29sdmVkLiIpO3RoaXMuQz1hO3RoaXMuYShhKX07ZnVuY3Rpb24gQ2YoYSl7dmFyIGI9ZG9jdW1lbnQ7dGhpcy5TPXZvaWQgMDt0aGlzLk09YTt0aGlzLmE9Yjt4Zih0aGlzLk0sdGhpcy5hKTsibG9hZGluZyI9PT10aGlzLmEucmVhZHlTdGF0ZSYmKHRoaXMuUz1uZXcgTXV0YXRpb25PYnNlcnZlcih0aGlzLmIuYmluZCh0aGlzKSksdGhpcy5TLm9ic2VydmUodGhpcy5hLHtjaGlsZExpc3Q6ITAsc3VidHJlZTohMH0pKX1mdW5jdGlvbiBEZihhKXthLlMmJmEuUy5kaXNjb25uZWN0KCl9Q2YucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5hLnJlYWR5U3RhdGU7ImludGVyYWN0aXZlIiE9PWImJiJjb21wbGV0ZSIhPT1ifHxEZih0aGlzKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcih2YXIgYz1hW2JdLmFkZGVkTm9kZXMsZD0wO2Q8Yy5sZW5ndGg7ZCsrKXhmKHRoaXMuTSxjW2RdKX07ZnVuY3Rpb24gVChhKXt0aGlzLmZhPW5ldyBNYXA7dGhpcy5nYT1uZXcgTWFwO3RoaXMueGE9bmV3IE1hcDt0aGlzLm5hPSExO3RoaXMucWE9bmV3IE1hcDt0aGlzLmVhPWZ1bmN0aW9uKGIpe3JldHVybiBiKCl9O3RoaXMuUD0hMTt0aGlzLmhhPVtdO3RoaXMuTT1hO3RoaXMueWE9YS5qYj9uZXcgQ2YoYSk6dm9pZCAwfXc9VC5wcm90b3R5cGU7dy4kYT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXM7aWYoIShiIGluc3RhbmNlb2YgRnVuY3Rpb24pKXRocm93IG5ldyBUeXBlRXJyb3IoIkN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9yIGdldHRlcnMgbXVzdCBiZSBmdW5jdGlvbnMuIik7RWYodGhpcyxhKTt0aGlzLmZhLnNldChhLGIpO3RoaXMuaGEucHVzaChhKTt0aGlzLlB8fCh0aGlzLlA9ITAsdGhpcy5lYShmdW5jdGlvbigpe3JldHVybiBGZihjKX0pKX07CncuZGVmaW5lPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcztpZighKGIgaW5zdGFuY2VvZiBGdW5jdGlvbikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3VzdG9tIGVsZW1lbnQgY29uc3RydWN0b3JzIG11c3QgYmUgZnVuY3Rpb25zLiIpO0VmKHRoaXMsYSk7R2YodGhpcyxhLGIpO3RoaXMuaGEucHVzaChhKTt0aGlzLlB8fCh0aGlzLlA9ITAsdGhpcy5lYShmdW5jdGlvbigpe3JldHVybiBGZihjKX0pKX07ZnVuY3Rpb24gRWYoYSxiKXtpZighaGYoYikpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJUaGUgZWxlbWVudCBuYW1lICciK2IrIicgaXMgbm90IHZhbGlkLiIpO2lmKHlmKGEsYikpdGhyb3cgRXJyb3IoIkEgY3VzdG9tIGVsZW1lbnQgd2l0aCBuYW1lICciKyhiKyInIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZC4iKSk7aWYoYS5uYSl0aHJvdyBFcnJvcigiQSBjdXN0b20gZWxlbWVudCBpcyBhbHJlYWR5IGJlaW5nIGRlZmluZWQuIik7fQpmdW5jdGlvbiBHZihhLGIsYyl7YS5uYT0hMDt2YXIgZDt0cnl7dmFyIGU9Yy5wcm90b3R5cGU7aWYoIShlIGluc3RhbmNlb2YgT2JqZWN0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgY3VzdG9tIGVsZW1lbnQgY29uc3RydWN0b3IncyBwcm90b3R5cGUgaXMgbm90IGFuIG9iamVjdC4iKTt2YXIgZj1mdW5jdGlvbihtKXt2YXIgcT1lW21dO2lmKHZvaWQgMCE9PXEmJiEocSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSl0aHJvdyBFcnJvcigiVGhlICciK20rIicgY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpO3JldHVybiBxfTt2YXIgZz1mKCJjb25uZWN0ZWRDYWxsYmFjayIpO3ZhciBoPWYoImRpc2Nvbm5lY3RlZENhbGxiYWNrIik7dmFyIGs9ZigiYWRvcHRlZENhbGxiYWNrIik7dmFyIGw9KGQ9ZigiYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrIikpJiZjLm9ic2VydmVkQXR0cmlidXRlc3x8W119Y2F0Y2gobSl7dGhyb3cgbTt9ZmluYWxseXthLm5hPSExfWM9e2xvY2FsTmFtZTpiLApjb25zdHJ1Y3RvckZ1bmN0aW9uOmMsY29ubmVjdGVkQ2FsbGJhY2s6ZyxkaXNjb25uZWN0ZWRDYWxsYmFjazpoLGFkb3B0ZWRDYWxsYmFjazprLGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjazpkLG9ic2VydmVkQXR0cmlidXRlczpsLGNvbnN0cnVjdGlvblN0YWNrOltdfTthLmdhLnNldChiLGMpO2EueGEuc2V0KGMuY29uc3RydWN0b3JGdW5jdGlvbixjKTtyZXR1cm4gY313LnVwZ3JhZGU9ZnVuY3Rpb24oYSl7eGYodGhpcy5NLGEpfTsKZnVuY3Rpb24gRmYoYSl7aWYoITEhPT1hLlApe2EuUD0hMTtmb3IodmFyIGI9W10sYz1hLmhhLGQ9bmV3IE1hcCxlPTA7ZTxjLmxlbmd0aDtlKyspZC5zZXQoY1tlXSxbXSk7eGYoYS5NLGRvY3VtZW50LHt1cGdyYWRlOmZ1bmN0aW9uKGspe2lmKHZvaWQgMD09PWsuX19DRV9zdGF0ZSl7dmFyIGw9ay5sb2NhbE5hbWUsbT1kLmdldChsKTttP20ucHVzaChrKTphLmdhLmhhcyhsKSYmYi5wdXNoKGspfX19KTtmb3IoZT0wO2U8Yi5sZW5ndGg7ZSsrKXZmKGEuTSxiW2VdKTtmb3IoZT0wO2U8Yy5sZW5ndGg7ZSsrKXtmb3IodmFyIGY9Y1tlXSxnPWQuZ2V0KGYpLGg9MDtoPGcubGVuZ3RoO2grKyl2ZihhLk0sZ1toXSk7KGY9YS5xYS5nZXQoZikpJiZmLnJlc29sdmUodm9pZCAwKX1jLmxlbmd0aD0wfX13LmdldD1mdW5jdGlvbihhKXtpZihhPXlmKHRoaXMsYSkpcmV0dXJuIGEuY29uc3RydWN0b3JGdW5jdGlvbn07Cncud2hlbkRlZmluZWQ9ZnVuY3Rpb24oYSl7aWYoIWhmKGEpKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgU3ludGF4RXJyb3IoIiciK2ErIicgaXMgbm90IGEgdmFsaWQgY3VzdG9tIGVsZW1lbnQgbmFtZS4iKSk7dmFyIGI9dGhpcy5xYS5nZXQoYSk7aWYoYilyZXR1cm4gYi5DYTtiPW5ldyBCZjt0aGlzLnFhLnNldChhLGIpO3ZhciBjPXRoaXMuZ2EuaGFzKGEpfHx0aGlzLmZhLmhhcyhhKTthPS0xPT09dGhpcy5oYS5pbmRleE9mKGEpO2MmJmEmJmIucmVzb2x2ZSh2b2lkIDApO3JldHVybiBiLkNhfTt3LnBvbHlmaWxsV3JhcEZsdXNoQ2FsbGJhY2s9ZnVuY3Rpb24oYSl7dGhpcy55YSYmRGYodGhpcy55YSk7dmFyIGI9dGhpcy5lYTt0aGlzLmVhPWZ1bmN0aW9uKGMpe3JldHVybiBhKGZ1bmN0aW9uKCl7cmV0dXJuIGIoYyl9KX19OwpmdW5jdGlvbiB5ZihhLGIpe3ZhciBjPWEuZ2EuZ2V0KGIpO2lmKGMpcmV0dXJuIGM7aWYoYz1hLmZhLmdldChiKSl7YS5mYS5kZWxldGUoYik7dHJ5e3JldHVybiBHZihhLGIsYygpKX1jYXRjaChkKXt6ZihkKX19fXdpbmRvdy5DdXN0b21FbGVtZW50UmVnaXN0cnk9VDtULnByb3RvdHlwZS5kZWZpbmU9VC5wcm90b3R5cGUuZGVmaW5lO1QucHJvdG90eXBlLnVwZ3JhZGU9VC5wcm90b3R5cGUudXBncmFkZTtULnByb3RvdHlwZS5nZXQ9VC5wcm90b3R5cGUuZ2V0O1QucHJvdG90eXBlLndoZW5EZWZpbmVkPVQucHJvdG90eXBlLndoZW5EZWZpbmVkO1QucHJvdG90eXBlLnBvbHlmaWxsRGVmaW5lTGF6eT1ULnByb3RvdHlwZS4kYTtULnByb3RvdHlwZS5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrPVQucHJvdG90eXBlLnBvbHlmaWxsV3JhcEZsdXNoQ2FsbGJhY2s7ZnVuY3Rpb24gSGYoYSxiLGMpe2Z1bmN0aW9uIGQoZSl7cmV0dXJuIGZ1bmN0aW9uKGYpe2Zvcih2YXIgZz1bXSxoPTA7aDxhcmd1bWVudHMubGVuZ3RoOysraClnW2hdPWFyZ3VtZW50c1toXTtoPVtdO2Zvcih2YXIgaz1bXSxsPTA7bDxnLmxlbmd0aDtsKyspe3ZhciBtPWdbbF07bSBpbnN0YW5jZW9mIEVsZW1lbnQmJlMobSkmJmsucHVzaChtKTtpZihtIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudClmb3IobT1tLmZpcnN0Q2hpbGQ7bTttPW0ubmV4dFNpYmxpbmcpaC5wdXNoKG0pO2Vsc2UgaC5wdXNoKG0pfWUuYXBwbHkodGhpcyxnKTtmb3IoZz0wO2c8ay5sZW5ndGg7ZysrKXdmKGEsa1tnXSk7aWYoUyh0aGlzKSlmb3IoZz0wO2c8aC5sZW5ndGg7ZysrKWs9aFtnXSxrIGluc3RhbmNlb2YgRWxlbWVudCYmdWYoYSxrKX19dm9pZCAwIT09Yy5wcmVwZW5kJiYoYi5wcmVwZW5kPWQoYy5wcmVwZW5kKSk7dm9pZCAwIT09Yy5hcHBlbmQmJihiLmFwcGVuZD1kKGMuYXBwZW5kKSl9CjtmdW5jdGlvbiBJZihhKXtEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlRWxlbWVudD1mdW5jdGlvbihiKXtyZXR1cm4gQWYoYSx0aGlzLGIsbnVsbCl9O0RvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlPWZ1bmN0aW9uKGIsYyl7Yj1DZS5jYWxsKHRoaXMsYiwhIWMpO3RoaXMuX19DRV9yZWdpc3RyeT94ZihhLGIpOnNmKGEsYik7cmV0dXJuIGJ9O0RvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVFbGVtZW50TlM9ZnVuY3Rpb24oYixjKXtyZXR1cm4gQWYoYSx0aGlzLGMsYil9O0hmKGEsRG9jdW1lbnQucHJvdG90eXBlLHtwcmVwZW5kOkRlLGFwcGVuZDpFZX0pfTtmdW5jdGlvbiBKZihhKXtmdW5jdGlvbiBiKGQpe3JldHVybiBmdW5jdGlvbihlKXtmb3IodmFyIGY9W10sZz0wO2c8YXJndW1lbnRzLmxlbmd0aDsrK2cpZltnXT1hcmd1bWVudHNbZ107Zz1bXTtmb3IodmFyIGg9W10saz0wO2s8Zi5sZW5ndGg7aysrKXt2YXIgbD1mW2tdO2wgaW5zdGFuY2VvZiBFbGVtZW50JiZTKGwpJiZoLnB1c2gobCk7aWYobCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpZm9yKGw9bC5maXJzdENoaWxkO2w7bD1sLm5leHRTaWJsaW5nKWcucHVzaChsKTtlbHNlIGcucHVzaChsKX1kLmFwcGx5KHRoaXMsZik7Zm9yKGY9MDtmPGgubGVuZ3RoO2YrKyl3ZihhLGhbZl0pO2lmKFModGhpcykpZm9yKGY9MDtmPGcubGVuZ3RoO2YrKyloPWdbZl0saCBpbnN0YW5jZW9mIEVsZW1lbnQmJnVmKGEsaCl9fXZhciBjPUVsZW1lbnQucHJvdG90eXBlO3ZvaWQgMCE9PVplJiYoYy5iZWZvcmU9YihaZSkpO3ZvaWQgMCE9PSRlJiYoYy5hZnRlcj1iKCRlKSk7dm9pZCAwIT09CmFmJiYoYy5yZXBsYWNlV2l0aD1mdW5jdGlvbihkKXtmb3IodmFyIGU9W10sZj0wO2Y8YXJndW1lbnRzLmxlbmd0aDsrK2YpZVtmXT1hcmd1bWVudHNbZl07Zj1bXTtmb3IodmFyIGc9W10saD0wO2g8ZS5sZW5ndGg7aCsrKXt2YXIgaz1lW2hdO2sgaW5zdGFuY2VvZiBFbGVtZW50JiZTKGspJiZnLnB1c2goayk7aWYoayBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpZm9yKGs9ay5maXJzdENoaWxkO2s7az1rLm5leHRTaWJsaW5nKWYucHVzaChrKTtlbHNlIGYucHVzaChrKX1oPVModGhpcyk7YWYuYXBwbHkodGhpcyxlKTtmb3IoZT0wO2U8Zy5sZW5ndGg7ZSsrKXdmKGEsZ1tlXSk7aWYoaClmb3Iod2YoYSx0aGlzKSxlPTA7ZTxmLmxlbmd0aDtlKyspZz1mW2VdLGcgaW5zdGFuY2VvZiBFbGVtZW50JiZ1ZihhLGcpfSk7dm9pZCAwIT09YmYmJihjLnJlbW92ZT1mdW5jdGlvbigpe3ZhciBkPVModGhpcyk7YmYuY2FsbCh0aGlzKTtkJiZ3ZihhLHRoaXMpfSl9O2Z1bmN0aW9uIEtmKGEpe2Z1bmN0aW9uIGIoZSxmKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiaW5uZXJIVE1MIix7ZW51bWVyYWJsZTpmLmVudW1lcmFibGUsY29uZmlndXJhYmxlOiEwLGdldDpmLmdldCxzZXQ6ZnVuY3Rpb24oZyl7dmFyIGg9dGhpcyxrPXZvaWQgMDtTKHRoaXMpJiYoaz1bXSxwZihhLHRoaXMsZnVuY3Rpb24ocSl7cSE9PWgmJmsucHVzaChxKX0pKTtmLnNldC5jYWxsKHRoaXMsZyk7aWYoaylmb3IodmFyIGw9MDtsPGsubGVuZ3RoO2wrKyl7dmFyIG09a1tsXTsxPT09bS5fX0NFX3N0YXRlJiZhLmRpc2Nvbm5lY3RlZENhbGxiYWNrKG0pfXRoaXMub3duZXJEb2N1bWVudC5fX0NFX3JlZ2lzdHJ5P3hmKGEsdGhpcyk6c2YoYSx0aGlzKTtyZXR1cm4gZ319KX1mdW5jdGlvbiBjKGUsZil7ZS5pbnNlcnRBZGphY2VudEVsZW1lbnQ9ZnVuY3Rpb24oZyxoKXt2YXIgaz1TKGgpO2c9Zi5jYWxsKHRoaXMsZyxoKTtrJiZ3ZihhLGgpO1MoZykmJnVmKGEsaCk7cmV0dXJuIGd9fQpmdW5jdGlvbiBkKGUsZil7ZnVuY3Rpb24gZyhoLGspe2Zvcih2YXIgbD1bXTtoIT09aztoPWgubmV4dFNpYmxpbmcpbC5wdXNoKGgpO2ZvcihrPTA7azxsLmxlbmd0aDtrKyspeGYoYSxsW2tdKX1lLmluc2VydEFkamFjZW50SFRNTD1mdW5jdGlvbihoLGspe2g9aC50b0xvd2VyQ2FzZSgpO2lmKCJiZWZvcmViZWdpbiI9PT1oKXt2YXIgbD10aGlzLnByZXZpb3VzU2libGluZztmLmNhbGwodGhpcyxoLGspO2cobHx8dGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsdGhpcyl9ZWxzZSBpZigiYWZ0ZXJiZWdpbiI9PT1oKWw9dGhpcy5maXJzdENoaWxkLGYuY2FsbCh0aGlzLGgsayksZyh0aGlzLmZpcnN0Q2hpbGQsbCk7ZWxzZSBpZigiYmVmb3JlZW5kIj09PWgpbD10aGlzLmxhc3RDaGlsZCxmLmNhbGwodGhpcyxoLGspLGcobHx8dGhpcy5maXJzdENoaWxkLG51bGwpO2Vsc2UgaWYoImFmdGVyZW5kIj09PWgpbD10aGlzLm5leHRTaWJsaW5nLGYuY2FsbCh0aGlzLGgsayksZyh0aGlzLm5leHRTaWJsaW5nLApsKTtlbHNlIHRocm93IG5ldyBTeW50YXhFcnJvcigiVGhlIHZhbHVlIHByb3ZpZGVkICgiK1N0cmluZyhoKSsiKSBpcyBub3Qgb25lIG9mICdiZWZvcmViZWdpbicsICdhZnRlcmJlZ2luJywgJ2JlZm9yZWVuZCcsIG9yICdhZnRlcmVuZCcuIik7fX1OZSYmKEVsZW1lbnQucHJvdG90eXBlLmF0dGFjaFNoYWRvdz1mdW5jdGlvbihlKXtlPU5lLmNhbGwodGhpcyxlKTtpZihhLlImJiFlLl9fQ0VfcGF0Y2hlZCl7ZS5fX0NFX3BhdGNoZWQ9ITA7Zm9yKHZhciBmPTA7ZjxhLlgubGVuZ3RoO2YrKylhLlhbZl0oZSl9cmV0dXJuIHRoaXMuX19DRV9zaGFkb3dSb290PWV9KTtPZSYmT2UuZ2V0P2IoRWxlbWVudC5wcm90b3R5cGUsT2UpOmRmJiZkZi5nZXQ/YihIVE1MRWxlbWVudC5wcm90b3R5cGUsZGYpOnJmKGEsZnVuY3Rpb24oZSl7YihlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSGUuY2FsbCh0aGlzLCEwKS5pbm5lckhUTUx9LHNldDpmdW5jdGlvbihmKXt2YXIgZz0KInRlbXBsYXRlIj09PXRoaXMubG9jYWxOYW1lLGg9Zz90aGlzLmNvbnRlbnQ6dGhpcyxrPUJlLmNhbGwoZG9jdW1lbnQsdGhpcy5uYW1lc3BhY2VVUkksdGhpcy5sb2NhbE5hbWUpO2ZvcihrLmlubmVySFRNTD1mOzA8aC5jaGlsZE5vZGVzLmxlbmd0aDspS2UuY2FsbChoLGguY2hpbGROb2Rlc1swXSk7Zm9yKGY9Zz9rLmNvbnRlbnQ6azswPGYuY2hpbGROb2Rlcy5sZW5ndGg7KUllLmNhbGwoaCxmLmNoaWxkTm9kZXNbMF0pfX0pfSk7RWxlbWVudC5wcm90b3R5cGUuc2V0QXR0cmlidXRlPWZ1bmN0aW9uKGUsZil7aWYoMSE9PXRoaXMuX19DRV9zdGF0ZSlyZXR1cm4gUWUuY2FsbCh0aGlzLGUsZik7dmFyIGc9UGUuY2FsbCh0aGlzLGUpO1FlLmNhbGwodGhpcyxlLGYpO2Y9UGUuY2FsbCh0aGlzLGUpO2EuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHRoaXMsZSxnLGYsbnVsbCl9O0VsZW1lbnQucHJvdG90eXBlLnNldEF0dHJpYnV0ZU5TPWZ1bmN0aW9uKGUsZixnKXtpZigxIT09dGhpcy5fX0NFX3N0YXRlKXJldHVybiBUZS5jYWxsKHRoaXMsCmUsZixnKTt2YXIgaD1TZS5jYWxsKHRoaXMsZSxmKTtUZS5jYWxsKHRoaXMsZSxmLGcpO2c9U2UuY2FsbCh0aGlzLGUsZik7YS5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodGhpcyxmLGgsZyxlKX07RWxlbWVudC5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlPWZ1bmN0aW9uKGUpe2lmKDEhPT10aGlzLl9fQ0Vfc3RhdGUpcmV0dXJuIFJlLmNhbGwodGhpcyxlKTt2YXIgZj1QZS5jYWxsKHRoaXMsZSk7UmUuY2FsbCh0aGlzLGUpO251bGwhPT1mJiZhLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0aGlzLGUsZixudWxsLG51bGwpfTtFbGVtZW50LnByb3RvdHlwZS5yZW1vdmVBdHRyaWJ1dGVOUz1mdW5jdGlvbihlLGYpe2lmKDEhPT10aGlzLl9fQ0Vfc3RhdGUpcmV0dXJuIFVlLmNhbGwodGhpcyxlLGYpO3ZhciBnPVNlLmNhbGwodGhpcyxlLGYpO1VlLmNhbGwodGhpcyxlLGYpO3ZhciBoPVNlLmNhbGwodGhpcyxlLGYpO2chPT1oJiZhLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0aGlzLApmLGcsaCxlKX07ZWY/YyhIVE1MRWxlbWVudC5wcm90b3R5cGUsZWYpOlZlJiZjKEVsZW1lbnQucHJvdG90eXBlLFZlKTtmZj9kKEhUTUxFbGVtZW50LnByb3RvdHlwZSxmZik6V2UmJmQoRWxlbWVudC5wcm90b3R5cGUsV2UpO0hmKGEsRWxlbWVudC5wcm90b3R5cGUse3ByZXBlbmQ6WGUsYXBwZW5kOlllfSk7SmYoYSl9O3ZhciBMZj17fTtmdW5jdGlvbiBNZihhKXtmdW5jdGlvbiBiKCl7dmFyIGM9dGhpcy5jb25zdHJ1Y3Rvcjt2YXIgZD1kb2N1bWVudC5fX0NFX3JlZ2lzdHJ5LnhhLmdldChjKTtpZighZCl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGNvbnN0cnVjdCBhIGN1c3RvbSBlbGVtZW50OiBUaGUgY29uc3RydWN0b3Igd2FzIG5vdCByZWdpc3RlcmVkIHdpdGggYGN1c3RvbUVsZW1lbnRzYC4iKTt2YXIgZT1kLmNvbnN0cnVjdGlvblN0YWNrO2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gZT1BZS5jYWxsKGRvY3VtZW50LGQubG9jYWxOYW1lKSxPYmplY3Quc2V0UHJvdG90eXBlT2YoZSxjLnByb3RvdHlwZSksZS5fX0NFX3N0YXRlPTEsZS5fX0NFX2RlZmluaXRpb249ZCx0ZihhLGUpLGU7dmFyIGY9ZS5sZW5ndGgtMSxnPWVbZl07aWYoZz09PUxmKXRocm93IEVycm9yKCJGYWlsZWQgdG8gY29uc3RydWN0ICciK2QubG9jYWxOYW1lKyInOiBUaGlzIGVsZW1lbnQgd2FzIGFscmVhZHkgY29uc3RydWN0ZWQuIik7ZVtmXT0KTGY7T2JqZWN0LnNldFByb3RvdHlwZU9mKGcsYy5wcm90b3R5cGUpO3RmKGEsZyk7cmV0dXJuIGd9Yi5wcm90b3R5cGU9Y2YucHJvdG90eXBlO09iamVjdC5kZWZpbmVQcm9wZXJ0eShIVE1MRWxlbWVudC5wcm90b3R5cGUsImNvbnN0cnVjdG9yIix7d3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6Yn0pO3dpbmRvdy5IVE1MRWxlbWVudD1ifTtmdW5jdGlvbiBOZihhKXtmdW5jdGlvbiBiKGMsZCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGMsInRleHRDb250ZW50Iix7ZW51bWVyYWJsZTpkLmVudW1lcmFibGUsY29uZmlndXJhYmxlOiEwLGdldDpkLmdldCxzZXQ6ZnVuY3Rpb24oZSl7aWYodGhpcy5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFKWQuc2V0LmNhbGwodGhpcyxlKTtlbHNle3ZhciBmPXZvaWQgMDtpZih0aGlzLmZpcnN0Q2hpbGQpe3ZhciBnPXRoaXMuY2hpbGROb2RlcyxoPWcubGVuZ3RoO2lmKDA8aCYmUyh0aGlzKSl7Zj1BcnJheShoKTtmb3IodmFyIGs9MDtrPGg7aysrKWZba109Z1trXX19ZC5zZXQuY2FsbCh0aGlzLGUpO2lmKGYpZm9yKGU9MDtlPGYubGVuZ3RoO2UrKyl3ZihhLGZbZV0pfX19KX1Ob2RlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmU9ZnVuY3Rpb24oYyxkKXtpZihjIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCl7dmFyIGU9a2YoYyk7Yz1KZS5jYWxsKHRoaXMsYyxkKTtpZihTKHRoaXMpKWZvcihkPQowO2Q8ZS5sZW5ndGg7ZCsrKXVmKGEsZVtkXSk7cmV0dXJuIGN9ZT1jIGluc3RhbmNlb2YgRWxlbWVudCYmUyhjKTtkPUplLmNhbGwodGhpcyxjLGQpO2UmJndmKGEsYyk7Uyh0aGlzKSYmdWYoYSxjKTtyZXR1cm4gZH07Tm9kZS5wcm90b3R5cGUuYXBwZW5kQ2hpbGQ9ZnVuY3Rpb24oYyl7aWYoYyBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpe3ZhciBkPWtmKGMpO2M9SWUuY2FsbCh0aGlzLGMpO2lmKFModGhpcykpZm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspdWYoYSxkW2VdKTtyZXR1cm4gY31kPWMgaW5zdGFuY2VvZiBFbGVtZW50JiZTKGMpO2U9SWUuY2FsbCh0aGlzLGMpO2QmJndmKGEsYyk7Uyh0aGlzKSYmdWYoYSxjKTtyZXR1cm4gZX07Tm9kZS5wcm90b3R5cGUuY2xvbmVOb2RlPWZ1bmN0aW9uKGMpe2M9SGUuY2FsbCh0aGlzLCEhYyk7dGhpcy5vd25lckRvY3VtZW50Ll9fQ0VfcmVnaXN0cnk/eGYoYSxjKTpzZihhLGMpO3JldHVybiBjfTtOb2RlLnByb3RvdHlwZS5yZW1vdmVDaGlsZD0KZnVuY3Rpb24oYyl7dmFyIGQ9YyBpbnN0YW5jZW9mIEVsZW1lbnQmJlMoYyksZT1LZS5jYWxsKHRoaXMsYyk7ZCYmd2YoYSxjKTtyZXR1cm4gZX07Tm9kZS5wcm90b3R5cGUucmVwbGFjZUNoaWxkPWZ1bmN0aW9uKGMsZCl7aWYoYyBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpe3ZhciBlPWtmKGMpO2M9TGUuY2FsbCh0aGlzLGMsZCk7aWYoUyh0aGlzKSlmb3Iod2YoYSxkKSxkPTA7ZDxlLmxlbmd0aDtkKyspdWYoYSxlW2RdKTtyZXR1cm4gY31lPWMgaW5zdGFuY2VvZiBFbGVtZW50JiZTKGMpO3ZhciBmPUxlLmNhbGwodGhpcyxjLGQpLGc9Uyh0aGlzKTtnJiZ3ZihhLGQpO2UmJndmKGEsYyk7ZyYmdWYoYSxjKTtyZXR1cm4gZn07TWUmJk1lLmdldD9iKE5vZGUucHJvdG90eXBlLE1lKTpxZihhLGZ1bmN0aW9uKGMpe2IoYyx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7Zm9yKHZhciBkPVtdLGU9dGhpcy5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKWUubm9kZVR5cGUhPT0KTm9kZS5DT01NRU5UX05PREUmJmQucHVzaChlLnRleHRDb250ZW50KTtyZXR1cm4gZC5qb2luKCIiKX0sc2V0OmZ1bmN0aW9uKGQpe2Zvcig7dGhpcy5maXJzdENoaWxkOylLZS5jYWxsKHRoaXMsdGhpcy5maXJzdENoaWxkKTtudWxsIT1kJiYiIiE9PWQmJkllLmNhbGwodGhpcyxkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkKSl9fSl9KX07dmFyIG9mPXdpbmRvdy5jdXN0b21FbGVtZW50cztmdW5jdGlvbiBPZigpe3ZhciBhPW5ldyBuZjtNZihhKTtJZihhKTtIZihhLERvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLHtwcmVwZW5kOkZlLGFwcGVuZDpHZX0pO05mKGEpO0tmKGEpO2E9bmV3IFQoYSk7ZG9jdW1lbnQuX19DRV9yZWdpc3RyeT1hO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImN1c3RvbUVsZW1lbnRzIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6YX0pfW9mJiYhb2YuZm9yY2VQb2x5ZmlsbCYmImZ1bmN0aW9uIj09dHlwZW9mIG9mLmRlZmluZSYmImZ1bmN0aW9uIj09dHlwZW9mIG9mLmdldHx8T2YoKTt3aW5kb3cuX19DRV9pbnN0YWxsUG9seWZpbGw9T2Y7CmZ1bmN0aW9uIFBmKCl7dGhpcy5lbmQ9dGhpcy5zdGFydD0wO3RoaXMucnVsZXM9dGhpcy5wYXJlbnQ9dGhpcy5wcmV2aW91cz1udWxsO3RoaXMuY3NzVGV4dD10aGlzLnBhcnNlZENzc1RleHQ9IiI7dGhpcy5hdFJ1bGU9ITE7dGhpcy50eXBlPTA7dGhpcy5wYXJzZWRTZWxlY3Rvcj10aGlzLnNlbGVjdG9yPXRoaXMua2V5ZnJhbWVzTmFtZT0iIn0KZnVuY3Rpb24gUWYoYSl7dmFyIGI9YT1hLnJlcGxhY2UoUmYsIiIpLnJlcGxhY2UoU2YsIiIpLGM9bmV3IFBmO2Muc3RhcnQ9MDtjLmVuZD1iLmxlbmd0aDtmb3IodmFyIGQ9YyxlPTAsZj1iLmxlbmd0aDtlPGY7ZSsrKWlmKCJ7Ij09PWJbZV0pe2QucnVsZXN8fChkLnJ1bGVzPVtdKTt2YXIgZz1kLGg9Zy5ydWxlc1tnLnJ1bGVzLmxlbmd0aC0xXXx8bnVsbDtkPW5ldyBQZjtkLnN0YXJ0PWUrMTtkLnBhcmVudD1nO2QucHJldmlvdXM9aDtnLnJ1bGVzLnB1c2goZCl9ZWxzZSJ9Ij09PWJbZV0mJihkLmVuZD1lKzEsZD1kLnBhcmVudHx8Yyk7cmV0dXJuIFRmKGMsYSl9CmZ1bmN0aW9uIFRmKGEsYil7dmFyIGM9Yi5zdWJzdHJpbmcoYS5zdGFydCxhLmVuZC0xKTthLnBhcnNlZENzc1RleHQ9YS5jc3NUZXh0PWMudHJpbSgpO2EucGFyZW50JiYoYz1iLnN1YnN0cmluZyhhLnByZXZpb3VzP2EucHJldmlvdXMuZW5kOmEucGFyZW50LnN0YXJ0LGEuc3RhcnQtMSksYz1VZihjKSxjPWMucmVwbGFjZShWZiwiICIpLGM9Yy5zdWJzdHJpbmcoYy5sYXN0SW5kZXhPZigiOyIpKzEpLGM9YS5wYXJzZWRTZWxlY3Rvcj1hLnNlbGVjdG9yPWMudHJpbSgpLGEuYXRSdWxlPTA9PT1jLmluZGV4T2YoIkAiKSxhLmF0UnVsZT8wPT09Yy5pbmRleE9mKCJAbWVkaWEiKT9hLnR5cGU9V2Y6Yy5tYXRjaChYZikmJihhLnR5cGU9WWYsYS5rZXlmcmFtZXNOYW1lPWEuc2VsZWN0b3Iuc3BsaXQoVmYpLnBvcCgpKTphLnR5cGU9MD09PWMuaW5kZXhPZigiLS0iKT9aZjokZik7aWYoYz1hLnJ1bGVzKWZvcih2YXIgZD0wLGU9Yy5sZW5ndGgsZj12b2lkIDA7ZDxlJiYoZj1jW2RdKTtkKyspVGYoZiwKYik7cmV0dXJuIGF9ZnVuY3Rpb24gVWYoYSl7cmV0dXJuIGEucmVwbGFjZSgvXFwoWzAtOWEtZl17MSw2fSlccy9naSxmdW5jdGlvbihiLGMpe2I9Yztmb3IoYz02LWIubGVuZ3RoO2MtLTspYj0iMCIrYjtyZXR1cm4iXFwiK2J9KX0KZnVuY3Rpb24gYWcoYSxiLGMpe2M9dm9pZCAwPT09Yz8iIjpjO3ZhciBkPSIiO2lmKGEuY3NzVGV4dHx8YS5ydWxlcyl7dmFyIGU9YS5ydWxlcyxmO2lmKGY9ZSlmPWVbMF0sZj0hKGYmJmYuc2VsZWN0b3ImJjA9PT1mLnNlbGVjdG9yLmluZGV4T2YoIi0tIikpO2lmKGYpe2Y9MDtmb3IodmFyIGc9ZS5sZW5ndGgsaD12b2lkIDA7ZjxnJiYoaD1lW2ZdKTtmKyspZD1hZyhoLGIsZCl9ZWxzZSBiP2I9YS5jc3NUZXh0OihiPWEuY3NzVGV4dCxiPWIucmVwbGFjZShiZywiIikucmVwbGFjZShjZywiIiksYj1iLnJlcGxhY2UoZGcsIiIpLnJlcGxhY2UoZWcsIiIpKSwoZD1iLnRyaW0oKSkmJihkPSIgICIrZCsiXG4iKX1kJiYoYS5zZWxlY3RvciYmKGMrPWEuc2VsZWN0b3IrIiB7XG4iKSxjKz1kLGEuc2VsZWN0b3ImJihjKz0ifVxuXG4iKSk7cmV0dXJuIGN9CnZhciAkZj0xLFlmPTcsV2Y9NCxaZj0xRTMsUmY9L1wvXCpbXipdKlwqKyhbXi8qXVteKl0qXCorKSpcLy9naW0sU2Y9L0BpbXBvcnRbXjtdKjsvZ2ltLGJnPS8oPzpeW147XC1cc31dKyk/LS1bXjt7fV0qPzpbXnt9O10qPyg/Ols7XG5dfCQpL2dpbSxjZz0vKD86XlteO1wtXHN9XSspPy0tW147e31dKj86W157fTtdKj97W159XSo/fSg/Ols7XG5dfCQpPy9naW0sZGc9L0BhcHBseVxzKlwoP1teKTtdKlwpP1xzKig/Ols7XG5dfCQpPy9naW0sZWc9L1teOzpdKj86W147XSo/dmFyXChbXjtdKlwpKD86Wztcbl18JCk/L2dpbSxYZj0vXkBbXlxzXSprZXlmcmFtZXMvLFZmPS9ccysvZzt2YXIgVT0hKHdpbmRvdy5TaGFkeURPTSYmd2luZG93LlNoYWR5RE9NLmluVXNlKSxmZztmdW5jdGlvbiBnZyhhKXtmZz1hJiZhLnNoaW1jc3Nwcm9wZXJ0aWVzPyExOlV8fCEobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQXBwbGVXZWJLaXRcLzYwMXxFZGdlXC8xNS8pfHwhd2luZG93LkNTU3x8IUNTUy5zdXBwb3J0c3x8IUNTUy5zdXBwb3J0cygiYm94LXNoYWRvdyIsIjAgMCAwIHZhcigtLWZvbykiKSl9dmFyIGhnO3dpbmRvdy5TaGFkeUNTUyYmdm9pZCAwIT09d2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkJiYoaGc9d2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkKTt2YXIgaWc9ISghd2luZG93LlNoYWR5Q1NTfHwhd2luZG93LlNoYWR5Q1NTLmRpc2FibGVSdW50aW1lKTsKd2luZG93LlNoYWR5Q1NTJiZ2b2lkIDAhPT13aW5kb3cuU2hhZHlDU1MubmF0aXZlQ3NzP2ZnPXdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3M6d2luZG93LlNoYWR5Q1NTPyhnZyh3aW5kb3cuU2hhZHlDU1MpLHdpbmRvdy5TaGFkeUNTUz12b2lkIDApOmdnKHdpbmRvdy5XZWJDb21wb25lbnRzJiZ3aW5kb3cuV2ViQ29tcG9uZW50cy5mbGFncyk7dmFyIFY9Zmc7dmFyIGpnPS8oPzpefFs7XHN7XVxzKikoLS1bXHctXSo/KVxzKjpccyooPzooKD86Jyg/OlxcJ3wuKSo/J3wiKD86XFwifC4pKj8ifFwoW14pXSo/XCl8W159O3tdKSspfFx7KFtefV0qKVx9KD86KD89Wztcc31dKXwkKSkvZ2ksa2c9Lyg/Ol58XFcrKUBhcHBseVxzKlwoPyhbXik7XG5dKilcKT8vZ2ksbGc9LygtLVtcdy1dKylccyooWzosOyldfCQpL2dpLG1nPS8oYW5pbWF0aW9uXHMqOil8KGFuaW1hdGlvbi1uYW1lXHMqOikvLG5nPS9AbWVkaWFccyguKikvLG9nPS9ce1tefV0qXH0vZzt2YXIgcGc9bmV3IFNldDtmdW5jdGlvbiBxZyhhLGIpe2lmKCFhKXJldHVybiIiOyJzdHJpbmciPT09dHlwZW9mIGEmJihhPVFmKGEpKTtiJiZzZyhhLGIpO3JldHVybiBhZyhhLFYpfWZ1bmN0aW9uIHRnKGEpeyFhLl9fY3NzUnVsZXMmJmEudGV4dENvbnRlbnQmJihhLl9fY3NzUnVsZXM9UWYoYS50ZXh0Q29udGVudCkpO3JldHVybiBhLl9fY3NzUnVsZXN8fG51bGx9ZnVuY3Rpb24gdWcoYSl7cmV0dXJuISFhLnBhcmVudCYmYS5wYXJlbnQudHlwZT09PVlmfWZ1bmN0aW9uIHNnKGEsYixjLGQpe2lmKGEpe3ZhciBlPSExLGY9YS50eXBlO2lmKGQmJmY9PT1XZil7dmFyIGc9YS5zZWxlY3Rvci5tYXRjaChuZyk7ZyYmKHdpbmRvdy5tYXRjaE1lZGlhKGdbMV0pLm1hdGNoZXN8fChlPSEwKSl9Zj09PSRmP2IoYSk6YyYmZj09PVlmP2MoYSk6Zj09PVpmJiYoZT0hMCk7aWYoKGE9YS5ydWxlcykmJiFlKWZvcihlPTAsZj1hLmxlbmd0aCxnPXZvaWQgMDtlPGYmJihnPWFbZV0pO2UrKylzZyhnLGIsYyxkKX19CmZ1bmN0aW9uIHZnKGEsYixjLGQpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7YiYmZS5zZXRBdHRyaWJ1dGUoInNjb3BlIixiKTtlLnRleHRDb250ZW50PWE7d2coZSxjLGQpO3JldHVybiBlfXZhciB4Zz1udWxsO2Z1bmN0aW9uIHlnKGEpe2E9ZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgiIFNoYWR5IERPTSBzdHlsZXMgZm9yICIrYSsiICIpO3ZhciBiPWRvY3VtZW50LmhlYWQ7Yi5pbnNlcnRCZWZvcmUoYSwoeGc/eGcubmV4dFNpYmxpbmc6bnVsbCl8fGIuZmlyc3RDaGlsZCk7cmV0dXJuIHhnPWF9ZnVuY3Rpb24gd2coYSxiLGMpe2I9Ynx8ZG9jdW1lbnQuaGVhZDtiLmluc2VydEJlZm9yZShhLGMmJmMubmV4dFNpYmxpbmd8fGIuZmlyc3RDaGlsZCk7eGc/YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih4Zyk9PT1Ob2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORyYmKHhnPWEpOnhnPWF9CmZ1bmN0aW9uIHpnKGEsYil7Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtiPGQ7YisrKWlmKCIoIj09PWFbYl0pYysrO2Vsc2UgaWYoIikiPT09YVtiXSYmMD09PS0tYylyZXR1cm4gYjtyZXR1cm4tMX1mdW5jdGlvbiBBZyhhLGIpe3ZhciBjPWEuaW5kZXhPZigidmFyKCIpO2lmKC0xPT09YylyZXR1cm4gYihhLCIiLCIiLCIiKTt2YXIgZD16ZyhhLGMrMyksZT1hLnN1YnN0cmluZyhjKzQsZCk7Yz1hLnN1YnN0cmluZygwLGMpO2E9QWcoYS5zdWJzdHJpbmcoZCsxKSxiKTtkPWUuaW5kZXhPZigiLCIpO3JldHVybi0xPT09ZD9iKGMsZS50cmltKCksIiIsYSk6YihjLGUuc3Vic3RyaW5nKDAsZCkudHJpbSgpLGUuc3Vic3RyaW5nKGQrMSkudHJpbSgpLGEpfWZ1bmN0aW9uIEJnKGEsYil7VT9hLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpOndpbmRvdy5TaGFkeURPTS5uYXRpdmVNZXRob2RzLnNldEF0dHJpYnV0ZS5jYWxsKGEsImNsYXNzIixiKX0KdmFyIENnPXdpbmRvdy5TaGFkeURPTSYmd2luZG93LlNoYWR5RE9NLndyYXB8fGZ1bmN0aW9uKGEpe3JldHVybiBhfTtmdW5jdGlvbiBEZyhhKXt2YXIgYj1hLmxvY2FsTmFtZSxjPSIiO2I/LTE8Yi5pbmRleE9mKCItIil8fChjPWIsYj1hLmdldEF0dHJpYnV0ZSYmYS5nZXRBdHRyaWJ1dGUoImlzIil8fCIiKTooYj1hLmlzLGM9YS5leHRlbmRzKTtyZXR1cm57aXM6YixjYTpjfX1mdW5jdGlvbiBFZyhhKXtmb3IodmFyIGI9W10sYz0iIixkPTA7MDw9ZCYmZDxhLmxlbmd0aDtkKyspaWYoIigiPT09YVtkXSl7dmFyIGU9emcoYSxkKTtjKz1hLnNsaWNlKGQsZSsxKTtkPWV9ZWxzZSIsIj09PWFbZF0/KGIucHVzaChjKSxjPSIiKTpjKz1hW2RdO2MmJmIucHVzaChjKTtyZXR1cm4gYn0KZnVuY3Rpb24gRmcoYSl7aWYodm9pZCAwIT09aGcpcmV0dXJuIGhnO2lmKHZvaWQgMD09PWEuX19jc3NCdWlsZCl7dmFyIGI9YS5nZXRBdHRyaWJ1dGUoImNzcy1idWlsZCIpO2lmKGIpYS5fX2Nzc0J1aWxkPWI7ZWxzZXthOntiPSJ0ZW1wbGF0ZSI9PT1hLmxvY2FsTmFtZT9hLmNvbnRlbnQuZmlyc3RDaGlsZDphLmZpcnN0Q2hpbGQ7aWYoYiBpbnN0YW5jZW9mIENvbW1lbnQmJihiPWIudGV4dENvbnRlbnQudHJpbSgpLnNwbGl0KCI6IiksImNzcy1idWlsZCI9PT1iWzBdKSl7Yj1iWzFdO2JyZWFrIGF9Yj0iIn1pZigiIiE9PWIpe3ZhciBjPSJ0ZW1wbGF0ZSI9PT1hLmxvY2FsTmFtZT9hLmNvbnRlbnQuZmlyc3RDaGlsZDphLmZpcnN0Q2hpbGQ7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpfWEuX19jc3NCdWlsZD1ifX1yZXR1cm4gYS5fX2Nzc0J1aWxkfHwiIn0KZnVuY3Rpb24gR2coYSl7YT12b2lkIDA9PT1hPyIiOmE7cmV0dXJuIiIhPT1hJiZWP1U/InNoYWRvdyI9PT1hOiJzaGFkeSI9PT1hOiExfTtmdW5jdGlvbiBIZygpe31mdW5jdGlvbiBJZyhhLGIpe0pnKEtnLGEsZnVuY3Rpb24oYyl7TGcoYyxifHwiIil9KX1mdW5jdGlvbiBKZyhhLGIsYyl7Yi5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiZjKGIpO3ZhciBkOyJ0ZW1wbGF0ZSI9PT1iLmxvY2FsTmFtZT9kPShiLmNvbnRlbnR8fGIuX2NvbnRlbnR8fGIpLmNoaWxkTm9kZXM6ZD1iLmNoaWxkcmVufHxiLmNoaWxkTm9kZXM7aWYoZClmb3IoYj0wO2I8ZC5sZW5ndGg7YisrKUpnKGEsZFtiXSxjKX0KZnVuY3Rpb24gTGcoYSxiLGMpe2lmKGIpaWYoYS5jbGFzc0xpc3QpYz8oYS5jbGFzc0xpc3QucmVtb3ZlKCJzdHlsZS1zY29wZSIpLGEuY2xhc3NMaXN0LnJlbW92ZShiKSk6KGEuY2xhc3NMaXN0LmFkZCgic3R5bGUtc2NvcGUiKSxhLmNsYXNzTGlzdC5hZGQoYikpO2Vsc2UgaWYoYS5nZXRBdHRyaWJ1dGUpe3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpO2M/ZCYmKGI9ZC5yZXBsYWNlKCJzdHlsZS1zY29wZSIsIiIpLnJlcGxhY2UoYiwiIiksQmcoYSxiKSk6QmcoYSwoZD9kKyIgIjoiIikrInN0eWxlLXNjb3BlICIrYil9fWZ1bmN0aW9uIE1nKGEsYixjKXtKZyhLZyxhLGZ1bmN0aW9uKGQpe0xnKGQsYiwhMCk7TGcoZCxjKX0pfWZ1bmN0aW9uIE5nKGEsYil7SmcoS2csYSxmdW5jdGlvbihjKXtMZyhjLGJ8fCIiLCEwKX0pfQpmdW5jdGlvbiBPZyhhLGIsYyxkLGUpe3ZhciBmPUtnO2U9dm9pZCAwPT09ZT8iIjplOyIiPT09ZSYmKFV8fCJzaGFkeSI9PT0odm9pZCAwPT09ZD8iIjpkKT9lPXFnKGIsYyk6KGE9RGcoYSksZT1QZyhmLGIsYS5pcyxhLmNhLGMpKyJcblxuIikpO3JldHVybiBlLnRyaW0oKX1mdW5jdGlvbiBQZyhhLGIsYyxkLGUpe3ZhciBmPVFnKGMsZCk7Yz1jPyIuIitjOiIiO3JldHVybiBxZyhiLGZ1bmN0aW9uKGcpe2cuY3x8KGcuc2VsZWN0b3I9Zy53PVJnKGEsZyxhLmIsYyxmKSxnLmM9ITApO2UmJmUoZyxjLGYpfSl9ZnVuY3Rpb24gUWcoYSxiKXtyZXR1cm4gYj8iW2lzPSIrYSsiXSI6YX0KZnVuY3Rpb24gUmcoYSxiLGMsZCxlKXt2YXIgZj1FZyhiLnNlbGVjdG9yKTtpZighdWcoYikpe2I9MDtmb3IodmFyIGc9Zi5sZW5ndGgsaD12b2lkIDA7YjxnJiYoaD1mW2JdKTtiKyspZltiXT1jLmNhbGwoYSxoLGQsZSl9cmV0dXJuIGYuZmlsdGVyKGZ1bmN0aW9uKGspe3JldHVybiEha30pLmpvaW4oIiwiKX1mdW5jdGlvbiBTZyhhKXtyZXR1cm4gYS5yZXBsYWNlKFRnLGZ1bmN0aW9uKGIsYyxkKXstMTxkLmluZGV4T2YoIisiKT9kPWQucmVwbGFjZSgvXCsvZywiX19fIik6LTE8ZC5pbmRleE9mKCJfX18iKSYmKGQ9ZC5yZXBsYWNlKC9fX18vZywiKyIpKTtyZXR1cm4iOiIrYysiKCIrZCsiKSJ9KX0KZnVuY3Rpb24gVWcoYSl7Zm9yKHZhciBiPVtdLGM7Yz1hLm1hdGNoKFZnKTspe3ZhciBkPWMuaW5kZXgsZT16ZyhhLGQpO2lmKC0xPT09ZSl0aHJvdyBFcnJvcihjLmlucHV0KyIgc2VsZWN0b3IgbWlzc2luZyAnKSciKTtjPWEuc2xpY2UoZCxlKzEpO2E9YS5yZXBsYWNlKGMsIlx1ZTAwMCIpO2IucHVzaChjKX1yZXR1cm57d2E6YSxtYXRjaGVzOmJ9fWZ1bmN0aW9uIFdnKGEsYil7dmFyIGM9YS5zcGxpdCgiXHVlMDAwIik7cmV0dXJuIGIucmVkdWNlKGZ1bmN0aW9uKGQsZSxmKXtyZXR1cm4gZCtlK2NbZisxXX0sY1swXSl9CkhnLnByb3RvdHlwZS5iPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD0hMTthPWEudHJpbSgpO3ZhciBlPVRnLnRlc3QoYSk7ZSYmKGE9YS5yZXBsYWNlKFRnLGZ1bmN0aW9uKGgsayxsKXtyZXR1cm4iOiIraysiKCIrbC5yZXBsYWNlKC9ccy9nLCIiKSsiKSJ9KSxhPVNnKGEpKTt2YXIgZj1WZy50ZXN0KGEpO2lmKGYpe3ZhciBnPVVnKGEpO2E9Zy53YTtnPWcubWF0Y2hlc31hPWEucmVwbGFjZShYZywiOmhvc3QgJDEiKTthPWEucmVwbGFjZShZZyxmdW5jdGlvbihoLGssbCl7ZHx8KGg9WmcobCxrLGIsYyksZD1kfHxoLnN0b3Asaz1oLlFhLGw9aC52YWx1ZSk7cmV0dXJuIGsrbH0pO2YmJihhPVdnKGEsZykpO2UmJihhPVNnKGEpKTtyZXR1cm4gYT1hLnJlcGxhY2UoJGcsZnVuY3Rpb24oaCxrLGwsbSl7cmV0dXJuJ1tkaXI9IicrbCsnIl0gJytrK20rIiwgIitrKydbZGlyPSInK2wrJyJdJyttfSl9OwpmdW5jdGlvbiBaZyhhLGIsYyxkKXt2YXIgZT1hLmluZGV4T2YoIjo6c2xvdHRlZCIpOzA8PWEuaW5kZXhPZigiOmhvc3QiKT9hPWFoKGEsZCk6MCE9PWUmJihhPWM/YmgoYSxjKTphKTtjPSExOzA8PWUmJihiPSIiLGM9ITApO2lmKGMpe3ZhciBmPSEwO2MmJihhPWEucmVwbGFjZShjaCxmdW5jdGlvbihnLGgpe3JldHVybiIgPiAiK2h9KSl9cmV0dXJue3ZhbHVlOmEsUWE6YixzdG9wOmZ9fWZ1bmN0aW9uIGJoKGEsYil7YT1hLnNwbGl0KC8oXFsuKz9cXSkvKTtmb3IodmFyIGM9W10sZD0wO2Q8YS5sZW5ndGg7ZCsrKWlmKDE9PT1kJTIpYy5wdXNoKGFbZF0pO2Vsc2V7dmFyIGU9YVtkXTtpZigiIiE9PWV8fGQhPT1hLmxlbmd0aC0xKWU9ZS5zcGxpdCgiOiIpLGVbMF0rPWIsYy5wdXNoKGUuam9pbigiOiIpKX1yZXR1cm4gYy5qb2luKCIiKX0KZnVuY3Rpb24gYWgoYSxiKXt2YXIgYz1hLm1hdGNoKGRoKTtyZXR1cm4oYz1jJiZjWzJdLnRyaW0oKXx8IiIpP2NbMF0ubWF0Y2goZWgpP2EucmVwbGFjZShkaCxmdW5jdGlvbihkLGUsZil7cmV0dXJuIGIrZn0pOmMuc3BsaXQoZWgpWzBdPT09Yj9jOiJzaG91bGRfbm90X21hdGNoIjphLnJlcGxhY2UoIjpob3N0IixiKX1mdW5jdGlvbiBmaChhKXsiOnJvb3QiPT09YS5zZWxlY3RvciYmKGEuc2VsZWN0b3I9Imh0bWwiKX1IZy5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXtyZXR1cm4gYS5tYXRjaCgiOmhvc3QiKT8iIjphLm1hdGNoKCI6OnNsb3R0ZWQiKT90aGlzLmIoYSwiOm5vdCguc3R5bGUtc2NvcGUpIik6YmgoYS50cmltKCksIjpub3QoLnN0eWxlLXNjb3BlKSIpfTtjYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhIZy5wcm90b3R5cGUse2E6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiJzdHlsZS1zY29wZSJ9fX0pOwp2YXIgVGc9LzoobnRoWy1cd10rKVwoKFteKV0rKVwpLyxZZz0vKF58W1xzPit+XSspKCg/OlxbLis/XF18W15ccz4rfj1bXSkrKS9nLGVoPS9bWy46IypdLyxYZz0vXig6OnNsb3R0ZWQpLyxkaD0vKDpob3N0KSg/OlwoKCg/OlwoW14pKF0qXCl8W14pKF0qKSs/KVwpKS8sY2g9Lyg/Ojo6c2xvdHRlZCkoPzpcKCgoPzpcKFteKShdKlwpfFteKShdKikrPylcKSkvLCRnPS8oLiopOmRpclwoKD86KGx0cnxydGwpKVwpKC4qKS8sVmc9LzooPzptYXRjaGVzfGFueXwtKD86d2Via2l0fG1veiktYW55KS8sS2c9bmV3IEhnO2Z1bmN0aW9uIGdoKGEsYixjLGQsZSl7dGhpcy5IPWF8fG51bGw7dGhpcy5iPWJ8fG51bGw7dGhpcy50YT1jfHxbXTt0aGlzLkY9bnVsbDt0aGlzLmNzc0J1aWxkPWV8fCIiO3RoaXMuY2E9ZHx8IiI7dGhpcy5hPXRoaXMuRz10aGlzLkw9bnVsbH1mdW5jdGlvbiBoaChhKXtyZXR1cm4gYT9hLl9fc3R5bGVJbmZvOm51bGx9ZnVuY3Rpb24gaWgoYSxiKXtyZXR1cm4gYS5fX3N0eWxlSW5mbz1ifWdoLnByb3RvdHlwZS5jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSH07Z2gucHJvdG90eXBlLl9nZXRTdHlsZVJ1bGVzPWdoLnByb3RvdHlwZS5jO2Z1bmN0aW9uIGpoKGEpe3ZhciBiPXRoaXMubWF0Y2hlc3x8dGhpcy5tYXRjaGVzU2VsZWN0b3J8fHRoaXMubW96TWF0Y2hlc1NlbGVjdG9yfHx0aGlzLm1zTWF0Y2hlc1NlbGVjdG9yfHx0aGlzLm9NYXRjaGVzU2VsZWN0b3J8fHRoaXMud2Via2l0TWF0Y2hlc1NlbGVjdG9yO3JldHVybiBiJiZiLmNhbGwodGhpcyxhKX12YXIga2g9Lzpob3N0XHMqPlxzKi8sbGg9bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgiVHJpZGVudCIpO2Z1bmN0aW9uIG1oKCl7fWZ1bmN0aW9uIG5oKGEpe3ZhciBiPXt9LGM9W10sZD0wO3NnKGEsZnVuY3Rpb24oZil7b2goZik7Zi5pbmRleD1kKys7Zj1mLnYuY3NzVGV4dDtmb3IodmFyIGc7Zz1sZy5leGVjKGYpOyl7dmFyIGg9Z1sxXTsiOiIhPT1nWzJdJiYoYltoXT0hMCl9fSxmdW5jdGlvbihmKXtjLnB1c2goZil9KTthLmI9YzthPVtdO2Zvcih2YXIgZSBpbiBiKWEucHVzaChlKTtyZXR1cm4gYX0KZnVuY3Rpb24gb2goYSl7aWYoIWEudil7dmFyIGI9e30sYz17fTtwaChhLGMpJiYoYi5LPWMsYS5ydWxlcz1udWxsKTtiLmNzc1RleHQ9YS5wYXJzZWRDc3NUZXh0LnJlcGxhY2Uob2csIiIpLnJlcGxhY2UoamcsIiIpO2Eudj1ifX1mdW5jdGlvbiBwaChhLGIpe3ZhciBjPWEudjtpZihjKXtpZihjLkspcmV0dXJuIE9iamVjdC5hc3NpZ24oYixjLkspLCEwfWVsc2V7Yz1hLnBhcnNlZENzc1RleHQ7Zm9yKHZhciBkO2E9amcuZXhlYyhjKTspe2Q9KGFbMl18fGFbM10pLnRyaW0oKTtpZigiaW5oZXJpdCIhPT1kfHwidW5zZXQiIT09ZCliW2FbMV0udHJpbSgpXT1kO2Q9ITB9cmV0dXJuIGR9fQpmdW5jdGlvbiBxaChhLGIsYyl7YiYmKGI9MDw9Yi5pbmRleE9mKCI7Iik/cmgoYSxiLGMpOkFnKGIsZnVuY3Rpb24oZCxlLGYsZyl7aWYoIWUpcmV0dXJuIGQrZzsoZT1xaChhLGNbZV0sYykpJiYiaW5pdGlhbCIhPT1lPyJhcHBseS1zaGltLWluaGVyaXQiPT09ZSYmKGU9ImluaGVyaXQiKTplPXFoKGEsY1tmXXx8ZixjKXx8ZjtyZXR1cm4gZCsoZXx8IiIpK2d9KSk7cmV0dXJuIGImJmIudHJpbSgpfHwiIn0KZnVuY3Rpb24gcmgoYSxiLGMpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgZD0wLGUsZjtkPGIubGVuZ3RoO2QrKylpZihlPWJbZF0pe2tnLmxhc3RJbmRleD0wO2lmKGY9a2cuZXhlYyhlKSllPXFoKGEsY1tmWzFdXSxjKTtlbHNlIGlmKGY9ZS5pbmRleE9mKCI6IiksLTEhPT1mKXt2YXIgZz1lLnN1YnN0cmluZyhmKTtnPWcudHJpbSgpO2c9cWgoYSxnLGMpfHxnO2U9ZS5zdWJzdHJpbmcoMCxmKStnfWJbZF09ZSYmZS5sYXN0SW5kZXhPZigiOyIpPT09ZS5sZW5ndGgtMT9lLnNsaWNlKDAsLTEpOmV8fCIifXJldHVybiBiLmpvaW4oIjsiKX0KZnVuY3Rpb24gc2goYSxiKXt2YXIgYz17fSxkPVtdO3NnKGEsZnVuY3Rpb24oZSl7ZS52fHxvaChlKTt2YXIgZj1lLnd8fGUucGFyc2VkU2VsZWN0b3I7YiYmZS52LksmJmYmJmpoLmNhbGwoYixmKSYmKHBoKGUsYyksZT1lLmluZGV4LGY9cGFyc2VJbnQoZS8zMiwxMCksZFtmXT0oZFtmXXx8MCl8MTw8ZSUzMil9LG51bGwsITApO3JldHVybntLOmMsa2V5OmR9fQpmdW5jdGlvbiB0aChhLGIsYyxkKXtiLnZ8fG9oKGIpO2lmKGIudi5LKXt2YXIgZT1EZyhhKTthPWUuaXM7ZT1lLmNhO2U9YT9RZyhhLGUpOiJodG1sIjt2YXIgZj1iLnBhcnNlZFNlbGVjdG9yO3ZhciBnPSEhZi5tYXRjaChraCl8fCJodG1sIj09PWUmJi0xPGYuaW5kZXhPZigiaHRtbCIpO3ZhciBoPTA9PT1mLmluZGV4T2YoIjpob3N0IikmJiFnOyJzaGFkeSI9PT1jJiYoZz1mPT09ZSsiID4gKi4iK2V8fC0xIT09Zi5pbmRleE9mKCJodG1sIiksaD0hZyYmMD09PWYuaW5kZXhPZihlKSk7aWYoZ3x8aCljPWUsaCYmKGIud3x8KGIudz1SZyhLZyxiLEtnLmIsYT8iLiIrYToiIixlKSksYz1iLnd8fGUpLGcmJiJodG1sIj09PWUmJihjPWIud3x8Yi5KKSxkKHt3YTpjLFhhOmgsbWI6Z30pfX0KZnVuY3Rpb24gdWgoYSxiLGMpe3ZhciBkPXt9LGU9e307c2coYixmdW5jdGlvbihmKXt0aChhLGYsYyxmdW5jdGlvbihnKXtqaC5jYWxsKGEuX2VsZW1lbnR8fGEsZy53YSkmJihnLlhhP3BoKGYsZCk6cGgoZixlKSl9KX0sbnVsbCwhMCk7cmV0dXJue2NiOmUsVmE6ZH19CmZ1bmN0aW9uIHZoKGEsYixjLGQpe3ZhciBlPURnKGIpLGY9UWcoZS5pcyxlLmNhKSxnPW5ldyBSZWdFeHAoIig/Ol58W14uI1s6XSkiKyhiLmV4dGVuZHM/IlxcIitmLnNsaWNlKDAsLTEpKyJcXF0iOmYpKyIoJHxbLjpbXFxzPit+XSkiKSxoPWhoKGIpO2U9aC5IO2g9aC5jc3NCdWlsZDt2YXIgaz13aChlLGQpO3JldHVybiBPZyhiLGUsZnVuY3Rpb24obCl7dmFyIG09IiI7bC52fHxvaChsKTtsLnYuY3NzVGV4dCYmKG09cmgoYSxsLnYuY3NzVGV4dCxjKSk7bC5jc3NUZXh0PW07aWYoIVUmJiF1ZyhsKSYmbC5jc3NUZXh0KXt2YXIgcT1tPWwuY3NzVGV4dDtudWxsPT1sLkRhJiYobC5EYT1tZy50ZXN0KG0pKTtpZihsLkRhKWlmKG51bGw9PWwua2Epe2wua2E9W107Zm9yKHZhciBIIGluIGspcT1rW0hdLHE9cShtKSxtIT09cSYmKG09cSxsLmthLnB1c2goSCkpfWVsc2V7Zm9yKEg9MDtIPGwua2EubGVuZ3RoOysrSClxPWtbbC5rYVtIXV0sbT1xKG0pO3E9bX1sLmNzc1RleHQ9cTtsLnc9Cmwud3x8bC5zZWxlY3RvcjttPSIuIitkO0g9RWcobC53KTtxPTA7Zm9yKHZhciBDPUgubGVuZ3RoLHQ9dm9pZCAwO3E8QyYmKHQ9SFtxXSk7cSsrKUhbcV09dC5tYXRjaChnKT90LnJlcGxhY2UoZixtKTptKyIgIit0O2wuc2VsZWN0b3I9SC5qb2luKCIsIil9fSxoKX1mdW5jdGlvbiB3aChhLGIpe2E9YS5iO3ZhciBjPXt9O2lmKCFVJiZhKWZvcih2YXIgZD0wLGU9YVtkXTtkPGEubGVuZ3RoO2U9YVsrK2RdKXt2YXIgZj1lLGc9YjtmLmw9bmV3IFJlZ0V4cCgiXFxiIitmLmtleWZyYW1lc05hbWUrIig/IVxcQnwtKSIsImciKTtmLmE9Zi5rZXlmcmFtZXNOYW1lKyItIitnO2Yudz1mLnd8fGYuc2VsZWN0b3I7Zi5zZWxlY3Rvcj1mLncucmVwbGFjZShmLmtleWZyYW1lc05hbWUsZi5hKTtjW2Uua2V5ZnJhbWVzTmFtZV09eGgoZSl9cmV0dXJuIGN9ZnVuY3Rpb24geGgoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBiLnJlcGxhY2UoYS5sLGEuYSl9fQpmdW5jdGlvbiB5aChhLGIpe3ZhciBjPXpoLGQ9dGcoYSk7YS50ZXh0Q29udGVudD1xZyhkLGZ1bmN0aW9uKGUpe3ZhciBmPWUuY3NzVGV4dD1lLnBhcnNlZENzc1RleHQ7ZS52JiZlLnYuY3NzVGV4dCYmKGY9Zi5yZXBsYWNlKGJnLCIiKS5yZXBsYWNlKGNnLCIiKSxlLmNzc1RleHQ9cmgoYyxmLGIpKX0pfWNhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG1oLnByb3RvdHlwZSx7YTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIngtc2NvcGUifX19KTt2YXIgemg9bmV3IG1oO3ZhciBBaD17fSxCaD13aW5kb3cuY3VzdG9tRWxlbWVudHM7aWYoQmgmJiFVJiYhaWcpe3ZhciBDaD1CaC5kZWZpbmU7QmguZGVmaW5lPWZ1bmN0aW9uKGEsYixjKXtBaFthXXx8KEFoW2FdPXlnKGEpKTtDaC5jYWxsKEJoLGEsYixjKX19O2Z1bmN0aW9uIERoKCl7dGhpcy5jYWNoZT17fX1EaC5wcm90b3R5cGUuc3RvcmU9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9dGhpcy5jYWNoZVthXXx8W107ZS5wdXNoKHtLOmIsc3R5bGVFbGVtZW50OmMsRzpkfSk7MTAwPGUubGVuZ3RoJiZlLnNoaWZ0KCk7dGhpcy5jYWNoZVthXT1lfTtmdW5jdGlvbiBFaCgpe312YXIgRmg9bmV3IFJlZ0V4cChLZy5hKyJcXHMqKFteXFxzXSopIik7ZnVuY3Rpb24gR2goYSl7cmV0dXJuKGE9KGEuY2xhc3NMaXN0JiZhLmNsYXNzTGlzdC52YWx1ZT9hLmNsYXNzTGlzdC52YWx1ZTphLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpLm1hdGNoKEZoKSk/YVsxXToiIn1mdW5jdGlvbiBIaChhKXt2YXIgYj1DZyhhKS5nZXRSb290Tm9kZSgpO3JldHVybiBiPT09YXx8Yj09PWEub3duZXJEb2N1bWVudD8iIjooYT1iLmhvc3QpP0RnKGEpLmlzOiIifQpmdW5jdGlvbiBJaChhKXtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXTtpZihjLnRhcmdldCE9PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmYy50YXJnZXQhPT1kb2N1bWVudC5oZWFkKWZvcih2YXIgZD0wO2Q8Yy5hZGRlZE5vZGVzLmxlbmd0aDtkKyspe3ZhciBlPWMuYWRkZWROb2Rlc1tkXTtpZihlLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe3ZhciBmPWUuZ2V0Um9vdE5vZGUoKSxnPUdoKGUpO2lmKGcmJmY9PT1lLm93bmVyRG9jdW1lbnQmJigic3R5bGUiIT09ZS5sb2NhbE5hbWUmJiJ0ZW1wbGF0ZSIhPT1lLmxvY2FsTmFtZXx8IiI9PT1GZyhlKSkpTmcoZSxnKTtlbHNlIGlmKGYgaW5zdGFuY2VvZiBTaGFkb3dSb290KWZvcihmPUhoKGUpLGYhPT1nJiZNZyhlLGcsZiksZT13aW5kb3cuU2hhZHlET00ubmF0aXZlTWV0aG9kcy5xdWVyeVNlbGVjdG9yQWxsLmNhbGwoZSwiOm5vdCguIitLZy5hKyIpIiksZz0wO2c8ZS5sZW5ndGg7ZysrKXtmPWVbZ107CnZhciBoPUhoKGYpO2gmJkxnKGYsaCl9fX19fQppZighKFV8fHdpbmRvdy5TaGFkeURPTSYmd2luZG93LlNoYWR5RE9NLmhhbmRsZXNEeW5hbWljU2NvcGluZykpe3ZhciBKaD1uZXcgTXV0YXRpb25PYnNlcnZlcihJaCksS2g9ZnVuY3Rpb24oYSl7Smgub2JzZXJ2ZShhLHtjaGlsZExpc3Q6ITAsc3VidHJlZTohMH0pfTtpZih3aW5kb3cuY3VzdG9tRWxlbWVudHMmJiF3aW5kb3cuY3VzdG9tRWxlbWVudHMucG9seWZpbGxXcmFwRmx1c2hDYWxsYmFjaylLaChkb2N1bWVudCk7ZWxzZXt2YXIgTGg9ZnVuY3Rpb24oKXtLaChkb2N1bWVudC5ib2R5KX07d2luZG93LkhUTUxJbXBvcnRzP3dpbmRvdy5IVE1MSW1wb3J0cy53aGVuUmVhZHkoTGgpOnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe2lmKCJsb2FkaW5nIj09PWRvY3VtZW50LnJlYWR5U3RhdGUpe3ZhciBhPWZ1bmN0aW9uKCl7TGgoKTtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIixhKX07ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsCmEpfWVsc2UgTGgoKX0pfUVoPWZ1bmN0aW9uKCl7SWgoSmgudGFrZVJlY29yZHMoKSl9fTt2YXIgTWg9e307dmFyIE5oPVByb21pc2UucmVzb2x2ZSgpO2Z1bmN0aW9uIE9oKGEpe2lmKGE9TWhbYV0pYS5fYXBwbHlTaGltQ3VycmVudFZlcnNpb249YS5fYXBwbHlTaGltQ3VycmVudFZlcnNpb258fDAsYS5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb249YS5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb258fDAsYS5fYXBwbHlTaGltTmV4dFZlcnNpb249KGEuX2FwcGx5U2hpbU5leHRWZXJzaW9ufHwwKSsxfWZ1bmN0aW9uIFBoKGEpe3JldHVybiBhLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbj09PWEuX2FwcGx5U2hpbU5leHRWZXJzaW9ufWZ1bmN0aW9uIFFoKGEpe2EuX2FwcGx5U2hpbVZhbGlkYXRpbmdWZXJzaW9uPWEuX2FwcGx5U2hpbU5leHRWZXJzaW9uO2EuX3ZhbGlkYXRpbmd8fChhLl92YWxpZGF0aW5nPSEwLE5oLnRoZW4oZnVuY3Rpb24oKXthLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbj1hLl9hcHBseVNoaW1OZXh0VmVyc2lvbjthLl92YWxpZGF0aW5nPSExfSkpfTt2YXIgUmg9e30sU2g9bmV3IERoO2Z1bmN0aW9uIFgoKXt0aGlzLlk9e307dGhpcy5jPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudDt2YXIgYT1uZXcgUGY7YS5ydWxlcz1bXTt0aGlzLmw9aWgodGhpcy5jLG5ldyBnaChhKSk7dGhpcy5KPSExO3RoaXMuYT10aGlzLmI9bnVsbH13PVgucHJvdG90eXBlO3cuZmx1c2g9ZnVuY3Rpb24oKXtFaCgpfTt3LlRhPWZ1bmN0aW9uKGEpe3JldHVybiB0ZyhhKX07dy5oYj1mdW5jdGlvbihhKXtyZXR1cm4gcWcoYSl9O3cucHJlcGFyZVRlbXBsYXRlPWZ1bmN0aW9uKGEsYixjKXt0aGlzLnByZXBhcmVUZW1wbGF0ZURvbShhLGIpO3RoaXMucHJlcGFyZVRlbXBsYXRlU3R5bGVzKGEsYixjKX07CncucHJlcGFyZVRlbXBsYXRlU3R5bGVzPWZ1bmN0aW9uKGEsYixjKXtpZighYS5fcHJlcGFyZWQmJiFpZyl7VXx8QWhbYl18fChBaFtiXT15ZyhiKSk7YS5fcHJlcGFyZWQ9ITA7YS5uYW1lPWI7YS5leHRlbmRzPWM7TWhbYl09YTt2YXIgZD1GZyhhKSxlPUdnKGQpO2M9e2lzOmIsZXh0ZW5kczpjfTtmb3IodmFyIGY9W10sZz1hLmNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgic3R5bGUiKSxoPTA7aDxnLmxlbmd0aDtoKyspe3ZhciBrPWdbaF07aWYoay5oYXNBdHRyaWJ1dGUoInNoYWR5LXVuc2NvcGVkIikpe2lmKCFVKXt2YXIgbD1rLnRleHRDb250ZW50O2lmKCFwZy5oYXMobCkpe3BnLmFkZChsKTt2YXIgbT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO20uc2V0QXR0cmlidXRlKCJzaGFkeS11bnNjb3BlZCIsIiIpO20udGV4dENvbnRlbnQ9bDtkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKG0pfWsucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChrKX19ZWxzZSBmLnB1c2goay50ZXh0Q29udGVudCksCmsucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChrKX1mPWYuam9pbigiIikudHJpbSgpKyhSaFtiXXx8IiIpO1RoKHRoaXMpO2lmKCFlKXtpZihnPSFkKWc9a2cudGVzdChmKXx8amcudGVzdChmKSxrZy5sYXN0SW5kZXg9MCxqZy5sYXN0SW5kZXg9MDtoPVFmKGYpO2cmJlYmJnRoaXMuYiYmdGhpcy5iLnRyYW5zZm9ybVJ1bGVzKGgsYik7YS5fc3R5bGVBc3Q9aH1nPVtdO1Z8fChnPW5oKGEuX3N0eWxlQXN0KSk7aWYoIWcubGVuZ3RofHxWKWg9VT9hLmNvbnRlbnQ6bnVsbCxiPUFoW2JdfHxudWxsLGQ9T2coYyxhLl9zdHlsZUFzdCxudWxsLGQsZT9mOiIiKSxkPWQubGVuZ3RoP3ZnKGQsYy5pcyxoLGIpOm51bGwsYS5fc3R5bGU9ZDthLmE9Z319O3cuYWI9ZnVuY3Rpb24oYSxiKXtSaFtiXT1hLmpvaW4oIiAiKX07CncucHJlcGFyZVRlbXBsYXRlRG9tPWZ1bmN0aW9uKGEsYil7aWYoIWlnKXt2YXIgYz1GZyhhKTtVfHwic2hhZHkiPT09Y3x8YS5fZG9tUHJlcGFyZWR8fChhLl9kb21QcmVwYXJlZD0hMCxJZyhhLmNvbnRlbnQsYikpfX07ZnVuY3Rpb24gVWgoYSl7dmFyIGI9RGcoYSksYz1iLmlzO2I9Yi5jYTt2YXIgZD1BaFtjXXx8bnVsbCxlPU1oW2NdO2lmKGUpe2M9ZS5fc3R5bGVBc3Q7dmFyIGY9ZS5hO2U9RmcoZSk7Yj1uZXcgZ2goYyxkLGYsYixlKTtpaChhLGIpO3JldHVybiBifX0KZnVuY3Rpb24gVmgoYSl7IWEuYSYmd2luZG93LlNoYWR5Q1NTJiZ3aW5kb3cuU2hhZHlDU1MuQ3VzdG9tU3R5bGVJbnRlcmZhY2UmJihhLmE9d2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlLGEuYS50cmFuc2Zvcm1DYWxsYmFjaz1mdW5jdGlvbihiKXthLkhhKGIpfSxhLmEudmFsaWRhdGVDYWxsYmFjaz1mdW5jdGlvbigpe3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpeyhhLmEuZW5xdWV1ZWR8fGEuSikmJmEuZmx1c2hDdXN0b21TdHlsZXMoKX0pfSl9ZnVuY3Rpb24gVGgoYSl7aWYoIWEuYiYmd2luZG93LlNoYWR5Q1NTJiZ3aW5kb3cuU2hhZHlDU1MuQXBwbHlTaGltKXthLmI9d2luZG93LlNoYWR5Q1NTLkFwcGx5U2hpbTthLmIuaW52YWxpZENhbGxiYWNrPU9oO3ZhciBiPSEwfWVsc2UgYj0hMTtWaChhKTtyZXR1cm4gYn0Kdy5mbHVzaEN1c3RvbVN0eWxlcz1mdW5jdGlvbigpe2lmKCFpZyl7dmFyIGE9VGgodGhpcyk7aWYodGhpcy5hKXt2YXIgYj10aGlzLmEucHJvY2Vzc1N0eWxlcygpO2lmKChhfHx0aGlzLmEuZW5xdWV1ZWQpJiYhR2codGhpcy5sLmNzc0J1aWxkKSl7aWYoVil7aWYoIXRoaXMubC5jc3NCdWlsZClmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz10aGlzLmEuZ2V0U3R5bGVGb3JDdXN0b21TdHlsZShiW2FdKTtpZihjJiZWJiZ0aGlzLmIpe3ZhciBkPXRnKGMpO1RoKHRoaXMpO3RoaXMuYi50cmFuc2Zvcm1SdWxlcyhkKTtjLnRleHRDb250ZW50PXFnKGQpfX19ZWxzZXtXaCh0aGlzLGIpO1hoKHRoaXMsdGhpcy5jLHRoaXMubCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKykoYz10aGlzLmEuZ2V0U3R5bGVGb3JDdXN0b21TdHlsZShiW2FdKSkmJnloKGMsdGhpcy5sLkwpO3RoaXMuSiYmdGhpcy5zdHlsZURvY3VtZW50KCl9dGhpcy5hLmVucXVldWVkPSExfX19fTsKZnVuY3Rpb24gV2goYSxiKXtiPWIubWFwKGZ1bmN0aW9uKGMpe3JldHVybiBhLmEuZ2V0U3R5bGVGb3JDdXN0b21TdHlsZShjKX0pLmZpbHRlcihmdW5jdGlvbihjKXtyZXR1cm4hIWN9KTtiLnNvcnQoZnVuY3Rpb24oYyxkKXtjPWQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYyk7cmV0dXJuIGMmTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkc/MTpjJk5vZGUuRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HPy0xOjB9KTthLmwuSC5ydWxlcz1iLm1hcChmdW5jdGlvbihjKXtyZXR1cm4gdGcoYyl9KX0Kdy5zdHlsZUVsZW1lbnQ9ZnVuY3Rpb24oYSxiKXtpZihpZyl7aWYoYil7aGgoYSl8fGloKGEsbmV3IGdoKG51bGwpKTt2YXIgYz1oaChhKTtjLkY9Yy5GfHx7fTtPYmplY3QuYXNzaWduKGMuRixiKTtZaCh0aGlzLGEsYyl9fWVsc2UgaWYoYz1oaChhKXx8VWgoYSkpaWYoYSE9PXRoaXMuYyYmKHRoaXMuSj0hMCksYiYmKGMuRj1jLkZ8fHt9LE9iamVjdC5hc3NpZ24oYy5GLGIpKSxWKVloKHRoaXMsYSxjKTtlbHNlIGlmKHRoaXMuZmx1c2goKSxYaCh0aGlzLGEsYyksYy50YSYmYy50YS5sZW5ndGgpe2I9RGcoYSkuaXM7dmFyIGQ7YTp7aWYoZD1TaC5jYWNoZVtiXSlmb3IodmFyIGU9ZC5sZW5ndGgtMTswPD1lO2UtLSl7dmFyIGY9ZFtlXTtiOnt2YXIgZz1jLnRhO2Zvcih2YXIgaD0wO2g8Zy5sZW5ndGg7aCsrKXt2YXIgaz1nW2hdO2lmKGYuS1trXSE9PWMuTFtrXSl7Zz0hMTticmVhayBifX1nPSEwfWlmKGcpe2Q9ZjticmVhayBhfX1kPXZvaWQgMH1nPWQ/ZC5zdHlsZUVsZW1lbnQ6Cm51bGw7ZT1jLkc7KGY9ZCYmZC5HKXx8KGY9dGhpcy5ZW2JdPSh0aGlzLllbYl18fDApKzEsZj1iKyItIitmKTtjLkc9ZjtmPWMuRztoPXpoO2g9Zz9nLnRleHRDb250ZW50fHwiIjp2aChoLGEsYy5MLGYpO2s9aGgoYSk7dmFyIGw9ay5hO2wmJiFVJiZsIT09ZyYmKGwuX3VzZUNvdW50LS0sMD49bC5fdXNlQ291bnQmJmwucGFyZW50Tm9kZSYmbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGwpKTtVP2suYT8oay5hLnRleHRDb250ZW50PWgsZz1rLmEpOmgmJihnPXZnKGgsZixhLnNoYWRvd1Jvb3Qsay5iKSk6Zz9nLnBhcmVudE5vZGV8fChsaCYmLTE8aC5pbmRleE9mKCJAbWVkaWEiKSYmKGcudGV4dENvbnRlbnQ9aCksd2coZyxudWxsLGsuYikpOmgmJihnPXZnKGgsZixudWxsLGsuYikpO2cmJihnLl91c2VDb3VudD1nLl91c2VDb3VudHx8MCxrLmEhPWcmJmcuX3VzZUNvdW50Kyssay5hPWcpO2Y9ZztVfHwoZz1jLkcsaz1oPWEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIixlJiYoaz0KaC5yZXBsYWNlKG5ldyBSZWdFeHAoIlxccyp4LXNjb3BlXFxzKiIrZSsiXFxzKiIsImciKSwiICIpKSxrKz0oaz8iICI6IiIpKyJ4LXNjb3BlICIrZyxoIT09ayYmQmcoYSxrKSk7ZHx8U2guc3RvcmUoYixjLkwsZixjLkcpfX07CmZ1bmN0aW9uIFloKGEsYixjKXt2YXIgZD1EZyhiKS5pcztpZihjLkYpe3ZhciBlPWMuRixmO2ZvcihmIGluIGUpbnVsbD09PWY/Yi5zdHlsZS5yZW1vdmVQcm9wZXJ0eShmKTpiLnN0eWxlLnNldFByb3BlcnR5KGYsZVtmXSl9ZT1NaFtkXTtpZighKCFlJiZiIT09YS5jfHxlJiYiIiE9PUZnKGUpKSYmZSYmZS5fc3R5bGUmJiFQaChlKSl7aWYoUGgoZSl8fGUuX2FwcGx5U2hpbVZhbGlkYXRpbmdWZXJzaW9uIT09ZS5fYXBwbHlTaGltTmV4dFZlcnNpb24pVGgoYSksYS5iJiZhLmIudHJhbnNmb3JtUnVsZXMoZS5fc3R5bGVBc3QsZCksZS5fc3R5bGUudGV4dENvbnRlbnQ9T2coYixjLkgpLFFoKGUpO1UmJihhPWIuc2hhZG93Um9vdCkmJihhPWEucXVlcnlTZWxlY3Rvcigic3R5bGUiKSkmJihhLnRleHRDb250ZW50PU9nKGIsYy5IKSk7Yy5IPWUuX3N0eWxlQXN0fX0KZnVuY3Rpb24gWmgoYSxiKXtyZXR1cm4oYj1DZyhiKS5nZXRSb290Tm9kZSgpLmhvc3QpP2hoKGIpfHxVaChiKT9iOlpoKGEsYik6YS5jfWZ1bmN0aW9uIFhoKGEsYixjKXt2YXIgZD1aaChhLGIpLGU9aGgoZCksZj1lLkw7ZD09PWEuY3x8Znx8KFhoKGEsZCxlKSxmPWUuTCk7YT1PYmplY3QuY3JlYXRlKGZ8fG51bGwpO2Q9dWgoYixjLkgsYy5jc3NCdWlsZCk7Yj1zaChlLkgsYikuSztPYmplY3QuYXNzaWduKGEsZC5WYSxiLGQuY2IpO2I9Yy5GO2Zvcih2YXIgZyBpbiBiKWlmKChlPWJbZ10pfHwwPT09ZSlhW2ddPWU7Zz16aDtiPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGEpO2ZvcihlPTA7ZTxiLmxlbmd0aDtlKyspZD1iW2VdLGFbZF09cWgoZyxhW2RdLGEpO2MuTD1hfXcuc3R5bGVEb2N1bWVudD1mdW5jdGlvbihhKXt0aGlzLnN0eWxlU3VidHJlZSh0aGlzLmMsYSl9Owp3LnN0eWxlU3VidHJlZT1mdW5jdGlvbihhLGIpe3ZhciBjPUNnKGEpLGQ9Yy5zaGFkb3dSb290LGU9YT09PXRoaXMuYzsoZHx8ZSkmJnRoaXMuc3R5bGVFbGVtZW50KGEsYik7aWYoYT1lP2M6ZClmb3IoYT1BcnJheS5mcm9tKGEucXVlcnlTZWxlY3RvckFsbCgiKiIpKS5maWx0ZXIoZnVuY3Rpb24oZil7cmV0dXJuIENnKGYpLnNoYWRvd1Jvb3R9KSxiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5zdHlsZVN1YnRyZWUoYVtiXSl9Owp3LkhhPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYz1GZyhhKTtjIT09dGhpcy5sLmNzc0J1aWxkJiYodGhpcy5sLmNzc0J1aWxkPWMpO2lmKCFHZyhjKSl7dmFyIGQ9dGcoYSk7c2coZCxmdW5jdGlvbihlKXtpZihVKWZoKGUpO2Vsc2V7dmFyIGY9S2c7ZS5zZWxlY3Rvcj1lLnBhcnNlZFNlbGVjdG9yO2ZoKGUpO2Uuc2VsZWN0b3I9ZS53PVJnKGYsZSxmLmMsdm9pZCAwLHZvaWQgMCl9ViYmIiI9PT1jJiYoVGgoYiksYi5iJiZiLmIudHJhbnNmb3JtUnVsZShlKSl9KTtWP2EudGV4dENvbnRlbnQ9cWcoZCk6dGhpcy5sLkgucnVsZXMucHVzaChkKX19O3cuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlPWZ1bmN0aW9uKGEsYil7dmFyIGM7Vnx8KGM9KGhoKGEpfHxoaChaaCh0aGlzLGEpKSkuTFtiXSk7cmV0dXJuKGM9Y3x8d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkuZ2V0UHJvcGVydHlWYWx1ZShiKSk/Yy50cmltKCk6IiJ9Owp3LmdiPWZ1bmN0aW9uKGEsYil7dmFyIGM9Q2coYSkuZ2V0Um9vdE5vZGUoKSxkO2I/ZD0oInN0cmluZyI9PT10eXBlb2YgYj9iOlN0cmluZyhiKSkuc3BsaXQoL1xzLyk6ZD1bXTtiPWMuaG9zdCYmYy5ob3N0LmxvY2FsTmFtZTtpZighYiYmKGM9YS5nZXRBdHRyaWJ1dGUoImNsYXNzIikpKXtjPWMuc3BsaXQoL1xzLyk7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspaWYoY1tlXT09PUtnLmEpe2I9Y1tlKzFdO2JyZWFrfX1iJiZkLnB1c2goS2cuYSxiKTtWfHwoYj1oaChhKSkmJmIuRyYmZC5wdXNoKHpoLmEsYi5HKTtCZyhhLGQuam9pbigiICIpKX07dy5PYT1mdW5jdGlvbihhKXtyZXR1cm4gaGgoYSl9O3cuZmI9ZnVuY3Rpb24oYSxiKXtMZyhhLGIpfTt3LmliPWZ1bmN0aW9uKGEsYil7TGcoYSxiLCEwKX07dy5lYj1mdW5jdGlvbihhKXtyZXR1cm4gSGgoYSl9O3cuUmE9ZnVuY3Rpb24oYSl7cmV0dXJuIEdoKGEpfTtYLnByb3RvdHlwZS5mbHVzaD1YLnByb3RvdHlwZS5mbHVzaDsKWC5wcm90b3R5cGUucHJlcGFyZVRlbXBsYXRlPVgucHJvdG90eXBlLnByZXBhcmVUZW1wbGF0ZTtYLnByb3RvdHlwZS5zdHlsZUVsZW1lbnQ9WC5wcm90b3R5cGUuc3R5bGVFbGVtZW50O1gucHJvdG90eXBlLnN0eWxlRG9jdW1lbnQ9WC5wcm90b3R5cGUuc3R5bGVEb2N1bWVudDtYLnByb3RvdHlwZS5zdHlsZVN1YnRyZWU9WC5wcm90b3R5cGUuc3R5bGVTdWJ0cmVlO1gucHJvdG90eXBlLmdldENvbXB1dGVkU3R5bGVWYWx1ZT1YLnByb3RvdHlwZS5nZXRDb21wdXRlZFN0eWxlVmFsdWU7WC5wcm90b3R5cGUuc2V0RWxlbWVudENsYXNzPVgucHJvdG90eXBlLmdiO1gucHJvdG90eXBlLl9zdHlsZUluZm9Gb3JOb2RlPVgucHJvdG90eXBlLk9hO1gucHJvdG90eXBlLnRyYW5zZm9ybUN1c3RvbVN0eWxlRm9yRG9jdW1lbnQ9WC5wcm90b3R5cGUuSGE7WC5wcm90b3R5cGUuZ2V0U3R5bGVBc3Q9WC5wcm90b3R5cGUuVGE7WC5wcm90b3R5cGUuc3R5bGVBc3RUb1N0cmluZz1YLnByb3RvdHlwZS5oYjsKWC5wcm90b3R5cGUuZmx1c2hDdXN0b21TdHlsZXM9WC5wcm90b3R5cGUuZmx1c2hDdXN0b21TdHlsZXM7WC5wcm90b3R5cGUuc2NvcGVOb2RlPVgucHJvdG90eXBlLmZiO1gucHJvdG90eXBlLnVuc2NvcGVOb2RlPVgucHJvdG90eXBlLmliO1gucHJvdG90eXBlLnNjb3BlRm9yTm9kZT1YLnByb3RvdHlwZS5lYjtYLnByb3RvdHlwZS5jdXJyZW50U2NvcGVGb3JOb2RlPVgucHJvdG90eXBlLlJhO1gucHJvdG90eXBlLnByZXBhcmVBZG9wdGVkQ3NzVGV4dD1YLnByb3RvdHlwZS5hYjtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhYLnByb3RvdHlwZSx7bmF0aXZlU2hhZG93OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVX19LG5hdGl2ZUNzczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFZ9fX0pO3ZhciBZPW5ldyBYLCRoLGFpO3dpbmRvdy5TaGFkeUNTUyYmKCRoPXdpbmRvdy5TaGFkeUNTUy5BcHBseVNoaW0sYWk9d2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlKTsKd2luZG93LlNoYWR5Q1NTPXtTY29waW5nU2hpbTpZLHByZXBhcmVUZW1wbGF0ZTpmdW5jdGlvbihhLGIsYyl7WS5mbHVzaEN1c3RvbVN0eWxlcygpO1kucHJlcGFyZVRlbXBsYXRlKGEsYixjKX0scHJlcGFyZVRlbXBsYXRlRG9tOmZ1bmN0aW9uKGEsYil7WS5wcmVwYXJlVGVtcGxhdGVEb20oYSxiKX0scHJlcGFyZVRlbXBsYXRlU3R5bGVzOmZ1bmN0aW9uKGEsYixjKXtZLmZsdXNoQ3VzdG9tU3R5bGVzKCk7WS5wcmVwYXJlVGVtcGxhdGVTdHlsZXMoYSxiLGMpfSxzdHlsZVN1YnRyZWU6ZnVuY3Rpb24oYSxiKXtZLmZsdXNoQ3VzdG9tU3R5bGVzKCk7WS5zdHlsZVN1YnRyZWUoYSxiKX0sc3R5bGVFbGVtZW50OmZ1bmN0aW9uKGEpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTtZLnN0eWxlRWxlbWVudChhKX0sc3R5bGVEb2N1bWVudDpmdW5jdGlvbihhKXtZLmZsdXNoQ3VzdG9tU3R5bGVzKCk7WS5zdHlsZURvY3VtZW50KGEpfSxmbHVzaEN1c3RvbVN0eWxlczpmdW5jdGlvbigpe1kuZmx1c2hDdXN0b21TdHlsZXMoKX0sCmdldENvbXB1dGVkU3R5bGVWYWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiBZLmdldENvbXB1dGVkU3R5bGVWYWx1ZShhLGIpfSxuYXRpdmVDc3M6VixuYXRpdmVTaGFkb3c6VSxjc3NCdWlsZDpoZyxkaXNhYmxlUnVudGltZTppZ307JGgmJih3aW5kb3cuU2hhZHlDU1MuQXBwbHlTaGltPSRoKTthaSYmKHdpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZT1haSk7KGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIodCl7IiI9PXQmJihmLmNhbGwodGhpcyksdGhpcy5oPSEwKTtyZXR1cm4gdC50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIGModCl7dmFyIEY9dC5jaGFyQ29kZUF0KDApO3JldHVybiAzMjxGJiYxMjc+RiYmLTE9PVszNCwzNSw2MCw2Miw2Myw5Nl0uaW5kZXhPZihGKT90OmVuY29kZVVSSUNvbXBvbmVudCh0KX1mdW5jdGlvbiBkKHQpe3ZhciBGPXQuY2hhckNvZGVBdCgwKTtyZXR1cm4gMzI8RiYmMTI3PkYmJi0xPT1bMzQsMzUsNjAsNjIsOTZdLmluZGV4T2YoRik/dDplbmNvZGVVUklDb21wb25lbnQodCl9ZnVuY3Rpb24gZSh0LEYsRSl7ZnVuY3Rpb24gTShrYSl7dmEucHVzaChrYSl9dmFyIHk9Rnx8InNjaGVtZSBzdGFydCIsVz0wLHY9IiIsdWE9ITEsZWE9ITEsdmE9W107YTpmb3IoOyh2b2lkIDAhPXRbVy0xXXx8MD09VykmJiF0aGlzLmg7KXt2YXIgbj10W1ddO3N3aXRjaCh5KXtjYXNlICJzY2hlbWUgc3RhcnQiOmlmKG4mJnEudGVzdChuKSl2Kz0Kbi50b0xvd2VyQ2FzZSgpLHk9InNjaGVtZSI7ZWxzZSBpZihGKXtNKCJJbnZhbGlkIHNjaGVtZS4iKTticmVhayBhfWVsc2V7dj0iIjt5PSJubyBzY2hlbWUiO2NvbnRpbnVlfWJyZWFrO2Nhc2UgInNjaGVtZSI6aWYobiYmSC50ZXN0KG4pKXYrPW4udG9Mb3dlckNhc2UoKTtlbHNlIGlmKCI6Ij09bil7dGhpcy5nPXY7dj0iIjtpZihGKWJyZWFrIGE7dm9pZCAwIT09bFt0aGlzLmddJiYodGhpcy5BPSEwKTt5PSJmaWxlIj09dGhpcy5nPyJyZWxhdGl2ZSI6dGhpcy5BJiZFJiZFLmc9PXRoaXMuZz8icmVsYXRpdmUgb3IgYXV0aG9yaXR5Ijp0aGlzLkE/ImF1dGhvcml0eSBmaXJzdCBzbGFzaCI6InNjaGVtZSBkYXRhIn1lbHNlIGlmKEYpe3ZvaWQgMCE9biYmTSgiQ29kZSBwb2ludCBub3QgYWxsb3dlZCBpbiBzY2hlbWU6ICIrbik7YnJlYWsgYX1lbHNle3Y9IiI7Vz0wO3k9Im5vIHNjaGVtZSI7Y29udGludWV9YnJlYWs7Y2FzZSAic2NoZW1lIGRhdGEiOiI/Ij09bj8odGhpcy5vPSI/IiwKeT0icXVlcnkiKToiIyI9PW4/KHRoaXMudT0iIyIseT0iZnJhZ21lbnQiKTp2b2lkIDAhPW4mJiJcdCIhPW4mJiJcbiIhPW4mJiJcciIhPW4mJih0aGlzLnBhKz1jKG4pKTticmVhaztjYXNlICJubyBzY2hlbWUiOmlmKEUmJnZvaWQgMCE9PWxbRS5nXSl7eT0icmVsYXRpdmUiO2NvbnRpbnVlfWVsc2UgTSgiTWlzc2luZyBzY2hlbWUuIiksZi5jYWxsKHRoaXMpLHRoaXMuaD0hMDticmVhaztjYXNlICJyZWxhdGl2ZSBvciBhdXRob3JpdHkiOmlmKCIvIj09biYmIi8iPT10W1crMV0peT0iYXV0aG9yaXR5IGlnbm9yZSBzbGFzaGVzIjtlbHNle00oIkV4cGVjdGVkIC8sIGdvdDogIituKTt5PSJyZWxhdGl2ZSI7Y29udGludWV9YnJlYWs7Y2FzZSAicmVsYXRpdmUiOnRoaXMuQT0hMDsiZmlsZSIhPXRoaXMuZyYmKHRoaXMuZz1FLmcpO2lmKHZvaWQgMD09bil7dGhpcy5pPUUuaTt0aGlzLm09RS5tO3RoaXMuaj1FLmouc2xpY2UoKTt0aGlzLm89RS5vO3RoaXMucz1FLnM7dGhpcy5mPUUuZjsKYnJlYWsgYX1lbHNlIGlmKCIvIj09bnx8IlxcIj09bikiXFwiPT1uJiZNKCJcXCBpcyBhbiBpbnZhbGlkIGNvZGUgcG9pbnQuIikseT0icmVsYXRpdmUgc2xhc2giO2Vsc2UgaWYoIj8iPT1uKXRoaXMuaT1FLmksdGhpcy5tPUUubSx0aGlzLmo9RS5qLnNsaWNlKCksdGhpcy5vPSI/Iix0aGlzLnM9RS5zLHRoaXMuZj1FLmYseT0icXVlcnkiO2Vsc2UgaWYoIiMiPT1uKXRoaXMuaT1FLmksdGhpcy5tPUUubSx0aGlzLmo9RS5qLnNsaWNlKCksdGhpcy5vPUUubyx0aGlzLnU9IiMiLHRoaXMucz1FLnMsdGhpcy5mPUUuZix5PSJmcmFnbWVudCI7ZWxzZXt5PXRbVysxXTt2YXIgST10W1crMl07aWYoImZpbGUiIT10aGlzLmd8fCFxLnRlc3Qobil8fCI6IiE9eSYmInwiIT15fHx2b2lkIDAhPUkmJiIvIiE9SSYmIlxcIiE9SSYmIj8iIT1JJiYiIyIhPUkpdGhpcy5pPUUuaSx0aGlzLm09RS5tLHRoaXMucz1FLnMsdGhpcy5mPUUuZix0aGlzLmo9RS5qLnNsaWNlKCksdGhpcy5qLnBvcCgpO3k9CiJyZWxhdGl2ZSBwYXRoIjtjb250aW51ZX1icmVhaztjYXNlICJyZWxhdGl2ZSBzbGFzaCI6aWYoIi8iPT1ufHwiXFwiPT1uKSJcXCI9PW4mJk0oIlxcIGlzIGFuIGludmFsaWQgY29kZSBwb2ludC4iKSx5PSJmaWxlIj09dGhpcy5nPyJmaWxlIGhvc3QiOiJhdXRob3JpdHkgaWdub3JlIHNsYXNoZXMiO2Vsc2V7ImZpbGUiIT10aGlzLmcmJih0aGlzLmk9RS5pLHRoaXMubT1FLm0sdGhpcy5zPUUucyx0aGlzLmY9RS5mKTt5PSJyZWxhdGl2ZSBwYXRoIjtjb250aW51ZX1icmVhaztjYXNlICJhdXRob3JpdHkgZmlyc3Qgc2xhc2giOmlmKCIvIj09bil5PSJhdXRob3JpdHkgc2Vjb25kIHNsYXNoIjtlbHNle00oIkV4cGVjdGVkICcvJywgZ290OiAiK24pO3k9ImF1dGhvcml0eSBpZ25vcmUgc2xhc2hlcyI7Y29udGludWV9YnJlYWs7Y2FzZSAiYXV0aG9yaXR5IHNlY29uZCBzbGFzaCI6eT0iYXV0aG9yaXR5IGlnbm9yZSBzbGFzaGVzIjtpZigiLyIhPW4pe00oIkV4cGVjdGVkICcvJywgZ290OiAiKwpuKTtjb250aW51ZX1icmVhaztjYXNlICJhdXRob3JpdHkgaWdub3JlIHNsYXNoZXMiOmlmKCIvIiE9biYmIlxcIiE9bil7eT0iYXV0aG9yaXR5Ijtjb250aW51ZX1lbHNlIE0oIkV4cGVjdGVkIGF1dGhvcml0eSwgZ290OiAiK24pO2JyZWFrO2Nhc2UgImF1dGhvcml0eSI6aWYoIkAiPT1uKXt1YSYmKE0oIkAgYWxyZWFkeSBzZWVuLiIpLHYrPSIlNDAiKTt1YT0hMDtmb3Iobj0wO248di5sZW5ndGg7bisrKUk9dltuXSwiXHQiPT1JfHwiXG4iPT1JfHwiXHIiPT1JP00oIkludmFsaWQgd2hpdGVzcGFjZSBpbiBhdXRob3JpdHkuIik6IjoiPT1JJiZudWxsPT09dGhpcy5mP3RoaXMuZj0iIjooST1jKEkpLG51bGwhPT10aGlzLmY/dGhpcy5mKz1JOnRoaXMucys9SSk7dj0iIn1lbHNlIGlmKHZvaWQgMD09bnx8Ii8iPT1ufHwiXFwiPT1ufHwiPyI9PW58fCIjIj09bil7Vy09di5sZW5ndGg7dj0iIjt5PSJob3N0Ijtjb250aW51ZX1lbHNlIHYrPW47YnJlYWs7Y2FzZSAiZmlsZSBob3N0IjppZih2b2lkIDA9PQpufHwiLyI9PW58fCJcXCI9PW58fCI/Ij09bnx8IiMiPT1uKXsyIT12Lmxlbmd0aHx8IXEudGVzdCh2WzBdKXx8IjoiIT12WzFdJiYifCIhPXZbMV0/KDAhPXYubGVuZ3RoJiYodGhpcy5pPWIuY2FsbCh0aGlzLHYpLHY9IiIpLHk9InJlbGF0aXZlIHBhdGggc3RhcnQiKTp5PSJyZWxhdGl2ZSBwYXRoIjtjb250aW51ZX1lbHNlIlx0Ij09bnx8IlxuIj09bnx8IlxyIj09bj9NKCJJbnZhbGlkIHdoaXRlc3BhY2UgaW4gZmlsZSBob3N0LiIpOnYrPW47YnJlYWs7Y2FzZSAiaG9zdCI6Y2FzZSAiaG9zdG5hbWUiOmlmKCI6IiE9bnx8ZWEpaWYodm9pZCAwPT1ufHwiLyI9PW58fCJcXCI9PW58fCI/Ij09bnx8IiMiPT1uKXt0aGlzLmk9Yi5jYWxsKHRoaXMsdik7dj0iIjt5PSJyZWxhdGl2ZSBwYXRoIHN0YXJ0IjtpZihGKWJyZWFrIGE7Y29udGludWV9ZWxzZSJcdCIhPW4mJiJcbiIhPW4mJiJcciIhPW4/KCJbIj09bj9lYT0hMDoiXSI9PW4mJihlYT0hMSksdis9bik6TSgiSW52YWxpZCBjb2RlIHBvaW50IGluIGhvc3QvaG9zdG5hbWU6ICIrCm4pO2Vsc2UgaWYodGhpcy5pPWIuY2FsbCh0aGlzLHYpLHY9IiIseT0icG9ydCIsImhvc3RuYW1lIj09RilicmVhayBhO2JyZWFrO2Nhc2UgInBvcnQiOmlmKC9bMC05XS8udGVzdChuKSl2Kz1uO2Vsc2UgaWYodm9pZCAwPT1ufHwiLyI9PW58fCJcXCI9PW58fCI/Ij09bnx8IiMiPT1ufHxGKXsiIiE9diYmKHY9cGFyc2VJbnQodiwxMCksdiE9bFt0aGlzLmddJiYodGhpcy5tPXYrIiIpLHY9IiIpO2lmKEYpYnJlYWsgYTt5PSJyZWxhdGl2ZSBwYXRoIHN0YXJ0Ijtjb250aW51ZX1lbHNlIlx0Ij09bnx8IlxuIj09bnx8IlxyIj09bj9NKCJJbnZhbGlkIGNvZGUgcG9pbnQgaW4gcG9ydDogIituKTooZi5jYWxsKHRoaXMpLHRoaXMuaD0hMCk7YnJlYWs7Y2FzZSAicmVsYXRpdmUgcGF0aCBzdGFydCI6IlxcIj09biYmTSgiJ1xcJyBub3QgYWxsb3dlZCBpbiBwYXRoLiIpO3k9InJlbGF0aXZlIHBhdGgiO2lmKCIvIiE9biYmIlxcIiE9biljb250aW51ZTticmVhaztjYXNlICJyZWxhdGl2ZSBwYXRoIjppZih2b2lkIDAhPQpuJiYiLyIhPW4mJiJcXCIhPW4mJihGfHwiPyIhPW4mJiIjIiE9bikpIlx0IiE9biYmIlxuIiE9biYmIlxyIiE9biYmKHYrPWMobikpO2Vsc2V7IlxcIj09biYmTSgiXFwgbm90IGFsbG93ZWQgaW4gcmVsYXRpdmUgcGF0aC4iKTtpZihJPW1bdi50b0xvd2VyQ2FzZSgpXSl2PUk7Ii4uIj09dj8odGhpcy5qLnBvcCgpLCIvIiE9biYmIlxcIiE9biYmdGhpcy5qLnB1c2goIiIpKToiLiI9PXYmJiIvIiE9biYmIlxcIiE9bj90aGlzLmoucHVzaCgiIik6Ii4iIT12JiYoImZpbGUiPT10aGlzLmcmJjA9PXRoaXMuai5sZW5ndGgmJjI9PXYubGVuZ3RoJiZxLnRlc3QodlswXSkmJiJ8Ij09dlsxXSYmKHY9dlswXSsiOiIpLHRoaXMuai5wdXNoKHYpKTt2PSIiOyI/Ij09bj8odGhpcy5vPSI/Iix5PSJxdWVyeSIpOiIjIj09biYmKHRoaXMudT0iIyIseT0iZnJhZ21lbnQiKX1icmVhaztjYXNlICJxdWVyeSI6Rnx8IiMiIT1uP3ZvaWQgMCE9biYmIlx0IiE9biYmIlxuIiE9biYmIlxyIiE9biYmKHRoaXMubys9CmQobikpOih0aGlzLnU9IiMiLHk9ImZyYWdtZW50Iik7YnJlYWs7Y2FzZSAiZnJhZ21lbnQiOnZvaWQgMCE9biYmIlx0IiE9biYmIlxuIiE9biYmIlxyIiE9biYmKHRoaXMudSs9bil9VysrfX1mdW5jdGlvbiBmKCl7dGhpcy5zPXRoaXMucGE9dGhpcy5nPSIiO3RoaXMuZj1udWxsO3RoaXMubT10aGlzLmk9IiI7dGhpcy5qPVtdO3RoaXMudT10aGlzLm89IiI7dGhpcy5BPXRoaXMuaD0hMX1mdW5jdGlvbiBnKHQsRil7dm9pZCAwPT09Rnx8RiBpbnN0YW5jZW9mIGd8fChGPW5ldyBnKFN0cmluZyhGKSkpO3RoaXMuYT10O2YuY2FsbCh0aGlzKTtlLmNhbGwodGhpcyx0aGlzLmEucmVwbGFjZSgvXlsgXHRcclxuXGZdK3xbIFx0XHJcblxmXSskL2csIiIpLG51bGwsRil9dmFyIGg9ITE7dHJ5e3ZhciBrPW5ldyBVUkwoImIiLCJodHRwOi8vYSIpO2sucGF0aG5hbWU9ImMlMjBkIjtoPSJodHRwOi8vYS9jJTIwZCI9PT1rLmhyZWZ9Y2F0Y2godCl7fWlmKCFoKXt2YXIgbD1PYmplY3QuY3JlYXRlKG51bGwpOwpsLmZ0cD0yMTtsLmZpbGU9MDtsLmdvcGhlcj03MDtsLmh0dHA9ODA7bC5odHRwcz00NDM7bC53cz04MDtsLndzcz00NDM7dmFyIG09T2JqZWN0LmNyZWF0ZShudWxsKTttWyIlMmUiXT0iLiI7bVsiLiUyZSJdPSIuLiI7bVsiJTJlLiJdPSIuLiI7bVsiJTJlJTJlIl09Ii4uIjt2YXIgcT0vW2EtekEtWl0vLEg9L1thLXpBLVowLTlcK1wtXC5dLztnLnByb3RvdHlwZT17dG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ocmVmfSxnZXQgaHJlZigpe2lmKHRoaXMuaClyZXR1cm4gdGhpcy5hO3ZhciB0PSIiO2lmKCIiIT10aGlzLnN8fG51bGwhPXRoaXMuZil0PXRoaXMucysobnVsbCE9dGhpcy5mPyI6Iit0aGlzLmY6IiIpKyJAIjtyZXR1cm4gdGhpcy5wcm90b2NvbCsodGhpcy5BPyIvLyIrdCt0aGlzLmhvc3Q6IiIpK3RoaXMucGF0aG5hbWUrdGhpcy5vK3RoaXMudX0sc2V0IGhyZWYodCl7Zi5jYWxsKHRoaXMpO2UuY2FsbCh0aGlzLHQpfSxnZXQgcHJvdG9jb2woKXtyZXR1cm4gdGhpcy5nKwoiOiJ9LHNldCBwcm90b2NvbCh0KXt0aGlzLmh8fGUuY2FsbCh0aGlzLHQrIjoiLCJzY2hlbWUgc3RhcnQiKX0sZ2V0IGhvc3QoKXtyZXR1cm4gdGhpcy5oPyIiOnRoaXMubT90aGlzLmkrIjoiK3RoaXMubTp0aGlzLml9LHNldCBob3N0KHQpeyF0aGlzLmgmJnRoaXMuQSYmZS5jYWxsKHRoaXMsdCwiaG9zdCIpfSxnZXQgaG9zdG5hbWUoKXtyZXR1cm4gdGhpcy5pfSxzZXQgaG9zdG5hbWUodCl7IXRoaXMuaCYmdGhpcy5BJiZlLmNhbGwodGhpcyx0LCJob3N0bmFtZSIpfSxnZXQgcG9ydCgpe3JldHVybiB0aGlzLm19LHNldCBwb3J0KHQpeyF0aGlzLmgmJnRoaXMuQSYmZS5jYWxsKHRoaXMsdCwicG9ydCIpfSxnZXQgcGF0aG5hbWUoKXtyZXR1cm4gdGhpcy5oPyIiOnRoaXMuQT8iLyIrdGhpcy5qLmpvaW4oIi8iKTp0aGlzLnBhfSxzZXQgcGF0aG5hbWUodCl7IXRoaXMuaCYmdGhpcy5BJiYodGhpcy5qPVtdLGUuY2FsbCh0aGlzLHQsInJlbGF0aXZlIHBhdGggc3RhcnQiKSl9LGdldCBzZWFyY2goKXtyZXR1cm4gdGhpcy5ofHwKIXRoaXMub3x8Ij8iPT10aGlzLm8/IiI6dGhpcy5vfSxzZXQgc2VhcmNoKHQpeyF0aGlzLmgmJnRoaXMuQSYmKHRoaXMubz0iPyIsIj8iPT10WzBdJiYodD10LnNsaWNlKDEpKSxlLmNhbGwodGhpcyx0LCJxdWVyeSIpKX0sZ2V0IGhhc2goKXtyZXR1cm4gdGhpcy5ofHwhdGhpcy51fHwiIyI9PXRoaXMudT8iIjp0aGlzLnV9LHNldCBoYXNoKHQpe3RoaXMuaHx8KHQ/KHRoaXMudT0iIyIsIiMiPT10WzBdJiYodD10LnNsaWNlKDEpKSxlLmNhbGwodGhpcyx0LCJmcmFnbWVudCIpKTp0aGlzLnU9IiIpfSxnZXQgb3JpZ2luKCl7dmFyIHQ7aWYodGhpcy5ofHwhdGhpcy5nKXJldHVybiIiO3N3aXRjaCh0aGlzLmcpe2Nhc2UgImRhdGEiOmNhc2UgImZpbGUiOmNhc2UgImphdmFzY3JpcHQiOmNhc2UgIm1haWx0byI6cmV0dXJuIm51bGwifXJldHVybih0PXRoaXMuaG9zdCk/dGhpcy5nKyI6Ly8iK3Q6IiJ9fTt2YXIgQz1hLlVSTDtDJiYoZy5jcmVhdGVPYmplY3RVUkw9ZnVuY3Rpb24odCl7cmV0dXJuIEMuY3JlYXRlT2JqZWN0VVJMLmFwcGx5KEMsCmFyZ3VtZW50cyl9LGcucmV2b2tlT2JqZWN0VVJMPWZ1bmN0aW9uKHQpe0MucmV2b2tlT2JqZWN0VVJMKHQpfSk7YS5VUkw9Z319KSh3aW5kb3cpO09iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTm9kZS5wcm90b3R5cGUsImJhc2VVUkkiKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KE5vZGUucHJvdG90eXBlLCJiYXNlVVJJIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIGE9KHRoaXMub3duZXJEb2N1bWVudHx8dGhpcykucXVlcnlTZWxlY3RvcigiYmFzZVtocmVmXSIpO3JldHVybiBhJiZhLmhyZWZ8fHdpbmRvdy5sb2NhdGlvbi5ocmVmfSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0pO3ZhciBiaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2JpLnRleHRDb250ZW50PSJib2R5IHt0cmFuc2l0aW9uOiBvcGFjaXR5IGVhc2UtaW4gMC4yczsgfSBcbmJvZHlbdW5yZXNvbHZlZF0ge29wYWNpdHk6IDA7IGRpc3BsYXk6IGJsb2NrOyBvdmVyZmxvdzogaGlkZGVuOyBwb3NpdGlvbjogcmVsYXRpdmU7IH0gXG4iO3ZhciBjaT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJoZWFkIik7Y2kuaW5zZXJ0QmVmb3JlKGJpLGNpLmZpcnN0Q2hpbGQpOwp2YXIgZGk9d2luZG93LmN1c3RvbUVsZW1lbnRzLGVpPSExLGZpPW51bGw7ZGkucG9seWZpbGxXcmFwRmx1c2hDYWxsYmFjayYmZGkucG9seWZpbGxXcmFwRmx1c2hDYWxsYmFjayhmdW5jdGlvbihhKXtmaT1hO2VpJiZhKCl9KTtmdW5jdGlvbiBnaSgpe3dpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50LmJvb3RzdHJhcCYmd2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQuYm9vdHN0cmFwKHdpbmRvdy5kb2N1bWVudCk7ZmkmJmZpKCk7ZWk9ITA7d2luZG93LldlYkNvbXBvbmVudHMucmVhZHk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIldlYkNvbXBvbmVudHNSZWFkeSIse2J1YmJsZXM6ITB9KSl9CiJjb21wbGV0ZSIhPT1kb2N1bWVudC5yZWFkeVN0YXRlPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZ2kpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixnaSk7Z2koKX0pKTpnaSgpO30pLmNhbGwodGhpcyk7";
+
+const sha256 = "'sha256-Xwzkrrrq3g7zsld2XFc1phJHOgfQ7VYchGSf92NeEZg='";
+
+var httpResponseObserver = {
+ observe: function (subject, topic, data) {
+ if ((topic == "http-on-examine-response" || topic == "http-on-examine-cached-response") &&
+ subject instanceof Ci.nsIHttpChannel && subject.URI.host == "github.com" && subject.responseStatus == 200) {
+ try {
+ let ctype = subject.getResponseHeader("Content-Type").toLowerCase();
+ if (ctype.indexOf("text/html") == -1 && ctype.indexOf("text/javascrip") == -1) {
+ return;
+ }
+ } catch (e) {}
+ try {
+ let csp = subject.getResponseHeader("Content-Security-Policy");
+ csp = csp.replace("script-src ", "script-src " + sha256 + " ");
+ csp = csp.replace("worker-src ", "worker-src github.githubassets.com ");
+ subject.setResponseHeader("Content-Security-Policy", csp, false);
+ } catch (e) {}
+ }
+ },
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsISupportsWeakReference])
+};
+
+var deiObserver = {
+ observe: function(subject, topic, data) {
+ if (topic == "document-element-inserted" && subject instanceof Ci.nsIDOMDocument
+ && subject.defaultView && subject.defaultView == subject.defaultView.top
+ && subject.location.protocol == "https:"
+ && subject.location.hostname == "github.com"
+ && subject.contentType == "text/html") {
+ let script = subject.createElement("script");
+ script.textContent = subject.defaultView.atob(polyfill);
+ subject.documentElement.appendChild(script);
+ }
+ },
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsISupportsWeakReference])
+};
+
+function startup(data, reason) {
+ Services.obs.addObserver(httpResponseObserver, "http-on-examine-response", false);
+ Services.obs.addObserver(httpResponseObserver, "http-on-examine-cached-response", false);
+ Services.obs.addObserver(deiObserver, "document-element-inserted", false);
+}
+
+function shutdown(data, reason) {
+ if (reason == APP_SHUTDOWN) {
+ return;
+ }
+ Services.obs.removeObserver(deiObserver, "document-element-inserted", false);
+ Services.obs.removeObserver(httpResponseObserver, "http-on-examine-cached-response", false);
+ Services.obs.removeObserver(httpResponseObserver, "http-on-examine-response", false);
+}
+
+function install() {}
+
+function uninstall() {}
diff --git a/icon.png b/icon.png
new file mode 100644
index 0000000..1d69f31
--- /dev/null
+++ b/icon.png
Binary files differ
diff --git a/install.rdf b/install.rdf
new file mode 100644
index 0000000..ee0e2ea
--- /dev/null
+++ b/install.rdf
@@ -0,0 +1,22 @@
+<?xml version='1.0' encoding='utf-8'?>
+<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
+ <Description about="urn:mozilla:install-manifest">
+ <em:id>github-wc-polyfill@Off.JustOff</em:id>
+ <em:version>1.0.1</em:version>
+ <em:type>2</em:type>
+ <em:bootstrap>true</em:bootstrap>
+ <em:name>GitHub Web Components Polyfill</em:name>
+ <em:description>Provides Web Components Polyfill for GitHub</em:description>
+ <em:creator>Off JustOff &lt;Off.Just.Off@gmail.com&gt;</em:creator>
+ <em:contributor>The Polymer Authors https://github.com/webcomponents/polyfills</em:contributor>
+ <em:homepageURL>https://github.com/JustOff/github-wc-polyfill/</em:homepageURL>
+ <em:updateURL>https://raw.githubusercontent.com/JustOff/github-wc-polyfill/master/update.xml</em:updateURL>
+ <em:targetApplication>
+ <Description>
+ <em:id>{8de7fcbb-c55c-4fbe-bfc5-fc555c87dbc4}</em:id>
+ <em:minVersion>28.14.0</em:minVersion>
+ <em:maxVersion>29.*</em:maxVersion>
+ </Description>
+ </em:targetApplication>
+ </Description>
+</RDF>
diff --git a/release.cmd b/release.cmd
new file mode 100644
index 0000000..d21ed55
--- /dev/null
+++ b/release.cmd
@@ -0,0 +1,9 @@
+@echo off
+set VER=1.0.1
+
+sed -i -E "s/version>.+?</version>%VER%</" install.rdf
+sed -i -E "s/version>.+?</version>%VER%</; s/download\/.+?\/github-wc-polyfill-.+?\.xpi/download\/%VER%\/github-wc-polyfill-%VER%\.xpi/" update.xml
+
+set XPI=github-wc-polyfill-%VER%.xpi
+if exist %XPI% del %XPI%
+zip -r9q %XPI% bootstrap.js icon.png install.rdf
diff --git a/update.xml b/update.xml
new file mode 100644
index 0000000..8cc1457
--- /dev/null
+++ b/update.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
+ <RDF:Description about="urn:mozilla:extension:github-wc-polyfill@Off.JustOff">
+ <em:updates>
+ <RDF:Seq>
+ <RDF:li>
+ <RDF:Description>
+ <em:version>1.0.1</em:version>
+ <em:targetApplication>
+ <RDF:Description>
+ <em:id>{8de7fcbb-c55c-4fbe-bfc5-fc555c87dbc4}</em:id>
+ <em:minVersion>28.14.0</em:minVersion>
+ <em:maxVersion>29.*</em:maxVersion>
+ <em:updateLink>https://github.com/JustOff/github-wc-polyfill/releases/download/1.0.1/github-wc-polyfill-1.0.1.xpi</em:updateLink>
+ </RDF:Description>
+ </em:targetApplication>
+ </RDF:Description>
+ </RDF:li>
+ </RDF:Seq>
+ </em:updates>
+ </RDF:Description>
+</RDF:RDF>